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
7 changed files with 156 additions and 45 deletions

View file

@ -396,6 +396,12 @@ Ces paramètres peuvent être modifiés à tout moment à partir du menu "P
<source>Close</source>
<translation>Fermer</translation>
</message>
<message>
<source>Take a few seconds to configure LogarithmPlotter.
These settings can always be changed at any time from the &quot;Settings&quot; menu.</source>
<translation>Take a few seconds to configure LogarithmPlotter.
These settings can always be changed at any time from the &quot;Settings&quot; menu.</translation>
</message>
<message>
<source>Check for updates on startup (requires online connectivity)</source>
<translation>Vérifier les mises à jour au démarrage (nécessite d&apos;être connecté à internet)</translation>
@ -1100,6 +1106,22 @@ Formule analysée : %3</translation>
<source>LogarithmPlotter - Drawing error</source>
<translation>LogarithmPlotter - Erreur</translation>
</message>
<message>
<source>Automatically close parenthesises and brackets</source>
<translation>Fermer automatiquement les parenthèses et les crochets</translation>
</message>
<message>
<source>Enable syntax highlighting</source>
<translation>Activer la coloration syntaxique</translation>
</message>
<message>
<source>Enable autocompletion</source>
<translation>Activer l&apos;autocomplétion</translation>
</message>
<message>
<source>Color Scheme</source>
<translation>Coloration Syntaxique</translation>
</message>
</context>
<context>
<name>function</name>
@ -1133,6 +1155,18 @@ Formule analysée : %3</translation>
</context>
<context>
<name>general</name>
<message>
<source>Check for updates on startup</source>
<translation>Vérifier la présence de mise à jour au démarrage</translation>
</message>
<message>
<source>Reset redo stack automaticly</source>
<translation>Réinitialiser la pile d&apos;action &quot;Rétablir&quot; automatiquement</translation>
</message>
<message>
<source>Enable LaTeX rendering</source>
<translation>Activer le rendu LaTeX</translation>
</message>
</context>
<context>
<name>historylib</name>
@ -1175,6 +1209,30 @@ Formule analysée : %3</translation>
<source>History</source>
<translation>Historique</translation>
</message>
<message>
<source>Saved plot to &apos;%1&apos;.</source>
<translation>Graphe sauvegardé dans &apos;%1&apos;.</translation>
</message>
<message>
<source>Loading file &apos;%1&apos;.</source>
<translation>Chargement du fichier &apos;%1&apos;.</translation>
</message>
<message>
<source>Unknown object type: %1.</source>
<translation>Type d&apos;objet inconnu : %1.</translation>
</message>
<message>
<source>Invalid file provided.</source>
<translation>Fichier fourni invalide.</translation>
</message>
<message>
<source>Could not save file: </source>
<translation>Impossible de sauvegarder le fichier : </translation>
</message>
<message>
<source>Loaded file &apos;%1&apos;.</source>
<translation>Fichier &apos;%1&apos; chargé.</translation>
</message>
<message>
<source>Copied plot screenshot to clipboard!</source>
<translation>Image du graphe copiée dans le presse-papiers !</translation>

View file

@ -16,18 +16,18 @@
* 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 PySide6.QtWidgets import QApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import Qt, QTranslator, QLocale
from PySide6.QtCore import QTranslator, QLocale
from PySide6.QtGui import QIcon
from tempfile import TemporaryDirectory
from os import getcwd, chdir, environ, path, remove, close
from platform import release as os_release
from sys import platform, argv, version as sys_version, exit
from sys import path as sys_path
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtQuickControls2 import QQuickStyle
from PySide6.QtWidgets import QApplication
start_time = time()
@ -48,10 +48,7 @@ from LogarithmPlotter.util.helper import Helper
from LogarithmPlotter.util.latex import Latex
from LogarithmPlotter.util.js import PyJSValue
config.init()
def get_linux_theme():
def get_linux_theme() -> str:
des = {
"KDE": "Fusion",
"gnome": "Basic",
@ -59,59 +56,59 @@ def get_linux_theme():
"mate": "Fusion",
}
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:
# Android
return "Material"
def run():
if not 'QT_QUICK_CONTROLS_STYLE' in environ:
environ["QT_QUICK_CONTROLS_STYLE"] = {
def get_platform_qt_style(os) -> str:
return {
"linux": 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",
"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")
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, "history")))
icon_fallbacks.append(path.realpath(path.join(base_icon_path, "settings")))
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.setApplicationName("LogarithmPlotter")
app.setDesktopFileName("eu.ad5001.LogarithmPlotter.desktop")
app.setOrganizationName("Ad5001")
app.styleHints().setShowShortcutsInContextMenus(True)
app.setWindowIcon(QIcon(path.realpath(path.join(getcwd(), "logarithmplotter.svg"))))
return app
def install_translation(app: QApplication) -> QTranslator:
# Installing translators
translator = QTranslator()
# Check if lang is forced.
forcedlang = [p for p in argv if p[:7] == "--lang="]
locale = QLocale(forcedlang[0][7:]) if len(forcedlang) > 0 else QLocale()
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
helper = Helper(pwd, tmpfile)
latex = Latex(tempdir)
engine = QQmlApplicationEngine()
js_globals = PyJSValue(engine.globalObject())
js_globals.Modules = engine.newObject()
js_globals.Helper = engine.newQObject(helper)
@ -119,15 +116,37 @@ def run():
engine.rootContext().setContextProperty("TestBuild", "--test-build" in argv)
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.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(path.realpath(path.join(getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "LogarithmPlotter.qml")))
exit(-1)
# Open the current diagram

View file

@ -34,7 +34,7 @@ class IOAPI extends Module {
/**
* Initializes module with QML elements.
* @param {LogarithmPlotter} rootElement
* @param {{width: number, height: number, updateObjectsLists: function()}} rootElement
* @param {Settings} settings
* @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[hu]=Síkbeli ábrázolásszoftver
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[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
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"
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]]
name = "pyside6-essentials"
version = "6.7.2"
@ -421,4 +438,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.9,<3.13"
content-hash = "4693a671e927103ceeb946f688b84fdc56b8b39b2cd772d8d32475e1236d8a07"
content-hash = "083111ed37f3ef23de75a56eaf4c6fdda954b6005c5ee0922aad4470e2a36738"

View file

@ -10,6 +10,7 @@ package-mode = false
[tool.poetry.dependencies]
python = ">=3.9,<3.13"
PySide6-Essentials = "^6.7.2"
pyside6-addons = "^6.7.2"
[tool.poetry.group.dev.dependencies]
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()