diff --git a/Pdf4QtDocPageOrganizer/mainwindow.cpp b/Pdf4QtDocPageOrganizer/mainwindow.cpp index d18f830..f198413 100644 --- a/Pdf4QtDocPageOrganizer/mainwindow.cpp +++ b/Pdf4QtDocPageOrganizer/mainwindow.cpp @@ -93,6 +93,50 @@ MainWindow::MainWindow(QWidget* parent) : ui->actionRegroup_by_Bookmarks->setData(int(Operation::RegroupBookmarks)); ui->actionRegroup_by_Alternating_Pages->setData(int(Operation::RegroupAlternatingPages)); ui->actionRegroup_by_Alternating_Pages_Reversed_Order->setData(int(Operation::RegroupAlternatingPagesReversed)); + ui->actionPrepare_Icon_Theme->setData(int(Operation::PrepareIconTheme)); + + m_iconTheme.registerAction(ui->actionAddDocument, ":/pdfdocpage/resources/open.svg"); + m_iconTheme.registerAction(ui->actionClose, ":/pdfdocpage/resources/close.svg"); + m_iconTheme.registerAction(ui->actionCloneSelection, ":/pdfdocpage/resources/clone-selection.svg"); + m_iconTheme.registerAction(ui->actionRemoveSelection, ":/pdfdocpage/resources/remove-selection.svg"); + m_iconTheme.registerAction(ui->actionRestoreRemovedItems, ":/pdfdocpage/resources/restore-removed-items.svg"); + m_iconTheme.registerAction(ui->actionInsert_PDF, ":/pdfdocpage/resources/insert-page-from-pdf.svg"); + m_iconTheme.registerAction(ui->actionInsert_Image, ":/pdfdocpage/resources/insert-image.svg"); + m_iconTheme.registerAction(ui->actionInsert_Empty_Page, ":/pdfdocpage/resources/insert-empty-page.svg"); + m_iconTheme.registerAction(ui->actionCut, ":/pdfdocpage/resources/cut.svg"); + m_iconTheme.registerAction(ui->actionCopy, ":/pdfdocpage/resources/copy.svg"); + m_iconTheme.registerAction(ui->actionPaste, ":/pdfdocpage/resources/paste.svg"); + m_iconTheme.registerAction(ui->actionReplaceSelection, ":/pdfdocpage/resources/replace-selection.svg"); + m_iconTheme.registerAction(ui->actionSelect_None, ":/pdfdocpage/resources/select-none.svg"); + m_iconTheme.registerAction(ui->actionSelect_All, ":/pdfdocpage/resources/select-all.svg"); + m_iconTheme.registerAction(ui->actionSelect_Even, ":/pdfdocpage/resources/select-even.svg"); + m_iconTheme.registerAction(ui->actionSelect_Odd, ":/pdfdocpage/resources/select-odd.svg"); + m_iconTheme.registerAction(ui->actionSelect_Portrait, ":/pdfdocpage/resources/select-portrait.svg"); + m_iconTheme.registerAction(ui->actionSelect_Landscape, ":/pdfdocpage/resources/select-landscape.svg"); + m_iconTheme.registerAction(ui->actionRotate_Right, ":/pdfdocpage/resources/rotate-right.svg"); + m_iconTheme.registerAction(ui->actionRotate_Left, ":/pdfdocpage/resources/rotate-left.svg"); + m_iconTheme.registerAction(ui->actionZoom_In, ":/pdfdocpage/resources/zoom-in.svg"); + m_iconTheme.registerAction(ui->actionZoom_Out, ":/pdfdocpage/resources/zoom-out.svg"); + m_iconTheme.registerAction(ui->actionGet_Source, ":/pdfdocpage/resources/get-source.svg"); + m_iconTheme.registerAction(ui->actionAbout, ":/pdfdocpage/resources/about.svg"); + m_iconTheme.registerAction(ui->actionUnited_Document, ":/pdfdocpage/resources/make-united-document.svg"); + m_iconTheme.registerAction(ui->actionSeparate_to_Multiple_Documents, ":/pdfdocpage/resources/make-separated-document.svg"); + m_iconTheme.registerAction(ui->actionSeparate_to_Multiple_Documents_Grouped, ":/pdfdocpage/resources/make-separated-document-from-groups.svg"); + m_iconTheme.registerAction(ui->actionGroup, ":/pdfdocpage/resources/group.svg"); + m_iconTheme.registerAction(ui->actionUngroup, ":/pdfdocpage/resources/ungroup.svg"); + m_iconTheme.registerAction(ui->actionClear, ":/pdfdocpage/resources/clear.svg"); + m_iconTheme.registerAction(ui->actionRegroup_Even_Odd, ":/pdfdocpage/resources/regroup-even-odd.svg"); + m_iconTheme.registerAction(ui->actionRegroup_by_Page_Pairs, ":/pdfdocpage/resources/regroup-pairs.svg"); + m_iconTheme.registerAction(ui->actionRegroup_by_Bookmarks, ":/pdfdocpage/resources/regroup-bookmarks.svg"); + m_iconTheme.registerAction(ui->actionRegroup_by_Alternating_Pages, ":/pdfdocpage/resources/regroup-alternating.svg"); + m_iconTheme.registerAction(ui->actionRegroup_by_Alternating_Pages_Reversed_Order, ":/pdfdocpage/resources/regroup-alternating-reversed.svg"); + m_iconTheme.registerAction(ui->actionInvert_Selection, ":/pdfdocpage/resources/invert-selection.svg"); + m_iconTheme.registerAction(ui->actionUndo, ":/pdfdocpage/resources/undo.svg"); + m_iconTheme.registerAction(ui->actionRedo, ":/pdfdocpage/resources/redo.svg"); + + m_iconTheme.setDirectory("pdfdocpage_theme"); + m_iconTheme.setPrefix(":/pdfdocpage/resources/"); + m_iconTheme.loadTheme(); QToolBar* mainToolbar = addToolBar(tr("Main")); mainToolbar->setObjectName("main_toolbar"); @@ -360,6 +404,7 @@ bool MainWindow::canPerformOperation(Operation operation) const case Operation::InsertPDF: case Operation::GetSource: case Operation::About: + case Operation::PrepareIconTheme: return true; case Operation::InvertSelection: @@ -561,6 +606,10 @@ void MainWindow::performOperation(Operation operation) break; } + case Operation::PrepareIconTheme: + m_iconTheme.prepareTheme(); + break; + case Operation::Unite: case Operation::Separate: case Operation::SeparateGrouped: diff --git a/Pdf4QtDocPageOrganizer/mainwindow.h b/Pdf4QtDocPageOrganizer/mainwindow.h index 40cea6f..12e12de 100644 --- a/Pdf4QtDocPageOrganizer/mainwindow.h +++ b/Pdf4QtDocPageOrganizer/mainwindow.h @@ -18,11 +18,12 @@ #ifndef PDFDOCPAGEORGANIZER_MAINWINDOW_H #define PDFDOCPAGEORGANIZER_MAINWINDOW_H -#include +#include "pdficontheme.h" #include "pageitemmodel.h" #include "pageitemdelegate.h" +#include #include namespace Ui @@ -92,7 +93,8 @@ public: RegroupAlternatingPagesReversed, GetSource, - About + About, + PrepareIconTheme }; private slots: @@ -116,6 +118,7 @@ private: Ui::MainWindow* ui; + pdf::PDFIconTheme m_iconTheme; PageItemModel* m_model; PageItemDelegate* m_delegate; Settings m_settings; diff --git a/Pdf4QtDocPageOrganizer/mainwindow.ui b/Pdf4QtDocPageOrganizer/mainwindow.ui index aed788c..b6889a0 100644 --- a/Pdf4QtDocPageOrganizer/mainwindow.ui +++ b/Pdf4QtDocPageOrganizer/mainwindow.ui @@ -118,6 +118,7 @@ + @@ -582,6 +583,11 @@ Ctrl+Y + + + Prepare Icon Theme + + diff --git a/Pdf4QtLib/Pdf4QtLib.pro b/Pdf4QtLib/Pdf4QtLib.pro index c62a23d..b36f2a2 100644 --- a/Pdf4QtLib/Pdf4QtLib.pro +++ b/Pdf4QtLib/Pdf4QtLib.pro @@ -57,6 +57,7 @@ SOURCES += \ sources/pdfexecutionpolicy.cpp \ sources/pdffile.cpp \ sources/pdfform.cpp \ + sources/pdficontheme.cpp \ sources/pdfitemmodels.cpp \ sources/pdfjavascriptscanner.cpp \ sources/pdfjbig2decoder.cpp \ @@ -123,6 +124,7 @@ HEADERS += \ sources/pdfexecutionpolicy.h \ sources/pdffile.h \ sources/pdfform.h \ + sources/pdficontheme.h \ sources/pdfitemmodels.h \ sources/pdfjavascriptscanner.h \ sources/pdfjbig2decoder.h \ diff --git a/Pdf4QtLib/sources/pdficontheme.cpp b/Pdf4QtLib/sources/pdficontheme.cpp new file mode 100644 index 0000000..8832816 --- /dev/null +++ b/Pdf4QtLib/sources/pdficontheme.cpp @@ -0,0 +1,123 @@ +// Copyright (C) 2021 Jakub Melka +// +// This file is part of PDF4QT. +// +// PDF4QT 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 +// with the written consent of the copyright owner, any later version. +// +// PDF4QT 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 PDF4QT. If not, see . + +#include "pdficontheme.h" + +#include + +namespace pdf +{ + +void PDFIconTheme::registerAction(QAction* action, QString iconFileName) +{ + m_actionInfos.emplace_back(action, std::move(iconFileName)); +} + +QString PDFIconTheme::getDirectory() const +{ + return m_directory; +} + +void PDFIconTheme::setDirectory(const QString& directory) +{ + m_directory = directory; +} + +QString PDFIconTheme::getPrefix() const +{ + return m_prefix; +} + +void PDFIconTheme::setPrefix(const QString& prefix) +{ + m_prefix = prefix; +} + +void PDFIconTheme::prepareTheme() +{ + QString directory = getThemeDirectory(); + QDir dir(directory); + + if (!dir.exists()) + { + dir.mkpath(directory); + + QStringList infoList; + + for (const ActionInfo& actionInfo : m_actionInfos) + { + QString fileName = formatFileName(actionInfo, directory); + if (!QFile::exists(fileName)) + { + QFile::copy(actionInfo.fileName, fileName); + QFile::setPermissions(fileName, QFile::Permissions(0xFFFF)); + } + + infoList << QString("%1;%2").arg(actionInfo.action->text(), fileName); + } + + if (!infoList.isEmpty()) + { + QFile file(directory + "/icons.txt"); + if (file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate)) + { + { + QTextStream stream(&file); + stream.setCodec("UTF8"); + stream.setGenerateByteOrderMark(true); + for (const QString& text : infoList) + { + stream << text << endl; + } + } + file.close(); + } + } + } +} + +void PDFIconTheme::loadTheme() +{ + QString directory = getThemeDirectory(); + QDir dir(directory); + + if (dir.exists()) + { + for (const ActionInfo& actionInfo : m_actionInfos) + { + QString fileName = formatFileName(actionInfo, directory); + if (QFile::exists(fileName)) + { + actionInfo.action->setIcon(QIcon(fileName)); + } + } + } +} + +QString PDFIconTheme::getThemeDirectory() const +{ + return QApplication::applicationDirPath() + "/" + m_directory; +} + +QString PDFIconTheme::formatFileName(const ActionInfo& info, const QString& themeDirectory) const +{ + QString fileName = info.fileName; + fileName.remove(m_prefix); + return QString("%1/%2").arg(themeDirectory, fileName); +} + +} // namespace pdf diff --git a/Pdf4QtLib/sources/pdficontheme.h b/Pdf4QtLib/sources/pdficontheme.h new file mode 100644 index 0000000..120919e --- /dev/null +++ b/Pdf4QtLib/sources/pdficontheme.h @@ -0,0 +1,72 @@ +// Copyright (C) 2021 Jakub Melka +// +// This file is part of PDF4QT. +// +// PDF4QT 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 +// with the written consent of the copyright owner, any later version. +// +// PDF4QT 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 PDF4QT. If not, see . + +#ifndef PDFICONTHEME_H +#define PDFICONTHEME_H + +#include "pdfglobal.h" + +#include + +namespace pdf +{ + +/// Theme icon provider. Can provide icons from custom directory, +/// so user can use their own icon theme. +class PDF4QTLIBSHARED_EXPORT PDFIconTheme +{ +public: + explicit PDFIconTheme() = default; + + void registerAction(QAction* action, QString iconFileName); + + QString getDirectory() const; + void setDirectory(const QString& directory); + + QString getPrefix() const; + void setPrefix(const QString& prefix); + + void prepareTheme(); + void loadTheme(); + + QString getThemeDirectory() const; + +private: + struct ActionInfo + { + ActionInfo(QAction* action = nullptr, QString fileName = QString()) : + action(action), + fileName(std::move(fileName)) + { + + } + + QAction* action = nullptr; + QString fileName; + }; + + QString m_directory; + QString m_prefix; + + QString formatFileName(const ActionInfo& info, const QString& themeDirectory) const; + + std::vector m_actionInfos; +}; + +} // namespace pdf + +#endif // PDFICONTHEME_H