Issue #54: Finishing of bookmarking

This commit is contained in:
Jakub Melka 2023-12-17 18:11:49 +01:00
parent 7a5f37e38f
commit e9ca3a4a82
18 changed files with 808 additions and 56 deletions

View File

@ -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>

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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())

View File

@ -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>

View File

@ -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())

View File

@ -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>

View File

@ -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)
{
}

View File

@ -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; }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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