Refactoring of viewer application

This commit is contained in:
Jakub Melka 2020-12-20 16:36:07 +01:00
parent 5f13474710
commit 6f24be7164
10 changed files with 2444 additions and 1498 deletions

View File

@ -45,6 +45,7 @@ SOURCES += \
pdfadvancedfindwidget.cpp \
pdfdocumentpropertiesdialog.cpp \
pdfoptimizedocumentdialog.cpp \
pdfprogramcontroller.cpp \
pdfrecentfilemanager.cpp \
pdfrendertoimagesdialog.cpp \
pdfsendmail.cpp \
@ -60,6 +61,7 @@ HEADERS += \
pdfadvancedfindwidget.h \
pdfdocumentpropertiesdialog.h \
pdfoptimizedocumentdialog.h \
pdfprogramcontroller.h \
pdfrecentfilemanager.h \
pdfrendertoimagesdialog.h \
pdfsendmail.h \

View File

@ -29,8 +29,9 @@ int main(int argc, char *argv[])
QApplication application(argc, argv);
QCoreApplication::setOrganizationName("MelkaJ");
QCoreApplication::setApplicationName("PDF Viewer");
QCoreApplication::setApplicationName("PDF4QT Viewer Profi");
QCoreApplication::setApplicationVersion("1.0.0");
QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Viewer Profi"));
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::applicationName());
parser.addHelpOption();
@ -44,7 +45,7 @@ int main(int argc, char *argv[])
QStringList arguments = application.arguments();
if (arguments.size() > 1)
{
mainWindow.openDocument(arguments[1]);
mainWindow.getProgramController()->openDocument(arguments[1]);
}
return application.exec();

View File

@ -30,6 +30,10 @@ PDFAboutDialog::PDFAboutDialog(QWidget* parent) :
{
ui->setupUi(this);
QString html = ui->copyrightLabel->text();
html.replace("PdfForQtViewer", QApplication::applicationDisplayName());
ui->copyrightLabel->setText(html);
std::vector<pdf::PDFDependentLibraryInfo> infos = pdf::PDFDependentLibraryInfo::getLibraryInfo();
ui->tableWidget->setColumnCount(4);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,397 @@
// 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 PDFPROGRAMCONTROLLER_H
#define PDFPROGRAMCONTROLLER_H
#include "pdfdocument.h"
#include "pdfsignaturehandler.h"
#include "pdfdocumentreader.h"
#include "pdfdocumentpropertiesdialog.h"
#include "pdfplugin.h"
#include <QObject>
#include <QAction>
#include <QToolButton>
#include <QActionGroup>
#include <array>
class QMainWindow;
class QToolBar;
namespace pdf
{
class PDFAction;
class PDFWidget;
class PDFCMSManager;
class PDFToolManager;
class PDFFormManager;
class PDFWidgetAnnotationManager;
}
namespace pdfviewer
{
class PDFViewerSettings;
class PDFUndoRedoManager;
class PDFRecentFileManager;
class PDFTextToSpeech;
class IMainWindow
{
public:
explicit IMainWindow() = default;
virtual ~IMainWindow() = default;
virtual void updateUI(bool fullUpdate) = 0;
virtual QMenu* addToolMenu(QString name) = 0;
virtual void setStatusBarMessage(QString message, int time) = 0;
virtual void setDocument(const pdf::PDFModifiedDocument& document) = 0;
virtual void adjustToolbar(QToolBar* toolbar) = 0;
};
class PDFActionManager : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFActionManager(QObject* parent);
enum Action
{
Open,
Close,
Quit,
ZoomIn,
ZoomOut,
Find,
FindPrevious,
FindNext,
SelectTextAll,
DeselectText,
CopyText,
RotateRight,
RotateLeft,
Print,
Undo,
Redo,
Save,
SaveAs,
Properties,
Options,
About,
SendByMail,
RenderToImages,
Optimize,
FitPage,
FitWidth,
FitHeight,
ShowRenderingErrors,
GoToDocumentStart,
GoToDocumentEnd,
GoToNextPage,
GoToPreviousPage,
GoToNextLine,
GoToPreviousLine,
CreateStickyNoteComment,
CreateStickyNoteHelp,
CreateStickyNoteInsert,
CreateStickyNoteKey,
CreateStickyNoteNewParagraph,
CreateStickyNoteNote,
CreateStickyNoteParagraph,
CreateTextHighlight,
CreateTextUnderline,
CreateTextStrikeout,
CreateTextSquiggly,
CreateHyperlink,
CreateInlineText,
CreateStraightLine,
CreatePolyline,
CreatePolygon,
CreateEllipse,
CreateFreehandCurve,
CreateStampApproved,
CreateStampAsIs,
CreateStampConfidential,
CreateStampDepartmental,
CreateStampDraft,
CreateStampExperimental,
CreateStampExpired,
CreateStampFinal,
CreateStampForComment,
CreateStampForPublicRelease,
CreateStampNotApproved,
CreateStampNotForPublicRelease,
CreateStampSold,
CreateStampTopSecret,
RenderOptionAntialiasing,
RenderOptionTextAntialiasing,
RenderOptionSmoothPictures,
RenderOptionIgnoreOptionalContentSettings,
RenderOptionDisplayAnnotations,
RenderOptionInvertColors,
RenderOptionShowTextBlocks,
RenderOptionShowTextLines,
PageLayoutSinglePage,
PageLayoutContinuous,
PageLayoutTwoPages,
PageLayoutTwoColumns,
PageLayoutFirstPageOnRightSide,
ToolSelectText,
ToolMagnifier,
ToolScreenshot,
ToolExtractImage,
LastAction
};
enum ActionGroup
{
CreateStickyNoteGroup,
CreateTextHighlightGroup,
CreateStampGroup,
LastActionGroup
};
inline void setAction(Action type, QAction* action) { m_actions[type] = action; }
inline QAction* getAction(Action type) const { return m_actions[type]; }
inline QActionGroup* getActionGroup(ActionGroup group) const { return m_actionGroups[group]; }
/// Creates a tool button with menu for action group. If action group
/// doesn't exist, then nullptr is returned.
/// \param group Action group
/// \param parent Tool button's parent
QToolButton* createToolButtonForActionGroup(ActionGroup group, QWidget* parent) const;
/// Sets shortcut for given action. If action is nullptr,
/// then nothing happens.
/// \param type Action type
/// \param sequence Key sequence
void setShortcut(Action type, QKeySequence sequence);
/// Sets action data. If action is nullptr, then nothing happens.
/// \param type Action type
/// \param userData User data
void setUserData(Action type, QVariant userData);
/// Sets enabled state of the action. If action is nullptr, the nothing happens.
/// \param type Action type
/// \param enabled Enabled
void setEnabled(Action type, bool enabled);
/// Sets check state of the action. If action is nullptr, the nothing happens.
/// \param type Action type
/// \param enabled Enabled
void setChecked(Action type, bool checked);
/// Returns a list of rendering option actions
std::vector<QAction*> getRenderingOptionActions() const;
/// Returns a list of all actions
std::vector<QAction*> getActions() const;
/// Adds additional action to action manager
void addAdditionalAction(QAction* action);
void initActions(QSize iconSize, bool initializeStampActions);
private:
bool hasActions(const std::initializer_list<Action>& actionTypes) const;
std::vector<QAction*> getActionList(const std::initializer_list<Action>& actionTypes) const;
std::array<QAction*, LastAction> m_actions;
std::array<QActionGroup*, LastActionGroup> m_actionGroups;
std::vector<QAction*> m_additionalActions;
};
class PDFProgramController : public QObject
{
Q_OBJECT
private:
using BaseClass = QObject;
public:
explicit PDFProgramController(QObject* parent);
virtual ~PDFProgramController() override;
enum Feature
{
None = 0x0000, ///< No feature
Tools = 0x0001, ///< Tools
Forms = 0x0002, ///< Forms
UndoRedo = 0x0004, ///< Undo/redo
Plugins = 0x0008, ///< Plugins
TextToSpeech = 0x0010, ///< Text to speech
AllFeatures = 0xFFFF, ///< All features enabled
};
Q_DECLARE_FLAGS(Features, Feature)
void openDocument(const QString& fileName);
void setDocument(pdf::PDFModifiedDocument document);
void closeDocument();
pdf::PDFWidget* getPdfWidget() const { return m_pdfWidget; }
pdf::PDFToolManager* getToolManager() const { return m_toolManager; }
PDFRecentFileManager* getRecentFileManager() const { return m_recentFileManager; }
PDFViewerSettings* getSettings() const { return m_settings; }
pdf::PDFDocument* getDocument() const { return m_pdfDocument.data(); }
pdf::PDFCertificateStore* getCertificateStore() const { return const_cast<pdf::PDFCertificateStore*>(&m_certificateStore); }
PDFTextToSpeech* getTextToSpeech() const { return m_textToSpeech; }
const std::vector<pdf::PDFSignatureVerificationResult>* getSignatures() const { return &m_signatures; }
void initialize(Features features,
QMainWindow* mainWindow,
IMainWindow* mainWindowInterface,
PDFActionManager* actionManager,
pdf::PDFProgress* progress);
void finishInitialization();
void writeSettings();
void performPrint();
void performSave();
void performSaveAs();
void onActionTriggered(const pdf::PDFAction* action);
void updateActionsAvailability();
bool getIsBusy() const;
void setIsBusy(bool isBusy);
bool canClose() const;
signals:
void queryPasswordRequest(QString* password, bool* ok);
private:
struct AsyncReadingResult
{
pdf::PDFDocumentPointer document;
QString errorMessage;
pdf::PDFDocumentReader::Result result = pdf::PDFDocumentReader::Result::Cancelled;
std::vector<pdf::PDFSignatureVerificationResult> signatures;
};
void initializeToolManager();
void initializeAnnotationManager();
void initializeFormManager();
void onActionGoToDocumentStartTriggered();
void onActionGoToDocumentEndTriggered();
void onActionGoToNextPageTriggered();
void onActionGoToPreviousPageTriggered();
void onActionGoToNextLineTriggered();
void onActionGoToPreviousLineTriggered();
void onActionZoomIn();
void onActionZoomOut();
void onActionRotateRightTriggered();
void onActionRotateLeftTriggered();
void onActionRenderingOptionTriggered(bool checked);
void onActionPropertiesTriggered();
void onActionAboutTriggered();
void onActionSendByEMailTriggered();
void onActionRenderToImagesTriggered();
void onActionOptimizeTriggered();
void onActionFitPageTriggered();
void onActionFitWidthTriggered();
void onActionFitHeightTriggered();
void onActionRenderingErrorsTriggered();
void onActionPageLayoutSinglePageTriggered();
void onActionPageLayoutContinuousTriggered();
void onActionPageLayoutTwoPagesTriggered();
void onActionPageLayoutTwoColumnsTriggered();
void onActionFirstPageOnRightSideTriggered();
void onActionFindTriggered();
void onActionOptionsTriggered();
void onActionOpenTriggered();
void onActionCloseTriggered();
void onDrawSpaceChanged();
void onPageLayoutChanged();
void onDocumentReadingFinished();
void onDocumentModified(pdf::PDFModifiedDocument document);
void onDocumentUndoRedo(pdf::PDFModifiedDocument document);
void onQueryPasswordRequest(QString* password, bool* ok);
void onPageRenderingErrorsChanged(pdf::PDFInteger pageIndex, int errorsCount);
void onViewerSettingsChanged();
void updateMagnifierToolSettings();
void updateUndoRedoSettings();
void updateUndoRedoActions();
void updateTitle();
void updatePageLayoutActions();
void updateRenderingOptionActions();
void setPageLayout(pdf::PageLayout pageLayout);
void updateFileInfo(const QString& fileName);
enum SettingFlag
{
NoSettings = 0x0000, ///< No feature
WindowSettings = 0x0001, ///< Window settings
GeneralSettings = 0x0002, ///< General settings
PluginsSettings = 0x0004, ///< Enabled plugin settings
ActionSettings = 0x0008, ///< Action settings
RecentFileSettings = 0x0010, ///< Recent files settings
CertificateSettings = 0x0020, ///< Certificate settings
};
Q_DECLARE_FLAGS(Settings, SettingFlag)
void loadPlugins();
void readSettings(Settings settings);
void saveDocument(const QString& fileName);
PDFActionManager* m_actionManager;
QMainWindow* m_mainWindow;
IMainWindow* m_mainWindowInterface;
pdf::PDFWidget* m_pdfWidget;
PDFViewerSettings* m_settings;
PDFUndoRedoManager* m_undoRedoManager;
PDFRecentFileManager* m_recentFileManager;
pdf::PDFOptionalContentActivity* m_optionalContentActivity;
pdf::PDFDocumentPointer m_pdfDocument;
PDFTextToSpeech* m_textToSpeech;
QFuture<AsyncReadingResult> m_future;
QFutureWatcher<AsyncReadingResult>* m_futureWatcher;
pdf::PDFCMSManager* m_CMSManager;
pdf::PDFToolManager* m_toolManager;
pdf::PDFWidgetAnnotationManager* m_annotationManager;
pdf::PDFFormManager* m_formManager;
PDFFileInfo m_fileInfo;
pdf::PDFCertificateStore m_certificateStore;
std::vector<pdf::PDFSignatureVerificationResult> m_signatures;
bool m_isBusy;
pdf::PDFProgress* m_progress;
QStringList m_enabledPlugins;
pdf::PDFPluginInfos m_plugins;
std::vector<std::pair<pdf::PDFPluginInfo, pdf::PDFPlugin*>> m_loadedPlugins;
};
} // namespace pdfviewer
#endif // PDFPROGRAMCONTROLLER_H

File diff suppressed because it is too large Load Diff

View File

@ -32,6 +32,7 @@
#include "pdfform.h"
#include "pdfundoredomanager.h"
#include "pdfplugin.h"
#include "pdfprogramcontroller.h"
#include <QFuture>
#include <QTreeView>
@ -64,7 +65,7 @@ namespace pdfviewer
class PDFSidebarWidget;
class PDFAdvancedFindWidget;
class PDFViewerMainWindow : public QMainWindow
class PDFViewerMainWindow : public QMainWindow, public IMainWindow
{
Q_OBJECT
@ -75,111 +76,39 @@ public:
virtual void closeEvent(QCloseEvent* event) override;
virtual void showEvent(QShowEvent* event) override;
void openDocument(const QString& fileName);
PDFProgramController* getProgramController() const { return m_programController; }
signals:
void queryPasswordRequest(QString* password, bool* ok);
virtual void updateUI(bool fullUpdate) override;
virtual QMenu* addToolMenu(QString name) override;
virtual void setStatusBarMessage(QString message, int time) override;
virtual void setDocument(const pdf::PDFModifiedDocument& document) override;
virtual void adjustToolbar(QToolBar* toolbar) override;
protected:
virtual void dragEnterEvent(QDragEnterEvent* event) override;
virtual void dragMoveEvent(QDragMoveEvent* event) override;
virtual void dropEvent(QDropEvent* event) override;
private slots:
void onQueryPasswordRequest(QString* password, bool* ok);
void on_actionPageLayoutSinglePage_triggered();
void on_actionPageLayoutContinuous_triggered();
void on_actionPageLayoutTwoPages_triggered();
void on_actionPageLayoutTwoColumns_triggered();
void on_actionFirstPageOnRightSide_triggered();
void on_actionRendering_Errors_triggered();
void on_actionOptions_triggered();
void on_actionAbout_triggered();
void on_actionFitPage_triggered();
void on_actionFitWidth_triggered();
void on_actionFitHeight_triggered();
void on_actionProperties_triggered();
void on_actionSend_by_E_Mail_triggered();
void on_actionRotateRight_triggered();
void on_actionRotateLeft_triggered();
void on_actionPrint_triggered();
void on_actionRender_to_Images_triggered();
void on_actionOptimize_triggered();
void on_actionSave_As_triggered();
void on_actionSave_triggered();
private:
void onActionOpenTriggered();
void onActionCloseTriggered();
void onActionQuitTriggered();
void onPageRenderingErrorsChanged(pdf::PDFInteger pageIndex, int errorsCount);
void onDrawSpaceChanged();
void onPageLayoutChanged();
void onPageNumberSpinboxEditingFinished();
void onPageZoomSpinboxEditingFinished();
void onActionTriggered(const pdf::PDFAction* action);
void onProgressStarted(pdf::ProgressStartupInfo info);
void onProgressStep(int percentage);
void onProgressFinished();
void onDocumentReadingFinished();
void onDocumentModified(pdf::PDFModifiedDocument document);
void onDocumentUndoRedo(pdf::PDFModifiedDocument document);
void readSettings();
void readActionSettings();
void writeSettings();
void updateTitle();
void updatePageLayoutActions();
void updateRenderingOptionActions();
void updateUI(bool fullUpdate);
void updateActionsAvailability();
void updateMagnifierToolSettings();
void updateUndoRedoSettings();
void updateUndoRedoActions();
void onViewerSettingsChanged();
void onRenderingOptionTriggered(bool checked);
void setDocument(pdf::PDFModifiedDocument document);
void closeDocument();
void saveDocument(const QString& fileName);
void setPageLayout(pdf::PageLayout pageLayout);
void updateFileInfo(const QString& fileName);
void loadPlugins();
std::vector<QAction*> getRenderingOptionActions() const;
QList<QAction*> getActions() const;
int adjustDpiX(int value);
QIcon createStickyNoteIcon(QString key) const;
struct AsyncReadingResult
{
pdf::PDFDocumentPointer document;
QString errorMessage;
pdf::PDFDocumentReader::Result result = pdf::PDFDocumentReader::Result::Cancelled;
std::vector<pdf::PDFSignatureVerificationResult> signatures;
};
Ui::PDFViewerMainWindow* ui;
pdf::PDFCMSManager* m_CMSManager;
PDFRecentFileManager* m_recentFileManager;
PDFViewerSettings* m_settings;
pdf::PDFWidget* m_pdfWidget;
pdf::PDFDocumentPointer m_pdfDocument;
PDFActionManager* m_actionManager;
PDFProgramController* m_programController;
PDFSidebarWidget* m_sidebarWidget;
QDockWidget* m_sidebarDockWidget;
PDFAdvancedFindWidget* m_advancedFindWidget;
QDockWidget* m_advancedFindDockWidget;
pdf::PDFOptionalContentActivity* m_optionalContentActivity;
QSpinBox* m_pageNumberSpinBox;
QLabel* m_pageNumberLabel;
QDoubleSpinBox* m_pageZoomSpinBox;
@ -187,28 +116,9 @@ private:
pdf::PDFProgress* m_progress;
QWinTaskbarButton* m_taskbarButton;
QWinTaskbarProgress* m_progressTaskbarIndicator;
PDFFileInfo m_fileInfo;
pdf::PDFCertificateStore m_certificateStore;
std::vector<pdf::PDFSignatureVerificationResult> m_signatures;
QActionGroup* m_insertStickyNoteGroup;
QActionGroup* m_insertStampGroup;
QActionGroup* m_insertHighlightGroup;
QFuture<AsyncReadingResult> m_future;
QFutureWatcher<AsyncReadingResult>* m_futureWatcher;
QProgressDialog* m_progressDialog;
bool m_isBusy;
bool m_isChangingProgressStep;
pdf::PDFToolManager* m_toolManager;
pdf::PDFWidgetAnnotationManager* m_annotationManager;
pdf::PDFFormManager* m_formManager;
PDFTextToSpeech* m_textToSpeech;
PDFUndoRedoManager* m_undoRedoManager;
QStringList m_enabledPlugins;
pdf::PDFPluginInfos m_plugins;
std::vector<std::pair<pdf::PDFPluginInfo, pdf::PDFPlugin*>> m_loadedPlugins;
};
} // namespace pdfviewer

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>590</width>
<height>476</height>
<width>770</width>
<height>572</height>
</rect>
</property>
<property name="windowTitle">
@ -19,7 +19,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>590</width>
<width>770</width>
<height>21</height>
</rect>
</property>
@ -45,6 +45,12 @@
<property name="title">
<string>Go To</string>
</property>
<addaction name="actionGoToDocumentStart"/>
<addaction name="actionGoToDocumentEnd"/>
<addaction name="actionGoToPreviousPage"/>
<addaction name="actionGoToNextPage"/>
<addaction name="actionGoToPreviousLine"/>
<addaction name="actionGoToNextLine"/>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
@ -755,6 +761,60 @@
<string>Squiggly</string>
</property>
</action>
<action name="actionGoToDocumentStart">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous-start.svg</normaloff>:/resources/previous-start.svg</iconset>
</property>
<property name="text">
<string>Go to document start</string>
</property>
</action>
<action name="actionGoToDocumentEnd">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next-end.svg</normaloff>:/resources/next-end.svg</iconset>
</property>
<property name="text">
<string>Go to document end</string>
</property>
</action>
<action name="actionGoToNextPage">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next-page.svg</normaloff>:/resources/next-page.svg</iconset>
</property>
<property name="text">
<string>Go to next page</string>
</property>
</action>
<action name="actionGoToPreviousPage">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous-page.svg</normaloff>:/resources/previous-page.svg</iconset>
</property>
<property name="text">
<string>Go to previous page</string>
</property>
</action>
<action name="actionGoToNextLine">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/next.svg</normaloff>:/resources/next.svg</iconset>
</property>
<property name="text">
<string>Go to next line</string>
</property>
</action>
<action name="actionGoToPreviousLine">
<property name="icon">
<iconset resource="pdfforqtviewer.qrc">
<normaloff>:/resources/previous.svg</normaloff>:/resources/previous.svg</iconset>
</property>
<property name="text">
<string>Go to previous line</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

View File

@ -39,7 +39,7 @@ PDFViewerSettingsDialog::PDFViewerSettingsDialog(const PDFViewerSettings::Settin
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
const pdf::PDFCertificateStore& certificateStore,
QList<QAction*> actions,
const std::vector<QAction*>& actions,
pdf::PDFCMSManager* cmsManager,
const QStringList& enabledPlugins,
const pdf::PDFPluginInfos& plugins,

View File

@ -58,7 +58,7 @@ public:
const pdf::PDFCMSSettings& cmsSettings,
const OtherSettings& otherSettings,
const pdf::PDFCertificateStore& certificateStore,
QList<QAction*> actions,
const std::vector<QAction*>& actions,
pdf::PDFCMSManager* cmsManager,
const QStringList& enabledPlugins,
const pdf::PDFPluginInfos& plugins,