Switch project so src layout

This will make it possible to build pip packages.
Add a make file to compile UI files and build mac and win applications.
This commit is contained in:
2023-01-04 18:12:59 +01:00
parent 2400bd6951
commit 3f2f3e0478
73 changed files with 2606 additions and 2584 deletions

2
.idea/misc.xml generated
View File

@@ -4,7 +4,7 @@
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectPlainTextFileTypeManager">
<file url="file://$PROJECT_DIR$/revpicommander/locale/revpicommander_de.ts" />
<file url="file://$PROJECT_DIR$/src/revpicommander/locale/revpicommander_de.ts" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (revpicommander)" project-jdk-type="Python SDK" />
<component name="PythonCompatibilityInspectionAdvertiser">

View File

@@ -2,9 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/include" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/revpicommander" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/lib/revpimodio2" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.9 (revpicommander)" jdkType="Python SDK" />

7
.idea/vcs.xml generated
View File

@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CommitMessageInspectionProfile">
<profile version="1.0">
<inspection_tool class="BodyLimit" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SubjectBodySeparation" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SubjectLimit" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>

View File

@@ -1,8 +1,7 @@
include MANIFEST.in
include stdeb.cfg
recursive-include data *
recursive-include include *.py
recursive-include lib *.py
recursive-include revpicommander *.py *.qm
global-exclude *.pyc
include LICENSE.txt
include MANIFEST.in
include README.md
include stdeb.cfg

38
Makefile Normal file
View File

@@ -0,0 +1,38 @@
SHELL := bash
build_ui:
cd ui_dev && for ui_file in *.ui; do \
file_name=$${ui_file%.ui}; \
pyuic5 $${ui_file} -o ../src/revpicommander/ui/$${file_name}_ui.py -x --from-imports; \
echo $${file_name}; \
done
cd ui_dev && for rc_file in *.qrc; do \
file_name=$${rc_file%.qrc}; \
pyrcc5 $${rc_file} -o ../src/revpicommander/ui/$${file_name}_rc.py; \
echo $${file_name}; \
done
update_translation:
pylupdate5 translate.pro
installer_mac:
pyinstaller -n "RevPi Commander" \
--add-data="src/revpicommander/locale:locale" \
--add-data="data/revpicommander.icns:." \
--icon=data/revpicommander.icns \
--noconfirm \
--clean \
--onedir \
--windowed \
src/revpicommander/__main__.py
installer_win:
pyinstaller -n "RevPi Commander" \
--add-data="src\\revpicommander\\locale;.\\locale" \
--add-data="data\\revpicommander.ico;." \
--icon=data\\revpicommander.ico \
--noconfirm \
--clean \
--onedir \
--windowed \
src/revpicommander\__main__.py

BIN
data/revpicommander.icns Normal file

Binary file not shown.

View File

@@ -1,7 +0,0 @@
@echo off
pyinstaller --noconfirm --clean -D --windowed ^
--add-data="data\\revpicommander.ico;." ^
--add-data="revpicommander\\locale;.\\locale" ^
--icon=data\\revpicommander.ico ^
--path=include ^
revpicommander\revpicommander.py

View File

@@ -4,33 +4,22 @@ __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3"
import distutils.command.install_egg_info
from distutils.core import setup
from glob import glob
class MyEggInfo(distutils.command.install_egg_info.install_egg_info):
u"""Disable egg_info installation, seems pointless for a non-library."""
def run(self):
u"""just pass egg_info."""
pass
from setuptools import setup
setup(
version="0.9.3b",
python_requires="~=3.4",
requires=["PyQt5", "revpimodio2", "zeroconf"],
version="0.9.10rc1",
# python_requires="~=3.4",
install_requires=["PyQt5", "revpimodio2", "zeroconf"],
scripts=["data/revpicommander"],
data_files=[
("share/applications", ["data/revpicommander.desktop"]),
("share/icons/hicolor/32x32/apps", ["data/revpicommander.png"]),
("share/revpicommander", glob("revpicommander/*.py")),
("share/revpicommander/ui", glob("include/ui/*.py")),
("share/revpicommander/locale/", glob("revpicommander/locale/*.qm")),
],
entry_points={
'console_scripts': [
'revpicommander = revpicommander.revpicommander:main',
],
'gui_scripts': [
'RevPiCommander = revpicommander.revpicommander:main',
],
},
# Additional meta-data
name="revpicommander",
@@ -51,5 +40,4 @@ setup(
"Operating System :: POSIX :: Linux",
],
license="GPLv3",
cmdclass={"install_egg_info": MyEggInfo},
)

View File

@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
"""Package: RevPiCommander."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
"""Start main application of this package."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
# If we are running from a wheel, add the wheel to sys.path
if __package__ == "":
from os.path import dirname
from sys import path
# __file__ is package-*.whl/package/__main__.py
# Resulting path is the name of the wheel itself
package_path = dirname(dirname(__file__))
path.insert(0, package_path)
if __name__ == "__main__":
import sys
from revpicommander.revpicommander import main
# Run the main application of this package
sys.exit(main())

View File

@@ -1,15 +1,15 @@
# -*- coding: utf-8 -*-
"""Manager for ACL lists."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from re import compile
from PyQt5 import QtCore, QtGui, QtWidgets
from helper import WidgetData
from ui.aclmanager_ui import Ui_diag_aclmanager
from .helper import WidgetData
from .ui.aclmanager_ui import Ui_diag_aclmanager
class AclManager(QtWidgets.QDialog, Ui_diag_aclmanager):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Revolution Pi search with zeroconf."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import webbrowser
@@ -12,10 +12,9 @@ from sys import platform
from PyQt5 import QtCore, QtGui, QtWidgets
from zeroconf import IPVersion, ServiceBrowser, Zeroconf
import helper
import proginit as pi
from helper import WidgetData
from ui.avahisearch_ui import Ui_diag_search
from . import proginit as pi
from .helper import WidgetData, settings
from .ui.avahisearch_ui import Ui_diag_search
class AvahiSearchThread(QtCore.QThread):
@@ -103,8 +102,8 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
self.btn_connect.setEnabled(False)
self.btn_save.setEnabled(False)
self.restoreGeometry(helper.settings.value("avahisearch/geo", b''))
column_sizes = helper.settings.value("avahisearch/column_sizes", [], type=list)
self.restoreGeometry(settings.value("avahisearch/geo", b''))
column_sizes = settings.value("avahisearch/column_sizes", [], type=list)
if len(column_sizes) == self.tb_revpi.columnCount():
for i in range(self.tb_revpi.columnCount()):
self.tb_revpi.setColumnWidth(i, int(column_sizes[i]))
@@ -130,15 +129,15 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
"""Load existing connections to show hostname of existing ip addresses"""
self.known_hosts.clear()
for i in range(helper.settings.beginReadArray("connections")):
helper.settings.setArrayIndex(i)
for i in range(settings.beginReadArray("connections")):
settings.setArrayIndex(i)
name = helper.settings.value("name", type=str)
folder = helper.settings.value("folder", type=str)
address = helper.settings.value("address", type=str)
name = settings.value("name", type=str)
folder = settings.value("folder", type=str)
address = settings.value("address", type=str)
self.known_hosts[address] = "{0}/{1}".format(folder, name) if folder else name
helper.settings.endArray()
settings.endArray()
def _restart_search(self) -> None:
"""Clean up and restart search thread."""
@@ -169,12 +168,12 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
selected_address = item.data(WidgetData.address)
selected_port = item.data(WidgetData.port)
i = 0
for i in range(helper.settings.beginReadArray("connections")):
helper.settings.setArrayIndex(i)
for i in range(settings.beginReadArray("connections")):
settings.setArrayIndex(i)
name = helper.settings.value("name", type=str)
address = helper.settings.value("address", type=str)
port = helper.settings.value("port", type=int)
name = settings.value("name", type=str)
address = settings.value("address", type=str)
port = settings.value("port", type=int)
if address.lower() == selected_address.lower() and port == selected_port:
if not no_warn:
QtWidgets.QMessageBox.information(
@@ -183,19 +182,19 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
"connection list as '{0}'."
).format(name)
)
helper.settings.endArray()
settings.endArray()
return i
helper.settings.endArray()
helper.settings.beginWriteArray("connections")
settings.endArray()
settings.beginWriteArray("connections")
helper.settings.setArrayIndex(i + 1)
helper.settings.setValue("address", selected_address)
helper.settings.setValue("folder", folder_name)
helper.settings.setValue("name", selected_name)
helper.settings.setValue("port", selected_port)
settings.setArrayIndex(i + 1)
settings.setValue("address", selected_address)
settings.setValue("folder", folder_name)
settings.setValue("name", selected_name)
settings.setValue("port", selected_port)
helper.settings.endArray()
settings.endArray()
if not no_warn:
QtWidgets.QMessageBox.information(
@@ -208,8 +207,8 @@ class AvahiSearch(QtWidgets.QDialog, Ui_diag_search):
return i + 1
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
helper.settings.setValue("avahisearch/geo", self.saveGeometry())
helper.settings.setValue("avahisearch/column_sizes", [
settings.setValue("avahisearch/geo", self.saveGeometry())
settings.setValue("avahisearch/column_sizes", [
self.tb_revpi.columnWidth(i)
for i in range(self.tb_revpi.columnCount())
])

View File

@@ -1,14 +1,14 @@
# -*- coding: utf-8 -*-
"""File transfer system to handle QThreads."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2021 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from logging import getLogger
from PyQt5 import QtCore, QtGui, QtWidgets
from ui.backgroundworker_ui import Ui_diag_backgroundworker
from .ui.backgroundworker_ui import Ui_diag_backgroundworker
log = getLogger()

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Debug control widget to append to main window."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import pickle
@@ -9,10 +9,10 @@ from xmlrpc.client import Binary, Fault, MultiCall, MultiCallIterator
from PyQt5 import QtCore, QtWidgets
import helper
import proginit as pi
from debugios import DebugIos
from ui.debugcontrol_ui import Ui_wid_debugcontrol
from .import helper
from . import proginit as pi
from .debugios import DebugIos
from .ui.debugcontrol_ui import Ui_wid_debugcontrol
class PsValues(QtCore.QThread):

View File

@@ -1,16 +1,16 @@
# -*- coding: utf-8 -*-
"""One device of the Revolution Pi."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import struct
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from ui.debugios_ui import Ui_win_debugios
from . import helper
from . import proginit as pi
from .ui.debugios_ui import Ui_win_debugios
class DebugIos(QtWidgets.QMainWindow, Ui_win_debugios):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Helper functions for this application."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import pickle
@@ -16,7 +16,7 @@ from xmlrpc.client import Binary, ServerProxy
from PyQt5 import QtCore
import proginit as pi
from . import proginit as pi
class WidgetData(IntEnum):

View File

@@ -2,13 +2,13 @@
"""Options for MQTT system."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from PyQt5 import QtGui, QtWidgets
import proginit as pi
from ui.mqttmanager_ui import Ui_diag_mqtt
from . import proginit as pi
from .ui.mqttmanager_ui import Ui_diag_mqtt
class MqttManager(QtWidgets.QDialog, Ui_diag_mqtt):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Global program initialization."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2019 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "LGPLv3"
import logging

View File

@@ -12,18 +12,18 @@ from os.path import basename, dirname, join
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
import revpilogfile
from avahisearch import AvahiSearch
from debugcontrol import DebugControl
from revpifiles import RevPiFiles
from revpiinfo import RevPiInfo
from revpioption import RevPiOption
from revpiplclist import RevPiPlcList
from revpiprogram import RevPiProgram
from simulator import Simulator
from ui.revpicommander_ui import Ui_win_revpicommander
from . import helper
from . import proginit as pi
from . import revpilogfile
from .avahisearch import AvahiSearch
from .debugcontrol import DebugControl
from .revpifiles import RevPiFiles
from .revpiinfo import RevPiInfo
from .revpioption import RevPiOption
from .revpiplclist import RevPiPlcList
from .revpiprogram import RevPiProgram
from .simulator import Simulator
from .ui.revpicommander_ui import Ui_win_revpicommander
class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
@@ -475,15 +475,15 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
# endregion # # # # #
if __name__ == "__main__":
import sys
def main() -> int:
from sys import argv
if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
app = QtWidgets.QApplication(sys.argv)
app = QtWidgets.QApplication(argv)
try:
# Setup translation from file with system language
@@ -506,4 +506,9 @@ if __name__ == "__main__":
helper.cm.requestInterruption()
helper.cm.wait()
sys.exit(exit_code)
return exit_code
if __name__ == "__main__":
import sys
sys.exit(main())

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""File manager for up und download PLC program."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import gzip
@@ -11,11 +11,11 @@ from xmlrpc.client import Binary
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from backgroundworker import BackgroundWorker
from helper import WidgetData
from ui.files_ui import Ui_win_files
from . import helper
from . import proginit as pi
from .backgroundworker import BackgroundWorker
from .helper import WidgetData
from .ui.files_ui import Ui_win_files
class NodeType(IntEnum):

View File

@@ -1,13 +1,13 @@
# -*- coding: utf-8 -*-
"""Program information of local an remote system."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
from ui.revpiinfo_ui import Ui_diag_revpiinfo
from . import helper
from .ui.revpiinfo_ui import Ui_diag_revpiinfo
class RevPiInfo(QtWidgets.QDialog, Ui_diag_revpiinfo):

View File

@@ -1,16 +1,16 @@
# -*- coding: utf-8 -*-
"""View log files from Revolution Pi."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from enum import IntEnum
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from ui.revpilogfile_ui import Ui_win_revpilogfile
from . import helper
from . import proginit as pi
from .ui.revpilogfile_ui import Ui_win_revpilogfile
class LogType(IntEnum):

View File

@@ -1,16 +1,16 @@
# -*- coding: utf-8 -*-
"""RevPiPyLoad options window."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from aclmanager import AclManager
from mqttmanager import MqttManager
from ui.revpioption_ui import Ui_diag_options
from . import helper
from . import proginit as pi
from .aclmanager import AclManager
from .mqttmanager import MqttManager
from .ui.revpioption_ui import Ui_diag_options
class RevPiOption(QtWidgets.QDialog, Ui_diag_options):

View File

@@ -1,17 +1,16 @@
# -*- coding: utf-8 -*-
"""Saved connections of Revolution Pi devices."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from enum import IntEnum
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from helper import WidgetData
from ui.revpiplclist_ui import Ui_diag_connections
from . import proginit as pi
from .helper import WidgetData, settings
from .ui.revpiplclist_ui import Ui_diag_connections
class NodeType(IntEnum):
@@ -42,29 +41,29 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
self.tre_connections.clear()
self.cbb_folder.clear()
self.cbb_folder.addItem("")
for i in range(helper.settings.beginReadArray("connections")):
helper.settings.setArrayIndex(i)
for i in range(settings.beginReadArray("connections")):
settings.setArrayIndex(i)
con_item = QtWidgets.QTreeWidgetItem(NodeType.CON)
con_item.setIcon(0, QtGui.QIcon(":/main/ico/cpu.ico"))
con_item.setText(0, helper.settings.value("name", "Revolution Pi", str))
con_item.setText(1, helper.settings.value("address", "127.0.0.1", str))
con_item.setData(0, WidgetData.port, helper.settings.value("port", self.__default_port, int))
con_item.setData(0, WidgetData.timeout, helper.settings.value("timeout", 5, int))
con_item.setText(0, settings.value("name", "Revolution Pi", str))
con_item.setText(1, settings.value("address", "127.0.0.1", str))
con_item.setData(0, WidgetData.port, settings.value("port", self.__default_port, int))
con_item.setData(0, WidgetData.timeout, settings.value("timeout", 5, int))
con_item.setData(0, WidgetData.last_dir_upload, helper.settings.value("last_dir_upload"))
con_item.setData(0, WidgetData.last_file_upload, helper.settings.value("last_file_upload"))
con_item.setData(0, WidgetData.last_dir_pictory, helper.settings.value("last_dir_pictory"))
con_item.setData(0, WidgetData.last_dir_picontrol, helper.settings.value("last_dir_picontrol"))
con_item.setData(0, WidgetData.last_dir_selected, helper.settings.value("last_dir_selected"))
con_item.setData(0, WidgetData.last_pictory_file, helper.settings.value("last_pictory_file"))
con_item.setData(0, WidgetData.last_tar_file, helper.settings.value("last_tar_file"))
con_item.setData(0, WidgetData.last_zip_file, helper.settings.value("last_zip_file"))
con_item.setData(0, WidgetData.watch_files, helper.settings.value("watch_files"))
con_item.setData(0, WidgetData.watch_path, helper.settings.value("watch_path"))
con_item.setData(0, WidgetData.debug_geos, helper.settings.value("debug_geos"))
con_item.setData(0, WidgetData.last_dir_upload, settings.value("last_dir_upload"))
con_item.setData(0, WidgetData.last_file_upload, settings.value("last_file_upload"))
con_item.setData(0, WidgetData.last_dir_pictory, settings.value("last_dir_pictory"))
con_item.setData(0, WidgetData.last_dir_picontrol, settings.value("last_dir_picontrol"))
con_item.setData(0, WidgetData.last_dir_selected, settings.value("last_dir_selected"))
con_item.setData(0, WidgetData.last_pictory_file, settings.value("last_pictory_file"))
con_item.setData(0, WidgetData.last_tar_file, settings.value("last_tar_file"))
con_item.setData(0, WidgetData.last_zip_file, settings.value("last_zip_file"))
con_item.setData(0, WidgetData.watch_files, settings.value("watch_files"))
con_item.setData(0, WidgetData.watch_path, settings.value("watch_path"))
con_item.setData(0, WidgetData.debug_geos, settings.value("debug_geos"))
folder = helper.settings.value("folder", "", str)
folder = settings.value("folder", "", str)
if folder:
sub_folder = self._get_folder_item(folder)
if sub_folder is None:
@@ -78,7 +77,7 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
else:
self.tre_connections.addTopLevelItem(con_item)
helper.settings.endArray()
settings.endArray()
self.tre_connections.expandAll()
self.changes = True
@@ -91,52 +90,52 @@ class RevPiPlcList(QtWidgets.QDialog, Ui_diag_connections):
def set_settings(node: QtWidgets.QTreeWidgetItem):
parent = node.parent()
helper.settings.setValue("address", node.text(1))
helper.settings.setValue("folder", parent.text(0) if parent else "")
helper.settings.setValue("name", node.text(0))
helper.settings.setValue("port", node.data(0, WidgetData.port))
helper.settings.setValue("timeout", node.data(0, WidgetData.timeout))
settings.setValue("address", node.text(1))
settings.setValue("folder", parent.text(0) if parent else "")
settings.setValue("name", node.text(0))
settings.setValue("port", node.data(0, WidgetData.port))
settings.setValue("timeout", node.data(0, WidgetData.timeout))
if node.data(0, WidgetData.last_dir_upload):
helper.settings.setValue("last_dir_upload", node.data(0, WidgetData.last_dir_upload))
settings.setValue("last_dir_upload", node.data(0, WidgetData.last_dir_upload))
if node.data(0, WidgetData.last_file_upload):
helper.settings.setValue("last_file_upload", node.data(0, WidgetData.last_file_upload))
settings.setValue("last_file_upload", node.data(0, WidgetData.last_file_upload))
if node.data(0, WidgetData.last_dir_pictory):
helper.settings.setValue("last_dir_pictory", node.data(0, WidgetData.last_dir_pictory))
settings.setValue("last_dir_pictory", node.data(0, WidgetData.last_dir_pictory))
if node.data(0, WidgetData.last_dir_picontrol):
helper.settings.setValue("last_dir_picontrol", node.data(0, WidgetData.last_dir_picontrol))
settings.setValue("last_dir_picontrol", node.data(0, WidgetData.last_dir_picontrol))
if node.data(0, WidgetData.last_dir_selected):
helper.settings.setValue("last_dir_selected", node.data(0, WidgetData.last_dir_selected))
settings.setValue("last_dir_selected", node.data(0, WidgetData.last_dir_selected))
if node.data(0, WidgetData.last_pictory_file):
helper.settings.setValue("last_pictory_file", node.data(0, WidgetData.last_pictory_file))
settings.setValue("last_pictory_file", node.data(0, WidgetData.last_pictory_file))
if node.data(0, WidgetData.last_tar_file):
helper.settings.setValue("last_tar_file", node.data(0, WidgetData.last_tar_file))
settings.setValue("last_tar_file", node.data(0, WidgetData.last_tar_file))
if node.data(0, WidgetData.last_zip_file):
helper.settings.setValue("last_zip_file", node.data(0, WidgetData.last_zip_file))
settings.setValue("last_zip_file", node.data(0, WidgetData.last_zip_file))
if node.data(0, WidgetData.watch_files):
helper.settings.setValue("watch_files", node.data(0, WidgetData.watch_files))
settings.setValue("watch_files", node.data(0, WidgetData.watch_files))
if node.data(0, WidgetData.watch_path):
helper.settings.setValue("watch_path", node.data(0, WidgetData.watch_path))
settings.setValue("watch_path", node.data(0, WidgetData.watch_path))
if node.data(0, WidgetData.debug_geos):
helper.settings.setValue("debug_geos", node.data(0, WidgetData.debug_geos))
settings.setValue("debug_geos", node.data(0, WidgetData.debug_geos))
helper.settings.remove("connections")
helper.settings.beginWriteArray("connections")
settings.remove("connections")
settings.beginWriteArray("connections")
counter_index = 0
for i in range(self.tre_connections.topLevelItemCount()):
root_item = self.tre_connections.topLevelItem(i)
if root_item.type() == NodeType.DIR:
for k in range(root_item.childCount()):
helper.settings.setArrayIndex(counter_index)
settings.setArrayIndex(counter_index)
set_settings(root_item.child(k))
counter_index += 1
elif root_item.type() == NodeType.CON:
helper.settings.setArrayIndex(counter_index)
settings.setArrayIndex(counter_index)
set_settings(root_item)
counter_index += 1
helper.settings.endArray()
settings.endArray()
self.changes = False
super(RevPiPlcList, self).accept()

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Revolution Pi PLC program configuration."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
import gzip
@@ -14,9 +14,9 @@ from xmlrpc.client import Binary
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
import proginit as pi
from ui.revpiprogram_ui import Ui_diag_program
from . import helper
from . import proginit as pi
from .ui.revpiprogram_ui import Ui_diag_program
class RevPiProgram(QtWidgets.QDialog, Ui_diag_program):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Simulator for piControl."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2021 Sven Sager"
__copyright__ = "Copyright (C) 2023 Sven Sager"
__license__ = "GPLv3"
from os import W_OK, access
@@ -9,8 +9,8 @@ from os.path import basename, dirname, exists, join
from PyQt5 import QtCore, QtGui, QtWidgets
import helper
from ui.simulator_ui import Ui_diag_simulator
from . import helper
from .ui.simulator_ui import Ui_diag_simulator
class Simulator(QtWidgets.QDialog, Ui_diag_simulator):

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'aclmanager.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -120,8 +121,8 @@ class Ui_diag_aclmanager(object):
self.verticalLayout.addWidget(self.btn_box)
self.retranslateUi(diag_aclmanager)
self.btn_box.accepted.connect(diag_aclmanager.accept)
self.btn_box.rejected.connect(diag_aclmanager.reject)
self.btn_box.accepted.connect(diag_aclmanager.accept) # type: ignore
self.btn_box.rejected.connect(diag_aclmanager.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_aclmanager)
diag_aclmanager.setTabOrder(self.tb_acls, self.btn_edit)
diag_aclmanager.setTabOrder(self.btn_edit, self.btn_remove)

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'backgroundworker.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'debugcontrol.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'debugios.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'files.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'mqttmanager.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -117,8 +118,8 @@ class Ui_diag_mqtt(object):
self.verticalLayout.addWidget(self.btn_box)
self.retranslateUi(diag_mqtt)
self.btn_box.accepted.connect(diag_mqtt.accept)
self.btn_box.rejected.connect(diag_mqtt.reject)
self.btn_box.accepted.connect(diag_mqtt.accept) # type: ignore
self.btn_box.rejected.connect(diag_mqtt.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_mqtt)
def retranslateUi(self, diag_mqtt):

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'revpiinfo.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -79,8 +80,8 @@ class Ui_diag_revpiinfo(object):
self.gridLayout.addItem(spacerItem, 5, 0, 1, 1)
self.retranslateUi(diag_revpiinfo)
self.btn_box.accepted.connect(diag_revpiinfo.accept)
self.btn_box.rejected.connect(diag_revpiinfo.reject)
self.btn_box.accepted.connect(diag_revpiinfo.accept) # type: ignore
self.btn_box.rejected.connect(diag_revpiinfo.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_revpiinfo)
def retranslateUi(self, diag_revpiinfo):

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'revpilogfile.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'revpioption.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -115,8 +116,8 @@ class Ui_diag_options(object):
self.verticalLayout.addWidget(self.btn_box)
self.retranslateUi(diag_options)
self.btn_box.accepted.connect(diag_options.accept)
self.btn_box.rejected.connect(diag_options.reject)
self.btn_box.accepted.connect(diag_options.accept) # type: ignore
self.btn_box.rejected.connect(diag_options.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_options)
def retranslateUi(self, diag_options):

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'revpiplclist.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -113,8 +114,8 @@ class Ui_diag_connections(object):
self.gridLayout.addWidget(self.btn_box, 2, 0, 1, 2)
self.retranslateUi(diag_connections)
self.btn_box.accepted.connect(diag_connections.accept)
self.btn_box.rejected.connect(diag_connections.reject)
self.btn_box.accepted.connect(diag_connections.accept) # type: ignore
self.btn_box.rejected.connect(diag_connections.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_connections)
def retranslateUi(self, diag_connections):

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'revpiprogram.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -104,8 +105,8 @@ class Ui_diag_program(object):
self.verticalLayout.addWidget(self.btn_box)
self.retranslateUi(diag_program)
self.btn_box.accepted.connect(diag_program.accept)
self.btn_box.rejected.connect(diag_program.reject)
self.btn_box.accepted.connect(diag_program.accept) # type: ignore
self.btn_box.rejected.connect(diag_program.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_program)
diag_program.setTabOrder(self.cbb_plcprogram, self.txt_plcarguments)
diag_program.setTabOrder(self.txt_plcarguments, self.rbn_pythonversion_2)

View File

@@ -2,9 +2,10 @@
# Form implementation generated from reading ui file 'simulator.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
@@ -92,9 +93,9 @@ class Ui_diag_simulator(object):
self.verticalLayout.addWidget(self.btn_start_nochange)
self.retranslateUi(diag_simulator)
self.btn_start_empty.clicked.connect(diag_simulator.accept)
self.btn_start_nochange.clicked.connect(diag_simulator.accept)
self.btn_start_pictory.clicked.connect(diag_simulator.accept)
self.btn_start_empty.clicked.connect(diag_simulator.accept) # type: ignore
self.btn_start_nochange.clicked.connect(diag_simulator.accept) # type: ignore
self.btn_start_pictory.clicked.connect(diag_simulator.accept) # type: ignore
QtCore.QMetaObject.connectSlotsByName(diag_simulator)
diag_simulator.setTabOrder(self.cbb_history, self.btn_configrsc)
diag_simulator.setTabOrder(self.btn_configrsc, self.cbx_stop_remove)

View File

@@ -1,32 +1,32 @@
SOURCES = revpicommander/aclmanager.py \
revpicommander/avahisearch.py \
revpicommander/debugcontrol.py \
revpicommander/debugios.py \
revpicommander/helper.py \
revpicommander/mqttmanager.py \
revpicommander/revpifiles.py \
revpicommander/revpiinfo.py \
revpicommander/revpilogfile.py \
revpicommander/revpioption.py \
revpicommander/revpiplclist.py \
revpicommander/revpiprogram.py \
revpicommander/simulator.py \
revpicommander/revpicommander.py
SOURCES = src/revpicommander/aclmanager.py \
src/revpicommander/avahisearch.py \
src/revpicommander/debugcontrol.py \
src/revpicommander/debugios.py \
src/revpicommander/helper.py \
src/revpicommander/mqttmanager.py \
src/revpicommander/revpifiles.py \
src/revpicommander/revpiinfo.py \
src/revpicommander/revpilogfile.py \
src/revpicommander/revpioption.py \
src/revpicommander/revpiplclist.py \
src/revpicommander/revpiprogram.py \
src/revpicommander/simulator.py \
src/revpicommander/revpicommander.py
FORMS = include/ui_dev/aclmanager.ui \
include/ui_dev/avahisearch.ui \
include/ui_dev/debugcontrol.ui \
include/ui_dev/debugios.ui \
include/ui_dev/files.ui \
include/ui_dev/mqttmanager.ui \
include/ui_dev/revpiinfo.ui \
include/ui_dev/revpilogfile.ui \
include/ui_dev/revpioption.ui \
include/ui_dev/revpiplclist.ui \
include/ui_dev/revpiprogram.ui \
include/ui_dev/simulator.ui \
include/ui_dev/revpicommander.ui
FORMS = ui_dev/aclmanager.ui \
ui_dev/avahisearch.ui \
ui_dev/debugcontrol.ui \
ui_dev/debugios.ui \
ui_dev/files.ui \
ui_dev/mqttmanager.ui \
ui_dev/revpiinfo.ui \
ui_dev/revpilogfile.ui \
ui_dev/revpioption.ui \
ui_dev/revpiplclist.ui \
ui_dev/revpiprogram.ui \
ui_dev/simulator.ui \
ui_dev/revpicommander.ui
TRANSLATIONS = revpicommander/locale/revpicommander_de.ts
TRANSLATIONS = src/revpicommander/locale/revpicommander_de.ts
CODECRORTR = UTF-8

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB