diff options
Diffstat (limited to 'libs/installer_bundle')
| -rw-r--r-- | libs/installer_bundle/.clang-format | 41 | ||||
| -rw-r--r-- | libs/installer_bundle/.git-blame-ignore-revs | 1 | ||||
| -rw-r--r-- | libs/installer_bundle/.gitattributes | 7 | ||||
| -rw-r--r-- | libs/installer_bundle/.github/workflows/build.yml | 20 | ||||
| -rw-r--r-- | libs/installer_bundle/.github/workflows/linting.yml | 16 | ||||
| -rw-r--r-- | libs/installer_bundle/.gitignore | 5 | ||||
| -rw-r--r-- | libs/installer_bundle/.pre-commit-config.yaml | 20 | ||||
| -rw-r--r-- | libs/installer_bundle/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | libs/installer_bundle/CMakePresets.json | 67 | ||||
| -rw-r--r-- | libs/installer_bundle/src/CMakeLists.txt | 14 | ||||
| -rw-r--r-- | libs/installer_bundle/src/installer_bundle_en.ts | 46 | ||||
| -rw-r--r-- | libs/installer_bundle/src/installerbundle.cpp | 194 | ||||
| -rw-r--r-- | libs/installer_bundle/src/installerbundle.h | 88 | ||||
| -rw-r--r-- | libs/installer_bundle/src/multiarchivedialog.cpp | 40 | ||||
| -rw-r--r-- | libs/installer_bundle/src/multiarchivedialog.h | 78 | ||||
| -rw-r--r-- | libs/installer_bundle/src/multiarchivedialog.ui | 77 | ||||
| -rw-r--r-- | libs/installer_bundle/vcpkg.json | 15 |
17 files changed, 734 insertions, 0 deletions
diff --git a/libs/installer_bundle/.clang-format b/libs/installer_bundle/.clang-format new file mode 100644 index 0000000..6098e1f --- /dev/null +++ b/libs/installer_bundle/.clang-format @@ -0,0 +1,41 @@ +--- +# We'll use defaults from the LLVM style, but with 4 columns indentation. +BasedOnStyle: LLVM +IndentWidth: 2 +--- +Language: Cpp +DeriveLineEnding: false +UseCRLF: true +DerivePointerAlignment: false +PointerAlignment: Left +AlignConsecutiveAssignments: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: Empty +AlwaysBreakTemplateDeclarations: Yes +AccessModifierOffset: -2 +AlignTrailingComments: true +SpacesBeforeTrailingComments: 2 +NamespaceIndentation: Inner +MaxEmptyLinesToKeep: 1 +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +ColumnLimit: 88 +ForEachMacros: ['Q_FOREACH', 'foreach'] diff --git a/libs/installer_bundle/.git-blame-ignore-revs b/libs/installer_bundle/.git-blame-ignore-revs new file mode 100644 index 0000000..b2ed96a --- /dev/null +++ b/libs/installer_bundle/.git-blame-ignore-revs @@ -0,0 +1 @@ +988523cac10641c510fd711d80d59c82d473f6a5 diff --git a/libs/installer_bundle/.gitattributes b/libs/installer_bundle/.gitattributes new file mode 100644 index 0000000..f869712 --- /dev/null +++ b/libs/installer_bundle/.gitattributes @@ -0,0 +1,7 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.cpp text eol=crlf +*.h text eol=crlf diff --git a/libs/installer_bundle/.github/workflows/build.yml b/libs/installer_bundle/.github/workflows/build.yml new file mode 100644 index 0000000..3e83565 --- /dev/null +++ b/libs/installer_bundle/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: Build Installer Bundle + +on: + push: + branches: [master] + pull_request: + types: [opened, synchronize, reopened] + +env: + VCPKG_BINARY_SOURCES: clear;x-azblob,${{ vars.AZ_BLOB_VCPKG_URL }},${{ secrets.AZ_BLOB_SAS }},readwrite + +jobs: + build: + runs-on: windows-2022 + steps: + - name: Build Installer Bundle + id: build-installer-bundle + uses: ModOrganizer2/build-with-mob-action@master + with: + mo2-dependencies: uibase diff --git a/libs/installer_bundle/.github/workflows/linting.yml b/libs/installer_bundle/.github/workflows/linting.yml new file mode 100644 index 0000000..31c504d --- /dev/null +++ b/libs/installer_bundle/.github/workflows/linting.yml @@ -0,0 +1,16 @@ +name: Lint Installer Bundle Plugin + +on: + push: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check format + uses: ModOrganizer2/check-formatting-action@master + with: + check-path: "." diff --git a/libs/installer_bundle/.gitignore b/libs/installer_bundle/.gitignore new file mode 100644 index 0000000..cf71be7 --- /dev/null +++ b/libs/installer_bundle/.gitignore @@ -0,0 +1,5 @@ +edit +CMakeLists.txt.user +/msbuild.log +/*std*.log +/*build diff --git a/libs/installer_bundle/.pre-commit-config.yaml b/libs/installer_bundle/.pre-commit-config.yaml new file mode 100644 index 0000000..3103a1f --- /dev/null +++ b/libs/installer_bundle/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-merge-conflict + - id: check-case-conflict + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v19.1.5 + hooks: + - id: clang-format + 'types_or': [c++, c] + +ci: + autofix_commit_msg: "[pre-commit.ci] Auto fixes from pre-commit.com hooks." + autofix_prs: true + autoupdate_commit_msg: "[pre-commit.ci] Pre-commit autoupdate." + autoupdate_schedule: quarterly + submodules: false diff --git a/libs/installer_bundle/CMakeLists.txt b/libs/installer_bundle/CMakeLists.txt new file mode 100644 index 0000000..6c48f9d --- /dev/null +++ b/libs/installer_bundle/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.16) + +project(installer_bundle) + +add_subdirectory(src) diff --git a/libs/installer_bundle/CMakePresets.json b/libs/installer_bundle/CMakePresets.json new file mode 100644 index 0000000..5a63c77 --- /dev/null +++ b/libs/installer_bundle/CMakePresets.json @@ -0,0 +1,67 @@ +{ + "configurePresets": [ + { + "errors": { + "deprecated": true + }, + "hidden": true, + "name": "cmake-dev", + "warnings": { + "deprecated": true, + "dev": true + } + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_NO_DEFAULT_FEATURES": { + "type": "BOOL", + "value": "ON" + } + }, + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "hidden": true, + "name": "vcpkg" + }, + { + "hidden": true, + "inherits": ["vcpkg"], + "name": "vcpkg-dev" + }, + { + "binaryDir": "${sourceDir}/vsbuild", + "architecture": { + "strategy": "set", + "value": "x64" + }, + "cacheVariables": { + "CMAKE_CXX_FLAGS": "/EHsc /MP /W4", + "VCPKG_TARGET_TRIPLET": { + "type": "STRING", + "value": "x64-windows-static-md" + } + }, + "generator": "Visual Studio 17 2022", + "inherits": ["cmake-dev", "vcpkg-dev"], + "name": "vs2022-windows", + "toolset": "v143" + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_FEATURES": { + "type": "STRING", + "value": "standalone" + } + }, + "inherits": "vs2022-windows", + "name": "vs2022-windows-standalone" + } + ], + "buildPresets": [ + { + "name": "vs2022-windows", + "resolvePackageReferences": "on", + "configurePreset": "vs2022-windows" + } + ], + "version": 4 +} diff --git a/libs/installer_bundle/src/CMakeLists.txt b/libs/installer_bundle/src/CMakeLists.txt new file mode 100644 index 0000000..7b946ce --- /dev/null +++ b/libs/installer_bundle/src/CMakeLists.txt @@ -0,0 +1,14 @@ + +cmake_minimum_required(VERSION 3.16) + +file(GLOB installer_bundle_SOURCES CONFIGURE_DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/*.ui + ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc +) + +add_library(installer_bundle SHARED ${installer_bundle_SOURCES}) +mo2_configure_plugin(installer_bundle NO_SOURCES WARNINGS OFF) +target_link_libraries(installer_bundle PRIVATE mo2::uibase) +mo2_install_plugin(installer_bundle) diff --git a/libs/installer_bundle/src/installer_bundle_en.ts b/libs/installer_bundle/src/installer_bundle_en.ts new file mode 100644 index 0000000..d38444a --- /dev/null +++ b/libs/installer_bundle/src/installer_bundle_en.ts @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en_US"> +<context> + <name>InstallerBundle</name> + <message> + <location filename="installerbundle.cpp" line="45"/> + <source>Bundle Installer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="installerbundle.cpp" line="55"/> + <source>Proxy-Installer to handle bundles containing the actual mod archive</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MultiArchiveDialog</name> + <message> + <location filename="multiarchivedialog.ui" line="14"/> + <source>Bundled archives</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="multiarchivedialog.ui" line="20"/> + <source>This archive contains multiple archives that can be installed separately. Please select the archive you want to extract and install.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="multiarchivedialog.ui" line="35"/> + <location filename="multiarchivedialog.ui" line="38"/> + <source>Opens a Dialog that allows custom modifications.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="multiarchivedialog.ui" line="41"/> + <source>Manual</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="multiarchivedialog.ui" line="64"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/libs/installer_bundle/src/installerbundle.cpp b/libs/installer_bundle/src/installerbundle.cpp new file mode 100644 index 0000000..65ea02f --- /dev/null +++ b/libs/installer_bundle/src/installerbundle.cpp @@ -0,0 +1,194 @@ +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "installerbundle.h" + +#include <QtPlugin> + +#include <uibase/iinstallationmanager.h> + +#include "multiarchivedialog.h" + +using namespace MOBase; + +InstallerBundle::InstallerBundle() {} + +bool InstallerBundle::init(IOrganizer* organizer) +{ + m_Organizer = organizer; + return true; +} + +QString InstallerBundle::name() const +{ + return "Bundle Installer"; +} + +QString InstallerBundle::localizedName() const +{ + return tr("Bundle Installer"); +} + +QString InstallerBundle::author() const +{ + return "Tannin"; +} + +QString InstallerBundle::description() const +{ + return tr("Proxy-Installer to handle bundles containing the actual mod archive"); +} + +VersionInfo InstallerBundle::version() const +{ + return VersionInfo(1, 1, 0, VersionInfo::RELEASE_FINAL); +} + +QList<PluginSetting> InstallerBundle::settings() const +{ + return {PluginSetting("auto_reinstall", + "when reinstalling from an archive containing multiple mods, " + "automatically select the previously installed", + true)}; +} + +unsigned int InstallerBundle::priority() const +{ + return 10; +} + +bool InstallerBundle::isManualInstaller() const +{ + return false; +} + +void InstallerBundle::onInstallationStart(QString const& archive, bool reinstallation, + IModInterface* currentMod) +{ + // We reset some field and fetch the previously installed file: + m_InstallationFile = archive; + m_InstallerUsed = false; + m_SelectedFile = ""; + m_PreviousFile = ""; + + if (reinstallation && m_Organizer->pluginSetting(name(), "auto_reinstall").toBool()) { + m_PreviousFile = currentMod->pluginSetting(name(), "archive", QString()).toString(); + } +} +void InstallerBundle::onInstallationEnd(EInstallResult result, IModInterface* newMod) +{ + if (result == EInstallResult::RESULT_SUCCESS && m_InstallerUsed) { + newMod->setInstallationFile(m_InstallationFile); + if (!m_SelectedFile.isEmpty()) { + newMod->setPluginSetting(name(), "archive", m_SelectedFile); + } + } +} + +std::vector<std::shared_ptr<const MOBase::FileTreeEntry>> +InstallerBundle::findObjects(std::shared_ptr<const IFileTree> tree) const +{ + std::vector<std::shared_ptr<const MOBase::FileTreeEntry>> entries; + // Check if we have an archive: + auto managerExtensions = manager()->getSupportedExtensions(); + + // Look for a file with a valid extension: + int nDirs = 0; + for (auto entry : *tree) { + if (entry->isFile()) { + if (managerExtensions.contains(entry->suffix(), + FileNameComparator::CaseSensitivity)) { + entries.push_back(entry); + } + } else { + nDirs++; + } + } + + if (!entries.empty()) { + return entries; + } + + // Arguably this should also check the name of the directory we're looking at + // is the same as the module name: + if (nDirs != 1) { + return {}; + } + + // Retrieve the first folder which is the first item: + return findObjects(tree->at(0)->astree()); +} + +bool InstallerBundle::isArchiveSupported(std::shared_ptr<const IFileTree> tree) const +{ + return !findObjects(tree).empty(); +} + +IPluginInstaller::EInstallResult +InstallerBundle::install(GuessedValue<QString>& modName, + std::shared_ptr<IFileTree>& tree, QString&, int& modId) +{ + // Find a valid "object": + auto entries = findObjects(tree); + if (entries.empty()) { + return IPluginInstaller::RESULT_NOTATTEMPTED; + } + + std::shared_ptr<const FileTreeEntry> entry = nullptr; + if (entries.size() == 1) { + entry = entries[0]; + } else { + if (!m_PreviousFile.isEmpty()) { + entry = tree->find(m_PreviousFile); + } + + if (entry == nullptr) { + MultiArchiveDialog dialog(entries, parentWidget()); + if (dialog.exec() == QDialog::Accepted) { + entry = dialog.selectedEntry(); + m_SelectedFile = entry->pathFrom(tree); + } else { + if (dialog.manualRequested()) { + return IPluginInstaller::RESULT_MANUALREQUESTED; + } else { + return IPluginInstaller::RESULT_CANCELED; + } + } + } + } + + if (entry == nullptr) { + return IPluginInstaller::RESULT_CANCELED; + } + + m_InstallerUsed = true; + + // Extract it: + QString tempFile = manager()->extractFile(entry); + IPluginInstaller::EInstallResult res = + manager()->installArchive(modName, tempFile, modId); + if (res == IPluginInstaller::RESULT_SUCCESS) { + res = IPluginInstaller::RESULT_SUCCESSCANCEL; + } + return res; +} + +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +Q_EXPORT_PLUGIN2(installerBundle, InstallerBundle) +#endif diff --git a/libs/installer_bundle/src/installerbundle.h b/libs/installer_bundle/src/installerbundle.h new file mode 100644 index 0000000..59cc28c --- /dev/null +++ b/libs/installer_bundle/src/installerbundle.h @@ -0,0 +1,88 @@ +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef INSTALLERBUNDLE_H +#define INSTALLERBUNDLE_H + +#include <uibase/iplugininstallersimple.h> + +class InstallerBundle : public MOBase::IPluginInstallerSimple +{ + + Q_OBJECT + Q_INTERFACES(MOBase::IPlugin MOBase::IPluginInstaller MOBase::IPluginInstallerSimple) +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + Q_PLUGIN_METADATA(IID "org.tannin.InstallerBundle") +#endif + +public: + InstallerBundle(); + + virtual bool init(MOBase::IOrganizer* moInfo) override; + virtual QString name() const override; + virtual QString localizedName() const override; + virtual QString author() const override; + virtual QString description() const override; + virtual MOBase::VersionInfo version() const override; + virtual QList<MOBase::PluginSetting> settings() const override; + + virtual unsigned int priority() const override; + virtual bool isManualInstaller() const override; + + virtual void onInstallationStart(QString const& archive, bool reinstallation, + MOBase::IModInterface* currentMod) override; + virtual void onInstallationEnd(EInstallResult result, + MOBase::IModInterface* newMod) override; + + virtual bool + isArchiveSupported(std::shared_ptr<const MOBase::IFileTree> tree) const override; + virtual EInstallResult install(MOBase::GuessedValue<QString>& modName, + std::shared_ptr<MOBase::IFileTree>& tree, + QString& version, int& modID) override; + +private: + /** + * @brief Find the entries that can be extracted from this archive. + * + * @param tree The tree to look the entry in. + * + * @return the entry, if one was found, or a null pointer. + */ + std::vector<std::shared_ptr<const MOBase::FileTreeEntry>> + findObjects(std::shared_ptr<const MOBase::IFileTree> tree) const; + +private: + MOBase::IOrganizer* m_Organizer; + + // The archive being installed: + QString m_InstallationFile; + + // Indicates if this installer was used during the installation process: + bool m_InstallerUsed; + + // Contains the file installed (when multiple archives are present), or an + // empty string: + QString m_SelectedFile; + + // Contains the file previously installed (when multiple archives are present), or an + // empty string: + QString m_PreviousFile; +}; + +#endif // INSTALLERBUNDLE_H diff --git a/libs/installer_bundle/src/multiarchivedialog.cpp b/libs/installer_bundle/src/multiarchivedialog.cpp new file mode 100644 index 0000000..03774f6 --- /dev/null +++ b/libs/installer_bundle/src/multiarchivedialog.cpp @@ -0,0 +1,40 @@ +#include "multiarchivedialog.h" +#include "ui_multiarchivedialog.h" + +using namespace MOBase; + +MultiArchiveDialog::MultiArchiveDialog( + std::vector<std::shared_ptr<const MOBase::FileTreeEntry>> entries, QWidget* parent) + : QDialog(parent), ui(new Ui::MultiArchiveDialog), m_Manual(false), + m_SelectedEntry(nullptr) +{ + ui->setupUi(this); + + auto layout = ui->middleLayout; + for (auto& entry : entries) { + QPushButton* button = new QPushButton(entry->name(), this); + button->setStyleSheet("text-align: left; padding: 10px; font-weight: bold;"); + layout->addWidget(button); + + connect(button, &QPushButton::clicked, [this, entry]() { + m_SelectedEntry = entry; + this->accept(); + }); + } +} + +MultiArchiveDialog::~MultiArchiveDialog() +{ + delete ui; +} + +void MultiArchiveDialog::on_cancelBtn_clicked() +{ + this->reject(); +} + +void MultiArchiveDialog::on_manualBtn_clicked() +{ + m_Manual = true; + this->reject(); +} diff --git a/libs/installer_bundle/src/multiarchivedialog.h b/libs/installer_bundle/src/multiarchivedialog.h new file mode 100644 index 0000000..39949b9 --- /dev/null +++ b/libs/installer_bundle/src/multiarchivedialog.h @@ -0,0 +1,78 @@ +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BAINCOMPLEXINSTALLERDIALOG_H +#define BAINCOMPLEXINSTALLERDIALOG_H + +#include <vector> + +#include <QDialog> + +#include <uibase/ifiletree.h> + +namespace Ui +{ +class MultiArchiveDialog; +} + +/** + * + **/ +class MultiArchiveDialog : public QDialog +{ + Q_OBJECT + +public: + /** + * @brief Constructor + * + * @param tree the directory tree of the archive. The caller is resonsible to verify + *this actually qualifies as a bain installer + * @param modName proposed name for the mod. The dialog allows the user to change this + * @param packageTXT path to the extracted package.txt file or an empty string if + *there is none + * @param parent parent widget + **/ + explicit MultiArchiveDialog( + std::vector<std::shared_ptr<const MOBase::FileTreeEntry>> entries, + QWidget* parent); + ~MultiArchiveDialog(); + + /** + * @return bool true if the user requested the manual dialog + **/ + bool manualRequested() const { return m_Manual; } + + /** + * @return QString the (user-modified) name to be used for the mod + **/ + auto selectedEntry() const { return m_SelectedEntry; } + +private slots: + + void on_manualBtn_clicked(); + void on_cancelBtn_clicked(); + +private: + Ui::MultiArchiveDialog* ui; + bool m_Manual; + std::shared_ptr<const MOBase::FileTreeEntry> m_SelectedEntry; +}; + +#endif // BAINCOMPLEXINSTALLERDIALOG_H diff --git a/libs/installer_bundle/src/multiarchivedialog.ui b/libs/installer_bundle/src/multiarchivedialog.ui new file mode 100644 index 0000000..47d5d8b --- /dev/null +++ b/libs/installer_bundle/src/multiarchivedialog.ui @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MultiArchiveDialog</class> + <widget class="QDialog" name="MultiArchiveDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>424</width> + <height>146</height> + </rect> + </property> + <property name="windowTitle"> + <string>Bundled archives</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>This archive contains multiple archives that can be installed separately. Please select the archive you want to extract and install.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="middleLayout"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="manualBtn"> + <property name="toolTip"> + <string>Opens a Dialog that allows custom modifications.</string> + </property> + <property name="whatsThis"> + <string>Opens a Dialog that allows custom modifications.</string> + </property> + <property name="text"> + <string>Manual</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="cancelBtn"> + <property name="text"> + <string>Cancel</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/libs/installer_bundle/vcpkg.json b/libs/installer_bundle/vcpkg.json new file mode 100644 index 0000000..28051ad --- /dev/null +++ b/libs/installer_bundle/vcpkg.json @@ -0,0 +1,15 @@ +{ + "features": { + "standalone": { + "description": "Build Standalone.", + "dependencies": ["mo2-cmake", "mo2-uibase"] + } + }, + "vcpkg-configuration": { + "default-registry": { + "kind": "git", + "repository": "https://github.com/ModOrganizer2/vcpkg-registry", + "baseline": "8beb2e0efa9c17dd6d17bb05288dd1e40727f673" + } + } +} |
