From 10fa30e2aa6d9d5ca93cc973af424f0d087a902f Mon Sep 17 00:00:00 2001 From: Ad5001 Date: Sat, 31 Jul 2021 01:40:51 +0200 Subject: [PATCH] Ensuring properties are different when they're edited, + linux installation editions*. *in preparation for snapcraft. - Moving application launch to it's separate file - Removing "install_after_setup" script because it's redundant with setup.py. - Fixed issue with xdg-icon-resource not being able to install svg files. - Better prefix handling in setup.py - Adding logarithmplotter.svg to import files - Adding weight for mime-type not to be overloaded by text/plain. - Using more appropriate properties for desktop files. Also: - Fixed reference link in MacOS plist file. --- LogarithmPlotter/__init__.py | 136 +----------------- LogarithmPlotter/__main__.py | 20 ++- .../qml/eu/ad5001/LogarithmPlotter/About.qml | 2 +- .../LogarithmPlotter/LogarithmPlotter.qml | 2 +- .../ad5001/LogarithmPlotter/ObjectLists.qml | 29 ++-- MANIFEST.in | 2 + ...r.svg => application-x-logarithm-plot.svg} | 0 linux/install_after_setup.sh | 29 ---- linux/install_local.sh | 10 +- linux/logplotter.desktop | 6 +- linux/x-logarithm-plot.xml | 6 +- mac/Info.plist | 2 +- run.py | 4 +- setup.py | 35 ++++- 14 files changed, 86 insertions(+), 197 deletions(-) rename linux/{application-x-logarithm-plotter.svg => application-x-logarithm-plot.svg} (100%) delete mode 100644 linux/install_after_setup.sh diff --git a/LogarithmPlotter/__init__.py b/LogarithmPlotter/__init__.py index 4ee4efc..13f6a90 100644 --- a/LogarithmPlotter/__init__.py +++ b/LogarithmPlotter/__init__.py @@ -16,142 +16,8 @@ * along with this program. If not, see . """ -from PySide2.QtWidgets import QApplication, QFileDialog -from PySide2.QtQml import QQmlApplicationEngine, qmlRegisterType -from PySide2.QtCore import Qt, QObject, Signal, Slot, Property -from PySide2.QtGui import QIcon, QImage, QKeySequence -from PySide2 import __version__ as PySide2_version - -import os -import tempfile -from platform import release as os_release -from json import dumps, loads -from sys import platform, argv, version as sys_version -import webbrowser - __VERSION__ = "0.0.1.dev0" -tempfile = tempfile.mkstemp(suffix='.png')[1] -pwd = os.getcwd() - -def get_linux_theme(): - des = { - "KDE": "Flat", - "gnome": "default", - "lxqt": "fusion", - "mate": "fusion", - } - if "XDG_SESSION_DESKTOP" in os.environ: - return des[os.environ["XDG_SESSION_DESKTOP"]] if os.environ["XDG_SESSION_DESKTOP"] in des else "fusion" - else: - # Android - return "Material" - -class Helper(QObject): - - @Slot(str, str) - def write(self, filename, filedata): - os.chdir(pwd) - if os.path.exists(os.path.dirname(os.path.realpath(filename))): - if filename.split(".")[-1] == "lpf": - # Add header to file - filedata = "LPFv1" + filedata - f = open(os.path.realpath(filename), 'w', -1, 'utf8') - f.write(filedata) - f.close() - os.chdir(os.path.dirname(os.path.realpath(__file__))) - - @Slot(str, result=str) - def load(self, filename): - os.chdir(pwd) - data = '{}' - if os.path.exists(os.path.realpath(filename)): - f = open(os.path.realpath(filename), 'r', -1, 'utf8') - data = f.read() - f.close() - try: - if data[:5] == "LPFv1": - # V1 version of the file - data = data[5:] - elif data[0] == "{" and "type" in loads(data) and loads(data)["type"] == "logplotv1": - pass - else: - raise Exception("Invalid LogarithmPlotter file.") - except Exception as e: # If file can't be loaded - from PySide2.QtWidgets import QMessageBox - QMessageBox.warning(None, 'LogarithmPlotter', 'Could not open file "{}":\n{}'.format(filename, e), QMessageBox.Ok) # Cannot parse file - else: - QMessageBox.warning(None, 'LogarithmPlotter', 'Could not open file: "{}"\nFile does not exist.'.format(filename), QMessageBox.Ok) # Cannot parse file - os.chdir(os.path.dirname(os.path.realpath(__file__))) - return data - - @Slot(result=str) - def gettmpfile(self): - global tempfile - return tempfile - - @Slot() - def copyImageToClipboard(self): - global tempfile - clipboard = QApplication.clipboard() - clipboard.setImage(QImage(tempfile)) - - @Slot(result=str) - def getVersion(self): - return __VERSION__ - - @Slot(result=str) - def getDebugInfos(self): - """ - Returns the version info about Qt, PySide2 & Python - """ - return "Built with PySide2 (Qt) v{} and python v{}".format(PySide2_version, sys_version.split("\n")[0]) - - @Slot(str) - def openUrl(self, url): - webbrowser.open(url) - -def run(): - os.chdir(os.path.dirname(os.path.realpath(__file__))) - - os.environ["QT_QUICK_CONTROLS_STYLE"] = { - "linux": get_linux_theme(), - "freebsd": get_linux_theme(), - "win32": "universal" if os_release == "10" else "fusion", - "cygwin": "fusion", - "darwin": "default" - }[platform] - - icon_fallbacks = QIcon.fallbackSearchPaths(); - icon_fallbacks.append(os.path.realpath(os.path.join(os.getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "icons"))) - icon_fallbacks.append(os.path.realpath(os.path.join(os.getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "icons", "settings"))) - icon_fallbacks.append(os.path.realpath(os.path.join(os.getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "icons", "settings", "custom"))) - QIcon.setFallbackSearchPaths(icon_fallbacks); - - app = QApplication(argv) - app.setApplicationName("LogarithmPlotter") - app.setOrganizationName("Ad5001") - app.setWindowIcon(QIcon(os.path.realpath(os.path.join(os.getcwd(), "..", "logplotter.svg")))) - engine = QQmlApplicationEngine() - helper = Helper() - engine.rootContext().setContextProperty("Helper", helper) - engine.rootContext().setContextProperty("TestBuild", "--test-build" in argv) - - engine.addImportPath(os.path.realpath(os.path.join(os.getcwd(), "qml"))) - engine.load(os.path.realpath(os.path.join(os.getcwd(), "qml", "eu", "ad5001", "LogarithmPlotter", "LogarithmPlotter.qml"))) - - os.chdir(pwd) - if len(argv) > 0 and os.path.exists(argv[-1]) and argv[-1].split('.')[-1] in ['json', 'lgg', 'lpf']: - engine.rootObjects()[0].loadDiagram(argv[-1]) - os.chdir(os.path.dirname(os.path.realpath(__file__))) - - if not engine.rootObjects(): - print("No root object") - exit(-1) - exit_code = app.exec_() - - os.remove(tempfile) - exit(exit_code) - if __name__ == "__main__": + from .logarithmplotter import run run() diff --git a/LogarithmPlotter/__main__.py b/LogarithmPlotter/__main__.py index 0482757..983dd6b 100644 --- a/LogarithmPlotter/__main__.py +++ b/LogarithmPlotter/__main__.py @@ -1,4 +1,20 @@ -from .run import run - +""" + * LogarithmPlotter - Create graphs with logarithm scales. + * Copyright (C) 2021 Ad5001 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +""" if __name__ == "__main__": + from .logarithmplotter import run run() diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/About.qml b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/About.qml index 12ada65..c850f63 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/About.qml +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/About.qml @@ -29,7 +29,7 @@ D.Dialog { Image { id: logo - source: "../../../../../logplotter.svg" + source: "icons/logarithmplotter.svg" sourceSize.width: 64 sourceSize.height: 64 width: 64 diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml index 6bffe8e..0325339 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml @@ -18,7 +18,7 @@ import QtQml 2.12 import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.15 +import QtQuick.Layouts 1.12 import QtQuick 2.12 import "js/objects.js" as Objects diff --git a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists.qml b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists.qml index 74161d6..b0a6415 100644 --- a/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists.qml +++ b/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists.qml @@ -237,8 +237,10 @@ ListView { icon: "icons/settings/custom/label.svg" currentIndex: model.indexOf(objEditor.obj.labelContent) onActivated: function(newIndex) { - Objects.currentObjects[objEditor.objType][objEditor.objIndex].labelContent = model[newIndex] - objectListList.update() + if(model[newIndex] != objEditor.obj.labelContent) { + objEditor.obj.labelContent = model[newIndex] + objectListList.update() + } } } @@ -282,14 +284,16 @@ ListView { 'string': () => newValue, 'number': () => parseFloat(newValue) }[modelData[1]]() - history.addToHistory(new HistoryLib.EditedProperty( - objEditor.obj.name, objEditor.objType, modelData[0], - objEditor.obj[modelData[0]], newValue - )) - //Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = newValue - objEditor.obj[modelData[0]] = newValue - Objects.currentObjects[objEditor.objType][objEditor.objIndex].update() - objectListList.update() + // Ensuring old and new values are different to prevent useless adding to history. + if(objEditor.obj[modelData[0]] != newValue) { + history.addToHistory(new HistoryLib.EditedProperty( + objEditor.obj.name, objEditor.objType, modelData[0], + objEditor.obj[modelData[0]], newValue + )) + objEditor.obj[modelData[0]] = newValue + Objects.currentObjects[objEditor.objType][objEditor.objIndex].update() + objectListList.update() + } } } @@ -345,14 +349,13 @@ ListView { objEditor.obj.name, objEditor.objType, modelData[0], objEditor.obj[modelData[0]], selectedObj )) - //Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = selectedObj objEditor.obj[modelData[0]] = selectedObj - } else { + } else if(model[newIndex] != objEditor.obj[modelData[0]]) { + // Ensuring new property is different to not add useless history entries. history.addToHistory(new HistoryLib.EditedProperty( objEditor.obj.name, objEditor.objType, modelData[0], objEditor.obj[modelData[0]], model[newIndex] )) - //Objects.currentObjects[objEditor.objType][objEditor.objIndex][modelData[0]] = model[newIndex] objEditor.obj[modelData[0]] = model[newIndex] } // Refreshing diff --git a/MANIFEST.in b/MANIFEST.in index 6cac856..2221cdb 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,4 @@ recursive-include LogarithmPlotter/qml *.qml *.js *.qdoc qmldir *.svg *.md LICENSE +include LogarithmPlotter/ *.svg +include . *.md LICENSE diff --git a/linux/application-x-logarithm-plotter.svg b/linux/application-x-logarithm-plot.svg similarity index 100% rename from linux/application-x-logarithm-plotter.svg rename to linux/application-x-logarithm-plot.svg diff --git a/linux/install_after_setup.sh b/linux/install_after_setup.sh deleted file mode 100644 index 16489fc..0000000 --- a/linux/install_after_setup.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# AccountFree - Browse and use online services, free of account. -# Copyright (C) 2021 Ad5001 -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -APPROOT="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -echo "Adding desktop file..." -xdg-desktop-menu install "$APPROOT/linux/logarithmplotter.desktop" -echo "Installing mime-type..." -xdg-mime install "$APPROOT/linux/x-logarithm-plot.xml" -echo "Installing icons..." -xdg-icon-resource install --context mimetypes --novendor "$APPROOT/logplotterfile.svg" "application-x-logarithm-plot" -xdg-icon-resource install --context apps --novendor "$APPROOT/logplotter.svg" "logarithmplotter" -update-mime-database ~/.local/share/mime/ -update-icon-caches ~/.local/share/icons/hicolor diff --git a/linux/install_local.sh b/linux/install_local.sh index b940e8b..21f7ddc 100644 --- a/linux/install_local.sh +++ b/linux/install_local.sh @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # +# This script installs the desktop file & mime type for development environment, linking it directly to run.py. APPROOT="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" echo "Adding desktop file..." @@ -24,7 +25,12 @@ xdg-desktop-menu install "$APPROOT/linux/logarithmplotter-local.desktop" echo "Installing mime-type..." xdg-mime install "$APPROOT/linux/x-logarithm-plot.xml" echo "Installing icons..." -xdg-icon-resource install --context mimetypes --novendor "$APPROOT/logplotterfile.svg" "application-x-logarithm-plot" -xdg-icon-resource install --context apps --novendor "$APPROOT/logplotter.svg" "logarithmplotter" +mkdir -p ~/.local/share/icons/hicolor/scalable/mimetypes +cp "$APPROOT/linux/application-x-logarithm-plot.svg" ~/.local/share/icons/hicolor/scalable/mimetypes/application-x-logarithm-plot.svg +mkdir -p ~/.local/share/icons/hicolor/scalable/apps +cp "$APPROOT/logplotter.svg" ~/.local/share/icons/hicolor/scalable/apps/logarithmplotter.svg +# xdg-icon-resource does not work with SVG yet. See https://bugs.launchpad.net/ubuntu/+source/xdg-utils/+bug/790449. +#xdg-icon-resource install --context mimetypes --novendor "$APPROOT/linux/application-x-logarithm-plot.svg" "application-x-logarithm-plot" +#xdg-icon-resource install --context apps --novendor "$APPROOT/logplotter.svg" "logarithmplotter" update-mime-database ~/.local/share/mime/ update-icon-caches ~/.local/share/icons/hicolor diff --git a/linux/logplotter.desktop b/linux/logplotter.desktop index 6637908..fcfb08d 100644 --- a/linux/logplotter.desktop +++ b/linux/logplotter.desktop @@ -2,8 +2,10 @@ Version=1.0 Type=Application Name=LogarithmPlotter -Comment=2D plotter software to make BODE diagrams, sequences and repartition functions. -Comment[fr]=Logiciel de traçage 2D pour les diagrammes de BODE, les suites et les fonctions de répartition. +GenericName=2D plotter software +GenericName[fr]=Logiciel de traçage 2D +Comment=Create BODE diagrams, sequences and repartition functions. +Comment[fr]=Créer des diagrammes de BODE, des suites et des fonctions de répartition. Exec=/usr/bin/python3 ROOTFOLDER/run.py %f Icon=logarithmplotter diff --git a/linux/x-logarithm-plot.xml b/linux/x-logarithm-plot.xml index 3e62661..89f489a 100644 --- a/linux/x-logarithm-plot.xml +++ b/linux/x-logarithm-plot.xml @@ -5,8 +5,8 @@ Fichier Graphe Logarithmique - - - + + + diff --git a/mac/Info.plist b/mac/Info.plist index f17f0cb..fdf7463 100644 --- a/mac/Info.plist +++ b/mac/Info.plist @@ -26,7 +26,7 @@ UTTypeIdentifier eu.ad5001.x-logarithm-plot UTTypeReferenceURL - https://git.ad5001.eu/Ad5001/LogarithmicPlotter/wiki/LogarithmPlotter-file-format-v1.0 + https://git.ad5001.eu/Ad5001/LogarithmPlotter/wiki/LogarithmPlotter-file-format-v1.0 UTTypeDescription Logarithm Plot File UTTypeIconFile diff --git a/run.py b/run.py index 0d8c282..ead8e33 100644 --- a/run.py +++ b/run.py @@ -1,7 +1,7 @@ def run(): - import LogarithmPlotter - LogarithmPlotter.run() + from LogarithmPlotter import logarithmplotter + logarithmplotter.run() if __name__ == "__main__": run() diff --git a/setup.py b/setup.py index 8fc4c6c..3894efd 100644 --- a/setup.py +++ b/setup.py @@ -22,6 +22,19 @@ import sys current_dir = os.path.realpath(os.path.dirname(os.path.realpath(__file__))) +if "PREFIX" not in os.environ and sys.platform == 'linux': + if "XDG_DATA_HOME" in os.environ: + os.environ["PREFIX"] = os.environ["XDG_DATA_HOME"] + else : + try: + # Checking if we have permission to write to root. + from os import makedirs, rmdir + makedirs("/usr/share/applications/test") + rmdir("/usr/share/applications/test") + os.environ["PREFIX"] = "/usr/share" + except: + os.environ["PREFIX"] = os.environ["home"] + "/local/share" + from LogarithmPlotter import __VERSION__ as pkg_version CLASSIFIERS = """ @@ -49,7 +62,7 @@ def read_file(file_name): return data def package_data(): - pkg_data = [] + pkg_data = ["logarithmplotter.svg"] for d,folders,files in os.walk("LogarithmPlotter/qml"): d = d[17:] pkg_data += [os.path.join(d, f) for f in files] @@ -57,10 +70,20 @@ def package_data(): data_files = [] if sys.platform == 'linux': - data_files.append(('/usr/share/applications/', ['linux/logarithmplotter.desktop'])) - data_files.append(('/usr/share/mime/packages/', ['linux/x-logarithm-plot.xml'])) - data_files.append(('/usr/share/icons/hicolor/scalable/mimetypes/', ['linux/application-x-logarithm-plot.svg'])) - data_files.append(('/usr/share/icons/hicolor/scalable/apps/', ['logplotter.svg'])) + data_files.append((os.environ["PREFIX"] + '/applications/', ['linux/logarithmplotter.desktop'])) + data_files.append((os.environ["PREFIX"] + '/mime/packages/', ['linux/x-logarithm-plot.xml'])) + data_files.append((os.environ["PREFIX"] + '/icons/hicolor/scalable/mimetypes/', ['linux/application-x-logarithm-plot.svg'])) + data_files.append((os.environ["PREFIX"] + '/icons/hicolor/scalable/apps/', ['logplotter.svg'])) + if len(sys.argv) > 1 and sys.argv[1] == "install": + from shutil import copyfile + os.makedirs(os.environ["PREFIX"] + '/applications/', exist_ok=True) + os.makedirs(os.environ["PREFIX"] + '/mime/packages/', exist_ok=True) + os.makedirs(os.environ["PREFIX"] + '/icons/hicolor/scalable/mimetypes/', exist_ok=True) + os.makedirs(os.environ["PREFIX"] + '/icons/hicolor/scalable/apps/', exist_ok=True) + copyfile(current_dir + '/linux/logarithmplotter.desktop', os.environ["PREFIX"] + '/applications/logarithmplotter.desktop') + copyfile(current_dir + '/linux/x-logarithm-plot.xml', os.environ["PREFIX"] + '/mime/packages/x-logarithm-plot.xml') + copyfile(current_dir + '/linux/application-x-logarithm-plot.svg', os.environ["PREFIX"] + '/icons/hicolor/scalable/mimetypes/application-x-logarithm-plot.svg') + copyfile(current_dir + '/logplotter.svg', os.environ["PREFIX"] + '/icons/hicolor/scalable/apps/logplotter.svg') setuptools.setup( install_requires=["PySide2"], @@ -90,7 +113,7 @@ setuptools.setup( data_files = data_files, entry_points={ 'console_scripts': [ - 'logarithmplotter = LogarithmPlotter:run', + 'logarithmplotter = LogarithmPlotter.logarithmplotter:run', ], } )