8 Commits
Author SHA1 Message Date
Mikaël Capelle fb91a1d2b6 Merge pull request #2 from Holt59/fix-optional-plugins
Fix not-selected plugins
2021-03-13 13:49:42 +01:00
Mikaël Capelle 9f71ac1517 Move not-selected plugins to 'optional'. 2021-03-13 13:48:45 +01:00
Mikaël Capelle 775d764950 Fix translations. 2021-02-06 19:28:26 +01:00
Mikaël Capelle 538a0f73e9 Make placeholder text not-translatable. 2021-02-03 18:35:19 +01:00
Mikaël Capelle ecefc5eb8a Fix FOMOD/OMOD detection. 2020-11-27 20:30:06 +01:00
Mikaël Capelle b9653b8322 Merge pull request #1 from ModOrganizer2/cmake-common
Add CMakeLists for MO2 build.
2020-11-25 17:51:27 +01:00
Mikaël Capelle b39be8c295 Add CMakeLists for MO2 build. 2020-11-23 10:56:59 +01:00
Mikaël Capelle 28deb0ce25 Fix release script. 2020-11-23 09:15:55 +01:00
13 changed files with 144 additions and 100 deletions
+5
View File
@@ -8,7 +8,12 @@ src/ui/*.py
.tox
.vscode
# MO2 build files:
vsbuild
mob.log
# Generated files:
lib
src/lib
installer_wizard
installer_wizard-*.zip
+13
View File
@@ -0,0 +1,13 @@
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)
else()
include(../cmake_common/project.cmake)
endif()
add_subdirectory(src)
+2 -1
View File
@@ -6,7 +6,8 @@ $target = ".\installer_wizard\"
Remove-Item -Recurse -Force -ErrorAction Ignore $target
New-Item -Path $target -Type Directory | Out-Null
Copy-Item -Recurse -Path .\src\* -Exclude "*.ui", "__pycache__" -Destination .\installer_wizard
Copy-Item -Recurse -Path .\src\* -Exclude "*.ui" -Destination $target
Get-ChildItem -Recurse $target -Include "__pycache__" | Remove-Item -Recurse -Force
Copy-Item .\installer_wizard_en.ts, .\README.md, .\LICENSE $target
# Find the version:
+1 -1
View File
@@ -1,5 +1,5 @@
# Install the lib:
pip install --target=.\src\lib --upgrade git+https://github.com/Holt59/bain-wizard-interpreter | Out-Null
pip install --target=.\src\lib --upgrade -r .\plugin-requirements.txt | Out-Null
# Convert ui files:
Get-ChildItem -Recurse -File -Include "*.ui" | ForEach-Object {
+1
View File
@@ -0,0 +1 @@
git+https://github.com/Holt59/bain-wizard-interpreter
+7
View File
@@ -0,0 +1,7 @@
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()
+19 -13
View File
@@ -1,10 +1,11 @@
# -*- encoding: utf-8 -*-
from pathlib import Path
from typing import Any, List, Mapping, Optional, Tuple
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
@@ -278,7 +279,7 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
kvisitor: WizardRunnerKeywordVisitor = context.factory.kvisitor # type: ignore
# The list of plugins in selected sub-packages:
plugins: List[str] = []
plugins: Set[str] = set()
# SubPackages:
for sp in kvisitor.subpackages:
@@ -289,9 +290,15 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
else:
item.setCheckState(Qt.Unchecked)
item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) # type: ignore
plugins.extend(kvisitor.plugins_for(sp))
plugins.update(kvisitor.plugins_for(sp))
self.ui.subpackagesList.addItem(item)
# Switch the renamed plugins:
for plugin in list(plugins):
if plugin in self.state.renames:
plugins.remove(plugin)
plugins.add(self.state.renames[plugin])
# Plugins:
for plugin in sorted(plugins):
item = QtWidgets.QListWidgetItem()
@@ -353,17 +360,16 @@ class WizardInstallerCompletePage(QtWidgets.QWidget):
sp.append(item.text())
return sp
def plugins(self) -> List[str]:
def plugins(self) -> Dict[str, bool]:
"""
Returns:
The list of plugins selected in the UI (either automatically by the
interpreter or by the user).
"""
sp: List[str] = []
sp: Dict[str, bool] = {}
for i in range(self.ui.pluginsList.count()):
item = self.ui.pluginsList.item(i)
if item.checkState() == Qt.Checked:
sp.append(item.text())
sp[item.text()] = item.checkState() == Qt.Checked
return sp
def tweaks(self) -> Mapping[str, List[WizardINISetting]]:
@@ -524,7 +530,7 @@ class WizardInstallerDialog(QtWidgets.QDialog):
assert isinstance(widget, WizardInstallerCompletePage)
return widget.subpackages()
def plugins(self):
def plugins(self) -> Dict[str, bool]:
"""
Returns:
The list of plugins to install and enable. Only valid if exec() returned
@@ -624,13 +630,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)
@@ -683,5 +689,5 @@ class WizardInstallerDialog(QtWidgets.QDialog):
self._update_focus()
return super().exec()
def _tr(self, txt: str) -> str:
return QtWidgets.QApplication.translate("WizardInstaller", txt)
def __tr(self, str):
return QApplication.translate("WizardInstallerDialog", str)
+15 -4
View File
@@ -53,11 +53,14 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
def name(self):
return "BAIN Wizard Installer"
def localizedName(self) -> str:
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)
@@ -134,10 +137,10 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
def _hasFomodInstaller(self) -> bool:
# Do not consider the NCC installer.
return bool(self._organizer.pluginSetting("Fomod Installer", "enabled"))
return self._organizer.isPluginEnabled("Fomod Installer")
def _hasOmodInstaller(self) -> bool:
return bool(self._organizer.pluginSetting("Omod Installer", "enabled"))
return self._organizer.isPluginEnabled("Omod Installer")
def _getWizardArchiveBase(
self, tree: mobase.IFileTree, data_name: str, checker: mobase.ModDataChecker
@@ -332,6 +335,14 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
tree.move(entry, new)
# Move not selected plugins to optional:
for plugin, enabled in dialog.plugins().items():
if not enabled:
entry = tree.find(plugin)
if not entry:
continue # silently fail since the plugin should be disabled
tree.addDirectory("optional").insert(entry)
# TODO: INI Tweaks:
alltweaks = dialog.tweaks()
@@ -385,7 +396,7 @@ class WizardInstaller(mobase.IPluginInstallerSimple):
else:
return mobase.InstallResult.CANCELED
def _tr(self, 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)
@@ -1,34 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="2.0">
<context>
<name>WizardInstallerComplete</name>
<name>WizardInstaller</name>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="151"/>
<source>Form</source>
<location filename="installer.py" line="63"/>
<source>Installer for BAIN archive containing wizard scripts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="152"/>
<location filename="installer.py" line="57"/>
<source>BAIN Wizard Installer</source>
<translation type="unfinished"></translation>
</message>
</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>
</message>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="153"/>
<location filename="ui/wizardinstallercomplete.ui" line="111"/>
<source>Sub-Packages:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="154"/>
<location filename="ui/wizardinstallercomplete.ui" line="128"/>
<source>Plugins:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="155"/>
<location filename="ui/wizardinstallercomplete.ui" line="180"/>
<source>INI Tweaks:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallercomplete.py" line="156"/>
<location filename="ui/wizardinstallercomplete.ui" line="236"/>
<source>Notes:</source>
<translation type="unfinished"></translation>
</message>
@@ -36,73 +44,60 @@
<context>
<name>WizardInstallerDialog</name>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="75"/>
<source>BAIN Wizard Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="76"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="77"/>
<source>Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="78"/>
<source>Script</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="79"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="80"/>
<location filename="ui/wizardinstallerdialog.ui" line="102"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerdialog.py" line="81"/>
<location filename="dialog.py" line="635"/>
<source>Install anyway</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="dialog.py" line="639"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="14"/>
<source>BAIN Wizard Installer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="25"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="56"/>
<source>Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="66"/>
<source>Script</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="92"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/wizardinstallerdialog.ui" line="109"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardInstallerError</name>
<message>
<location filename="src/ui/wizardinstallererror.py" line="52"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallererror.py" line="54"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardInstallerPage</name>
<message>
<location filename="src/ui/wizardinstallerpage.py" line="91"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerpage.py" line="92"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerpage.py" line="93"/>
<location filename="ui/wizardinstallerpage.ui" line="114"/>
<source>Options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerpage.py" line="94"/>
<location filename="ui/wizardinstallerpage.ui" line="148"/>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
@@ -110,52 +105,47 @@
<context>
<name>WizardInstallerRequires</name>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="113"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="114"/>
<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>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="115"/>
<location filename="ui/wizardinstallerrequires.ui" line="44"/>
<source>Requirements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="116"/>
<location filename="ui/wizardinstallerrequires.ui" line="52"/>
<source>Graphics Extender</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="117"/>
<location filename="ui/wizardinstallerrequires.ui" line="76"/>
<source>Wrye Bash</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="118"/>
<location filename="ui/wizardinstallerrequires.ui" line="86"/>
<source>Need</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="119"/>
<location filename="ui/wizardinstallerrequires.ui" line="103"/>
<source>Game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="122"/>
<location filename="ui/wizardinstallerrequires.ui" line="151"/>
<source>N/A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="121"/>
<location filename="ui/wizardinstallerrequires.ui" line="141"/>
<source>Have</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/ui/wizardinstallerrequires.py" line="123"/>
<location filename="ui/wizardinstallerrequires.ui" line="165"/>
<source>Script Extender</source>
<translation type="unfinished"></translation>
</message>
+1 -1
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
+13 -3
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
@@ -45,7 +45,7 @@
</size>
</property>
<property name="text">
<string>TextLabel</string>
<string notr="true"/>
</property>
</widget>
</item>
@@ -68,7 +68,7 @@
<item>
<widget class="QLabel" name="titleLabel">
<property name="text">
<string>TextLabel</string>
<string notr="true"/>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -82,6 +82,16 @@
<property name="readOnly">
<bool>true</bool>
</property>
<property name="markdown">
<string notr="true"/>
</property>
<property name="html">
<string notr="true">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
+2 -2
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
@@ -93,7 +93,7 @@
<enum>QFrame::Sunken</enum>
</property>
<property name="text">
<string>TextLabel</string>
<string notr="true"/>
</property>
<property name="wordWrap">
<bool>true</bool>
+1 -1
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">