From a4ea87f0610eb0007b57c9e049165d8f93b35713 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sun, 25 Apr 2021 18:33:41 +0200 Subject: [PATCH] Installer --- Pdf4QtLib/sources/pdfconstants.h | 1 + Pdf4QtViewer/Pdf4QtViewer.pro | 1 + Pdf4QtViewer/pdf4qtviewer.qrc | 1 + Pdf4QtViewer/pdfprogramcontroller.cpp | 132 ++++++++++++++++++++++++++ Pdf4QtViewer/pdfprogramcontroller.h | 2 + Pdf4QtViewer/pdfviewermainwindow.cpp | 1 + Pdf4QtViewer/pdfviewermainwindow.ui | 76 ++++++++------- Pdf4QtViewerLite/main.cpp | 3 +- Pdf4QtViewerProfi/main.cpp | 3 +- PdfTool/main.cpp | 5 +- 10 files changed, 186 insertions(+), 39 deletions(-) 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 @@ + @@ -198,7 +199,7 @@ - + :/resources/open.svg:/resources/open.svg @@ -212,7 +213,7 @@ - + :/resources/quit.svg:/resources/quit.svg @@ -279,7 +280,7 @@ - + :/resources/rendering-errors.svg:/resources/rendering-errors.svg @@ -323,7 +324,7 @@ - + :/resources/settings.svg:/resources/settings.svg @@ -335,7 +336,7 @@ - + :/resources/zoom-in.svg:/resources/zoom-in.svg @@ -344,7 +345,7 @@ - + :/resources/zoom-out.svg:/resources/zoom-out.svg @@ -358,7 +359,7 @@ - + :/resources/zoom-fit.svg:/resources/zoom-fit.svg @@ -367,7 +368,7 @@ - + :/resources/zoom-fit-horizontal.svg:/resources/zoom-fit-horizontal.svg @@ -379,7 +380,7 @@ - + :/resources/zoom-fit-vertical.svg:/resources/zoom-fit-vertical.svg @@ -391,7 +392,7 @@ - + :/resources/info.svg:/resources/info.svg @@ -400,7 +401,7 @@ - + :/resources/send-mail.svg:/resources/send-mail.svg @@ -425,7 +426,7 @@ - + :/resources/find.svg:/resources/find.svg @@ -434,7 +435,7 @@ - + :/resources/find-previous.svg:/resources/find-previous.svg @@ -443,7 +444,7 @@ - + :/resources/find-next.svg:/resources/find-next.svg @@ -455,7 +456,7 @@ true - + :/resources/select-text.svg:/resources/select-text.svg @@ -487,7 +488,7 @@ - + :/resources/rotate-right.svg:/resources/rotate-right.svg @@ -496,7 +497,7 @@ - + :/resources/rotate-left.svg:/resources/rotate-left.svg @@ -505,7 +506,7 @@ - + :/resources/print.svg:/resources/print.svg @@ -522,7 +523,7 @@ true - + :/resources/magnifier.svg:/resources/magnifier.svg @@ -537,7 +538,7 @@ true - + :/resources/screenshot-tool.svg:/resources/screenshot-tool.svg @@ -549,7 +550,7 @@ true - + :/resources/extract-image.svg:/resources/extract-image.svg @@ -566,7 +567,7 @@ - + :/resources/undo.svg:/resources/undo.svg @@ -575,7 +576,7 @@ - + :/resources/redo.svg:/resources/redo.svg @@ -658,7 +659,7 @@ true - + :/resources/hyperlink.svg:/resources/hyperlink.svg @@ -718,7 +719,7 @@ true - + :/resources/highlight.svg:/resources/highlight.svg @@ -730,7 +731,7 @@ true - + :/resources/underline.svg:/resources/underline.svg @@ -742,7 +743,7 @@ true - + :/resources/strikeout.svg:/resources/strikeout.svg @@ -754,7 +755,7 @@ true - + :/resources/squiggly.svg:/resources/squiggly.svg @@ -763,7 +764,7 @@ - + :/resources/previous-start.svg:/resources/previous-start.svg @@ -772,7 +773,7 @@ - + :/resources/next-end.svg:/resources/next-end.svg @@ -781,7 +782,7 @@ - + :/resources/next-page.svg:/resources/next-page.svg @@ -790,7 +791,7 @@ - + :/resources/previous-page.svg:/resources/previous-page.svg @@ -799,7 +800,7 @@ - + :/resources/next.svg:/resources/next.svg @@ -808,17 +809,22 @@ - + :/resources/previous.svg:/resources/previous.svg Go to previous line + + + Create Installer + + - + 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();