diff --git a/Pdf4QtLib/sources/pdfconstants.h b/Pdf4QtLib/sources/pdfconstants.h
index 80ad4b8..2c279c6 100644
--- a/Pdf4QtLib/sources/pdfconstants.h
+++ b/Pdf4QtLib/sources/pdfconstants.h
@@ -24,6 +24,7 @@ namespace pdf
// Name of the library, together with version
static constexpr const char* PDF_LIBRARY_NAME = "Pdf4Qt 1.0.0";
+static constexpr const char* PDF_LIBRARY_VERSION = "1.0.0";
// Structure file constants
static constexpr const char* PDF_END_OF_FILE_MARK = "%%EOF";
diff --git a/Pdf4QtViewer/Pdf4QtViewer.pro b/Pdf4QtViewer/Pdf4QtViewer.pro
index 1a0f2e6..3f78a4a 100644
--- a/Pdf4QtViewer/Pdf4QtViewer.pro
+++ b/Pdf4QtViewer/Pdf4QtViewer.pro
@@ -96,3 +96,4 @@ INSTALLS += plugins
RESOURCES += \
pdf4qtviewer.qrc
+DEFINES += QT_INSTALL_DIRECTORY=\"\\\"$$[QT_INSTALL_BINS]\\\"\"
diff --git a/Pdf4QtViewer/pdf4qtviewer.qrc b/Pdf4QtViewer/pdf4qtviewer.qrc
index b16ad62..0d9dfc8 100644
--- a/Pdf4QtViewer/pdf4qtviewer.qrc
+++ b/Pdf4QtViewer/pdf4qtviewer.qrc
@@ -57,5 +57,6 @@
resources/squiggly.svg
resources/strikeout.svg
resources/underline.svg
+ ../LICENSE.txt
diff --git a/Pdf4QtViewer/pdfprogramcontroller.cpp b/Pdf4QtViewer/pdfprogramcontroller.cpp
index 2cfca4d..dcd1d5d 100644
--- a/Pdf4QtViewer/pdfprogramcontroller.cpp
+++ b/Pdf4QtViewer/pdfprogramcontroller.cpp
@@ -23,6 +23,7 @@
#include "pdfadvancedtools.h"
#include "pdfdrawspacecontroller.h"
#include "pdfwidgetutils.h"
+#include "pdfconstants.h"
#include "pdfviewersettings.h"
#include "pdfundoredomanager.h"
@@ -47,6 +48,7 @@
#include
#include
#include
+#include
#ifdef Q_OS_WIN
#pragma comment(lib, "Shell32")
@@ -493,6 +495,10 @@ void PDFProgramController::initialize(Features features,
{
connect(action, &QAction::triggered, this, &PDFProgramController::onActionCloseTriggered);
}
+ if (QAction* action = m_actionManager->getAction(PDFActionManager::DeveloperCreateInstaller))
+ {
+ connect(action, &QAction::triggered, this, &PDFProgramController::onActionDeveloperCreateInstaller);
+ }
if (m_recentFileManager)
{
@@ -1829,6 +1835,132 @@ void PDFProgramController::onActionCloseTriggered()
closeDocument();
}
+void PDFProgramController::onActionDeveloperCreateInstaller()
+{
+ QString directory = QFileDialog::getExistingDirectory(m_mainWindow, tr("Select Directory for Installer"));
+
+ if (directory.isEmpty())
+ {
+ return;
+ }
+
+ // Config.xml
+ {
+ QDir().mkpath(directory + "/config");
+ QFile configFile(directory + "/config/config.xml");
+ if (configFile.open(QFile::WriteOnly | QFile::Truncate))
+ {
+ QXmlStreamWriter configWriter(&configFile);
+ configWriter.setAutoFormatting(true);
+ configWriter.setAutoFormattingIndent(2);
+
+ configWriter.writeStartDocument();
+ configWriter.writeStartElement("Installer");
+
+ configWriter.writeTextElement("Name", tr("PDF4QT"));
+ configWriter.writeTextElement("Title", tr("PDF4QT Suite (library, viewer, editor, command line tool)"));
+ configWriter.writeTextElement("Version", pdf::PDF_LIBRARY_VERSION);
+ configWriter.writeTextElement("Publisher", tr("Jakub Melka"));
+ configWriter.writeTextElement("StartMenuDir", "PDF4QT");
+ configWriter.writeTextElement("TargetDir", "@ApplicationsDir@/PDF4QT");
+ configWriter.writeTextElement("CreateLocalRepository", "true");
+ configWriter.writeTextElement("InstallActionColumnVisible", "true");
+
+ configWriter.writeEndElement();
+ configWriter.writeEndDocument();
+ configFile.close();
+ }
+ }
+
+ // Installer project file
+ {
+ QString qtInstallDirectory = QT_INSTALL_DIRECTORY;
+ int indexofQtRoot = qtInstallDirectory.lastIndexOf("/Qt/");
+ QString binaryCreatorDirectory;
+
+ if (indexofQtRoot != -1)
+ {
+ indexofQtRoot += 4;
+ QString qtRootDirectory = qtInstallDirectory.left(indexofQtRoot);
+ QString qtInstallerFrameworkRoot = qtRootDirectory + "Tools/QtInstallerFramework/";
+
+ QDir qtInstallerFrameworkRootDir(qtInstallerFrameworkRoot);
+ QStringList entries = qtInstallerFrameworkRootDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
+
+ if (!entries.isEmpty())
+ {
+ binaryCreatorDirectory = QString("%1/%2/bin").arg(qtInstallerFrameworkRoot, entries.back());
+ binaryCreatorDirectory = QDir(binaryCreatorDirectory).absolutePath();
+ }
+ }
+
+ QFile configFile(directory + "/installer.pro");
+ if (configFile.open(QFile::WriteOnly | QFile::Truncate))
+ {
+ QTextStream stream(&configFile);
+ stream << "TEMPLATE = aux" << endl << endl;
+ stream << "INSTALLER_NAME = $$PWD/instpdf4qt" << endl;
+ stream << "INPUT = $$PWD/config/config.xml $$PWD/packages" << endl;
+ stream << "pdfforqtinstaller.input = INPUT" << endl;
+ stream << "pdfforqtinstaller.output = $$INSTALLER_NAME" << endl;
+ stream << QString("pdfforqtinstaller.commands = %1/binarycreator -c $$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}").arg(binaryCreatorDirectory) << endl;
+ stream << "pdfforqtinstaller.CONFIG += target_predeps no_link combine" << endl << endl;
+ stream << "QMAKE_EXTRA_COMPILERS += pdfforqtinstaller";
+ configFile.close();
+ }
+ }
+
+ // Packages
+ QDir().mkpath(directory + "/packages");
+
+ auto addComponentMeta = [&](QString componentName, QString displayName, QString description, QString version, QString internalName, bool forcedInstallation, bool defaultInstall, bool addDefaultLicense)
+ {
+ QString componentMetaDirectory = directory + QString("/packages/%1/meta").arg(componentName);
+ QDir().mkpath(componentMetaDirectory);
+
+ QString metaFileName = QString("%1/package.xml").arg(componentMetaDirectory);
+
+ QFile metaFile(metaFileName);
+ if (metaFile.open(QFile::WriteOnly | QFile::Truncate))
+ {
+ QXmlStreamWriter metaFileWriter(&metaFile);
+ metaFileWriter.setAutoFormatting(true);
+ metaFileWriter.setAutoFormattingIndent(2);
+
+ metaFileWriter.writeStartDocument();
+ metaFileWriter.writeStartElement("Package");
+
+ metaFileWriter.writeTextElement("DisplayName", displayName);
+ metaFileWriter.writeTextElement("Description", description);
+ metaFileWriter.writeTextElement("Version", version);
+ metaFileWriter.writeTextElement("ReleaseDate", QDateTime::currentDateTime().toString("yyyy-MM-dd"));
+ metaFileWriter.writeTextElement("Name", internalName);
+ metaFileWriter.writeTextElement("ExpandedByDefault", "true");
+ metaFileWriter.writeTextElement("ForcedInstallation", forcedInstallation ? "true" : "false");
+ metaFileWriter.writeTextElement("Default", defaultInstall ? "true" : "false");
+
+ if (addDefaultLicense)
+ {
+ QFile::copy(":/LICENSE.txt", QString("%1/LICENSE.txt").arg(componentMetaDirectory));
+
+ metaFileWriter.writeStartElement("Licenses");
+ metaFileWriter.writeStartElement("License");
+ metaFileWriter.writeAttribute("name", tr("License Agreement"));
+ metaFileWriter.writeAttribute("file", tr("LICENSE.txt"));
+ metaFileWriter.writeEndElement();
+ metaFileWriter.writeEndElement();
+ }
+
+ metaFileWriter.writeEndElement();
+ metaFileWriter.writeEndDocument();
+ metaFile.close();
+ }
+ };
+
+ // CoreLib package
+ addComponentMeta("pdf4qt_framework", tr("Framework (Core libraries)"), tr("Framework libraries and other data files required to run all other programs."), pdf::PDF_LIBRARY_VERSION, "pdf4qt_framework", true, true, true);
+}
+
void PDFProgramController::onPageRenderingErrorsChanged(pdf::PDFInteger pageIndex, int errorsCount)
{
if (errorsCount > 0)
diff --git a/Pdf4QtViewer/pdfprogramcontroller.h b/Pdf4QtViewer/pdfprogramcontroller.h
index 32d597a..ddcf720 100644
--- a/Pdf4QtViewer/pdfprogramcontroller.h
+++ b/Pdf4QtViewer/pdfprogramcontroller.h
@@ -161,6 +161,7 @@ public:
ToolMagnifier,
ToolScreenshot,
ToolExtractImage,
+ DeveloperCreateInstaller,
LastAction
};
@@ -329,6 +330,7 @@ private:
void onActionOptionsTriggered();
void onActionOpenTriggered();
void onActionCloseTriggered();
+ void onActionDeveloperCreateInstaller();
void onDrawSpaceChanged();
void onPageLayoutChanged();
diff --git a/Pdf4QtViewer/pdfviewermainwindow.cpp b/Pdf4QtViewer/pdfviewermainwindow.cpp
index 6f756dc..ad3d74c 100644
--- a/Pdf4QtViewer/pdfviewermainwindow.cpp
+++ b/Pdf4QtViewer/pdfviewermainwindow.cpp
@@ -175,6 +175,7 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget* parent) :
m_actionManager->setAction(PDFActionManager::ToolMagnifier, ui->actionMagnifier);
m_actionManager->setAction(PDFActionManager::ToolScreenshot, ui->actionScreenshot);
m_actionManager->setAction(PDFActionManager::ToolExtractImage, ui->actionExtractImage);
+ m_actionManager->setAction(PDFActionManager::DeveloperCreateInstaller, ui->actionDeveloperCreateInstaller);
m_actionManager->initActions(pdf::PDFWidgetUtils::scaleDPI(this, QSize(24, 24)), true);
for (QAction* action : m_programController->getRecentFileManager()->getActions())
diff --git a/Pdf4QtViewer/pdfviewermainwindow.ui b/Pdf4QtViewer/pdfviewermainwindow.ui
index 2e43aea..18ebdfa 100644
--- a/Pdf4QtViewer/pdfviewermainwindow.ui
+++ b/Pdf4QtViewer/pdfviewermainwindow.ui
@@ -116,6 +116,7 @@
+
-
+
diff --git a/Pdf4QtViewerLite/main.cpp b/Pdf4QtViewerLite/main.cpp
index 372fb18..f9778f7 100644
--- a/Pdf4QtViewerLite/main.cpp
+++ b/Pdf4QtViewerLite/main.cpp
@@ -1,4 +1,5 @@
#include "pdfviewermainwindowlite.h"
+#include "pdfconstants.h"
#include
#include
@@ -12,7 +13,7 @@ int main(int argc, char *argv[])
QCoreApplication::setOrganizationName("MelkaJ");
QCoreApplication::setApplicationName("PDF4QT Viewer Lite");
- QCoreApplication::setApplicationVersion("1.0.0");
+ QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION);
QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Viewer Lite"));
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::applicationName());
diff --git a/Pdf4QtViewerProfi/main.cpp b/Pdf4QtViewerProfi/main.cpp
index 8d3c180..3911de9 100644
--- a/Pdf4QtViewerProfi/main.cpp
+++ b/Pdf4QtViewerProfi/main.cpp
@@ -1,4 +1,5 @@
#include "pdfviewermainwindow.h"
+#include "pdfconstants.h"
#include
#include
@@ -12,7 +13,7 @@ int main(int argc, char *argv[])
QCoreApplication::setOrganizationName("MelkaJ");
QCoreApplication::setApplicationName("PDF4QT Viewer Profi");
- QCoreApplication::setApplicationVersion("1.0.0");
+ QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION);
QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Viewer Profi"));
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::applicationName());
diff --git a/PdfTool/main.cpp b/PdfTool/main.cpp
index b9aeb7c..0d10937 100644
--- a/PdfTool/main.cpp
+++ b/PdfTool/main.cpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2020 Jakub Melka
+// Copyright (C) 2020-2021 Jakub Melka
//
// This file is part of Pdf4Qt.
//
@@ -16,6 +16,7 @@
// along with Pdf4Qt. If not, see .
#include "pdftoolabstractapplication.h"
+#include "pdfconstants.h"
#include
#include
@@ -26,7 +27,7 @@ int main(int argc, char *argv[])
QGuiApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity, true);
QCoreApplication::setOrganizationName("MelkaJ");
QCoreApplication::setApplicationName("PdfTool");
- QCoreApplication::setApplicationVersion("1.0.0");
+ QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION);
QStringList arguments = QCoreApplication::arguments();