mirror of https://github.com/JakubMelka/PDF4QT.git
Issue #54: Finishing of bookmarking
This commit is contained in:
parent
7a5f37e38f
commit
e9ca3a4a82
|
@ -105,5 +105,8 @@
|
|||
<file>resources/sidebar-visibility.svg</file>
|
||||
<file>resources/outline.svg</file>
|
||||
<file>resources/sidebar-favourites.svg</file>
|
||||
<file>resources/bookmark.svg</file>
|
||||
<file>resources/bookmark-next.svg</file>
|
||||
<file>resources/bookmark-previous.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
|
@ -110,46 +110,23 @@ void PDFBookmarkManager::setDocument(const pdf::PDFModifiedDocument& document)
|
|||
{
|
||||
Q_EMIT bookmarksAboutToBeChanged();
|
||||
|
||||
const bool init = !m_document;
|
||||
m_document = document.getDocument();
|
||||
|
||||
QString key;
|
||||
|
||||
if (document.hasPreserveView() && m_document)
|
||||
if (document.hasReset())
|
||||
{
|
||||
// Pass the key
|
||||
key = QString::fromLatin1(m_document->getSourceDataHash().toHex());
|
||||
|
||||
if (m_bookmarks.count(m_currentKey) && m_currentKey != key)
|
||||
if (!document.hasPreserveView())
|
||||
{
|
||||
m_bookmarks[key] = m_bookmarks[m_currentKey];
|
||||
m_bookmarks.erase(m_currentKey);
|
||||
m_bookmarks.bookmarks.clear();
|
||||
regenerateAutoBookmarks();
|
||||
}
|
||||
}
|
||||
|
||||
if (init && m_document)
|
||||
{
|
||||
key = QString::fromLatin1(m_document->getSourceDataHash().toHex());
|
||||
}
|
||||
|
||||
if (key.isEmpty())
|
||||
{
|
||||
key = "generic";
|
||||
}
|
||||
|
||||
m_currentKey = key;
|
||||
|
||||
if (document.hasReset() && !document.hasPreserveView())
|
||||
{
|
||||
regenerateAutoBookmarks();
|
||||
}
|
||||
|
||||
Q_EMIT bookmarksChanged();
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::saveToFile(QString fileName)
|
||||
{
|
||||
QJsonDocument doc = PDFBookmarkManagerHelper::convertBookmarksMapToJsonDocument(m_bookmarks);
|
||||
QJsonDocument doc(PDFBookmarkManagerHelper::convertBookmarksToJson(m_bookmarks));
|
||||
|
||||
// Příklad zápisu do souboru
|
||||
QFile file(fileName);
|
||||
|
@ -168,31 +145,130 @@ bool PDFBookmarkManager::loadFromFile(QString fileName)
|
|||
QJsonDocument loadedDoc = QJsonDocument::fromJson(file.readAll());
|
||||
file.close();
|
||||
|
||||
m_bookmarks = PDFBookmarkManagerHelper::convertBookmarksMapFromJsonDocument(loadedDoc);
|
||||
Q_EMIT bookmarksAboutToBeChanged();
|
||||
m_bookmarks = PDFBookmarkManagerHelper::convertBookmarksFromJson(loadedDoc.object());
|
||||
Q_EMIT bookmarksChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PDFBookmarkManager::isEmpty() const
|
||||
{
|
||||
return m_bookmarks.bookmarks.empty();
|
||||
}
|
||||
|
||||
int PDFBookmarkManager::getBookmarkCount() const
|
||||
{
|
||||
if (m_bookmarks.count(m_currentKey))
|
||||
{
|
||||
return m_bookmarks.at(m_currentKey).bookmarks.size();
|
||||
}
|
||||
|
||||
return 0;
|
||||
return static_cast<int>(m_bookmarks.bookmarks.size());
|
||||
}
|
||||
|
||||
PDFBookmarkManager::Bookmark PDFBookmarkManager::getBookmark(int index) const
|
||||
{
|
||||
if (m_bookmarks.count(m_currentKey))
|
||||
return m_bookmarks.bookmarks.at(index);
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::toggleBookmark(pdf::PDFInteger pageIndex)
|
||||
{
|
||||
Q_EMIT bookmarksAboutToBeChanged();
|
||||
|
||||
auto it = std::find_if(m_bookmarks.bookmarks.begin(), m_bookmarks.bookmarks.end(), [pageIndex](const auto& bookmark) { return bookmark.pageIndex == pageIndex; });
|
||||
if (it != m_bookmarks.bookmarks.cend())
|
||||
{
|
||||
return m_bookmarks.at(m_currentKey).bookmarks.at(index);
|
||||
Bookmark& bookmark = *it;
|
||||
if (bookmark.isAuto)
|
||||
{
|
||||
bookmark.isAuto = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bookmarks.bookmarks.erase(it);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Bookmark bookmark;
|
||||
bookmark.isAuto = false;
|
||||
bookmark.name = tr("User bookmark for page %1").arg(pageIndex + 1);
|
||||
bookmark.pageIndex = pageIndex;
|
||||
m_bookmarks.bookmarks.push_back(bookmark);
|
||||
sortBookmarks();
|
||||
}
|
||||
|
||||
return Bookmark();
|
||||
Q_EMIT bookmarksChanged();
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::setGenerateBookmarksAutomatically(bool generateBookmarksAutomatically)
|
||||
{
|
||||
if (m_generateBookmarksAutomatically != generateBookmarksAutomatically)
|
||||
{
|
||||
Q_EMIT bookmarksAboutToBeChanged();
|
||||
m_generateBookmarksAutomatically = generateBookmarksAutomatically;
|
||||
regenerateAutoBookmarks();
|
||||
Q_EMIT bookmarksChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::goToNextBookmark()
|
||||
{
|
||||
if (isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_currentBookmark = (m_currentBookmark + 1) % getBookmarkCount();
|
||||
goToCurrentBookmark();
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::goToPreviousBookmark()
|
||||
{
|
||||
if (isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_currentBookmark <= 0)
|
||||
{
|
||||
m_currentBookmark = getBookmarkCount() - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
--m_currentBookmark;
|
||||
}
|
||||
|
||||
goToCurrentBookmark();
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::goToCurrentBookmark()
|
||||
{
|
||||
if (isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_currentBookmark >= 0 && m_currentBookmark < getBookmarkCount())
|
||||
{
|
||||
Q_EMIT bookmarkActivated(m_currentBookmark, m_bookmarks.bookmarks.at(m_currentBookmark));
|
||||
}
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::goToBookmark(int index, bool force)
|
||||
{
|
||||
if (m_currentBookmark != index || force)
|
||||
{
|
||||
m_currentBookmark = index;
|
||||
goToCurrentBookmark();
|
||||
}
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::sortBookmarks()
|
||||
{
|
||||
auto predicate = [](const auto& l, const auto& r)
|
||||
{
|
||||
return l.pageIndex < r.pageIndex;
|
||||
};
|
||||
std::sort(m_bookmarks.bookmarks.begin(), m_bookmarks.bookmarks.end(), predicate);
|
||||
}
|
||||
|
||||
void PDFBookmarkManager::regenerateAutoBookmarks()
|
||||
|
@ -203,7 +279,7 @@ void PDFBookmarkManager::regenerateAutoBookmarks()
|
|||
}
|
||||
|
||||
// Create bookmarks for all main chapters
|
||||
Bookmarks& bookmarks = m_bookmarks[m_currentKey];
|
||||
Bookmarks& bookmarks = m_bookmarks;
|
||||
|
||||
for (auto it = bookmarks.bookmarks.begin(); it != bookmarks.bookmarks.end();)
|
||||
{
|
||||
|
@ -217,6 +293,11 @@ void PDFBookmarkManager::regenerateAutoBookmarks()
|
|||
}
|
||||
}
|
||||
|
||||
if (!m_generateBookmarksAutomatically)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (auto outlineRoot = m_document->getCatalog()->getOutlineRootPtr())
|
||||
{
|
||||
size_t childCount = outlineRoot->getChildCount();
|
||||
|
|
|
@ -47,16 +47,26 @@ public:
|
|||
pdf::PDFInteger pageIndex = -1;
|
||||
};
|
||||
|
||||
bool isEmpty() const;
|
||||
int getBookmarkCount() const;
|
||||
Bookmark getBookmark(int index) const;
|
||||
void toggleBookmark(pdf::PDFInteger pageIndex);
|
||||
void setGenerateBookmarksAutomatically(bool generateBookmarksAutomatically);
|
||||
|
||||
void goToNextBookmark();
|
||||
void goToPreviousBookmark();
|
||||
void goToCurrentBookmark();
|
||||
void goToBookmark(int index, bool force);
|
||||
|
||||
signals:
|
||||
void bookmarksAboutToBeChanged();
|
||||
void bookmarksChanged();
|
||||
void bookmarkActivated(int index, Bookmark bookmark);
|
||||
|
||||
private:
|
||||
friend class PDFBookmarkManagerHelper;
|
||||
|
||||
void sortBookmarks();
|
||||
void regenerateAutoBookmarks();
|
||||
|
||||
struct Bookmarks
|
||||
|
@ -65,8 +75,9 @@ private:
|
|||
};
|
||||
|
||||
pdf::PDFDocument* m_document;
|
||||
QString m_currentKey;
|
||||
std::map<QString, Bookmarks> m_bookmarks;
|
||||
Bookmarks m_bookmarks;
|
||||
int m_currentBookmark = -1;
|
||||
bool m_generateBookmarksAutomatically = true;
|
||||
};
|
||||
|
||||
} // namespace pdf
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "pdfbookmarkui.h"
|
||||
#include "pdfwidgetutils.h"
|
||||
#include "pdfpainterutils.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QPainterPath>
|
||||
|
@ -34,11 +35,17 @@ PDFBookmarkItemModel::PDFBookmarkItemModel(PDFBookmarkManager* bookmarkManager,
|
|||
|
||||
QModelIndex PDFBookmarkItemModel::index(int row, int column, const QModelIndex& parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
{
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
return createIndex(row, column, nullptr);
|
||||
}
|
||||
|
||||
QModelIndex PDFBookmarkItemModel::parent(const QModelIndex& child) const
|
||||
{
|
||||
Q_UNUSED(child);
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
|
@ -54,6 +61,11 @@ int PDFBookmarkItemModel::rowCount(const QModelIndex& parent) const
|
|||
|
||||
int PDFBookmarkItemModel::columnCount(const QModelIndex& parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -92,14 +104,22 @@ void PDFBookmarkItemDelegate::paint(QPainter* painter,
|
|||
QRect rect = options.rect;
|
||||
rect.marginsRemoved(QMargins(margin, margin, margin, margin));
|
||||
|
||||
QColor color = bookmark.isAuto ? QColor(0, 123, 255) : QColor(255, 159, 0);
|
||||
|
||||
if (options.state.testFlag(QStyle::State_Selected))
|
||||
{
|
||||
color = Qt::yellow;
|
||||
}
|
||||
|
||||
QRect iconRect = rect;
|
||||
iconRect.setWidth(iconSize);
|
||||
iconRect.setHeight(iconSize);
|
||||
iconRect.moveCenter(QPoint(rect.left() + iconSize / 2, rect.center().y()));
|
||||
drawStar(*painter, iconRect.center(), iconRect.width() * 0.5, QColor(64, 64, 192));
|
||||
drawStar(*painter, iconRect.center(), iconRect.width() * 0.5, color);
|
||||
|
||||
QRect textRect = rect;
|
||||
textRect.setLeft(iconRect.right() + margin);
|
||||
textRect.moveTop(rect.top() + (rect.height() - 2 * options.fontMetrics.lineSpacing()) / 2);
|
||||
|
||||
textRect.setHeight(options.fontMetrics.lineSpacing());
|
||||
|
||||
|
@ -135,18 +155,19 @@ QSize PDFBookmarkItemDelegate::sizeHint(const QStyleOptionViewItem& option, cons
|
|||
|
||||
void PDFBookmarkItemDelegate::drawStar(QPainter& painter, const QPointF& center, double size, const QColor& color) const
|
||||
{
|
||||
painter.save();
|
||||
pdf::PDFPainterStateGuard guard(&painter);
|
||||
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.setBrush(color);
|
||||
|
||||
QPainterPath path;
|
||||
double angle = M_PI / 5;
|
||||
double phase = -M_PI / 10;
|
||||
|
||||
for (int i = 0; i < 10; ++i)
|
||||
{
|
||||
double radius = (i % 2 == 0) ? size : size / 2.5;
|
||||
QPointF point(radius * cos(i * angle), radius * sin(i * angle));
|
||||
QPointF point(radius * cos(i * angle + phase), radius * sin(i * angle + phase));
|
||||
point += center;
|
||||
|
||||
if (i == 0)
|
||||
|
@ -159,15 +180,19 @@ void PDFBookmarkItemDelegate::drawStar(QPainter& painter, const QPointF& center,
|
|||
}
|
||||
}
|
||||
path.closeSubpath();
|
||||
|
||||
painter.drawPath(path);
|
||||
|
||||
painter.restore();
|
||||
}
|
||||
|
||||
QString PDFBookmarkItemDelegate::getPageText(const PDFBookmarkManager::Bookmark& bookmark) const
|
||||
{
|
||||
return tr("Page %1").arg(bookmark.pageIndex + 1);
|
||||
if (bookmark.isAuto)
|
||||
{
|
||||
return tr("Page %1 | Generated").arg(bookmark.pageIndex + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
return tr("Page %1").arg(bookmark.pageIndex + 1);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace pdfviewer
|
||||
|
|
|
@ -210,6 +210,9 @@ void PDFActionManager::initActions(QSize iconSize, bool initializeStampActions)
|
|||
setShortcut(GoToPreviousPage, QKeySequence::MoveToPreviousPage);
|
||||
setShortcut(GoToNextLine, QKeySequence::MoveToNextLine);
|
||||
setShortcut(GoToPreviousLine, QKeySequence::MoveToPreviousLine);
|
||||
setShortcut(BookmarkPage, QKeySequence("Ctrl+M"));
|
||||
setShortcut(BookmarkGoToNext, QKeySequence("Ctrl+."));
|
||||
setShortcut(BookmarkGoToPrevious, QKeySequence("Ctrl+,"));
|
||||
|
||||
if (hasActions({ CreateStickyNoteComment, CreateStickyNoteHelp, CreateStickyNoteInsert, CreateStickyNoteKey, CreateStickyNoteNewParagraph, CreateStickyNoteNote, CreateStickyNoteParagraph }))
|
||||
{
|
||||
|
@ -403,6 +406,8 @@ void PDFProgramController::initializeFormManager()
|
|||
void PDFProgramController::initializeBookmarkManager()
|
||||
{
|
||||
m_bookmarkManager = new PDFBookmarkManager(this);
|
||||
connect(m_bookmarkManager, &PDFBookmarkManager::bookmarkActivated, this, &PDFProgramController::onBookmarkActivated);
|
||||
updateBookmarkSettings();
|
||||
}
|
||||
|
||||
void PDFProgramController::initialize(Features features,
|
||||
|
@ -581,6 +586,30 @@ void PDFProgramController::initialize(Features features,
|
|||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionAutomaticDocumentRefresh);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkPage))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkPage);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkGoToNext))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkGoToNext);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkGoToPrevious))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkGoToPrevious);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkExport))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkExport);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkImport))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkImport);
|
||||
}
|
||||
if (QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkGenerateAutomatically))
|
||||
{
|
||||
connect(action, &QAction::triggered, this, &PDFProgramController::onActionBookmarkGenerateAutomatically);
|
||||
}
|
||||
|
||||
if (m_recentFileManager)
|
||||
{
|
||||
|
@ -1559,6 +1588,8 @@ void PDFProgramController::readSettings(Settings settingsFlags)
|
|||
{
|
||||
m_formManager->setAppearanceFlags(m_settings->getSettings().m_formAppearanceFlags);
|
||||
}
|
||||
|
||||
updateBookmarkSettings();
|
||||
}
|
||||
|
||||
if (settingsFlags.testFlag(PluginsSettings))
|
||||
|
@ -1712,6 +1743,13 @@ void PDFProgramController::onFileChanged(const QString& fileName)
|
|||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::onBookmarkActivated(int index, PDFBookmarkManager::Bookmark bookmark)
|
||||
{
|
||||
Q_UNUSED(index);
|
||||
|
||||
m_pdfWidget->getDrawWidgetProxy()->goToPage(bookmark.pageIndex);
|
||||
}
|
||||
|
||||
void PDFProgramController::updateFileInfo(const QString& fileName)
|
||||
{
|
||||
QFileInfo fileInfo(fileName);
|
||||
|
@ -1996,6 +2034,22 @@ void PDFProgramController::updateRenderingOptionActions()
|
|||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::updateBookmarkSettings()
|
||||
{
|
||||
const bool enable = m_settings->getSettings().m_autoGenerateBookmarks;
|
||||
|
||||
if (m_bookmarkManager)
|
||||
{
|
||||
m_bookmarkManager->setGenerateBookmarksAutomatically(enable);
|
||||
}
|
||||
|
||||
QAction* action = m_actionManager->getAction(PDFActionManager::BookmarkGenerateAutomatically);
|
||||
if (action)
|
||||
{
|
||||
action->setChecked(enable);
|
||||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::updateTitle()
|
||||
{
|
||||
if (m_pdfDocument)
|
||||
|
@ -2550,6 +2604,53 @@ void PDFProgramController::onActionAutomaticDocumentRefresh()
|
|||
updateFileWatcher();
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkPage()
|
||||
{
|
||||
std::vector<pdf::PDFInteger> currentPages = m_pdfWidget->getDrawWidget()->getCurrentPages();
|
||||
if (!currentPages.empty())
|
||||
{
|
||||
m_bookmarkManager->toggleBookmark(currentPages.front());
|
||||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkGoToNext()
|
||||
{
|
||||
m_bookmarkManager->goToNextBookmark();
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkGoToPrevious()
|
||||
{
|
||||
m_bookmarkManager->goToPreviousBookmark();
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkExport()
|
||||
{
|
||||
QFileInfo fileInfo(m_fileInfo.originalFileName);
|
||||
QString saveFileName = QFileDialog::getSaveFileName(m_mainWindow, tr("Export Bookmarks As"), fileInfo.dir().absoluteFilePath(m_fileInfo.originalFileName).replace(".pdf", ".json"), tr("JSON (*.json);;All files (*.*)"));
|
||||
if (!saveFileName.isEmpty())
|
||||
{
|
||||
m_bookmarkManager->saveToFile(saveFileName);
|
||||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkImport()
|
||||
{
|
||||
QFileInfo fileInfo(m_fileInfo.originalFileName);
|
||||
QString fileName = QFileDialog::getOpenFileName(m_mainWindow, tr("Select PDF document"), fileInfo.dir().absolutePath(), tr("JSON (*.json)"));
|
||||
if (!fileName.isEmpty())
|
||||
{
|
||||
m_bookmarkManager->loadFromFile(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
void PDFProgramController::onActionBookmarkGenerateAutomatically(bool checked)
|
||||
{
|
||||
auto settings = m_settings->getSettings();
|
||||
settings.m_autoGenerateBookmarks = checked;
|
||||
m_settings->setSettings(settings);
|
||||
m_bookmarkManager->setGenerateBookmarksAutomatically(checked);
|
||||
}
|
||||
|
||||
void PDFProgramController::onPageRenderingErrorsChanged(pdf::PDFInteger pageIndex, int errorsCount)
|
||||
{
|
||||
if (errorsCount > 0)
|
||||
|
|
|
@ -178,6 +178,12 @@ public:
|
|||
ToolScreenshot,
|
||||
ToolExtractImage,
|
||||
DeveloperCreateInstaller,
|
||||
BookmarkPage,
|
||||
BookmarkGoToNext,
|
||||
BookmarkGoToPrevious,
|
||||
BookmarkExport,
|
||||
BookmarkImport,
|
||||
BookmarkGenerateAutomatically,
|
||||
LastAction
|
||||
};
|
||||
|
||||
|
@ -367,6 +373,12 @@ private:
|
|||
void onActionGetSource();
|
||||
void onActionBecomeSponsor();
|
||||
void onActionAutomaticDocumentRefresh();
|
||||
void onActionBookmarkPage();
|
||||
void onActionBookmarkGoToNext();
|
||||
void onActionBookmarkGoToPrevious();
|
||||
void onActionBookmarkExport();
|
||||
void onActionBookmarkImport();
|
||||
void onActionBookmarkGenerateAutomatically(bool checked);
|
||||
|
||||
void onDrawSpaceChanged();
|
||||
void onPageLayoutChanged();
|
||||
|
@ -377,6 +389,7 @@ private:
|
|||
void onViewerSettingsChanged();
|
||||
void onColorManagementSystemChanged();
|
||||
void onFileChanged(const QString& fileName);
|
||||
void onBookmarkActivated(int index, PDFBookmarkManager::Bookmark bookmark);
|
||||
|
||||
void updateMagnifierToolSettings();
|
||||
void updateUndoRedoSettings();
|
||||
|
@ -384,6 +397,7 @@ private:
|
|||
void updateTitle();
|
||||
void updatePageLayoutActions();
|
||||
void updateRenderingOptionActions();
|
||||
void updateBookmarkSettings();
|
||||
|
||||
void setPageLayout(pdf::PageLayout pageLayout);
|
||||
void updateFileInfo(const QString& fileName);
|
||||
|
|
|
@ -134,6 +134,9 @@ PDFSidebarWidget::PDFSidebarWidget(pdf::PDFDrawWidgetProxy* proxy,
|
|||
m_bookmarkItemModel = new PDFBookmarkItemModel(bookmarkManager, this);
|
||||
ui->bookmarksView->setModel(m_bookmarkItemModel);
|
||||
ui->bookmarksView->setItemDelegate(new PDFBookmarkItemDelegate(bookmarkManager, this));
|
||||
connect(m_bookmarkManager, &PDFBookmarkManager::bookmarkActivated, this, &PDFSidebarWidget::onBookmarkActivated);
|
||||
connect(ui->bookmarksView->selectionModel(), &QItemSelectionModel::currentChanged, this, &PDFSidebarWidget::onBookmarsCurrentIndexChanged);
|
||||
connect(ui->bookmarksView, &QListView::clicked, this, &PDFSidebarWidget::onBookmarkClicked);
|
||||
|
||||
m_pageInfo[Invalid] = { nullptr, ui->emptyPage };
|
||||
m_pageInfo[OptionalContent] = { ui->optionalContentButton, ui->optionalContentPage };
|
||||
|
@ -956,6 +959,46 @@ void PDFSidebarWidget::onOutlineItemsChanged()
|
|||
}
|
||||
}
|
||||
|
||||
void PDFSidebarWidget::onBookmarkActivated(int index, PDFBookmarkManager::Bookmark bookmark)
|
||||
{
|
||||
if (m_bookmarkChangeInProgress)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pdf::PDFTemporaryValueChange<bool> guard(&m_bookmarkChangeInProgress, true);
|
||||
QModelIndex currentIndex = m_bookmarkItemModel->index(index, 0, QModelIndex());
|
||||
ui->bookmarksView->selectionModel()->select(currentIndex, QItemSelectionModel::SelectCurrent);
|
||||
ui->bookmarksView->setCurrentIndex(currentIndex);
|
||||
}
|
||||
|
||||
void PDFSidebarWidget::onBookmarsCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous)
|
||||
{
|
||||
Q_UNUSED(previous);
|
||||
|
||||
if (m_bookmarkChangeInProgress)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pdf::PDFTemporaryValueChange<bool> guard(&m_bookmarkChangeInProgress, true);
|
||||
m_bookmarkManager->goToBookmark(current.row(), false);
|
||||
}
|
||||
|
||||
void PDFSidebarWidget::onBookmarkClicked(const QModelIndex& index)
|
||||
{
|
||||
if (m_bookmarkChangeInProgress)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (index == ui->bookmarksView->currentIndex())
|
||||
{
|
||||
pdf::PDFTemporaryValueChange<bool> guard(&m_bookmarkChangeInProgress, true);
|
||||
m_bookmarkManager->goToCurrentBookmark();
|
||||
}
|
||||
}
|
||||
|
||||
void PDFSidebarWidget::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
|
|
|
@ -119,6 +119,9 @@ private:
|
|||
void onSignatureCustomContextMenuRequested(const QPoint &pos);
|
||||
void onOutlineTreeViewContextMenuRequested(const QPoint &pos);
|
||||
void onOutlineItemsChanged();
|
||||
void onBookmarkActivated(int index, PDFBookmarkManager::Bookmark bookmark);
|
||||
void onBookmarsCurrentIndexChanged(const QModelIndex& current, const QModelIndex& previous);
|
||||
void onBookmarkClicked(const QModelIndex& index);
|
||||
|
||||
struct PageInfo
|
||||
{
|
||||
|
@ -142,6 +145,7 @@ private:
|
|||
std::map<Page, PageInfo> m_pageInfo;
|
||||
std::vector<pdf::PDFSignatureVerificationResult> m_signatures;
|
||||
std::vector<pdf::PDFCertificateInfo> m_certificateInfos;
|
||||
bool m_bookmarkChangeInProgress = false;
|
||||
};
|
||||
|
||||
} // namespace pdfviewer
|
||||
|
|
|
@ -194,6 +194,12 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget* parent) :
|
|||
m_actionManager->setAction(PDFActionManager::ToolScreenshot, ui->actionScreenshot);
|
||||
m_actionManager->setAction(PDFActionManager::ToolExtractImage, ui->actionExtractImage);
|
||||
m_actionManager->setAction(PDFActionManager::DeveloperCreateInstaller, ui->actionDeveloperCreateInstaller);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkPage, ui->actionBookmarkPage);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGoToNext, ui->actionGotoNextBookmark);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGoToPrevious, ui->actionGotoPreviousBookmark);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkExport, ui->actionBookmarkExport);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkImport, ui->actionBookmarkImport);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGenerateAutomatically, ui->actionBookmarkAutoGenerate);
|
||||
m_actionManager->initActions(pdf::PDFWidgetUtils::scaleDPI(this, QSize(24, 24)), true);
|
||||
|
||||
for (QAction* action : m_programController->getRecentFileManager()->getActions())
|
||||
|
|
|
@ -46,12 +46,25 @@
|
|||
<property name="title">
|
||||
<string>Go To</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuBookmarkSettings">
|
||||
<property name="title">
|
||||
<string>Bookmark Settings</string>
|
||||
</property>
|
||||
<addaction name="actionBookmarkExport"/>
|
||||
<addaction name="actionBookmarkImport"/>
|
||||
<addaction name="actionBookmarkAutoGenerate"/>
|
||||
</widget>
|
||||
<addaction name="actionGoToDocumentStart"/>
|
||||
<addaction name="actionGoToDocumentEnd"/>
|
||||
<addaction name="actionGoToPreviousPage"/>
|
||||
<addaction name="actionGoToNextPage"/>
|
||||
<addaction name="actionGoToPreviousLine"/>
|
||||
<addaction name="actionGoToNextLine"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionBookmarkPage"/>
|
||||
<addaction name="actionGotoPreviousBookmark"/>
|
||||
<addaction name="actionGotoNextBookmark"/>
|
||||
<addaction name="menuBookmarkSettings"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuView">
|
||||
<property name="title">
|
||||
|
@ -1051,6 +1064,99 @@
|
|||
<string>Convert the colored images to monochromatic to create a bitonal document.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkPage">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Bookmark Page</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Bookmark Page</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Bookmark page for fast navigation.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGotoNextBookmark">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark-next.svg</normaloff>:/resources/bookmark-next.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go to Next Bookmark</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go to Next Bookmark</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Navigates to the next bookmarked page.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGotoPreviousBookmark">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark-previous.svg</normaloff>:/resources/bookmark-previous.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go to Previous Bookmark</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go to Previous Bookmark</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Navigates to the previous bookmarked page.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkExport">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Export Bookmarks</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Export Bookmarks</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Export bookmarks to the file.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkImport">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Import Bookmarks</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Import Bookmarks</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Import bookmarks from the file.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkAutoGenerate">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Generate Bookmarks Automatically</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Generate Bookmarks Automatically</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>If checked, bookmarks for main document chapters are generated automatically.</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources>
|
||||
|
|
|
@ -151,6 +151,12 @@ PDFViewerMainWindowLite::PDFViewerMainWindowLite(QWidget* parent) :
|
|||
m_actionManager->setAction(PDFActionManager::PageLayoutTwoPages, ui->actionPageLayoutTwoPages);
|
||||
m_actionManager->setAction(PDFActionManager::PageLayoutTwoColumns, ui->actionPageLayoutTwoColumns);
|
||||
m_actionManager->setAction(PDFActionManager::PageLayoutFirstPageOnRightSide, ui->actionFirstPageOnRightSide);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkPage, ui->actionBookmarkPage);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGoToNext, ui->actionGotoNextBookmark);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGoToPrevious, ui->actionGotoPreviousBookmark);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkExport, ui->actionBookmarkExport);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkImport, ui->actionBookmarkImport);
|
||||
m_actionManager->setAction(PDFActionManager::BookmarkGenerateAutomatically, ui->actionBookmarkAutoGenerate);
|
||||
m_actionManager->initActions(pdf::PDFWidgetUtils::scaleDPI(this, QSize(24, 24)), true);
|
||||
|
||||
for (QAction* action : m_programController->getRecentFileManager()->getActions())
|
||||
|
|
|
@ -42,12 +42,26 @@
|
|||
<property name="title">
|
||||
<string>Go To</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuBookmarkSettings">
|
||||
<property name="title">
|
||||
<string>Bookmark Settings</string>
|
||||
</property>
|
||||
<addaction name="actionBookmarkExport"/>
|
||||
<addaction name="actionBookmarkImport"/>
|
||||
<addaction name="actionBookmarkAutoGenerate"/>
|
||||
</widget>
|
||||
<addaction name="actionGoToDocumentStart"/>
|
||||
<addaction name="actionGoToDocumentEnd"/>
|
||||
<addaction name="actionGoToPreviousPage"/>
|
||||
<addaction name="actionGoToNextPage"/>
|
||||
<addaction name="actionGoToPreviousLine"/>
|
||||
<addaction name="actionGoToNextLine"/>
|
||||
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionBookmarkPage"/>
|
||||
<addaction name="actionGotoPreviousBookmark"/>
|
||||
<addaction name="actionGotoNextBookmark"/>
|
||||
<addaction name="menuBookmarkSettings"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuView">
|
||||
<property name="title">
|
||||
|
@ -543,6 +557,100 @@
|
|||
<string>Become a Sponsor</string>
|
||||
</property>
|
||||
</action>
|
||||
|
||||
<action name="actionBookmarkPage">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Bookmark Page</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Bookmark Page</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Bookmark page for fast navigation.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGotoNextBookmark">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark-next.svg</normaloff>:/resources/bookmark-next.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go to Next Bookmark</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go to Next Bookmark</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Navigates to the next bookmarked page.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGotoPreviousBookmark">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark-previous.svg</normaloff>:/resources/bookmark-previous.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go to Previous Bookmark</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go to Previous Bookmark</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Navigates to the previous bookmarked page.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkExport">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Export Bookmarks</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Export Bookmarks</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Export bookmarks to the file.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkImport">
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Import Bookmarks</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Import Bookmarks</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Import bookmarks from the file.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBookmarkAutoGenerate">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="pdf4qtviewer.qrc">
|
||||
<normaloff>:/resources/bookmark.svg</normaloff>:/resources/bookmark.svg</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Generate Bookmarks Automatically</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Generate Bookmarks Automatically</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>If checked, bookmarks for main document chapters are generated automatically.</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources>
|
||||
|
|
|
@ -104,6 +104,10 @@ void PDFViewerSettings::readSettings(QSettings& settings, const pdf::PDFCMSSetti
|
|||
m_settings.m_signatureUseSystemStore = settings.value("signatureUseSystemStore", defaultSettings.m_signatureUseSystemStore).toBool();
|
||||
settings.endGroup();
|
||||
|
||||
settings.beginGroup("Bookmarks");
|
||||
m_settings.m_autoGenerateBookmarks = settings.value("autoGenerateBookmarks", defaultSettings.m_autoGenerateBookmarks).toBool();
|
||||
settings.endGroup();
|
||||
|
||||
Q_EMIT settingsChanged();
|
||||
}
|
||||
|
||||
|
@ -174,6 +178,10 @@ void PDFViewerSettings::writeSettings(QSettings& settings)
|
|||
settings.setValue("signatureIgnoreCertificateValidityTime", m_settings.m_signatureIgnoreCertificateValidityTime);
|
||||
settings.setValue("signatureUseSystemStore", m_settings.m_signatureUseSystemStore);
|
||||
settings.endGroup();
|
||||
|
||||
settings.beginGroup("Bookmarks");
|
||||
settings.setValue("autoGenerateBookmarks", m_settings.m_autoGenerateBookmarks);
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
QString PDFViewerSettings::getDirectory() const
|
||||
|
@ -287,7 +295,8 @@ PDFViewerSettings::Settings::Settings() :
|
|||
m_signatureVerificationEnabled(true),
|
||||
m_signatureTreatWarningsAsErrors(false),
|
||||
m_signatureIgnoreCertificateValidityTime(false),
|
||||
m_signatureUseSystemStore(true)
|
||||
m_signatureUseSystemStore(true),
|
||||
m_autoGenerateBookmarks(true)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -91,6 +91,9 @@ public:
|
|||
bool m_signatureTreatWarningsAsErrors;
|
||||
bool m_signatureIgnoreCertificateValidityTime;
|
||||
bool m_signatureUseSystemStore;
|
||||
|
||||
// Bookmarks settings
|
||||
bool m_autoGenerateBookmarks;
|
||||
};
|
||||
|
||||
const Settings& getSettings() const { return m_settings; }
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg815"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
sodipodi:docname="bookmark-next.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata821">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs819" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2035"
|
||||
id="namedview817"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.4279174"
|
||||
inkscape:cx="137.55859"
|
||||
inkscape:cy="137.21551"
|
||||
inkscape:window-x="-13"
|
||||
inkscape:window-y="-13"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg815" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:26.45669291;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
id="path839"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="259.20364"
|
||||
sodipodi:cy="269.65189"
|
||||
sodipodi:r1="203.30641"
|
||||
sodipodi:r2="101.65321"
|
||||
sodipodi:arg1="-1.585122"
|
||||
sodipodi:arg2="-0.95680346"
|
||||
inkscape:flatsided="false"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 256.29124,66.366336 61.47844,120.198874 133.87003,17.49813 -95.31804,95.61296 24.7264,132.72518 L 260.65984,371.29467 142.07158,435.82522 162.9856,302.44616 64.967615,209.60305 198.28142,188.27708 Z"
|
||||
inkscape:transform-center-x="0.89998123"
|
||||
inkscape:transform-center-y="-18.55611" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#000000;stroke-width:31.68950462;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 220.58404,237.11509 v 70.93287 c 0,14.53213 13.81864,23.63982 24.86768,16.38716 l 26.95074,-17.71983 26.95662,-17.78679 c 11.03729,-7.24597 11.03729,-25.42788 0,-32.68725 l -26.95662,-17.7734 -26.95074,-17.72652 c -11.04904,-7.27945 -24.86768,1.76127 -24.86768,16.37376 z"
|
||||
id="path1701" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1,75 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg815"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
sodipodi:docname="bookmark-previous.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata821">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs819" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2035"
|
||||
id="namedview817"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.21459961"
|
||||
inkscape:cx="-2504.7782"
|
||||
inkscape:cy="317.10796"
|
||||
inkscape:window-x="-13"
|
||||
inkscape:window-y="-13"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg815" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:26.45669291;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
id="path839"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="259.20364"
|
||||
sodipodi:cy="269.65189"
|
||||
sodipodi:r1="203.30641"
|
||||
sodipodi:r2="101.65321"
|
||||
sodipodi:arg1="-1.585122"
|
||||
sodipodi:arg2="-0.95680346"
|
||||
inkscape:flatsided="false"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 256.29124,66.366336 61.47844,120.198874 133.87003,17.49813 -95.31804,95.61296 24.7264,132.72518 L 260.65984,371.29467 142.07158,435.82522 162.9856,302.44616 64.967615,209.60305 198.28142,188.27708 Z"
|
||||
inkscape:transform-center-x="0.89998123"
|
||||
inkscape:transform-center-y="-18.55611" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:none;stroke:#000000;stroke-width:31.68950462;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 292.61298,235.87946 v 70.93287 c 0,14.53213 -13.81864,23.63982 -24.86768,16.38716 l -26.95074,-17.71983 -26.95662,-17.78679 c -11.03729,-7.24597 -11.03729,-25.42788 0,-32.68725 l 26.95662,-17.7734 26.95074,-17.72652 c 11.04904,-7.27945 24.86768,1.76127 24.86768,16.37376 z"
|
||||
id="path1701" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg815"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
sodipodi:docname="sidebar-favourites.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata821">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs819" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2035"
|
||||
id="namedview817"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.2139587"
|
||||
inkscape:cx="535.31725"
|
||||
inkscape:cy="132.65123"
|
||||
inkscape:window-x="-13"
|
||||
inkscape:window-y="-13"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg815" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:26.45669291;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
id="path839"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="259.20364"
|
||||
sodipodi:cy="269.65189"
|
||||
sodipodi:r1="203.30641"
|
||||
sodipodi:r2="101.65321"
|
||||
sodipodi:arg1="-1.585122"
|
||||
sodipodi:arg2="-0.95680346"
|
||||
inkscape:flatsided="false"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 256.29124,66.366336 61.47844,120.198874 133.87003,17.49813 -95.31804,95.61296 24.7264,132.72518 L 260.65984,371.29467 142.07158,435.82522 162.9856,302.44616 64.967615,209.60305 198.28142,188.27708 Z"
|
||||
inkscape:transform-center-x="0.89998123"
|
||||
inkscape:transform-center-y="-18.55611" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -43,16 +43,28 @@
|
|||
inkscape:window-height="2035"
|
||||
id="namedview817"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.30348968"
|
||||
inkscape:cx="-2950.1732"
|
||||
inkscape:cy="277.06973"
|
||||
inkscape:zoom="1.2139587"
|
||||
inkscape:cx="535.31725"
|
||||
inkscape:cy="132.65123"
|
||||
inkscape:window-x="-13"
|
||||
inkscape:window-y="-13"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg815" />
|
||||
<path
|
||||
style="fill:#000000;stroke-width:0.5"
|
||||
d="m 139.03566,421.94715 c -2.79737,-0.85185 -5.79201,-3.2299 -7.58405,-6.02256 -1.38453,-2.1576 -1.70923,-3.19414 -1.84701,-5.8962 -0.14818,-2.90575 0.12519,-4.10246 2.405,-10.52839 1.41469,-3.9875 4.55587,-13.1 6.98039,-20.25 2.42452,-7.15 8.16662,-23.9125 12.76022,-37.25 10.50154,-30.49115 19.75557,-58.03253 19.7309,-58.72206 -0.0189,-0.52992 -4.92747,-4.22387 -27.73111,-20.86941 -3.575,-2.60957 -18.45339,-13.61279 -33.0631,-24.4516 -14.609695,-10.83881 -29.86493,-22.13597 -33.900515,-25.1048 -8.016685,-5.89759 -9.791975,-7.96334 -10.83006,-12.60198 -1.16825,-5.22029 1.75494,-11.13603 6.780105,-13.72108 l 2.48643,-1.27907 64.45687,-0.25 64.45687,-0.25 4.95111,-14 c 9.84582,-27.84052 18.59349,-52.75333 22.91133,-65.25 12.57291,-36.388445 11.92763,-34.83447 15.41594,-37.124915 3.76617,-2.472895 7.65066,-3.013205 11.61282,-1.615275 4.54841,1.60477 7.5252,5.1016 9.52236,11.18591 3.41941,10.417175 24.25254,69.83815 32.84417,93.67928 l 4.81995,13.375 63.76786,0.022 c 68.86041,0.0237 65.60095,-0.10273 69.25773,2.68643 5.43773,4.14757 6.32897,13.06779 1.83878,18.40408 -0.72796,0.86513 -6.6122,5.50844 -13.07611,10.31847 -6.4639,4.81003 -21.12961,15.73706 -32.59047,24.28229 -11.46085,8.54523 -25.18585,18.73451 -30.5,22.64284 -5.31414,3.90832 -13.49778,9.92958 -18.18586,13.38056 l -8.52378,6.27452 4.60426,13.61944 c 2.53235,7.49068 7.23127,21.26943 10.44205,30.61943 3.21079,9.35 8.60821,25.1 11.99428,35 3.38606,9.9 8.20409,23.92662 10.70673,31.17026 5.00498,14.48644 5.27817,16.09668 3.52561,20.78082 -1.78384,4.76773 -6.69274,7.99046 -12.22536,8.02602 -3.72318,0.024 -4.28878,-0.29608 -17.25,-9.75992 -5.3625,-3.91551 -12.45,-9.03772 -15.75,-11.38269 -3.3,-2.34497 -8.71337,-6.19203 -12.02971,-8.54904 -3.31633,-2.357 -11.48374,-8.22295 -18.14978,-13.03545 -6.66605,-4.8125 -16.56996,-11.9 -22.0087,-15.75 -5.43875,-3.85 -13.8661,-9.86019 -18.72745,-13.35597 l -8.83882,-6.35598 -14.1826,10.17114 c -7.80043,5.59413 -18.88068,13.60572 -24.62277,17.80354 -10.5153,7.68731 -12.89484,9.43081 -30.69017,22.48681 -5.3625,3.93434 -12,8.80233 -14.75,10.81777 -2.75,2.01544 -8.2625,6.07362 -12.25,9.01819 -3.9875,2.94456 -8.21074,5.89541 -9.38497,6.55743 -2.44103,1.37625 -6.90762,1.86779 -9.57937,1.05421 z M 180,365.74416 c 12.20892,-9.0382 32.34222,-23.69689 54.93082,-39.99416 3.43044,-2.475 6.29932,-4.725 6.37529,-5 0.076,-0.275 -1.80418,-1.85 -4.17811,-3.5 -2.37392,-1.65 -7.70513,-5.4946 -11.84712,-8.54355 -16.45615,-12.11352 -27.85131,-20.30252 -28.01669,-20.13389 -0.35952,0.36659 -11.41106,32.16678 -21.26102,61.17744 -3.22606,9.50154 -6.69433,19.14572 -8.81029,24.49864 -0.3916,0.99065 -0.38294,0.99098 1.08118,0.0411 0.81176,-0.52666 6.08844,-4.37216 11.72594,-8.54558 z m 162.19338,7.13084 c -0.41924,-1.16875 -3.35012,-9.6625 -6.51306,-18.875 -15.3913,-44.82929 -22.70379,-65.48939 -23.18032,-65.49185 -0.28679,-0.002 -14.64506,10.30154 -27.5,19.7331 -4.8125,3.53088 -10.60625,7.7753 -12.875,9.43204 -2.26875,1.65674 -4.11976,3.13925 -4.11334,3.29448 0.006,0.15522 2.98766,2.43192 6.625,5.05931 3.63734,2.62741 11.78834,8.52736 18.11334,13.11103 10.32734,7.48413 23.19979,16.70141 39,27.92587 3.025,2.14896 6.625,4.80197 8,5.89558 1.375,1.0936 2.65877,2.00008 2.85282,2.01441 0.19405,0.0143 0.01,-0.93022 -0.40944,-2.09897 z M 198.69993,237.48095 c 4.91075,-14.58548 8.82349,-26.62419 8.695,-26.75269 -0.1285,-0.1285 -20.44134,-0.17618 -45.13965,-0.10594 l -44.90601,0.12768 9.87824,7.25 c 16.71033,12.2643 52.7714,38.9228 57.52249,42.52405 2.475,1.87601 4.6173,3.42556 4.76065,3.44344 0.14336,0.0179 4.27854,-11.90107 9.18928,-26.48654 z m 131.55489,18.96204 c 8.37364,-6.22386 20.01545,-14.80142 44.91847,-33.09545 5.54219,-4.07135 11.58831,-8.45885 13.43583,-9.75 1.84751,-1.29115 3.36627,-2.51629 3.375,-2.72254 0.009,-0.20625 -20.26035,-0.375 -45.04241,-0.375 h -45.05829 l 0.27138,1.125 c 0.26839,1.11263 13.59221,40.36652 15.99548,47.125 1.87238,5.26551 1.90355,5.32494 2.53311,4.83075 0.31163,-0.24462 4.61878,-3.45661 9.57143,-7.13776 z m -48.53136,-60.99938 c 0.42896,-0.42953 -25.58476,-76.76693 -26.54687,-77.90194 -0.0971,-0.11458 -0.29176,-0.0932 -0.43253,0.0476 C 254.16118,118.17216 228,193.90628 228,195.01079 c 0,0.24982 2.30625,0.53052 5.125,0.62377 8.72051,0.28849 48.27486,0.13307 48.59846,-0.19095 z"
|
||||
id="path825"
|
||||
inkscape:connector-curvature="0" />
|
||||
sodipodi:type="star"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:26.45669291;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
id="path839"
|
||||
sodipodi:sides="5"
|
||||
sodipodi:cx="259.20364"
|
||||
sodipodi:cy="269.65189"
|
||||
sodipodi:r1="203.30641"
|
||||
sodipodi:r2="101.65321"
|
||||
sodipodi:arg1="-1.585122"
|
||||
sodipodi:arg2="-0.95680346"
|
||||
inkscape:flatsided="false"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="m 256.29124,66.366336 61.47844,120.198874 133.87003,17.49813 -95.31804,95.61296 24.7264,132.72518 L 260.65984,371.29467 142.07158,435.82522 162.9856,302.44616 64.967615,209.60305 198.28142,188.27708 Z"
|
||||
inkscape:transform-center-x="0.89998123"
|
||||
inkscape:transform-center-y="-18.55611" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 2.4 KiB |
Loading…
Reference in New Issue