diff --git a/common/rollup.config.mjs b/common/rollup.config.mjs index 6a18a41..6156873 100644 --- a/common/rollup.config.mjs +++ b/common/rollup.config.mjs @@ -22,7 +22,7 @@ import { babel } from "@rollup/plugin-babel" import cleanup from "rollup-plugin-cleanup" const src = "./src/index.mjs" -const dest = "../build/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js/index.mjs" +const dest = "../build/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Common/index.mjs" export default { input: src, diff --git a/common/src/history/common.mjs b/common/src/history/common.mjs index 33f9118..e8e5795 100644 --- a/common/src/history/common.mjs +++ b/common/src/history/common.mjs @@ -95,11 +95,15 @@ export class Action { if(!Latex.enabled) throw new Error("Cannot render an item as LaTeX when LaTeX is disabled.") const imgDepth = History.imageDepth - const { source, width, height } = await Latex.requestAsyncRender( + const renderArguments = [ latexString, imgDepth * (History.fontSize + 2), History.themeTextColor - ) + ] + let render = Latex.findPrerendered(...renderArguments) + if(render === null) + render = await Latex.requestAsyncRender(...renderArguments) + const { source, width, height } = render return `` } diff --git a/common/src/module/canvas.mjs b/common/src/module/canvas.mjs index ba6d5ca..5736cfc 100644 --- a/common/src/module/canvas.mjs +++ b/common/src/module/canvas.mjs @@ -25,7 +25,10 @@ import Objects from "./objects.mjs" import History from "./history.mjs" import Settings from "./settings.mjs" + class CanvasAPI extends Module { + + /** @type {CanvasInterface} */ #canvas = null /** @type {CanvasRenderingContext2D} */ diff --git a/common/src/module/latex.mjs b/common/src/module/latex.mjs index 216e3be..65ce689 100644 --- a/common/src/module/latex.mjs +++ b/common/src/module/latex.mjs @@ -17,6 +17,7 @@ */ import { Module } from "./common.mjs" +import { BaseEvent } from "../events.mjs" import * as Instruction from "../lib/expr-eval/instruction.mjs" import { escapeValue } from "../lib/expr-eval/expression.mjs" import { HelperInterface, LatexInterface } from "./interface.mjs" @@ -44,6 +45,28 @@ const equivalchars = ["\\pi", "\\infty", "{}_{4}", "{}_{5}", "{}_{6}", "{}_{7}", "{}_{8}", "{}_{9}", "{}_{0}", ] + + + +class AsyncRenderStartedEvent extends BaseEvent { + constructor(markup, fontSize, color) { + super("async-render-started") + this.markup = markup + this.fontSize = fontSize + this.color = color + } +} + + +class AsyncRenderFinishedEvent extends BaseEvent { + constructor(markup, fontSize, color) { + super("async-render-finished") + this.markup = markup + this.fontSize = fontSize + this.color = color + } +} + /** * Class containing the result of a LaTeX render. * @@ -60,6 +83,8 @@ class LatexRenderResult { } class LatexAPI extends Module { + static emits = ["async-render-started", "async-render-finished"] + /** @type {LatexInterface} */ #latex = null @@ -113,10 +138,14 @@ class LatexAPI extends Module { async requestAsyncRender(markup, fontSize, color) { if(!this.initialized) throw new Error("Attempting requestAsyncRender before initialize!") let render - if(this.#latex.supportsAsyncRender) + if(this.#latex.supportsAsyncRender) { + console.trace() + this.emit(new AsyncRenderStartedEvent(markup, fontSize, color)) render = await this.#latex.renderAsync(markup, fontSize, color) - else + this.emit(new AsyncRenderFinishedEvent(markup, fontSize, color)) + } else { render = this.#latex.renderSync(markup, fontSize, color) + } const args = render.split(",") return new LatexRenderResult(...args) } diff --git a/common/src/objs/function.mjs b/common/src/objs/function.mjs index 1e345cb..b056cc3 100644 --- a/common/src/objs/function.mjs +++ b/common/src/objs/function.mjs @@ -122,7 +122,9 @@ export default class Function extends ExecutableObject { */ static drawFunction(canvas, expr, definitionDomain, destinationDomain, drawPoints = true, drawDash = true) { let pxprecision = 10 - let previousX = canvas.px2x(0) + const startDrawFrom = canvas.x2px(1)%pxprecision-pxprecision + let previousX = canvas.px2x(startDrawFrom) + // console.log("Starting draw from", previousX, startDrawFrom, canvas.x2px(1)) let previousY = null if(definitionDomain instanceof SpecialDomain && definitionDomain.moveSupported) { // Point based functions. @@ -160,7 +162,7 @@ export default class Function extends ExecutableObject { // Calculate the previousY at the start of the canvas if(definitionDomain.includes(previousX)) previousY = expr.execute(previousX) - for(let px = pxprecision; px < canvas.width; px += pxprecision) { + for(let px = pxprecision; px-pxprecision < canvas.width; px += pxprecision) { let currentX = canvas.px2x(px) if(!definitionDomain.includes(previousX) && definitionDomain.includes(currentX)) { // Should draw up to currentX, but NOT at previousX. @@ -169,7 +171,7 @@ export default class Function extends ExecutableObject { do { tmpPx++ previousX = canvas.px2x(tmpPx) - } while(!definitionDomain.includes(previousX)) + } while(!definitionDomain.includes(previousX) && currentX > previousX) // Recaclulate previousY previousY = expr.execute(previousX) } else if(!definitionDomain.includes(currentX)) { @@ -179,7 +181,7 @@ export default class Function extends ExecutableObject { do { tmpPx-- currentX = canvas.px2x(tmpPx) - } while(!definitionDomain.includes(currentX) && currentX !== previousX) + } while(!definitionDomain.includes(currentX) && currentX > previousX) } // This max variation is needed for functions with asymptotical vertical lines (e.g. 1/x, tan x...) let maxvariation = (canvas.px2y(0) - canvas.px2y(canvas.height)) diff --git a/common/src/preferences/general.mjs b/common/src/preferences/general.mjs index a6957c6..a00a813 100644 --- a/common/src/preferences/general.mjs +++ b/common/src/preferences/general.mjs @@ -47,8 +47,8 @@ class EnableLatex extends BoolSetting { } const ENABLE_LATEX_ASYNC = new BoolSetting( - qsTranslate("general", "Enable asynchronous LaTeX renderer"), - "enable_latex_async", + qsTranslate("general", "Enable threaded LaTeX renderer (experimental)"), + "enable_latex_threaded", "new" ) diff --git a/common/test/mock/helper.mjs b/common/test/mock/helper.mjs index 4cab472..b912b44 100644 --- a/common/test/mock/helper.mjs +++ b/common/test/mock/helper.mjs @@ -23,7 +23,7 @@ const DEFAULT_SETTINGS = { "reset_redo_stack": true, "last_install_greet": "0", "enable_latex": true, - "enable_latex_async": true, + "enable_latex_threaded": true, "expression_editor": { "autoclose": true, "colorize": true, @@ -113,4 +113,4 @@ export class MockHelper { throw new Error(`File not found.`) } -} \ No newline at end of file +} diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/AppMenuBar.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/AppMenuBar.qml index 87dd625..79fa6b0 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/AppMenuBar.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/AppMenuBar.qml @@ -20,7 +20,7 @@ import QtQuick import Qt.labs.platform as Native //import QtQuick.Controls 2.15 import eu.ad5001.MixedMenu 1.1 -import "js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Common/qmldir b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Common/qmldir new file mode 100644 index 0000000..af9eb16 --- /dev/null +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Common/qmldir @@ -0,0 +1,3 @@ +module eu.ad5001.LogarithmPlotter.Common + +JS 1.0 index.mjs diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryBrowser.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/Browser.qml similarity index 98% rename from runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryBrowser.qml rename to runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/Browser.qml index eb84340..645916c 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryBrowser.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/Browser.qml @@ -24,7 +24,7 @@ import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting /*! - \qmltype HistoryBrowser + \qmltype Browser \inqmlmodule eu.ad5001.LogarithmPlotter.History \brief Tab of the drawer that allows to navigate through the undo and redo history. @@ -95,7 +95,7 @@ Item { Repeater { model: historyBrowser.redoCount - HistoryItem { + SingleItem { id: redoButton width: historyBrowser.actionWidth //height: actionHeight @@ -147,7 +147,7 @@ Item { model: historyBrowser.undoCount - HistoryItem { + SingleItem { id: undoButton width: historyBrowser.actionWidth //height: actionHeight diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryItem.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/SingleItem.qml similarity index 99% rename from runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryItem.qml rename to runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/SingleItem.qml index 6ad6556..bffdb9b 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/HistoryItem.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/SingleItem.qml @@ -22,7 +22,7 @@ import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting /*! - \qmltype HistoryItem + \qmltype SingleItem \inqmlmodule eu.ad5001.LogarithmPlotter.History \brief Item representing an history action. diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/qmldir b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/qmldir index 7f8a628..66c4408 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/qmldir +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/History/qmldir @@ -1,4 +1,4 @@ module eu.ad5001.LogarithmPlotter.History -HistoryBrowser 1.0 HistoryBrowser.qml -HistoryItem 1.0 HistoryItem.qml +Browser 1.0 Browser.qml +SingleItem 1.0 SingleItem.qml diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml index d541a0c..064a0be 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/LogarithmPlotter.qml @@ -17,16 +17,17 @@ */ import QtQml -import QtQuick.Controls -import eu.ad5001.MixedMenu 1.1 -import QtQuick.Layouts 1.12 import QtQuick +import QtQuick.Controls +import QtQuick.Layouts 1.12 +import eu.ad5001.MixedMenu 1.1 // Auto loading all modules. -import "js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common -import eu.ad5001.LogarithmPlotter.History 1.0 +import eu.ad5001.LogarithmPlotter.History 1.0 as History import eu.ad5001.LogarithmPlotter.ObjectLists 1.0 +import eu.ad5001.LogarithmPlotter.Overlay 1.0 as Overlay import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup /*! @@ -120,16 +121,16 @@ ApplicationWindow { ObjectLists { id: objectLists - onChanged: drawCanvas.requestPaint() + onChanged: Modules.Canvas.requestPaint() } Settings { id: settings canvas: drawCanvas - onChanged: drawCanvas.requestPaint() + onChanged: Modules.Canvas.requestPaint() } - HistoryBrowser { + History.Browser { id: historyBrowser } } @@ -154,19 +155,21 @@ ApplicationWindow { } } - ViewPositionChangeOverlay { + Overlay.ViewPositionChange { id: viewPositionChanger anchors.fill: parent - canvas: parent - settingsInstance: settings } - PickLocationOverlay { + Overlay.PickLocation { id: positionPicker anchors.fill: parent - canvas: parent } } + + Overlay.Loading { + id: loadingOverlay + anchors.fill: parent + } Timer { id: delayRefreshTimer diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/CustomPropertyList.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/CustomPropertyList.qml index 49cea8e..e688202 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/CustomPropertyList.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/CustomPropertyList.qml @@ -20,7 +20,7 @@ import QtQuick import QtQuick.Controls import Qt.labs.platform as Native import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting -import "../../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! \qmltype CustomPropertyList diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/Dialog.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/Dialog.qml index 715602a..ced0cdd 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/Dialog.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/Editor/Dialog.qml @@ -18,11 +18,10 @@ import QtQuick import QtQuick.Controls -import QtQuick.Dialogs as D import Qt.labs.platform as Native import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup -import "../../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! \qmltype Dialog diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectCreationGrid.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectCreationGrid.qml index e8d4912..e3894cd 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectCreationGrid.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectCreationGrid.qml @@ -19,7 +19,7 @@ import QtQuick import QtQuick.Controls import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting -import "../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectLists.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectLists.qml index f755a6f..c2a5a23 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectLists.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectLists.qml @@ -56,7 +56,7 @@ ScrollView { property var editingRows: [] model: Modules.Objects.currentObjects[objType] width: objectsListView.width - implicitHeight: contentItem.childrenRect.height + height: contentItem.childrenRect.height + 10 visible: model != undefined && model.length > 0 interactive: false diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectRow.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectRow.qml index 9624d23..5812252 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectRow.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ObjectLists/ObjectRow.qml @@ -21,7 +21,7 @@ import QtQuick.Dialogs import QtQuick.Controls import QtQuick.Window import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting -import "../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/Loading.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/Loading.qml new file mode 100644 index 0000000..6aec616 --- /dev/null +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/Loading.qml @@ -0,0 +1,130 @@ +/** + * LogarithmPlotter - 2D plotter software to make BODE plots, sequences and distribution functions. + * Copyright (C) 2021-2024 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 . + */ + +import QtQuick +import QtQuick.Controls + + +/*! + \qmltype Loading + \inqmlmodule eu.ad5001.LogarithmPlotter.Overlay + \brief Overlay notifiying the user when a file is loading. + + Provides an overlay over the canvas that is shown when the user loads a new file, both to lock the ViewPositionChange + overlay and inform the user of what is loading and how much remains. + + \sa Common, ViewPositionChange +*/ +Item { + id: loadingRoot + opacity: 0 + visible: opacity !== 0 + clip: true + + property int currentlyLoading: 0 + property int maxCurrentLoadingSteps: 0 + + Behavior on opacity { PropertyAnimation {} } + + Rectangle { + anchors.fill: parent + color: sysPalette.window + opacity: 0.85 + } + + Column { + spacing: 5 + anchors { + verticalCenter: parent.verticalCenter + left: parent.left + right: parent.right + } + + Text { + id: loadingTitle + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 20 + color: sysPalette.windowText + } + + ProgressBar { + id: progress + anchors.horizontalCenter: parent.horizontalCenter + width: 300 + from: 0 + value: loadingRoot.maxCurrentLoadingSteps - loadingRoot.currentlyLoading + to: loadingRoot.maxCurrentLoadingSteps + } + + Text { + id: lastFinishedStep + anchors.horizontalCenter: parent.horizontalCenter + color: sysPalette.windowText + } + } + + MouseArea { + id: picker + anchors.fill: parent + hoverEnabled: parent.visible + cursorShape: Qt.ArrowCursor + acceptedButtons: Qt.LeftButton | Qt.RightButton + } + + + + /*! + \qmlmethod void Loading::addedLoadingStep() + Registers one new loading step that will eventually call \c finishedLoadingStep. + */ + function addedLoadingStep() { + if(loadingRoot.maxCurrentLoadingSteps === 1) { + // Only when several ones need to be loaded. + const fileName = Modules.Settings.saveFilename.split('/').pop().split('\\').pop() + loadingTitle.text = qsTr("Loading...") + loadingRoot.opacity = 1 + } + loadingRoot.currentlyLoading++ + loadingRoot.maxCurrentLoadingSteps++ + } + + /*! + \qmlmethod void Loading::finishedLoadingStep() + Marks a loading step as finished and displays the message to the user. + */ + function finishedLoadingStep(message) { + loadingRoot.currentlyLoading-- + const current = loadingRoot.maxCurrentLoadingSteps - loadingRoot.currentlyLoading + lastFinishedStep.text = `${message} (${current}/${loadingRoot.maxCurrentLoadingSteps})` + if(loadingRoot.currentlyLoading === 0) { + loadingRoot.maxCurrentLoadingSteps = 0 + loadingRoot.opacity = 0 + } + } + + + Component.onCompleted: function() { + Modules.Latex.on("async-render-started", (e) => { + addedLoadingStep() + }) + Modules.Latex.on("async-render-finished", (e) => { + const markup = e.markup.length > 20 ? e.markup.substring(0, 15)+"..." : e.markup + finishedLoadingStep(qsTr("Finished rendering of %1").arg(markup)) + }) + } +} diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/PickLocationOverlay.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/PickLocation.qml similarity index 98% rename from runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/PickLocationOverlay.qml rename to runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/PickLocation.qml index b364e73..60eb90e 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/PickLocationOverlay.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/PickLocation.qml @@ -18,12 +18,12 @@ import QtQuick import QtQuick.Controls -import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting -import "js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Setting as Setting +import eu.ad5001.LogarithmPlotter.Common /*! - \qmltype PickLocationOverlay - \inqmlmodule eu.ad5001.LogarithmPlotter + \qmltype PickLocation + \inqmlmodule eu.ad5001.LogarithmPlotter.Overlay \brief Overlay used to pick a new location for an object. Provides an overlay over the canvas that can be shown when the user clicks the "Set position" button @@ -36,7 +36,7 @@ Item { id: pickerRoot visible: false clip: true - + /*! \qmlsignal PickLocationOverlay::picked(var obj) @@ -97,9 +97,9 @@ Item { readonly property bool userPickY: pickY && pickYCheckbox.checked Rectangle { + anchors.fill: parent color: sysPalette.window opacity: 0.35 - anchors.fill: parent } MouseArea { diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ViewPositionChangeOverlay.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/ViewPositionChange.qml similarity index 94% rename from runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ViewPositionChangeOverlay.qml rename to runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/ViewPositionChange.qml index 7a7072b..41ce60a 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ViewPositionChangeOverlay.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/ViewPositionChange.qml @@ -19,7 +19,7 @@ import QtQuick /*! - \qmltype ViewPositionChangeOverlay + \qmltype ViewPositionChange.Overlay \inqmlmodule eu.ad5001.LogarithmPlotter \brief Overlay used allow the user to drag the canvas' position and change the zoom level. @@ -57,16 +57,6 @@ Item { */ signal endPositionChange(int deltaX, int deltaY) - /*! - \qmlproperty var ViewPositionChangeOverlay::canvas - LogGraphCanvas instance. - */ - property var canvas - /*! - \qmlproperty var ViewPositionChangeOverlay::settingsInstance - Settings instance. - */ - property var settingsInstance /*! \qmlproperty int ViewPositionChangeOverlay::prevX The x coordinate (on the mousearea) at the last change of the canvas position. diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/qmldir b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/qmldir new file mode 100644 index 0000000..0288c9e --- /dev/null +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Overlay/qmldir @@ -0,0 +1,5 @@ +module eu.ad5001.LogarithmPlotter.Overlay + +Loading 1.0 Loading.qml +PickLocation 1.0 PickLocation.qml +ViewPositionChange 1.0 ViewPositionChange.qml diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Popup/Preferences.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Popup/Preferences.qml index a76410f..70d77a9 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Popup/Preferences.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Popup/Preferences.qml @@ -20,7 +20,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting -import "../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! \qmltype Preferences diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Setting/ExpressionEditor.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Setting/ExpressionEditor.qml index bb99f52..8251a3f 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Setting/ExpressionEditor.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Setting/ExpressionEditor.qml @@ -20,7 +20,7 @@ import QtQuick.Controls import QtQuick import Qt.labs.platform as Native import eu.ad5001.LogarithmPlotter.Popup 1.0 as P -import "../js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Settings.qml b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Settings.qml index 992e9b1..3f17ea3 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Settings.qml +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/Settings.qml @@ -20,7 +20,7 @@ import QtQuick import QtQuick.Controls import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup -import "js/index.mjs" as JS +import eu.ad5001.LogarithmPlotter.Common /*! \qmltype Settings diff --git a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/qmldir b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/qmldir index 3aeaa15..c80cae5 100644 --- a/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/qmldir +++ b/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/qmldir @@ -2,6 +2,4 @@ module eu.ad5001.LogarithmPlotter AppMenuBar 1.0 AppMenuBar.qml LogGraphCanvas 1.0 LogGraphCanvas.qml -PickLocationOverlay 1.0 PickLocationOverlay.qml Settings 1.0 Settings.qml -ViewPositionChangeOverlay 1.0 ViewPositionChangeOverlay.qml \ No newline at end of file diff --git a/runtime-pyside6/LogarithmPlotter/util/config.py b/runtime-pyside6/LogarithmPlotter/util/config.py index e01deae..020569a 100644 --- a/runtime-pyside6/LogarithmPlotter/util/config.py +++ b/runtime-pyside6/LogarithmPlotter/util/config.py @@ -28,7 +28,7 @@ DEFAULT_SETTINGS = { "reset_redo_stack": True, "last_install_greet": "0", "enable_latex": which("latex") is not None and which("dvipng") is not None, - "enable_latex_async": True, + "enable_latex_threaded": True, "expression_editor": { "autoclose": True, "colorize": True, diff --git a/runtime-pyside6/LogarithmPlotter/util/debug.py b/runtime-pyside6/LogarithmPlotter/util/debug.py index f899fd5..ef02d62 100644 --- a/runtime-pyside6/LogarithmPlotter/util/debug.py +++ b/runtime-pyside6/LogarithmPlotter/util/debug.py @@ -22,9 +22,9 @@ from os import path from re import compile CURRENT_PATH = path.dirname(path.realpath(__file__)) -SOURCEMAP_PATH = path.realpath(f"{CURRENT_PATH}/../qml/eu/ad5001/LogarithmPlotter/js/index.mjs.map") +SOURCEMAP_PATH = path.realpath(f"{CURRENT_PATH}/../qml/eu/ad5001/LogarithmPlotter/Common/index.mjs.map") SOURCEMAP_INDEX = None -INDEX_REG = compile(r"build\/runtime-pyside6\/LogarithmPlotter\/qml\/eu\/ad5001\/LogarithmPlotter\/js\/index.mjs:(\d+)") +INDEX_REG = compile(r"build\/runtime-pyside6\/LogarithmPlotter\/qml\/eu\/ad5001\/LogarithmPlotter\/Common\/index.mjs:(\d+)") class LOG_COLORS: diff --git a/runtime-pyside6/LogarithmPlotter/util/latex.py b/runtime-pyside6/LogarithmPlotter/util/latex.py index 71064fa..570e083 100644 --- a/runtime-pyside6/LogarithmPlotter/util/latex.py +++ b/runtime-pyside6/LogarithmPlotter/util/latex.py @@ -91,7 +91,7 @@ class Latex(QObject): @Property(bool) def supportsAsyncRender(self) -> bool: - return config.getSetting("enable_latex_async") + return config.getSetting("enable_latex_threaded") @Slot(result=bool) def checkLatexInstallation(self) -> bool: @@ -181,7 +181,6 @@ class Latex(QObject): """ markup_hash, render_hash, export_path = self.create_export_path(latex_markup, font_size, color) if self.latexSupported and not path.exists(export_path + ".png"): - print("Rendering", latex_markup) # Generating file latex_path = path.join(self.tempdir, str(markup_hash)) # If the formula is just recolored or the font is just changed, no need to recreate the DVI. diff --git a/runtime-pyside6/LogarithmPlotter/util/promise.py b/runtime-pyside6/LogarithmPlotter/util/promise.py index f65efa8..c917660 100644 --- a/runtime-pyside6/LogarithmPlotter/util/promise.py +++ b/runtime-pyside6/LogarithmPlotter/util/promise.py @@ -100,6 +100,7 @@ class PyPromise(QObject): Starts the thread that will run the promise. """ if not self._started: # Avoid getting started twice. + print("Starting", self._runner.args) QThreadPool.globalInstance().start(self._runner) self._started = True @@ -153,6 +154,7 @@ class PyPromise(QObject): def _fulfill(self, data): self._state = "fulfilled" no_return = [None, QJSValue.SpecialValue.UndefinedValue] + print("Finished", self._runner.args) for i in range(len(self._fulfills)): try: result = self._fulfills[i](data) diff --git a/scripts/build.sh b/scripts/build.sh index be25274..b63d7f6 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -22,6 +22,10 @@ DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$DIR/.." || exit 1 +BUILD_DIR="build/runtime-pyside6" +BUILD_QML_DIR="$BUILD_DIR/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter" + + box() { len=${#1} echo "┌─$(printf '─%.0s' $(seq 1 "$len"))─┐" @@ -30,20 +34,22 @@ box() { } rm -rf build -mkdir -p build/runtime-pyside6 +mkdir -p "$BUILD_DIR" # Copy python box "Copying pyside6 python runtime..." -cp -r runtime-pyside6/{setup.py,LogarithmPlotter} build/runtime-pyside6 +cp -r runtime-pyside6/{setup.py,LogarithmPlotter} "$BUILD_DIR" box "Building ecmascript modules..." -mkdir -p build/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/js -cd common && (npm run build || exit) && cd .. +mkdir -p "$BUILD_QML_DIR/js" +cd common && \ + (npm run build || exit) && \ + cd .. box "Building translations..." cd assets/i18n/ && (bash release.sh || exit) && cd ../../ -mkdir -p build/runtime-pyside6/LogarithmPlotter/i18n && cp assets/i18n/*.qm build/runtime-pyside6/LogarithmPlotter/i18n/ +mkdir -p "$BUILD_DIR/LogarithmPlotter/i18n" && cp assets/i18n/*.qm "$BUILD_DIR/LogarithmPlotter/i18n/" box "Building icons..." -cp -r assets/icons build/runtime-pyside6/LogarithmPlotter/qml/eu/ad5001/LogarithmPlotter/ -cp assets/logarithmplotter.svg build/runtime-pyside6/LogarithmPlotter/ +cp -r assets/icons "$BUILD_QML_DIR" +cp assets/logarithmplotter.svg "$BUILD_DIR/LogarithmPlotter/"