/** * Logarithm Graph Creator - Create graphs with logarithm scales. * Copyright (C) 2020 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 QtQml 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 import QtQuick 2.12 import "js/objects.js" as Objects ApplicationWindow { id: root visible: true width: 1000 height: 500 color: sysPalette.window title: "Logarithmic Plotter " + (settings.saveFilename != "" ? " - " + settings.saveFilename : "") SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active } SystemPalette { id: sysPaletteIn; colorGroup: SystemPalette.Disabled } menuBar: AppMenuBar {} Drawer { id: sidebar width: 300 height: parent.height y: root.menuBar.height readonly property bool inPortrait: root.width < root.height modal: inPortrait interactive: inPortrait position: inPortrait ? 0 : 1 visible: !inPortrait Rectangle { id: topSeparator color: sysPaletteIn.dark width: parent.width height: 2 } TabBar { id: sidebarSelector width: parent.width anchors.top: topSeparator.bottom TabButton { text: qsTr("Objects") } TabButton { text: qsTr("Settings") } } StackLayout { anchors.top: sidebarSelector.bottom anchors.left: parent.left anchors.topMargin: 5 anchors.leftMargin: 5 width: parent.width - 10 height: parent.height - sidebarSelector.height currentIndex: sidebarSelector.currentIndex z: -1 clip: true ObjectLists { id: objectLists onChanged: drawCanvas.requestPaint() } Settings { id: settings onChanged: drawCanvas.requestPaint() } } } LogGraphCanvas { id: drawCanvas anchors.top: parent.top anchors.left: sidebar.right height: parent.height width: parent.width - sidebar.position*sidebar.width x: sidebar.position*sidebar.width xmin: settings.xmin ymax: settings.ymax xzoom: settings.xzoom yzoom: settings.yzoom xlabel: settings.xaxislabel ylabel: settings.yaxislabel yaxisstep: settings.yaxisstep xaxisstep: settings.xaxisstep logscalex: settings.logscalex onPaint: { var ctx = getContext("2d"); } } function saveDiagram(filename) { var objs = {} Object.keys(Objects.currentObjects).forEach(function(objType){ objs[objType] = [] Objects.currentObjects[objType].forEach(function(obj){ objs[objType].push(obj.export()) }) }) Helper.write(filename, JSON.stringify({ "xzoom": settings.xzoom, "yzoom": settings.yzoom, "xmin": settings.xmin, "ymax": settings.ymax, "xaxisstep": settings.xaxisstep, "yaxisstep": settings.yaxisstep, "xaxislabel": settings.xaxislabel, "yaxislabel": settings.yaxislabel, "logscalex": settings.logscalex, "width": root.width, "height": root.height, "objects": objs, "type": "logplotv1" })) } function loadDiagram(filename) { var data = JSON.parse(Helper.load(filename)) if(Object.keys(data).indexOf("type") != -1 && data["type"] == "logplotv1") { settings.xzoom = data["xzoom"] settings.yzoom = data["yzoom"] settings.xmin = data["xmin"] settings.ymax = data["ymax"] settings.xaxisstep = data["xaxisstep"] settings.yaxisstep = data["yaxisstep"] settings.xaxislabel = data["xaxislabel"] settings.yaxislabel = data["yaxislabel"] settings.logscalex = data["logscalex"] root.height = data["height"] root.width = data["width"] Objects.currentObjects = {} Object.keys(data['objects']).forEach(function(objType){ Objects.currentObjects[objType] = [] data['objects'][objType].forEach(function(objData){ var obj = new Objects.types[objType](...objData) Objects.currentObjects[objType].push(obj) }) }) // Refreshing sidebar if(sidebarSelector.currentIndex == 0) { // For some reason, if we load a file while the tab is on object, // we get stuck in a Qt-side loop? Qt bug or sideeffect here, I don't know. sidebarSelector.currentIndex = 1 objectLists.update() delayRefreshTimer.start() } else { objectLists.update() } } } Timer { id: delayRefreshTimer repeat: false interval: 1 onTriggered: sidebarSelector.currentIndex = 0 } function copyDiagramToClipboard() { var file = Helper.gettmpfile() drawCanvas.save(file) Helper.copyImageToClipboard() } }