Recent file manager

This commit is contained in:
Jakub Melka 2020-02-01 11:56:40 +01:00
parent e4effbc29a
commit af83f99f51
10 changed files with 453 additions and 3 deletions

View File

@ -37,6 +37,7 @@ SOURCES += \
pdfaboutdialog.cpp \
pdfadvancedfindwidget.cpp \
pdfdocumentpropertiesdialog.cpp \
pdfrecentfilemanager.cpp \
pdfsendmail.cpp \
pdfsidebarwidget.cpp \
pdfviewermainwindow.cpp \
@ -48,6 +49,7 @@ HEADERS += \
pdfaboutdialog.h \
pdfadvancedfindwidget.h \
pdfdocumentpropertiesdialog.h \
pdfrecentfilemanager.h \
pdfsendmail.h \
pdfsidebarwidget.h \
pdfviewermainwindow.h \

View File

@ -32,5 +32,6 @@
<file>resources/find-next.svg</file>
<file>resources/find-previous.svg</file>
<file>resources/select-text.svg</file>
<file>resources/ui.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,105 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of PdfForQt.
//
// PdfForQt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PdfForQt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with PDFForQt. If not, see <https://www.gnu.org/licenses/>.
#include "pdfrecentfilemanager.h"
namespace pdfviewer
{
PDFRecentFileManager::PDFRecentFileManager(QObject* parent) :
BaseClass(parent),
m_recentFilesLimit(DEFAULT_RECENT_FILES),
m_actions()
{
// Initialize actions
int index = 0;
for (auto it = m_actions.begin(); it != m_actions.end(); ++it)
{
QAction* recentFileAction = new QAction(this);
recentFileAction->setObjectName(QString("actionRecentFile%1").arg(++index));
recentFileAction->setVisible(false);
connect(recentFileAction, &QAction::triggered, this, &PDFRecentFileManager::onRecentFileActionTriggered);
*it = recentFileAction;
}
}
void PDFRecentFileManager::addRecentFile(QString fileName)
{
m_recentFiles.removeAll(fileName);
m_recentFiles.push_front(fileName);
update();
}
void PDFRecentFileManager::setRecentFiles(QStringList recentFiles)
{
if (m_recentFiles != recentFiles)
{
m_recentFiles = qMove(recentFiles);
update();
}
}
void PDFRecentFileManager::setRecentFilesLimit(int recentFilesLimit)
{
recentFilesLimit = qBound(getMinimumRecentFiles(), recentFilesLimit, getMaximumRecentFiles());
if (m_recentFilesLimit != recentFilesLimit)
{
m_recentFilesLimit = recentFilesLimit;
update();
}
}
void PDFRecentFileManager::update()
{
while (m_recentFiles.size() > m_recentFilesLimit)
{
m_recentFiles.pop_back();
}
for (int i = 0; i < m_actions.size(); ++i)
{
QAction* recentFileAction = m_actions[i];
if (i < m_recentFiles.size())
{
recentFileAction->setData(m_recentFiles[i]);
recentFileAction->setText(m_recentFiles[i]);
recentFileAction->setVisible(true);
}
else
{
recentFileAction->setData(QVariant());
recentFileAction->setText(tr("Recent file dummy %1").arg(i + 1));
recentFileAction->setVisible(false);
}
}
}
void PDFRecentFileManager::onRecentFileActionTriggered()
{
QAction* action = qobject_cast<QAction*>(sender());
Q_ASSERT(action);
QVariant data = action->data();
if (data.type() == QVariant::String)
{
emit fileOpenRequest(data.toString());
}
}
} // namespace pdfviewer

View File

@ -0,0 +1,84 @@
// Copyright (C) 2020 Jakub Melka
//
// This file is part of PdfForQt.
//
// PdfForQt is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// PdfForQt is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with PDFForQt. If not, see <https://www.gnu.org/licenses/>.
#ifndef PDFRECENTFILEMANAGER_H
#define PDFRECENTFILEMANAGER_H
#include <QObject>
#include <QAction>
#include <array>
namespace pdfviewer
{
/// Recent file manager, manages list of recent files.
class PDFRecentFileManager : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
static constexpr const int MAXIMUM_RECENT_FILES = 9;
static constexpr const int DEFAULT_RECENT_FILES = 5;
public:
explicit PDFRecentFileManager(QObject* parent);
/// Adds recent file to recent file list and updates the actions.
/// New recent file is added as first file.
/// \param fileName New recent file
void addRecentFile(QString fileName);
/// Returns a list of recent files
const QStringList& getRecentFiles() const { return m_recentFiles; }
/// Sets a list of recent files, and udpates manager
void setRecentFiles(QStringList recentFiles);
/// Returns a limit of recent files count
int getRecentFilesLimit() const { return m_recentFilesLimit; }
/// Sets a new limit of recent files count
void setRecentFilesLimit(int recentFilesLimit);
/// Returns list of recent files actions
const std::array<QAction*, MAXIMUM_RECENT_FILES>& getActions() const { return m_actions; }
static constexpr int getMinimumRecentFiles() { return 1; }
static constexpr int getDefaultRecentFiles() { return DEFAULT_RECENT_FILES; }
static constexpr int getMaximumRecentFiles() { return MAXIMUM_RECENT_FILES; }
signals:
void fileOpenRequest(QString fileName);
private:
/// Updates recent files actions / recent file list
void update();
/// Reaction on recent file action triggered
void onRecentFileActionTriggered();
int m_recentFilesLimit;
std::array<QAction*, MAXIMUM_RECENT_FILES> m_actions;
QStringList m_recentFiles;
};
} // namespace pdfviewer
#endif // PDFRECENTFILEMANAGER_H

View File

@ -66,6 +66,7 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::PDFViewerMainWindow),
m_CMSManager(new pdf::PDFCMSManager(this)),
m_recentFileManager(new PDFRecentFileManager(this)),
m_settings(new PDFViewerSettings(this)),
m_pdfWidget(nullptr),
m_sidebarWidget(nullptr),
@ -107,9 +108,16 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget* parent) :
ui->actionDeselectText->setShortcut(QKeySequence::Deselect);
ui->actionCopyText->setShortcut(QKeySequence::Copy);
for (QAction* action : m_recentFileManager->getActions())
{
ui->menuFile->insertAction(ui->actionQuit, action);
}
ui->menuFile->insertSeparator(ui->actionQuit);
connect(ui->actionOpen, &QAction::triggered, this, &PDFViewerMainWindow::onActionOpenTriggered);
connect(ui->actionClose, &QAction::triggered, this, &PDFViewerMainWindow::onActionCloseTriggered);
connect(ui->actionQuit, &QAction::triggered, this, &PDFViewerMainWindow::onActionQuitTriggered);
connect(m_recentFileManager, &PDFRecentFileManager::fileOpenRequest, this, &PDFViewerMainWindow::openDocument);
auto createGoToAction = [this](QMenu* menu, QString name, QString text, QKeySequence::StandardKey key, pdf::PDFDrawWidgetProxy::Operation operation, QString iconPath)
{
@ -651,6 +659,12 @@ void PDFViewerMainWindow::readActionSettings()
}
}
settings.endGroup();
// Load recent files
settings.beginGroup("RecentFiles");
m_recentFileManager->setRecentFilesLimit(settings.value("MaximumRecentFilesCount", PDFRecentFileManager::getDefaultRecentFiles()).toInt());
m_recentFileManager->setRecentFiles(settings.value("RecentFileList", QStringList()).toStringList());
settings.endGroup();
}
void PDFViewerMainWindow::writeSettings()
@ -673,6 +687,12 @@ void PDFViewerMainWindow::writeSettings()
}
}
settings.endGroup();
// Save recent files
settings.beginGroup("RecentFiles");
settings.setValue("MaximumRecentFilesCount", m_recentFileManager->getRecentFilesLimit());
settings.setValue("RecentFileList", m_recentFileManager->getRecentFiles());
settings.endGroup();
}
void PDFViewerMainWindow::updateTitle()
@ -881,6 +901,9 @@ void PDFViewerMainWindow::onDocumentReadingFinished()
m_settings->setDirectory(fileInfo.dir().absolutePath());
m_currentFile = fileInfo.fileName();
// We add file to recent files only, if we have successfully read the document
m_recentFileManager->addRecentFile(m_fileInfo.originalFileName);
m_pdfDocument = result.document;
setDocument(m_pdfDocument.data());
@ -1080,12 +1103,16 @@ void PDFViewerMainWindow::on_actionRendering_Errors_triggered()
void PDFViewerMainWindow::on_actionOptions_triggered()
{
PDFViewerSettingsDialog dialog(m_settings->getSettings(), m_settings->getColorManagementSystemSettings(), getActions(), m_CMSManager, this);
PDFViewerSettingsDialog::OtherSettings otherSettings;
otherSettings.maximumRecentFileCount = m_recentFileManager->getRecentFilesLimit();
PDFViewerSettingsDialog dialog(m_settings->getSettings(), m_settings->getColorManagementSystemSettings(), otherSettings, getActions(), m_CMSManager, this);
if (dialog.exec() == QDialog::Accepted)
{
m_settings->setSettings(dialog.getSettings());
m_settings->setColorManagementSystemSettings(dialog.getCMSSettings());
m_CMSManager->setSettings(m_settings->getColorManagementSystemSettings());
m_recentFileManager->setRecentFilesLimit(dialog.getOtherSettings().maximumRecentFileCount);
}
}

View File

@ -26,6 +26,7 @@
#include "pdfdocumentreader.h"
#include "pdfdocumentpropertiesdialog.h"
#include "pdfwidgettool.h"
#include "pdfrecentfilemanager.h"
#include <QFuture>
#include <QTreeView>
@ -141,6 +142,7 @@ private:
Ui::PDFViewerMainWindow* ui;
pdf::PDFCMSManager* m_CMSManager;
PDFRecentFileManager* m_recentFileManager;
PDFViewerSettings* m_settings;
pdf::PDFWidget* m_pdfWidget;
QSharedPointer<pdf::PDFDocument> m_pdfDocument;

View File

@ -20,6 +20,7 @@
#include "pdfglobal.h"
#include "pdfutils.h"
#include "pdfrecentfilemanager.h"
#include <QAction>
#include <QLineEdit>
@ -32,12 +33,14 @@ namespace pdfviewer
PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settings& settings,
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
QList<QAction*> actions,
pdf::PDFCMSManager* cmsManager, QWidget *parent) :
QDialog(parent),
ui(new Ui::PDFViewerSettingsDialog),
m_settings(settings),
m_cmsSettings(cmsSettings),
m_otherSettings(otherSettings),
m_actions(),
m_isLoadingData(false)
{
@ -50,6 +53,7 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
new QListWidgetItem(QIcon(":/resources/shortcuts.svg"), tr("Shortcuts"), ui->optionsPagesWidget, ShortcutSettings);
new QListWidgetItem(QIcon(":/resources/cms.svg"), tr("Colors"), ui->optionsPagesWidget, ColorManagementSystemSettings);
new QListWidgetItem(QIcon(":/resources/security.svg"), tr("Security"), ui->optionsPagesWidget, SecuritySettings);
new QListWidgetItem(QIcon(":/resources/ui.svg"), tr("UI"), ui->optionsPagesWidget, UISettings);
ui->renderingEngineComboBox->addItem(tr("Software"), static_cast<int>(pdf::RendererEngine::Software));
ui->renderingEngineComboBox->addItem(tr("Hardware accelerated (OpenGL)"), static_cast<int>(pdf::RendererEngine::OpenGL));
@ -63,6 +67,9 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
ui->multithreadingComboBox->addItem(tr("Multithreading (load balanced)"), static_cast<int>(pdf::PDFExecutionPolicy::Strategy::PageMultithreaded));
ui->multithreadingComboBox->addItem(tr("Multithreading (maximum threads)"), static_cast<int>(pdf::PDFExecutionPolicy::Strategy::AlwaysMultithreaded));
ui->maximumRecentFileCountEdit->setMinimum(PDFRecentFileManager::getMinimumRecentFiles());
ui->maximumRecentFileCountEdit->setMaximum(PDFRecentFileManager::getMaximumRecentFiles());
// Load CMS data
ui->cmsTypeComboBox->addItem(pdf::PDFCMSManager::getSystemName(pdf::PDFCMSSettings::System::Generic), int(pdf::PDFCMSSettings::System::Generic));
ui->cmsTypeComboBox->addItem(pdf::PDFCMSManager::getSystemName(pdf::PDFCMSSettings::System::LittleCMS2), int(pdf::PDFCMSSettings::System::LittleCMS2));
@ -168,6 +175,10 @@ void PDFViewerSettingsDialog::on_optionsPagesWidget_currentItemChanged(QListWidg
ui->stackedWidget->setCurrentWidget(ui->securityPage);
break;
case UISettings:
ui->stackedWidget->setCurrentWidget(ui->uiPage);
break;
default:
Q_ASSERT(false);
break;
@ -229,6 +240,9 @@ void PDFViewerSettingsDialog::loadData()
ui->allowLaunchCheckBox->setChecked(m_settings.m_allowLaunchApplications);
ui->allowRunURICheckBox->setChecked(m_settings.m_allowLaunchURI);
// UI
ui->maximumRecentFileCountEdit->setValue(m_otherSettings.maximumRecentFileCount);
// CMS
ui->cmsTypeComboBox->setCurrentIndex(ui->cmsTypeComboBox->findData(int(m_cmsSettings.system)));
if (m_cmsSettings.system != pdf::PDFCMSSettings::System::Generic)
@ -406,6 +420,10 @@ void PDFViewerSettingsDialog::saveData()
{
m_settings.m_multithreadingStrategy = static_cast<pdf::PDFExecutionPolicy::Strategy>(ui->multithreadingComboBox->currentData().toInt());
}
else if (sender == ui->maximumRecentFileCountEdit)
{
m_otherSettings.maximumRecentFileCount = ui->maximumRecentFileCountEdit->value();
}
loadData();
}

View File

@ -37,14 +37,22 @@ class PDFViewerSettingsDialog : public QDialog
Q_OBJECT
public:
struct OtherSettings
{
int maximumRecentFileCount = 0;
};
/// Constructor
/// \param settings Viewer settings
/// \param cmsSettings Color management system settings
/// \param otherSettings Other settings
/// \param actions Actions
/// \param cmsManager CMS manager
/// \param parent Parent widget
explicit PDFViewerSettingsDialog(const PDFViewerSettings::Settings& settings,
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
QList<QAction*> actions,
pdf::PDFCMSManager* cmsManager,
QWidget* parent);
@ -60,11 +68,13 @@ public:
CacheSettings,
ShortcutSettings,
ColorManagementSystemSettings,
SecuritySettings
SecuritySettings,
UISettings
};
const PDFViewerSettings::Settings& getSettings() const { return m_settings; }
const pdf::PDFCMSSettings& getCMSSettings() const { return m_cmsSettings; }
const OtherSettings& getOtherSettings() const { return m_otherSettings; }
private slots:
void on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous);
@ -81,6 +91,7 @@ private:
Ui::PDFViewerSettingsDialog* ui;
PDFViewerSettings::Settings m_settings;
pdf::PDFCMSSettings m_cmsSettings;
OtherSettings m_otherSettings;
QList<QAction*> m_actions;
bool m_isLoadingData;
};

View File

@ -26,7 +26,7 @@
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
<number>7</number>
</property>
<widget class="QWidget" name="enginePage">
<layout class="QVBoxLayout" name="enginePageLayout">
@ -825,6 +825,68 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="uiPage">
<layout class="QVBoxLayout" name="uiPageLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="uiGroupBox">
<property name="title">
<string>UI Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QGridLayout" name="uiGroupBoxLayout">
<item row="0" column="0">
<widget class="QLabel" name="maximumRecentFileCountLabel">
<property name="text">
<string>Maximum count of recent files</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="maximumRecentFileCountEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="uiInfoLabel">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Maximum count of recent files controls, how much of recent files will be displayed in menu. When document is opened, then document is addet to the top of recent file list, and recent file list is truncated from bottom, if number of recent files is greater, than maximum.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="uiGroupBoxSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>402</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>

View File

@ -0,0 +1,138 @@
<?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"
width="30mm"
height="30mm"
viewBox="0 0 30 30"
version="1.1"
id="svg5291"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="ui.svg">
<defs
id="defs5285">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 15 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="30 : 15 : 1"
inkscape:persp3d-origin="15 : 10 : 1"
id="perspective5921" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49999998"
inkscape:cx="-709.86288"
inkscape:cy="-498.71696"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2035"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1" />
<metadata
id="metadata5288">
<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>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Melka</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-267)">
<flowRoot
xml:space="preserve"
id="flowRoot5913"
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"><flowRegion
id="flowRegion5915"><rect
id="rect5917"
width="129.22377"
height="91.747108"
x="-13.788582"
y="-33.515606" /></flowRegion><flowPara
id="flowPara5919" /></flowRoot> <rect
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect845"
width="27.735897"
height="26.309353"
x="1.403165"
y="269.40442" />
<rect
style="fill:#000000;fill-opacity:0.34117648;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect847"
width="27.665739"
height="2.4087679"
x="1.403165"
y="269.40442" />
<rect
style="fill:none;fill-opacity:0.34117647;stroke:#000000;stroke-width:0.5;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="rect849"
width="8.8633251"
height="20.462824"
x="2.3386083"
y="273.73083" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.1671877,276.32943 5.4570315,0.0331"
id="path855"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 4.1837241,277.58619 5.4570312,0.0331"
id="path855-1"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.9604819,278.9091 5.4570297,0.0331"
id="path855-5"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.9770183,280.16586 5.4570293,0.0331"
id="path855-1-5"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB