Compare commits
3 commits
cf1eb468a9
...
a250f532d9
Author | SHA1 | Date | |
---|---|---|---|
a250f532d9 | |||
e68411e93c | |||
b55b2a11fe |
7 changed files with 156 additions and 45 deletions
|
@ -396,6 +396,12 @@ Ces paramètres peuvent être modifiés à tout moment à partir du menu "P
|
||||||
<source>Close</source>
|
<source>Close</source>
|
||||||
<translation>Fermer</translation>
|
<translation>Fermer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Take a few seconds to configure LogarithmPlotter.
|
||||||
|
These settings can always be changed at any time from the "Settings" menu.</source>
|
||||||
|
<translation>Take a few seconds to configure LogarithmPlotter.
|
||||||
|
These settings can always be changed at any time from the "Settings" menu.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Check for updates on startup (requires online connectivity)</source>
|
<source>Check for updates on startup (requires online connectivity)</source>
|
||||||
<translation>Vérifier les mises à jour au démarrage (nécessite d'être connecté à internet)</translation>
|
<translation>Vérifier les mises à jour au démarrage (nécessite d'être connecté à internet)</translation>
|
||||||
|
@ -1100,6 +1106,22 @@ Formule analysée : %3</translation>
|
||||||
<source>LogarithmPlotter - Drawing error</source>
|
<source>LogarithmPlotter - Drawing error</source>
|
||||||
<translation>LogarithmPlotter - Erreur</translation>
|
<translation>LogarithmPlotter - Erreur</translation>
|
||||||
</message>
|
</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'autocomplétion</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Color Scheme</source>
|
||||||
|
<translation>Coloration Syntaxique</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>function</name>
|
<name>function</name>
|
||||||
|
@ -1133,6 +1155,18 @@ Formule analysée : %3</translation>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>general</name>
|
<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'action "Rétablir" automatiquement</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enable LaTeX rendering</source>
|
||||||
|
<translation>Activer le rendu LaTeX</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>historylib</name>
|
<name>historylib</name>
|
||||||
|
@ -1175,6 +1209,30 @@ Formule analysée : %3</translation>
|
||||||
<source>History</source>
|
<source>History</source>
|
||||||
<translation>Historique</translation>
|
<translation>Historique</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Saved plot to '%1'.</source>
|
||||||
|
<translation>Graphe sauvegardé dans '%1'.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Loading file '%1'.</source>
|
||||||
|
<translation>Chargement du fichier '%1'.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Unknown object type: %1.</source>
|
||||||
|
<translation>Type d'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 '%1'.</source>
|
||||||
|
<translation>Fichier '%1' chargé.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Copied plot screenshot to clipboard!</source>
|
<source>Copied plot screenshot to clipboard!</source>
|
||||||
<translation>Image du graphe copiée dans le presse-papiers !</translation>
|
<translation>Image du graphe copiée dans le presse-papiers !</translation>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
19
poetry.lock
generated
|
@ -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"
|
||||||
|
|
|
@ -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
16
tests/python/test_main.py
Normal 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()
|
Loading…
Reference in a new issue