diff --git a/PdfForQtLib/sources/pdfglobal.h b/PdfForQtLib/sources/pdfglobal.h index 679442e..fdcb151 100644 --- a/PdfForQtLib/sources/pdfglobal.h +++ b/PdfForQtLib/sources/pdfglobal.h @@ -142,6 +142,12 @@ private: bool m_oldValue; }; +enum class RendererEngine +{ + Software, + OpenGL +}; + } // namespace pdf #endif // PDFGLOBAL_H diff --git a/PdfForQtViewer/PdfForQtViewer.pro b/PdfForQtViewer/PdfForQtViewer.pro index 08b3912..c709e74 100644 --- a/PdfForQtViewer/PdfForQtViewer.pro +++ b/PdfForQtViewer/PdfForQtViewer.pro @@ -34,13 +34,18 @@ LIBS += -lPDFForQtLib SOURCES += \ main.cpp \ - pdfviewermainwindow.cpp + pdfviewermainwindow.cpp \ + pdfviewersettings.cpp \ + pdfviewersettingsdialog.cpp HEADERS += \ - pdfviewermainwindow.h + pdfviewermainwindow.h \ + pdfviewersettings.h \ + pdfviewersettingsdialog.h FORMS += \ - pdfviewermainwindow.ui + pdfviewermainwindow.ui \ + pdfviewersettingsdialog.ui CONFIG += force_debug_info @@ -48,3 +53,6 @@ application.files = $$DESTDIR/PdfForQtViewer.exe application.path = $$DESTDIR/install INSTALLS += application +RESOURCES += \ + pdfforqtviewer.qrc + diff --git a/PdfForQtViewer/pdfforqtviewer.qrc b/PdfForQtViewer/pdfforqtviewer.qrc new file mode 100644 index 0000000..b3f4b1c --- /dev/null +++ b/PdfForQtViewer/pdfforqtviewer.qrc @@ -0,0 +1,7 @@ + + + resources/engine.svg + resources/rendering.svg + resources/shading.svg + + diff --git a/PdfForQtViewer/pdfviewermainwindow.cpp b/PdfForQtViewer/pdfviewermainwindow.cpp index 9321ce7..17bddb0 100644 --- a/PdfForQtViewer/pdfviewermainwindow.cpp +++ b/PdfForQtViewer/pdfviewermainwindow.cpp @@ -18,6 +18,8 @@ #include "pdfviewermainwindow.h" #include "ui_pdfviewermainwindow.h" +#include "pdfviewersettingsdialog.h" + #include "pdfdocumentreader.h" #include "pdfvisitor.h" #include "pdfstreamfilters.h" @@ -452,50 +454,10 @@ void PDFViewerMainWindow::on_actionGenerateCMAPrepository_triggered() } } -void PDFViewerSettings::readSettings(QSettings& settings) +void PDFViewerMainWindow::on_actionOptions_triggered() { - settings.beginGroup("ViewerSettings"); - m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString(); - m_features = static_cast(settings.value("rendererFeatures", static_cast(pdf::PDFRenderer::getDefaultFeatures())).toInt()); - settings.endGroup(); - - emit settingsChanged(); -} - -void PDFViewerSettings::writeSettings(QSettings& settings) -{ - settings.beginGroup("ViewerSettings"); - settings.setValue("defaultDirectory", m_directory); - settings.setValue("rendererFeatures", static_cast(m_features)); - settings.endGroup(); -} - -QString PDFViewerSettings::getDirectory() const -{ - return m_directory; -} - -void PDFViewerSettings::setDirectory(const QString& directory) -{ - if (m_directory != directory) - { - m_directory = directory; - emit settingsChanged(); - } -} - -pdf::PDFRenderer::Features PDFViewerSettings::getFeatures() const -{ - return m_features; -} - -void PDFViewerSettings::setFeatures(const pdf::PDFRenderer::Features& features) -{ - if (m_features != features) - { - m_features = features; - emit settingsChanged(); - } + PDFViewerSettingsDialog dialog(this); + dialog.exec(); } } // namespace pdfviewer diff --git a/PdfForQtViewer/pdfviewermainwindow.h b/PdfForQtViewer/pdfviewermainwindow.h index 13e4600..21d5052 100644 --- a/PdfForQtViewer/pdfviewermainwindow.h +++ b/PdfForQtViewer/pdfviewermainwindow.h @@ -21,6 +21,8 @@ #include "pdfcatalog.h" #include "pdfrenderer.h" +#include "pdfviewersettings.h" + #include #include #include @@ -42,35 +44,6 @@ class PDFOptionalContentTreeItemModel; namespace pdfviewer { -class PDFViewerSettings : public QObject -{ - Q_OBJECT - -public: - inline explicit PDFViewerSettings(QObject* parent) : - QObject(parent), - m_features(pdf::PDFRenderer::getDefaultFeatures()) - { - - } - - void readSettings(QSettings& settings); - void writeSettings(QSettings& settings); - - QString getDirectory() const; - void setDirectory(const QString& directory); - - pdf::PDFRenderer::Features getFeatures() const; - void setFeatures(const pdf::PDFRenderer::Features& features); - -signals: - void settingsChanged(); - -private: - pdf::PDFRenderer::Features m_features; - QString m_directory; -}; - class PDFViewerMainWindow : public QMainWindow { Q_OBJECT @@ -91,6 +64,8 @@ private slots: void on_actionRendering_Errors_triggered(); void on_actionGenerateCMAPrepository_triggered(); + void on_actionOptions_triggered(); + private: void onActionOpenTriggered(); void onActionCloseTriggered(); diff --git a/PdfForQtViewer/pdfviewermainwindow.ui b/PdfForQtViewer/pdfviewermainwindow.ui index b3a07aa..4068a73 100644 --- a/PdfForQtViewer/pdfviewermainwindow.ui +++ b/PdfForQtViewer/pdfviewermainwindow.ui @@ -68,6 +68,8 @@ Tools + + @@ -208,6 +210,11 @@ Ignore Optional Content Settings + + + Options... + + diff --git a/PdfForQtViewer/pdfviewersettings.cpp b/PdfForQtViewer/pdfviewersettings.cpp new file mode 100644 index 0000000..0d4693d --- /dev/null +++ b/PdfForQtViewer/pdfviewersettings.cpp @@ -0,0 +1,84 @@ +#include "pdfviewersettings.h" + +namespace pdfviewer +{ + +void PDFViewerSettings::readSettings(QSettings& settings) +{ + settings.beginGroup("ViewerSettings"); + m_settings.m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString(); + m_settings.m_features = static_cast(settings.value("rendererFeatures", static_cast(pdf::PDFRenderer::getDefaultFeatures())).toInt()); + m_settings.m_rendererEngine = static_cast(settings.value("renderingEngine", static_cast(pdf::RendererEngine::OpenGL)).toInt()); + m_settings.m_rendererSamples = settings.value("rendererSamples", 16).toInt(); + settings.endGroup(); + + emit settingsChanged(); +} + +void PDFViewerSettings::writeSettings(QSettings& settings) +{ + settings.beginGroup("ViewerSettings"); + settings.setValue("defaultDirectory", m_settings.m_directory); + settings.setValue("rendererFeatures", static_cast(m_settings.m_features)); + settings.setValue("renderingEngine", static_cast(m_settings.m_rendererEngine)); + settings.setValue("rendererSamples", m_settings.m_rendererSamples); + settings.endGroup(); +} + +QString PDFViewerSettings::getDirectory() const +{ + return m_settings.m_directory; +} + +void PDFViewerSettings::setDirectory(const QString& directory) +{ + if (m_settings.m_directory != directory) + { + m_settings.m_directory = directory; + emit settingsChanged(); + } +} + +pdf::PDFRenderer::Features PDFViewerSettings::getFeatures() const +{ + return m_settings.m_features; +} + +void PDFViewerSettings::setFeatures(const pdf::PDFRenderer::Features& features) +{ + if (m_settings.m_features != features) + { + m_settings.m_features = features; + emit settingsChanged(); + } +} + +pdf::RendererEngine PDFViewerSettings::getRendererEngine() const +{ + return m_settings.m_rendererEngine; +} + +void PDFViewerSettings::setRendererEngine(pdf::RendererEngine rendererEngine) +{ + if (m_settings.m_rendererEngine != rendererEngine) + { + m_settings.m_rendererEngine = rendererEngine; + emit settingsChanged(); + } +} + +int PDFViewerSettings::getRendererSamples() const +{ + return m_settings.m_rendererSamples; +} + +void PDFViewerSettings::setRendererSamples(int rendererSamples) +{ + if (m_settings.m_rendererSamples != rendererSamples) + { + m_settings.m_rendererSamples = rendererSamples; + emit settingsChanged(); + } +} + +} // namespace pdfviewer diff --git a/PdfForQtViewer/pdfviewersettings.h b/PdfForQtViewer/pdfviewersettings.h new file mode 100644 index 0000000..1d02828 --- /dev/null +++ b/PdfForQtViewer/pdfviewersettings.h @@ -0,0 +1,63 @@ +#ifndef PDFVIEWERSETTINGS_H +#define PDFVIEWERSETTINGS_H + +#include "pdfrenderer.h" + +#include + +namespace pdfviewer +{ + +class PDFViewerSettings : public QObject +{ + Q_OBJECT + +public: + inline explicit PDFViewerSettings(QObject* parent) : + QObject(parent) + { + + } + + void readSettings(QSettings& settings); + void writeSettings(QSettings& settings); + + QString getDirectory() const; + void setDirectory(const QString& directory); + + pdf::PDFRenderer::Features getFeatures() const; + void setFeatures(const pdf::PDFRenderer::Features& features); + + pdf::RendererEngine getRendererEngine() const; + void setRendererEngine(pdf::RendererEngine rendererEngine); + + int getRendererSamples() const; + void setRendererSamples(int rendererSamples); + +signals: + void settingsChanged(); + +private: + struct Settings + { + Settings() : + m_features(pdf::PDFRenderer::getDefaultFeatures()), + m_rendererEngine(pdf::RendererEngine::OpenGL), + m_rendererSamples(16) + { + + } + + pdf::PDFRenderer::Features m_features; + QString m_directory; + pdf::RendererEngine m_rendererEngine; + int m_rendererSamples; + }; + + Settings m_settings; +}; + + +} // namespace pdfviewer + +#endif // PDFVIEWERSETTINGS_H diff --git a/PdfForQtViewer/pdfviewersettingsdialog.cpp b/PdfForQtViewer/pdfviewersettingsdialog.cpp new file mode 100644 index 0000000..9506103 --- /dev/null +++ b/PdfForQtViewer/pdfviewersettingsdialog.cpp @@ -0,0 +1,57 @@ +#include "pdfviewersettingsdialog.h" +#include "ui_pdfviewersettingsdialog.h" + +#include + +namespace pdfviewer +{ + +PDFViewerSettingsDialog::PDFViewerSettingsDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PDFViewerSettingsDialog) +{ + ui->setupUi(this); + + new QListWidgetItem(QIcon(":/resources/engine.svg"), tr("Engine"), ui->optionsPagesWidget, EngineSettings); + new QListWidgetItem(QIcon(":/resources/rendering.svg"), tr("Rendering"), ui->optionsPagesWidget, RenderingSettings); + new QListWidgetItem(QIcon(":/resources/shading.svg"), tr("Shading"), ui->optionsPagesWidget, ShadingSettings); + + ui->renderingEngineComboBox->addItem(tr("Software"), static_cast(pdf::RendererEngine::Software)); + ui->renderingEngineComboBox->addItem(tr("Hardware accelerated (OpenGL)"), static_cast(pdf::RendererEngine::OpenGL)); + + for (int i : { 1, 2, 4, 8, 16 }) + { + ui->multisampleAntialiasingSamplesCountComboBox->addItem(QString::number(i)); + } +} + +PDFViewerSettingsDialog::~PDFViewerSettingsDialog() +{ + delete ui; +} + +void PDFViewerSettingsDialog::on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous) +{ + Q_UNUSED(previous); + + switch (current->type()) + { + case EngineSettings: + ui->stackedWidget->setCurrentWidget(ui->enginePage); + break; + + case RenderingSettings: + ui->stackedWidget->setCurrentWidget(ui->renderingPage); + break; + + case ShadingSettings: + ui->stackedWidget->setCurrentWidget(ui->shadingPage); + break; + + default: + Q_ASSERT(false); + break; + } +} + +} // namespace pdfviewer diff --git a/PdfForQtViewer/pdfviewersettingsdialog.h b/PdfForQtViewer/pdfviewersettingsdialog.h new file mode 100644 index 0000000..9a1199c --- /dev/null +++ b/PdfForQtViewer/pdfviewersettingsdialog.h @@ -0,0 +1,42 @@ +#ifndef PDFVIEWERSETTINGSDIALOG_H +#define PDFVIEWERSETTINGSDIALOG_H + +#include "pdfviewersettings.h" + +#include + +class QListWidgetItem; + +namespace Ui +{ +class PDFViewerSettingsDialog; +} + +namespace pdfviewer +{ + +class PDFViewerSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit PDFViewerSettingsDialog(QWidget* parent); + virtual ~PDFViewerSettingsDialog() override; + + enum Page : int + { + EngineSettings, + RenderingSettings, + ShadingSettings + }; + +private slots: + void on_optionsPagesWidget_currentItemChanged(QListWidgetItem* current, QListWidgetItem* previous); + +private: + Ui::PDFViewerSettingsDialog* ui; +}; + +} // namespace pdfviewer + +#endif // PDFVIEWERSETTINGSDIALOG_H diff --git a/PdfForQtViewer/pdfviewersettingsdialog.ui b/PdfForQtViewer/pdfviewersettingsdialog.ui new file mode 100644 index 0000000..ee9696e --- /dev/null +++ b/PdfForQtViewer/pdfviewersettingsdialog.ui @@ -0,0 +1,313 @@ + + + PDFViewerSettingsDialog + + + + 0 + 0 + 720 + 538 + + + + Options + + + + + + + + QAbstractItemView::SelectRows + + + + + + + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Engine Settings + + + + + + + + Rendering engine + + + + + + + + + + Enable + + + + + + + Multisample antialiasing (MSAA) + + + + + + + MSAA Samples count + + + + + + + + + + + + <html><head/><body><p>Select rendering method according to your needs. <span style=" font-weight:600;">Software rendering</span> is much slower than hardware accelerated rendering using <span style=" font-weight:600;">OpenGL rendering</span>, but it works when OpenGL is not available at your platform. OpenGL rendering is selected as default and is recommended.</p><p>OpenGL rendering uses<span style=" font-weight:600;"> multisample antialiasing (MSAA)</span>, which provides good quality antialiasing. You can turn this feature on or off, but without antialiasing, bad quality image can occur. Samples count affect how much samples per pixel are considered to determine pixel color. It can be a value 1, 2, 4, 8, and 16. Most modern GPUs support at least value 8. Lower this value, if your GPU doesn't support the desired sample count.</p></body></html> + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Rendering Settings + + + + + + + + Smooth pictures + + + + + + + Ignore optional content + + + + + + + Text antialiasing + + + + + + + Enable + + + + + + + Antialiasing + + + + + + + Clip to crop box + + + + + + + Enable + + + + + + + Enable + + + + + + + Enable + + + + + + + Enable + + + + + + + + + <html><head/><body><p>Rendering settings defines, how rendering engine should handle the page content, and appearance of displayed graphics. <span style=" font-weight:600;">Antialiasing</span> turns on antialiasing of painted shapes, such as rectangles, vector graphics, lines, but it did not affects text (characters printed on the screen). <span style=" font-weight:600;">Text antialiasing </span>turns on antialiasing of painted characters on the screen, but not any other items. Both <span style=" font-weight:600;">Antialiasing </span>and <span style=" font-weight:600;">Text antialiasing </span>affects only software renderer. If you are using hardware rendering engine, such as OpenGL rendering engine, this doesn't do anything, because OpenGL engine renders the pictures using MSAA antialiasing (if turned on).</p><p><span style=" font-weight:600;">Smooth pictures</span> transforms pictures to device space coordinates using smooth image transformation, which usually leads to better image quality. When this is turned off, then default fast transformation is used, and quality of the image is lower, if the source DPI and device DPI is different.</p><p><span style=" font-weight:600;">Ignore optional content </span>ignores all optional content settings and paints everything in the content stream. <span style=" font-weight:600;">Clip to crop box</span> clips the drawing rectangle to the crop box of the page, which is usually smaller, than whole page. The graphics outside of the crop box is not drawn (for example, it can contain marks for printer etc.).</p></body></html> + + + true + + + + + + + Qt::Vertical + + + + 20 + 74 + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Shading Settings + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + PDFViewerSettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PDFViewerSettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/PdfForQtViewer/resources/engine.svg b/PdfForQtViewer/resources/engine.svg new file mode 100644 index 0000000..aac71cb --- /dev/null +++ b/PdfForQtViewer/resources/engine.svg @@ -0,0 +1,756 @@ + + + + + + + + + + + + image/svg+xml + + + + + Jakub Melka + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPU + + diff --git a/PdfForQtViewer/resources/rendering.svg b/PdfForQtViewer/resources/rendering.svg new file mode 100644 index 0000000..d8ef3ff --- /dev/null +++ b/PdfForQtViewer/resources/rendering.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + image/svg+xml + + + + + + Jakub Melka + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PdfForQtViewer/resources/shading.svg b/PdfForQtViewer/resources/shading.svg new file mode 100644 index 0000000..920672c --- /dev/null +++ b/PdfForQtViewer/resources/shading.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + Jakub Melka + + + + + + + + + + + + + + + + + +