Author SHA1 Message Date
Mikaël Capelle aff1cbb944 Fixes for Qt6. 2022-04-22 13:18:04 +02:00
Mikaël Capelle 6492f84eac Minor fixes. 2022-04-19 23:33:35 +02:00
Mikaël Capelle 7b3dc82f46 Update following cmake_common changes.
# Conflicts:
#	CMakeLists.txt
2022-04-19 22:03:11 +02:00
Jeremy Rimpo 76faacba19 Merge remote-tracking branch 'origin/master' into qt6 2022-04-17 20:17:40 -05:00
Mikaël Capelle 0c8d7261fd Merge pull request #3 from Holt59/update-interpreter
Update interpreter to fix issues with case-sensitive comparisons.
2022-02-05 14:33:38 +01:00
Mikaël Capelle 3cf15300fb Update interpreter to fix issues with case-sensitive comparisons. 2022-02-05 14:31:39 +01:00
Jeremy Rimpo 3bfd181704 Installer image improvements
- Expand size of options / image row
- Resize image with correct aspect ratio
- Add maximize button to titlebar
2021-12-26 01:23:16 -06:00
Jeremy Rimpo bffeb8c05f More PyQt6 enum fixes 2021-12-26 01:16:42 -06:00
Jeremy Rimpo f7a9c95d5b Fix issues with PyQt6 2021-12-25 20:54:10 -06:00
Jeremy Rimpo 793ab6273b Reformat the translations 2021-12-09 19:39:50 -06:00
Jeremy Rimpo 7e5ec2d11a Fix pylupdate parsing 2021-12-06 23:50:35 -06:00
Jeremy Rimpo ca343602ec PyQt6 Compatibility 2021-12-06 05:25:26 -06:00
Jeremy Rimpo e2202073dc Changes to compile with Qt6 + Boost 1.77 2021-12-05 03:42:40 -06:00
11 changed files with 226 additions and 189 deletions
+4 -6
View File
@@ -1,13 +1,11 @@
cmake_minimum_required(VERSION 3.16)
project(installer_wizard LANGUAGES NONE)
set(project_type python_module_plugin)
set(enable_warnings OFF)
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/project.cmake)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/mo2.cmake)
else()
include(../cmake_common/project.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/../cmake_common/mo2.cmake)
endif()
project(installer_wizard LANGUAGES NONE)
add_subdirectory(src)
+1 -1
View File
@@ -1 +1 @@
git+https://github.com/Holt59/bain-wizard-interpreter
git+https://github.com/Holt59/bain-wizard-interpreter@v0.0.3
+2 -2
View File
@@ -1,7 +1,7 @@
black
PyQt5
PyQt6
mypy
flake8
flake8-black
mobase-stubs
git+https://github.com/Holt59/bain-wizard-interpreter
git+https://github.com/Holt59/bain-wizard-interpreter.git@v0.0.3
+13 -4
View File
@@ -6,6 +6,12 @@ extend-ignore =
E203,
exclude = lib,ui
[isort]
profile = black
multi_line_output = 3
known_mobase = mobase
sections=FUTURE,STDLIB,THIRDPARTY,MOBASE,FIRSTPARTY,LOCALFOLDER
[mypy]
warn_return_any = True
warn_unused_configs = True
@@ -28,18 +34,21 @@ ignore_missing_imports = True
[tox:tox]
skipsdist = true
envlist = py38-lint
envlist = py310-lint
[testenv:py38-lint]
[testenv:py310-lint]
skip_install = true
deps =
git+https://github.com/TilmanK/PyQt6-stubs.git
mobase-stubs==2.5.0.dev2
git+https://github.com/Holt59/bain-wizard-interpreter@v0.0.3
black
mypy
flake8
flake8-black
mobase-stubs==2.4.0.a3
git+https://github.com/Holt59/bain-wizard-interpreter
isort
commands =
black src --check --diff --exclude "lib" --exclude "ui"
isort -c src
flake8 src
mypy src
+2 -5
View File
@@ -1,7 +1,4 @@
cmake_minimum_required(VERSION 3.16)
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/src.cmake)
else()
include(../../cmake_common/src.cmake)
endif()
add_custom_target(installer_wizard ALL)
mo2_configure_python(installer_wizard MODULE)
+90 -60
View File
@@ -3,35 +3,34 @@
from pathlib import Path
from typing import Any, Dict, List, Mapping, Optional, Set, Tuple
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QPixmap, QKeySequence, QFontDatabase
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets
import mobase
from .ui.wizardinstallerdialog import Ui_WizardInstallerDialog
from .ui.wizardinstallerpage import Ui_WizardInstallerPage
from .ui.wizardinstallerrequires import Ui_WizardInstallerRequires
from .ui.wizardinstallercomplete import Ui_WizardInstallerComplete
from .ui.wizardinstallererror import Ui_WizardInstallerError
from antlr4 import ParserRuleContext
from PyQt6 import QtWidgets
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtGui import QFontDatabase, QKeySequence, QPixmap, QResizeEvent, QShortcut
from PyQt6.QtWidgets import QApplication
from wizard.contexts import (
WizardInterpreterContext,
WizardTopLevelContext,
WizardSelectContext,
WizardSelectOneContext,
WizardSelectManyContext,
WizardRequireVersionsContext,
WizardSelectContext,
WizardSelectManyContext,
WizardSelectOneContext,
WizardTerminationContext,
WizardTopLevelContext,
)
from wizard.errors import WizardError
from wizard.interpreter import WizardInterpreter
from wizard.manager import SelectOption
from wizard.runner import WizardRunnerState, WizardRunnerKeywordVisitor
from wizard.runner import WizardRunnerKeywordVisitor, WizardRunnerState
from wizard.tweaks import WizardINISetting
from wizard.value import Plugin
import mobase
from .ui.wizardinstallercomplete import Ui_WizardInstallerComplete
from .ui.wizardinstallerdialog import Ui_WizardInstallerDialog
from .ui.wizardinstallererror import Ui_WizardInstallerError
from .ui.wizardinstallerpage import Ui_WizardInstallerPage
from .ui.wizardinstallerrequires import Ui_WizardInstallerRequires
from .utils import make_ini_tweaks
WizardRunnerContext = WizardInterpreterContext[WizardRunnerState, Any]
@@ -104,13 +103,22 @@ class WizardInstallerRequiresVersionPage(QtWidgets.QWidget):
game = organizer.managedGame()
okIcon = QPixmap(":/MO/gui/checked-checkbox").scaled(
16, 16, Qt.KeepAspectRatio, Qt.SmoothTransformation
16,
16,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
noIcon = QPixmap(":/MO/gui/unchecked-checkbox").scaled(
16, 16, Qt.KeepAspectRatio, Qt.SmoothTransformation
16,
16,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
koIcon = QPixmap(":/MO/gui/indeterminate-checkbox").scaled(
16, 16, Qt.KeepAspectRatio, Qt.SmoothTransformation
16,
16,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
self.ui.labelGame.setText(game.gameName())
@@ -143,6 +151,7 @@ class WizardInstallerSelectPage(QtWidgets.QWidget):
_context: WizardSelectContext
_images: Mapping[Path, Path]
_currentImage: QPixmap
def __init__(
self,
@@ -191,11 +200,11 @@ class WizardInstallerSelectPage(QtWidgets.QWidget):
for i, option in enumerate(context.options):
item = self.ui.optionList.item(i)
if isinstance(context, WizardSelectManyContext):
item.setFlags(item.flags() | Qt.ItemIsUserCheckable) # type: ignore
item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable)
if option in previous_options:
item.setCheckState(Qt.Checked)
item.setCheckState(Qt.CheckState.Checked)
else:
item.setCheckState(Qt.Unchecked)
item.setCheckState(Qt.CheckState.Unchecked)
elif (
isinstance(context, WizardSelectOneContext)
and option in previous_options
@@ -220,7 +229,7 @@ class WizardInstallerSelectPage(QtWidgets.QWidget):
for i, option in enumerate(options):
item = self.ui.optionList.item(i)
item.setText(option.name)
item.setData(Qt.UserRole, option)
item.setData(Qt.ItemDataRole.UserRole, option)
# No item selected, select the first one:
if not self.ui.optionList.currentItem():
@@ -229,24 +238,41 @@ class WizardInstallerSelectPage(QtWidgets.QWidget):
def onCurrentItemChanged(
self, current: QtWidgets.QListWidgetItem, previous: QtWidgets.QListWidgetItem
):
option: SelectOption = current.data(Qt.UserRole)
option: SelectOption = current.data(Qt.ItemDataRole.UserRole)
self.ui.descriptionTextEdit.setText(option.description)
image = option.image
if image and Path(image) in self._images:
target = self._images[Path(image)]
self.ui.imageLabel.setPixmap(QPixmap(target.as_posix()))
self._currentImage = QPixmap(target.as_posix())
else:
self.ui.imageLabel.setPixmap(QPixmap())
self._currentImage = QPixmap()
self.ui.imageLabel.setPixmap(self.getResizedImage())
def getResizedImage(self) -> QPixmap:
if self._currentImage.isNull():
return self._currentImage
return self._currentImage.scaled(
self.ui.imageLabel.size(),
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
def resizeEvent(self, event: QResizeEvent) -> None:
super().resizeEvent(event)
self.ui.imageLabel.setPixmap(self.getResizedImage())
def selectedOptions(self) -> List[SelectOption]:
options = []
if isinstance(self._context, WizardSelectOneContext):
options.append(self.ui.optionList.currentItem().data(Qt.UserRole))
options.append(
self.ui.optionList.currentItem().data(Qt.ItemDataRole.UserRole)
)
else:
for i in range(self.ui.optionList.count()):
item = self.ui.optionList.item(i)
if item.checkState() == Qt.Checked:
options.append(item.data(Qt.UserRole))
if item.checkState() == Qt.CheckState.Checked:
options.append(item.data(Qt.ItemDataRole.UserRole))
return options
def selected(self) -> WizardSelectContext:
@@ -279,17 +305,17 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
kvisitor: WizardRunnerKeywordVisitor = context.factory.kvisitor # type: ignore
# The list of plugins in selected sub-packages:
plugins: Set[str] = set()
plugins: Set[Plugin] = set()
# SubPackages:
for sp in kvisitor.subpackages:
item = QtWidgets.QListWidgetItem()
item.setText(sp.name)
if sp.name in self.state.subpackages:
item.setCheckState(Qt.Checked)
item.setCheckState(Qt.CheckState.Checked)
else:
item.setCheckState(Qt.Unchecked)
item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) # type: ignore
item.setCheckState(Qt.CheckState.Unchecked)
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
plugins.update(kvisitor.plugins_for(sp))
self.ui.subpackagesList.addItem(item)
@@ -297,17 +323,17 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
for plugin in list(plugins):
if plugin in self.state.renames:
plugins.remove(plugin)
plugins.add(self.state.renames[plugin])
plugins.add(Plugin(self.state.renames[plugin]))
# Plugins:
for plugin in sorted(plugins):
item = QtWidgets.QListWidgetItem()
item.setText(plugin)
item.setText(plugin.name)
if plugin in self.state.plugins:
item.setCheckState(Qt.Checked)
item.setCheckState(Qt.CheckState.Checked)
else:
item.setCheckState(Qt.Unchecked)
item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) # type: ignore
item.setCheckState(Qt.CheckState.Unchecked)
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
self.ui.pluginsList.addItem(item)
# INI Tweaks:
@@ -323,11 +349,11 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
for file, ftweaks in tweaks.items():
item = QtWidgets.QListWidgetItem()
item.setText(file.replace("\\", "/"))
item.setData(Qt.UserRole, ftweaks)
item.setData(Qt.ItemDataRole.UserRole, ftweaks)
self.ui.tweaksList.addItem(item)
self.ui.tweaksTextEdit.setFont(
QFontDatabase.systemFont(QFontDatabase.FixedFont)
QFontDatabase.systemFont(QFontDatabase.SystemFont.FixedFont)
)
self.ui.tweaksList.setCurrentRow(0)
@@ -344,7 +370,7 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
# Clear text area and create the tweaks:
self.ui.tweaksTextEdit.clear()
self.ui.tweaksTextEdit.appendPlainText(
make_ini_tweaks(current.data(Qt.UserRole))
make_ini_tweaks(current.data(Qt.ItemDataRole.UserRole))
)
def subpackages(self) -> List[str]:
@@ -356,7 +382,7 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
sp: List[str] = []
for i in range(self.ui.subpackagesList.count()):
item = self.ui.subpackagesList.item(i)
if item.checkState() == Qt.Checked:
if item.checkState() == Qt.CheckState.Checked:
sp.append(item.text())
return sp
@@ -369,7 +395,7 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
sp: Dict[str, bool] = {}
for i in range(self.ui.pluginsList.count()):
item = self.ui.pluginsList.item(i)
sp[item.text()] = item.checkState() == Qt.Checked
sp[item.text()] = item.checkState() == Qt.CheckState.Checked
return sp
def tweaks(self) -> Mapping[str, List[WizardINISetting]]:
@@ -381,7 +407,7 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
rets = {}
for i in range(self.ui.tweaksList.count()):
item = self.ui.tweaksList.item(i)
rets[item.text()] = item.data(Qt.UserRole)
rets[item.text()] = item.data(Qt.ItemDataRole.UserRole)
return rets
@@ -402,7 +428,7 @@ class WizardInstallerCancelPage(QtWidgets.QWidget):
)
self.ui.iconLabel.setPixmap(
self.style()
.standardIcon(QtWidgets.QStyle.SP_MessageBoxWarning)
.standardIcon(QtWidgets.QStyle.StandardPixmap.SP_MessageBoxWarning)
.pixmap(24, 24)
)
self.ui.messageEdit.setText(context.message())
@@ -427,7 +453,7 @@ class WizardInstallerErrorPage(QtWidgets.QWidget):
)
self.ui.iconLabel.setPixmap(
self.style()
.standardIcon(QtWidgets.QStyle.SP_MessageBoxCritical)
.standardIcon(QtWidgets.QStyle.StandardPixmap.SP_MessageBoxCritical)
.pixmap(24, 24)
)
self.ui.messageEdit.setText(str(error))
@@ -484,18 +510,21 @@ class WizardInstallerDialog(QtWidgets.QDialog):
self.ui = Ui_WizardInstallerDialog()
self.ui.setupUi(self)
self.setWindowFlag(Qt.WindowContextHelpButtonHint, False)
self.setWindowFlag(Qt.WindowType.WindowContextHelpButtonHint, False)
self.setWindowFlag(Qt.WindowType.WindowMaximizeButtonHint, True)
# mobase.GuessedString contains multiple names with various level of
# "guess". Using .variants() returns the list of names, and doing str(name)
# will return the most-likely value.
for value in name.variants():
self.ui.nameCombo.addItem(value)
self.ui.nameCombo.completer().setCaseSensitivity(Qt.CaseSensitive)
self.ui.nameCombo.completer().setCaseSensitivity(
Qt.CaseSensitivity.CaseSensitive
)
self.ui.nameCombo.setCurrentIndex(self.ui.nameCombo.findText(str(name)))
# We need to connect the Cancel / Manual buttons. We can of course use
# PyQt5 signal/slot syntax:
# PyQt6 signal/slot syntax:
self.ui.cancelBtn.clicked.connect(self.reject)
def manualClicked():
@@ -507,9 +536,8 @@ class WizardInstallerDialog(QtWidgets.QDialog):
self.ui.prevBtn.clicked.connect(self.previousClicked)
self.ui.nextBtn.clicked.connect(self.nextClicked)
QtWidgets.QShortcut(QKeySequence(Qt.Key_Backspace), self).activated.connect(
self.previousClicked
)
backShortcut = QShortcut(QKeySequence(Qt.Key.Key_Backspace), self)
backShortcut.activated.connect(self.previousClicked) # type: ignore
@property
def scriptButtonClicked(self) -> pyqtSignal:
@@ -549,7 +577,9 @@ class WizardInstallerDialog(QtWidgets.QDialog):
"""
widget = self.ui.stackedWidget.currentWidget()
assert isinstance(widget, WizardInstallerCompletePage)
return widget.state.renames
return {
plugin.name: new_name for plugin, new_name in widget.state.renames.items()
}
def tweaks(self) -> Mapping[str, List[WizardINISetting]]:
"""
@@ -618,7 +648,7 @@ class WizardInstallerDialog(QtWidgets.QDialog):
def _update_focus(self):
widget = self.ui.stackedWidget.currentWidget()
if isinstance(widget, WizardInstallerSelectPage):
widget.ui.optionList.setFocus(True)
widget.ui.optionList.setFocus()
def _update_prev_button(self):
self.ui.prevBtn.setDisabled(self.ui.stackedWidget.currentIndex() <= 0)
@@ -630,13 +660,13 @@ class WizardInstallerDialog(QtWidgets.QDialog):
name: str = self.ui.nextBtn.text()
if isinstance(widget, WizardInstallerSelectPage):
name = self.__tr("Next")
name = self.tr("Next")
elif isinstance(widget, WizardInstallerRequiresVersionPage):
name = self.__tr("Install anyway")
name = self.tr("Install anyway")
elif isinstance(widget, (WizardInstallerCancelPage, WizardInstallerErrorPage)):
self.ui.nextBtn.setDisabled(True)
else:
name = self.__tr("Install")
name = self.tr("Install")
self.ui.nextBtn.setText(name)
@@ -689,5 +719,5 @@ class WizardInstallerDialog(QtWidgets.QDialog):
self._update_focus()
return super().exec()
def __tr(self, str):
def tr(self, str):
return QApplication.translate("WizardInstallerDialog", str)
+11 -12
View File
@@ -1,21 +1,20 @@
# -*- encoding: utf-8 -*-
import re
import os
import re
import sys
from collections import defaultdict
from pathlib import Path
from typing import Dict, Optional, List, Union
from typing import Dict, List, Optional, Union
# MO2 ships with PyQt5, so you can use it in your plugins:
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets
from PyQt6 import QtWidgets
# MO2 ships with PyQt6, so you can use it in your plugins:
from PyQt6.QtWidgets import QApplication
from wizard.runner import WizardRunnerState
import mobase
from wizard.runner import WizardRunnerState
from .dialog import WizardInstallerDialog
from .runner import make_interpreter
from .utils import make_ini_tweaks, merge_ini_tweaks
@@ -54,13 +53,13 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
return "BAIN Wizard Installer"
def localizedName(self) -> str:
return self.__tr("BAIN Wizard Installer")
return self.tr("BAIN Wizard Installer")
def author(self):
return "Holt59"
def description(self):
return self.__tr("Installer for BAIN archive containing wizard scripts.")
return self.tr("Installer for BAIN archive containing wizard scripts.")
def version(self):
return mobase.VersionInfo(1, 0, 2)
@@ -303,7 +302,7 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
# Note: Unlike the official installer, we do not have a "silent" setting,
# but it is really simple to add it.
if dialog.exec() == QtWidgets.QDialog.Accepted:
if dialog.exec() == QtWidgets.QDialog.DialogCode.Accepted:
# We update the name with the user specified one:
name.update(dialog.name(), mobase.GuessQuality.USER)
@@ -396,7 +395,7 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
else:
return mobase.InstallResult.CANCELED
def __tr(self, str) -> str:
def tr(self, str) -> str:
# We need this to translate string in Python. Check the common documentation
# for more details:
return QApplication.translate("WizardInstaller", str)
+95 -92
View File
@@ -1,153 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="2.0">
<context>
<!DOCTYPE TS>
<TS version="2.0">
<context>
<name>WizardInstaller</name>
<message>
<location filename="installer.py" line="63"/>
<source>Installer for BAIN archive containing wizard scripts.</source>
<translation type="unfinished"></translation>
<location filename="installer.py" line="55" />
<source>BAIN Wizard Installer</source>
<translation type="unfinished" />
</message>
<message>
<location filename="installer.py" line="57"/>
<source>BAIN Wizard Installer</source>
<translation type="unfinished"></translation>
<location filename="installer.py" line="61" />
<source>Installer for BAIN archive containing wizard scripts.</source>
<translation type="unfinished" />
</message>
</context>
<context>
</context>
<context>
<name>WizardInstallerComplete</name>
<message>
<location filename="ui/wizardinstallercomplete.ui" line="40"/>
<source>The installer script has finished. The following sub-packages and plugins will be installed.</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallercomplete.ui" line="0" />
<source>The installer script has finished. The following sub-packages and plugins will be installed.</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallercomplete.ui" line="111"/>
<source>Sub-Packages:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallercomplete.ui" line="0" />
<source>Sub-Packages:</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallercomplete.ui" line="128"/>
<source>Plugins:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallercomplete.ui" line="0" />
<source>Plugins:</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallercomplete.ui" line="180"/>
<source>INI Tweaks:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallercomplete.ui" line="0" />
<source>INI Tweaks:</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallercomplete.ui" line="236"/>
<source>Notes:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallercomplete.ui" line="0" />
<source>Notes:</source>
<translation type="unfinished" />
</message>
</context>
<context>
</context>
<context>
<name>WizardInstallerDialog</name>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="102"/>
<source>Next</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>BAIN Wizard Installer</source>
<translation type="unfinished" />
</message>
<message>
<location filename="dialog.py" line="635"/>
<source>Install anyway</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Name</source>
<translation type="unfinished" />
</message>
<message>
<location filename="dialog.py" line="639"/>
<source>Install</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Manual</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="14"/>
<source>BAIN Wizard Installer</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Script</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="25"/>
<source>Name</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Back</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="56"/>
<source>Manual</source>
<translation type="unfinished"></translation>
<location filename="dialog.py" line="647" />
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Next</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="66"/>
<source>Script</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerdialog.ui" line="0" />
<source>Cancel</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="92"/>
<source>Back</source>
<translation type="unfinished"></translation>
<location filename="dialog.py" line="649" />
<source>Install anyway</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="109"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
<location filename="dialog.py" line="653" />
<source>Install</source>
<translation type="unfinished" />
</message>
</context>
<context>
</context>
<context>
<name>WizardInstallerPage</name>
<message>
<location filename="ui/wizardinstallerpage.ui" line="114"/>
<source>Options:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerpage.ui" line="0" />
<source>Options:</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerpage.ui" line="148"/>
<source>Description:</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerpage.ui" line="0" />
<source>Description:</source>
<translation type="unfinished" />
</message>
</context>
<context>
</context>
<context>
<name>WizardInstallerRequires</name>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="34"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Warning:&lt;/span&gt; The following version requirements are not met for using this installer.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=" font-weight:600;"&gt;Warning:&lt;/span&gt; The following version requirements are not met for using this installer.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="44"/>
<source>Requirements</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Requirements</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="52"/>
<source>Graphics Extender</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Graphics Extender</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="76"/>
<source>Wrye Bash</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Wrye Bash</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="86"/>
<source>Need</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Need</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="103"/>
<source>Game</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Game</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="151"/>
<source>N/A</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>N/A</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="141"/>
<source>Have</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Have</source>
<translation type="unfinished" />
</message>
<message>
<location filename="ui/wizardinstallerrequires.ui" line="165"/>
<source>Script Extender</source>
<translation type="unfinished"></translation>
<location filename="ui\wizardinstallerrequires.ui" line="0" />
<source>Script Extender</source>
<translation type="unfinished" />
</message>
</context>
</context>
</TS>
+3 -4
View File
@@ -1,17 +1,16 @@
# -*- encoding: utf-8 -*-
import sys
from pathlib import Path
from typing import Iterable, List, Optional
import mobase
from wizard.interpreter import WizardInterpreter
from wizard.manager import ManagerModInterface
from wizard.severity import SeverityContext
from wizard.value import SubPackage, SubPackages
from wizard.utils import make_runner_context_factory
from wizard.value import SubPackage, SubPackages
import mobase
class MO2SubPackage(SubPackage):
+5 -2
View File
@@ -27,7 +27,7 @@
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1,0,1">
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,2,0,1">
<property name="spacing">
<number>6</number>
</property>
@@ -136,7 +136,10 @@
<string/>
</property>
<property name="scaledContents">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
-1
View File
@@ -1,7 +1,6 @@
# -*- encoding: utf-8 -*-
import re
from pathlib import Path
from typing import Dict, List, Mapping