Compare commits

...

3 commits

Author SHA1 Message Date
a250f532d9
Adding pyside6-addons as dependency until https://bugreports.qt.io/browse/PYSIDE-2871 is resolved.
All checks were successful
continuous-integration/drone/push Build is passing
2024-09-19 00:51:28 +02:00
e68411e93c
Fixing typos 2024-09-19 00:51:16 +02:00
b55b2a11fe
Starting main tests 2024-09-19 00:50:47 +02:00
6 changed files with 98 additions and 45 deletions

View file

@ -16,18 +16,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
from os import getcwd, chdir, environ, path
from platform import release as os_release
from sys import path as sys_path
from sys import platform, argv, exit
from tempfile import TemporaryDirectory
from time import time from time import time
from PySide6.QtWidgets import QApplication from PySide6.QtCore import QTranslator, QLocale
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import Qt, QTranslator, QLocale
from PySide6.QtGui import QIcon from PySide6.QtGui import QIcon
from PySide6.QtQml import QQmlApplicationEngine
from tempfile import TemporaryDirectory from PySide6.QtQuickControls2 import QQuickStyle
from os import getcwd, chdir, environ, path, remove, close from PySide6.QtWidgets import QApplication
from platform import release as os_release
from sys import platform, argv, version as sys_version, exit
from sys import path as sys_path
start_time = time() start_time = time()
@ -48,10 +48,7 @@ from LogarithmPlotter.util.helper import Helper
from LogarithmPlotter.util.latex import Latex from LogarithmPlotter.util.latex import Latex
from LogarithmPlotter.util.js import PyJSValue from LogarithmPlotter.util.js import PyJSValue
config.init() def get_linux_theme() -> str:
def get_linux_theme():
des = { des = {
"KDE": "Fusion", "KDE": "Fusion",
"gnome": "Basic", "gnome": "Basic",
@ -59,59 +56,59 @@ def get_linux_theme():
"mate": "Fusion", "mate": "Fusion",
} }
if "XDG_SESSION_DESKTOP" in environ: if "XDG_SESSION_DESKTOP" in environ:
return des[environ["XDG_SESSION_DESKTOP"]] if environ["XDG_SESSION_DESKTOP"] in des else "Fusion" if environ["XDG_SESSION_DESKTOP"] in des:
return des[environ["XDG_SESSION_DESKTOP"]]
return "Fusion"
else: else:
# Android # Android
return "Material" return "Material"
def run(): def get_platform_qt_style(os) -> str:
if not 'QT_QUICK_CONTROLS_STYLE' in environ: return {
environ["QT_QUICK_CONTROLS_STYLE"] = {
"linux": get_linux_theme(), "linux": get_linux_theme(),
"freebsd": get_linux_theme(), "freebsd": get_linux_theme(),
"win32": "Universal" if os_release == "10" else "Fusion", "win32": "Universal" if os_release() in ["10", "11", "12", "13", "14"] else "Windows",
"cygwin": "Fusion", "cygwin": "Fusion",
"darwin": "macOS" "darwin": "macOS"
}[platform] }[os]
dep_time = time()
print("Loaded dependencies in " + str((dep_time - start_time) * 1000) + "ms.")
icon_fallbacks = QIcon.fallbackSearchPaths(); def register_icon_directories() -> None:
icon_fallbacks = QIcon.fallbackSearchPaths()
base_icon_path = path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "icons") base_icon_path = path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "icons")
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "common"))) icon_fallbacks.append(path.realpath(path.join(base_icon_path, "common")))
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "objects"))) icon_fallbacks.append(path.realpath(path.join(base_icon_path, "objects")))
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "history"))) icon_fallbacks.append(path.realpath(path.join(base_icon_path, "history")))
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "settings"))) icon_fallbacks.append(path.realpath(path.join(base_icon_path, "settings")))
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "settings", "custom"))) icon_fallbacks.append(path.realpath(path.join(base_icon_path, "settings", "custom")))
QIcon.setFallbackSearchPaths(icon_fallbacks); QIcon.setFallbackSearchPaths(icon_fallbacks)
def create_qapp() -> QApplication:
app = QApplication(argv) app = QApplication(argv)
app.setApplicationName("LogarithmPlotter") app.setApplicationName("LogarithmPlotter")
app.setDesktopFileName("eu.ad5001.LogarithmPlotter.desktop") app.setDesktopFileName("eu.ad5001.LogarithmPlotter.desktop")
app.setOrganizationName("Ad5001") app.setOrganizationName("Ad5001")
app.styleHints().setShowShortcutsInContextMenus(True) app.styleHints().setShowShortcutsInContextMenus(True)
app.setWindowIcon(QIcon(path.realpath(path.join(getcwd(), "logarithmplotter.svg")))) app.setWindowIcon(QIcon(path.realpath(path.join(getcwd(), "logarithmplotter.svg"))))
return app
def install_translation(app: QApplication) -> QTranslator:
# Installing translators # Installing translators
translator = QTranslator() translator = QTranslator()
# Check if lang is forced. # Check if lang is forced.
forcedlang = [p for p in argv if p[:7] == "--lang="] forcedlang = [p for p in argv if p[:7] == "--lang="]
locale = QLocale(forcedlang[0][7:]) if len(forcedlang) > 0 else QLocale() locale = QLocale(forcedlang[0][7:]) if len(forcedlang) > 0 else QLocale()
if translator.load(locale, "lp", "_", path.realpath(path.join(getcwd(), "i18n"))): if translator.load(locale, "lp", "_", path.realpath(path.join(getcwd(), "i18n"))):
app.installTranslator(translator); app.installTranslator(translator)
return translator
# Installing macOS file handler.
macos_file_open_handler = None
if platform == "darwin":
macos_file_open_handler = native.MacOSFileOpenHandler()
app.installEventFilter(macos_file_open_handler)
engine = QQmlApplicationEngine() def create_engine(helper: Helper, latex: Latex, dep_time: float) -> tuple[QQmlApplicationEngine, PyJSValue]:
global tmpfile global tmpfile
helper = Helper(pwd, tmpfile) engine = QQmlApplicationEngine()
latex = Latex(tempdir)
js_globals = PyJSValue(engine.globalObject()) js_globals = PyJSValue(engine.globalObject())
js_globals.Modules = engine.newObject() js_globals.Modules = engine.newObject()
js_globals.Helper = engine.newQObject(helper) js_globals.Helper = engine.newQObject(helper)
@ -119,15 +116,37 @@ def run():
engine.rootContext().setContextProperty("TestBuild", "--test-build" in argv) engine.rootContext().setContextProperty("TestBuild", "--test-build" in argv)
engine.rootContext().setContextProperty("StartTime", dep_time) engine.rootContext().setContextProperty("StartTime", dep_time)
app.translate("About", "About LogarithmPlotter")
# FOR SOME REASON, if this isn't included, Qt refuses to load the QML file.
engine.addImportPath(path.realpath(path.join(getcwd(), "qml"))) engine.addImportPath(path.realpath(path.join(getcwd(), "qml")))
engine.load(path.realpath(path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "LogarithmPlotter.qml"))) engine.load(path.realpath(path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "LogarithmPlotter.qml")))
if not engine.rootObjects(): return engine, js_globals
def run():
config.init()
if not 'QT_QUICK_CONTROLS_STYLE' in environ:
QQuickStyle.setStyle(get_platform_qt_style(platform))
dep_time = time()
print("Loaded dependencies in " + str((dep_time - start_time) * 1000) + "ms.")
register_icon_directories()
app = create_qapp()
translator = install_translation(app)
# Installing macOS file handler.
macos_file_open_handler = None
if platform == "darwin":
macos_file_open_handler = native.MacOSFileOpenHandler()
app.installEventFilter(macos_file_open_handler)
helper = Helper(pwd, tmpfile)
latex = Latex(tempdir)
engine, js_globals = create_engine(helper, latex, dep_time)
if len(engine.rootObjects()) == 0: # No root objects loaded
print("No root object", path.realpath(path.join(getcwd(), "qml"))) print("No root object", path.realpath(path.join(getcwd(), "qml")))
print(path.realpath(path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "LogarithmPlotter.qml")))
exit(-1) exit(-1)
# Open the current diagram # Open the current diagram

View file

@ -34,7 +34,7 @@ class IOAPI extends Module {
/** /**
* Initializes module with QML elements. * Initializes module with QML elements.
* @param {LogarithmPlotter} rootElement * @param {{width: number, height: number, updateObjectsLists: function()}} rootElement
* @param {Settings} settings * @param {Settings} settings
* @param {{show: function(string)}} alert * @param {{show: function(string)}} alert
*/ */

View file

@ -7,9 +7,9 @@ GenericName[de]=2D-Grafiksoftware mit logarithmischer Skalierung
GenericName[fr]=Logiciel de traçage à l'échelle logarithmique GenericName[fr]=Logiciel de traçage à l'échelle logarithmique
GenericName[hu]=Síkbeli ábrázolásszoftver GenericName[hu]=Síkbeli ábrázolásszoftver
GenericName[no]=2D-plotterprogramvare GenericName[no]=2D-plotterprogramvare
Comment=Create BODE diagrams, sequences and distribution functions Comment=Create Bode diagrams, sequences and distribution functions
Comment[de]=Erstellung von Bode-Diagramms, Folgen und Verteilungsfunktionen Comment[de]=Erstellung von Bode-Diagramms, Folgen und Verteilungsfunktionen
Comment[fr]=Créer des diagrammes de BODE, des suites et des fonctions de répartition Comment[fr]=Créer des diagrammes de Bode, des suites et des fonctions de répartition
Comment[hu]=Bode-ábrák, sorozatok és újraosztási függvények létrehozása Comment[hu]=Bode-ábrák, sorozatok és újraosztási függvények létrehozása
TryExec=logarithmplotter TryExec=logarithmplotter

19
poetry.lock generated
View file

@ -259,6 +259,23 @@ importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
packaging = ">=22.0" packaging = ">=22.0"
setuptools = ">=42.0.0" setuptools = ">=42.0.0"
[[package]]
name = "pyside6-addons"
version = "6.7.2"
description = "Python bindings for the Qt cross-platform application and UI framework (Addons)"
optional = false
python-versions = "<3.13,>=3.9"
files = [
{file = "PySide6_Addons-6.7.2-cp39-abi3-macosx_11_0_universal2.whl", hash = "sha256:90b995efce61058d995c603ea480a9a3054fe8206739dcbc273fc3b53d40650f"},
{file = "PySide6_Addons-6.7.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:94b9bf6a2a4a7ac671e1776633e50d51326c86f4184f1c6e556f4dd5498fd52a"},
{file = "PySide6_Addons-6.7.2-cp39-abi3-manylinux_2_31_aarch64.whl", hash = "sha256:22979b1aa09d9cf1d7a86c8a9aa0cb4791d6bd1cc94f96c5b6780c5ef8a9e34e"},
{file = "PySide6_Addons-6.7.2-cp39-abi3-win_amd64.whl", hash = "sha256:ebf549eb25998665d8e4ec24014fbbd37bebc5ecdcb050b34db1e1c03e1bf81d"},
]
[package.dependencies]
PySide6-Essentials = "6.7.2"
shiboken6 = "6.7.2"
[[package]] [[package]]
name = "pyside6-essentials" name = "pyside6-essentials"
version = "6.7.2" version = "6.7.2"
@ -421,4 +438,4 @@ type = ["pytest-mypy"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.9,<3.13" python-versions = ">=3.9,<3.13"
content-hash = "4693a671e927103ceeb946f688b84fdc56b8b39b2cd772d8d32475e1236d8a07" content-hash = "083111ed37f3ef23de75a56eaf4c6fdda954b6005c5ee0922aad4470e2a36738"

View file

@ -10,6 +10,7 @@ package-mode = false
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.9,<3.13" python = ">=3.9,<3.13"
PySide6-Essentials = "^6.7.2" PySide6-Essentials = "^6.7.2"
pyside6-addons = "^6.7.2"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pyinstaller = "^6.10.0" pyinstaller = "^6.10.0"

16
tests/python/test_main.py Normal file
View file

@ -0,0 +1,16 @@
import pytest
from LogarithmPlotter.logarithmplotter import get_linux_theme
THEMES = [
"Basic",
"Universal",
"Material",
"Fusion",
"Windows",
"macOS"
]
class TestMain:
def test_themes(self):
get_linux_theme()