Compare commits
3 commits
7d1f63909a
...
0e3f6f48fd
Author | SHA1 | Date | |
---|---|---|---|
0e3f6f48fd | |||
d8541bab92 | |||
e384ec7929 |
21 changed files with 790 additions and 62 deletions
|
@ -90,6 +90,9 @@ class Helper(QObject):
|
||||||
data = data[5:]
|
data = data[5:]
|
||||||
elif data[0] == "{" and "type" in loads(data) and loads(data)["type"] == "logplotv1":
|
elif data[0] == "{" and "type" in loads(data) and loads(data)["type"] == "logplotv1":
|
||||||
pass
|
pass
|
||||||
|
elif data[:3] == "LPF":
|
||||||
|
# More recent version of LogarithmPlotter file, but incompatible with the current format
|
||||||
|
raise Exception(QCoreApplication.translate("This file was created by a more recent version of LogarithmPlotter and cannot be backloaded in LogarithmPlotter v{}.\nPlease update LogarithmPlotter to open this file.".format(__VERSION__)))
|
||||||
else:
|
else:
|
||||||
raise Exception("Invalid LogarithmPlotter file.")
|
raise Exception("Invalid LogarithmPlotter file.")
|
||||||
except Exception as e: # If file can't be loaded
|
except Exception as e: # If file can't be loaded
|
||||||
|
@ -145,7 +148,7 @@ class Helper(QObject):
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def fetchChangelog(self):
|
def fetchChangelog(self):
|
||||||
changelog_cache_path = path.join(path.dirname(path.realpath(__file__), "CHANGELOG.md"))
|
changelog_cache_path = path.join(path.dirname(path.realpath(__file__)), "CHANGELOG.md")
|
||||||
if path.exists(changelog_cache_path):
|
if path.exists(changelog_cache_path):
|
||||||
# We have a cached version of the changelog, for env that don't have access to the internet.
|
# We have a cached version of the changelog, for env that don't have access to the internet.
|
||||||
f = open(changelog_cache_path);
|
f = open(changelog_cache_path);
|
||||||
|
@ -154,5 +157,5 @@ class Helper(QObject):
|
||||||
else:
|
else:
|
||||||
# Fetch it from the internet.
|
# Fetch it from the internet.
|
||||||
runnable = ChangelogFetcher(self)
|
runnable = ChangelogFetcher(self)
|
||||||
^QThreadPool.globalInstance().start(runnable)
|
QThreadPool.globalInstance().start(runnable)
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,15 @@ import eu.ad5001.MixedMenu 1.1
|
||||||
import "js/objects.js" as Objects
|
import "js/objects.js" as Objects
|
||||||
import "js/historylib.js" as HistoryLib
|
import "js/historylib.js" as HistoryLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype AppMenuBar
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief MenuBar for LogarithmPlotter.
|
||||||
|
|
||||||
|
Makes use of eu.ad5001.LogarithmPlotter.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter
|
||||||
|
*/
|
||||||
MenuBar {
|
MenuBar {
|
||||||
|
|
||||||
Menu {
|
Menu {
|
||||||
|
|
|
@ -21,22 +21,60 @@ import QtQml 2.12
|
||||||
import "js/objects.js" as Objects
|
import "js/objects.js" as Objects
|
||||||
import "js/historylib.js" as HistoryLib
|
import "js/historylib.js" as HistoryLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype History
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief QObject holding persistantly for undo & redo stacks.
|
||||||
|
|
||||||
|
\sa HistoryBrowser, historylib
|
||||||
|
*/
|
||||||
Item {
|
Item {
|
||||||
// Using a QtObject is necessary in order to have proper property propagation in QML
|
// Using a QtObject is necessary in order to have proper property propagation in QML
|
||||||
id: historyObj
|
id: historyObj
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int History::undoCount
|
||||||
|
Count of undo actions.
|
||||||
|
*/
|
||||||
property int undoCount: 0
|
property int undoCount: 0
|
||||||
|
/*!
|
||||||
|
\qmlproperty int History::redoCount
|
||||||
|
Count of redo actions.
|
||||||
|
*/
|
||||||
property int redoCount: 0
|
property int redoCount: 0
|
||||||
|
/*!
|
||||||
|
\qmlproperty var History::undoStack
|
||||||
|
Stack of undo actions.
|
||||||
|
*/
|
||||||
property var undoStack: []
|
property var undoStack: []
|
||||||
|
/*!
|
||||||
|
\qmlproperty var History::redoStack
|
||||||
|
Stack of redo actions.
|
||||||
|
*/
|
||||||
property var redoStack: []
|
property var redoStack: []
|
||||||
// Only true when no modification was done to the current working file.
|
/*!
|
||||||
|
\qmlproperty bool History::saved
|
||||||
|
true when no modification was done to the current working file, false otherwise.
|
||||||
|
*/
|
||||||
property bool saved: true
|
property bool saved: true
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::clear()
|
||||||
|
Clears both undo and redo stacks completly.
|
||||||
|
*/
|
||||||
function clear() {
|
function clear() {
|
||||||
|
undoCount = 0
|
||||||
|
redoCount = 0
|
||||||
undoStack = []
|
undoStack = []
|
||||||
redoStack = []
|
redoStack = []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod var History::serialize()
|
||||||
|
Serializes history into JSON-able content.
|
||||||
|
*/
|
||||||
function serialize() {
|
function serialize() {
|
||||||
let undoSt = [], redoSt = [];
|
let undoSt = [], redoSt = [];
|
||||||
for(let i = 0; i < undoCount; i++)
|
for(let i = 0; i < undoCount; i++)
|
||||||
|
@ -52,6 +90,10 @@ Item {
|
||||||
return [undoSt, redoSt]
|
return [undoSt, redoSt]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::unserialize(var undoSt, var redoSt)
|
||||||
|
Unserializes both \c undoSt stack and \c redoSt stack from serialized content.
|
||||||
|
*/
|
||||||
function unserialize(undoSt, redoSt) {
|
function unserialize(undoSt, redoSt) {
|
||||||
clear();
|
clear();
|
||||||
for(let i = 0; i < undoSt.length; i++)
|
for(let i = 0; i < undoSt.length; i++)
|
||||||
|
@ -63,7 +105,10 @@ Item {
|
||||||
objectLists.update()
|
objectLists.update()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::addToHistory(var action)
|
||||||
|
Adds an instance of historylib.Action to history.
|
||||||
|
*/
|
||||||
function addToHistory(action) {
|
function addToHistory(action) {
|
||||||
if(action instanceof HistoryLib.Action) {
|
if(action instanceof HistoryLib.Action) {
|
||||||
console.log("Added new entry to history: " + action.getReadableString())
|
console.log("Added new entry to history: " + action.getReadableString())
|
||||||
|
@ -76,7 +121,11 @@ Item {
|
||||||
saved = false
|
saved = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::undo()
|
||||||
|
Undoes the historylib.Action at the top of the undo stack and pushes it to the top of the redo stack.
|
||||||
|
*/
|
||||||
function undo() {
|
function undo() {
|
||||||
if(undoStack.length > 0) {
|
if(undoStack.length > 0) {
|
||||||
var action = undoStack.pop()
|
var action = undoStack.pop()
|
||||||
|
@ -88,7 +137,11 @@ Item {
|
||||||
saved = false
|
saved = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::redo()
|
||||||
|
Redoes the historylib.Action at the top of the redo stack and pushes it to the top of the undo stack.
|
||||||
|
*/
|
||||||
function redo() {
|
function redo() {
|
||||||
if(redoStack.length > 0) {
|
if(redoStack.length > 0) {
|
||||||
var action = redoStack.pop()
|
var action = redoStack.pop()
|
||||||
|
@ -101,6 +154,11 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::undoMultipleDefered(int toUndoCount)
|
||||||
|
Undoes several historylib.Action at the top of the undo stack and pushes them to the top of the redo stack.
|
||||||
|
It undoes them deferedly to avoid overwhelming the computer while creating a cool short accelerated summary of all changes.
|
||||||
|
*/
|
||||||
function undoMultipleDefered(toUndoCount) {
|
function undoMultipleDefered(toUndoCount) {
|
||||||
undoTimer.toUndoCount = toUndoCount;
|
undoTimer.toUndoCount = toUndoCount;
|
||||||
undoTimer.start()
|
undoTimer.start()
|
||||||
|
@ -108,6 +166,12 @@ Item {
|
||||||
saved = false
|
saved = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void History::redoMultipleDefered(int toRedoCount)
|
||||||
|
Redoes several historylib.Action at the top of the redo stack and pushes them to the top of the undo stack.
|
||||||
|
It redoes them deferedly to avoid overwhelming the computer while creating a cool short accelerated summary of all changes.
|
||||||
|
*/
|
||||||
function redoMultipleDefered(toRedoCount) {
|
function redoMultipleDefered(toRedoCount) {
|
||||||
redoTimer.toRedoCount = toRedoCount;
|
redoTimer.toRedoCount = toRedoCount;
|
||||||
redoTimer.start()
|
redoTimer.start()
|
||||||
|
|
|
@ -20,11 +20,33 @@ import QtQuick.Controls 2.12
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import "js/utils.js" as Utils
|
import "js/utils.js" as Utils
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype HistoryBrowser
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief Tab of the drawer that allows to navigate through the undo and redo history.
|
||||||
|
|
||||||
|
Creates a scrollable view containing a list of history actions based on the redo stack, then a "Now" indicator
|
||||||
|
followed by the entirety of the saved undo stack. Each action can be click to restore a state of the graph at
|
||||||
|
some point of the history.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, Settings, ObjectLists
|
||||||
|
*/
|
||||||
ScrollView {
|
ScrollView {
|
||||||
id: historyBrowser
|
id: historyBrowser
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int HistoryBrowser::actionWidth
|
||||||
|
Width of the actions.
|
||||||
|
*/
|
||||||
property int actionWidth: width-20
|
property int actionWidth: width-20
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int HistoryBrowser::actionHeight
|
||||||
|
Height of the actions.
|
||||||
|
*/
|
||||||
|
property int actionHeight: 30
|
||||||
|
|
||||||
Flickable {
|
Flickable {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
|
@ -43,7 +65,7 @@ ScrollView {
|
||||||
Button {
|
Button {
|
||||||
id: redoButton
|
id: redoButton
|
||||||
width: historyBrowser.actionWidth
|
width: historyBrowser.actionWidth
|
||||||
height: 30
|
height: actionHeight
|
||||||
flat: true
|
flat: true
|
||||||
text: history.redoStack[index].getReadableString()
|
text: history.redoStack[index].getReadableString()
|
||||||
|
|
||||||
|
@ -73,7 +95,7 @@ ScrollView {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: redoColumn.bottom
|
anchors.top: redoColumn.bottom
|
||||||
width: historyBrowser.actionWidth
|
width: historyBrowser.actionWidth
|
||||||
height: 30
|
height: actionHeight
|
||||||
color: sysPalette.highlight
|
color: sysPalette.highlight
|
||||||
Text {
|
Text {
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
@ -96,7 +118,7 @@ ScrollView {
|
||||||
Button {
|
Button {
|
||||||
id: undoButton
|
id: undoButton
|
||||||
width: historyBrowser.actionWidth
|
width: historyBrowser.actionWidth
|
||||||
height: 30
|
height: actionHeight
|
||||||
flat: true
|
flat: true
|
||||||
text: history.undoStack[history.undoCount-index-1].getReadableString()
|
text: history.undoStack[history.undoCount-index-1].getReadableString()
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,15 @@ import "js/objects.js" as Objects
|
||||||
import "js/utils.js" as Utils
|
import "js/utils.js" as Utils
|
||||||
import "js/mathlib.js" as MathLib
|
import "js/mathlib.js" as MathLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype LogGraphCanvas
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief Canvas used to display the diagram.
|
||||||
|
|
||||||
|
Provides a customized canvas with several helper methods to be used by objects.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, PickLocationOverlay
|
||||||
|
*/
|
||||||
Canvas {
|
Canvas {
|
||||||
id: canvas
|
id: canvas
|
||||||
anchors.top: separator.bottom
|
anchors.top: separator.bottom
|
||||||
|
@ -29,26 +37,124 @@ Canvas {
|
||||||
height: parent.height - 90
|
height: parent.height - 90
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::xmin
|
||||||
|
Minimum x of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double xmin: 0
|
property double xmin: 0
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::ymax
|
||||||
|
Maximum y of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double ymax: 0
|
property double ymax: 0
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::xzoom
|
||||||
|
Zoom on the x axis of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double xzoom: 10
|
property double xzoom: 10
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::yzoom
|
||||||
|
Zoom on the y axis of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double yzoom: 10
|
property double yzoom: 10
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::xaxisstep
|
||||||
|
Step of the x axis graduation, provided from settings.
|
||||||
|
\note: Only available in non-logarithmic mode.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string xaxisstep: "4"
|
property string xaxisstep: "4"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::yaxisstep
|
||||||
|
Step of the y axis graduation, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string yaxisstep: "4"
|
property string yaxisstep: "4"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::xlabel
|
||||||
|
Label used on the x axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string xlabel: ""
|
property string xlabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::ylabel
|
||||||
|
Label used on the y axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string ylabel: ""
|
property string ylabel: ""
|
||||||
property int maxgradx: 20
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::linewidth
|
||||||
|
Width of lines that will be drawn into the canvas, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double linewidth: 1
|
property double linewidth: 1
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::textsize
|
||||||
|
Font size of the text that will be drawn into the canvas, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double textsize: 14
|
property double textsize: 14
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool LogGraphCanvas::logscalex
|
||||||
|
true if the canvas should be in logarithmic mode, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool logscalex: false
|
property bool logscalex: false
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool LogGraphCanvas::showxgrad
|
||||||
|
true if the x graduation should be shown, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool showxgrad: false
|
property bool showxgrad: false
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool LogGraphCanvas::showygrad
|
||||||
|
true if the y graduation should be shown, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool showygrad: false
|
property bool showygrad: false
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int LogGraphCanvas::maxgradx
|
||||||
|
Max power of the logarithmic scaled on the x axis in logarithmic mode.
|
||||||
|
*/
|
||||||
|
property int maxgradx: 20
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty var LogGraphCanvas::yaxisstepExpr
|
||||||
|
Expression for the y axis step (used to create labels).
|
||||||
|
*/
|
||||||
property var yaxisstepExpr: (new MathLib.Expression(`x*(${yaxisstep})`))
|
property var yaxisstepExpr: (new MathLib.Expression(`x*(${yaxisstep})`))
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::yaxisstep1
|
||||||
|
Value of the for the y axis step.
|
||||||
|
*/
|
||||||
property double yaxisstep1: yaxisstepExpr.execute(1)
|
property double yaxisstep1: yaxisstepExpr.execute(1)
|
||||||
|
/*!
|
||||||
|
\qmlproperty int LogGraphCanvas::drawMaxY
|
||||||
|
Minimum value of y that should be drawn onto the canvas.
|
||||||
|
*/
|
||||||
property int drawMaxY: Math.ceil(Math.max(Math.abs(ymax), Math.abs(px2y(canvasSize.height)))/yaxisstep1)
|
property int drawMaxY: Math.ceil(Math.max(Math.abs(ymax), Math.abs(px2y(canvasSize.height)))/yaxisstep1)
|
||||||
|
/*!
|
||||||
|
\qmlproperty var LogGraphCanvas::xaxisstepExpr
|
||||||
|
Expression for the x axis step (used to create labels).
|
||||||
|
*/
|
||||||
property var xaxisstepExpr: (new MathLib.Expression(`x*(${xaxisstep})`))
|
property var xaxisstepExpr: (new MathLib.Expression(`x*(${xaxisstep})`))
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::xaxisstep1
|
||||||
|
Value of the for the x axis step.
|
||||||
|
*/
|
||||||
property double xaxisstep1: xaxisstepExpr.execute(1)
|
property double xaxisstep1: xaxisstepExpr.execute(1)
|
||||||
|
/*!
|
||||||
|
\qmlproperty int LogGraphCanvas::drawMaxX
|
||||||
|
Maximum value of x that should be drawn onto the canvas.
|
||||||
|
*/
|
||||||
property int drawMaxX: Math.ceil(Math.max(Math.abs(xmin), Math.abs(px2x(canvasSize.width)))/xaxisstep1)
|
property int drawMaxX: Math.ceil(Math.max(Math.abs(xmin), Math.abs(px2x(canvasSize.width)))/xaxisstep1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,6 +177,11 @@ Canvas {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::reset(var ctx)
|
||||||
|
Resets the canvas to a blank one with default setting using 2D \c ctx.
|
||||||
|
*/
|
||||||
function reset(ctx){
|
function reset(ctx){
|
||||||
// Reset
|
// Reset
|
||||||
ctx.fillStyle = "#FFFFFF"
|
ctx.fillStyle = "#FFFFFF"
|
||||||
|
@ -80,6 +191,11 @@ Canvas {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drawing the log based graph
|
// Drawing the log based graph
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawGrille(var ctx)
|
||||||
|
Draws the grid using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawGrille(ctx) {
|
function drawGrille(ctx) {
|
||||||
ctx.strokeStyle = "#C0C0C0"
|
ctx.strokeStyle = "#C0C0C0"
|
||||||
if(logscalex) {
|
if(logscalex) {
|
||||||
|
@ -100,6 +216,10 @@ Canvas {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawAxises(var ctx)
|
||||||
|
Draws the graph axises using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawAxises(ctx) {
|
function drawAxises(ctx) {
|
||||||
ctx.strokeStyle = "#000000"
|
ctx.strokeStyle = "#000000"
|
||||||
var axisypos = logscalex ? 1 : 0
|
var axisypos = logscalex ? 1 : 0
|
||||||
|
@ -114,6 +234,10 @@ Canvas {
|
||||||
drawLine(ctx, canvasSize.width, axisxpx, canvasSize.width-10, axisxpx+10)
|
drawLine(ctx, canvasSize.width, axisxpx, canvasSize.width-10, axisxpx+10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawLabels(var ctx)
|
||||||
|
Draws all labels (graduation & axises labels) using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawLabels(ctx) {
|
function drawLabels(ctx) {
|
||||||
var axisypx = x2px(logscalex ? 1 : 0) // X coordinate of Y axis
|
var axisypx = x2px(logscalex ? 1 : 0) // X coordinate of Y axis
|
||||||
var axisxpx = y2px(0) // Y coordinate of X axis
|
var axisxpx = y2px(0) // Y coordinate of X axis
|
||||||
|
@ -157,18 +281,31 @@ Canvas {
|
||||||
ctx.fillStyle = "#FFFFFF"
|
ctx.fillStyle = "#FFFFFF"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawXLine(var ctx, double x)
|
||||||
|
Draws an horizontal line at \c x plot coordinate using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawXLine(ctx, x) {
|
function drawXLine(ctx, x) {
|
||||||
if(visible(x, ymax)) {
|
if(visible(x, ymax)) {
|
||||||
drawLine(ctx, x2px(x), 0, x2px(x), canvasSize.height)
|
drawLine(ctx, x2px(x), 0, x2px(x), canvasSize.height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawXLine(var ctx, double x)
|
||||||
|
Draws an vertical line at \c y plot coordinate using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawYLine(ctx, y) {
|
function drawYLine(ctx, y) {
|
||||||
if(visible(xmin, y)) {
|
if(visible(xmin, y)) {
|
||||||
drawLine(ctx, 0, y2px(y), canvasSize.width, y2px(y))
|
drawLine(ctx, 0, y2px(y), canvasSize.width, y2px(y))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::drawVisibleText(var ctx, string text, double x, double y)
|
||||||
|
Writes multline \c text onto the canvas using 2D \c ctx.
|
||||||
|
\note The \c x and \c y properties here are relative to the canvas, not the plot.
|
||||||
|
*/
|
||||||
function drawVisibleText(ctx, text, x, y) {
|
function drawVisibleText(ctx, text, x, y) {
|
||||||
if(x > 0 && x < canvasSize.width && y > 0 && y < canvasSize.height) {
|
if(x > 0 && x < canvasSize.width && y > 0 && y < canvasSize.height) {
|
||||||
text.toString().split("\n").forEach(function(txt, i){
|
text.toString().split("\n").forEach(function(txt, i){
|
||||||
|
@ -177,7 +314,11 @@ Canvas {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method to calculate multi-line string dimensions
|
/*!
|
||||||
|
\qmlmethod var LogGraphCanvas::measureText(var ctx, string text)
|
||||||
|
Measures the wicth and height of a multiline \c text that would be drawn onto the canvas using 2D \c ctx.
|
||||||
|
Return format: dictionary {"width": width, "height": height}
|
||||||
|
*/
|
||||||
function measureText(ctx, text) {
|
function measureText(ctx, text) {
|
||||||
var theight = 0
|
var theight = 0
|
||||||
var twidth = 0
|
var twidth = 0
|
||||||
|
@ -188,45 +329,81 @@ Canvas {
|
||||||
return {'width': twidth, 'height': theight}
|
return {'width': twidth, 'height': theight}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts x coordinate to it's relative position on the canvas
|
/*!
|
||||||
|
\qmlmethod double LogGraphCanvas::x2px(double x)
|
||||||
|
Converts an \c x coordinate to it's relative position on the canvas.
|
||||||
|
It supports both logarithmic and non logarithmic scale depending on the currently selected mode.
|
||||||
|
*/
|
||||||
function x2px(x) {
|
function x2px(x) {
|
||||||
if(logscalex) {
|
if(logscalex) {
|
||||||
var logxmin = Math.log(xmin)
|
var logxmin = Math.log(xmin)
|
||||||
return (Math.log(x)-logxmin)*xzoom
|
return (Math.log(x)-logxmin)*xzoom
|
||||||
} else return (x - xmin)*xzoom
|
} else return (x - xmin)*xzoom
|
||||||
}
|
}
|
||||||
// Converts y coordinate to it's relative position on the canvas
|
|
||||||
// Y is NOT ln based.
|
/*!
|
||||||
|
\qmlmethod double LogGraphCanvas::y2px(double y)
|
||||||
|
Converts an \c y coordinate to it's relative position on the canvas.
|
||||||
|
The y axis not supporting logarithmic scale, it only support linear convertion.
|
||||||
|
*/
|
||||||
function y2px(y) {
|
function y2px(y) {
|
||||||
return (ymax-y)*yzoom
|
return (ymax-y)*yzoom
|
||||||
}
|
}
|
||||||
// Reverse functions
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod double LogGraphCanvas::px2x(double px)
|
||||||
|
Converts an x \c px position on the canvas to it's corresponding coordinate on the plot.
|
||||||
|
It supports both logarithmic and non logarithmic scale depending on the currently selected mode.
|
||||||
|
*/
|
||||||
function px2x(px) {
|
function px2x(px) {
|
||||||
if(logscalex) {
|
if(logscalex) {
|
||||||
return Math.exp(px/xzoom+Math.log(xmin))
|
return Math.exp(px/xzoom+Math.log(xmin))
|
||||||
} else return (px/xzoom+xmin)
|
} else return (px/xzoom+xmin)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod double LogGraphCanvas::px2x(double px)
|
||||||
|
Converts an x \c px position on the canvas to it's corresponding coordinate on the plot.
|
||||||
|
It supports both logarithmic and non logarithmic scale depending on the currently selected mode.
|
||||||
|
*/
|
||||||
function px2y(px) {
|
function px2y(px) {
|
||||||
return -(px/yzoom-ymax)
|
return -(px/yzoom-ymax)
|
||||||
}
|
}
|
||||||
// Checks whether a point is visible or not.
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod bool LogGraphCanvas::visible(double x, double y)
|
||||||
|
Checks whether a plot point (\c x, \c y) is visible or not on the canvas.
|
||||||
|
*/
|
||||||
function visible(x, y) {
|
function visible(x, y) {
|
||||||
return (x2px(x) >= 0 && x2px(x) <= canvasSize.width) && (y2px(y) >= 0 && y2px(y) <= canvasSize.height)
|
return (x2px(x) >= 0 && x2px(x) <= canvasSize.width) && (y2px(y) >= 0 && y2px(y) <= canvasSize.height)
|
||||||
}
|
}
|
||||||
// Draws a line from a (x1, y1) to (x2, y2)
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod bool LogGraphCanvas::drawLine(var ctx, double x1, double y1, double x2, double y2)
|
||||||
|
Draws a line from plot point (\c x1, \c y1) to plot point (\c x2, \¢ y2) using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawLine(ctx, x1, y1, x2, y2) {
|
function drawLine(ctx, x1, y1, x2, y2) {
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.moveTo(x1, y1);
|
ctx.moveTo(x1, y1);
|
||||||
ctx.lineTo(x2, y2);
|
ctx.lineTo(x2, y2);
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod bool LogGraphCanvas::drawDashedLine2(var ctx, double x1, double y1, double x2, double y2)
|
||||||
|
Draws a dashed line from plot point (\c x1, \c y1) to plot point (\c x2, \¢ y2) using 2D \c ctx.
|
||||||
|
*/
|
||||||
function drawDashedLine2(ctx, x1, y1, x2, y2, dashPxSize = 5) {
|
function drawDashedLine2(ctx, x1, y1, x2, y2, dashPxSize = 5) {
|
||||||
ctx.setLineDash([dashPxSize, dashPxSize]);
|
ctx.setLineDash([dashPxSize, dashPxSize]);
|
||||||
drawLine(ctx, x1, y1, x2, y2)
|
drawLine(ctx, x1, y1, x2, y2)
|
||||||
ctx.setLineDash([]);
|
ctx.setLineDash([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod bool LogGraphCanvas::drawDashedLine(var ctx, double x1, double y1, double x2, double y2)
|
||||||
|
Draws a dashed line from plot point (\c x1, \c y1) to plot point (\c x2, \¢ y2) using 2D \c ctx.
|
||||||
|
(Legacy slower method)
|
||||||
|
*/
|
||||||
function drawDashedLine(ctx, x1, y1, x2, y2, dashPxSize = 10) {
|
function drawDashedLine(ctx, x1, y1, x2, y2, dashPxSize = 10) {
|
||||||
var distance = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
|
var distance = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
|
||||||
var progPerc = dashPxSize/distance
|
var progPerc = dashPxSize/distance
|
||||||
|
|
|
@ -28,7 +28,13 @@ import "js/objects.js" as Objects
|
||||||
import eu.ad5001.LogarithmPlotter.ObjectLists 1.0
|
import eu.ad5001.LogarithmPlotter.ObjectLists 1.0
|
||||||
import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup
|
import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype LogarithmPlotter
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief Main window of LogarithmPlotter
|
||||||
|
|
||||||
|
\sa AppMenuBar, History, GreetScreen, Changelog, Alert, ObjectLists, Settings, HistoryBrowser, LogGraphCanvas, PickLocationOverlay.
|
||||||
|
*/
|
||||||
ApplicationWindow {
|
ApplicationWindow {
|
||||||
id: root
|
id: root
|
||||||
visible: true
|
visible: true
|
||||||
|
@ -137,8 +143,8 @@ ApplicationWindow {
|
||||||
ymax: settings.ymax
|
ymax: settings.ymax
|
||||||
xzoom: settings.xzoom
|
xzoom: settings.xzoom
|
||||||
yzoom: settings.yzoom
|
yzoom: settings.yzoom
|
||||||
xlabel: settings.xaxislabel
|
xlabel: settings.xlabel
|
||||||
ylabel: settings.yaxislabel
|
ylabel: settings.ylabel
|
||||||
yaxisstep: settings.yaxisstep
|
yaxisstep: settings.yaxisstep
|
||||||
xaxisstep: settings.xaxisstep
|
xaxisstep: settings.xaxisstep
|
||||||
logscalex: settings.logscalex
|
logscalex: settings.logscalex
|
||||||
|
@ -165,6 +171,10 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogarithmPlotter::saveDiagram(string filename)
|
||||||
|
Saves the diagram to a certain \c filename.
|
||||||
|
*/
|
||||||
function saveDiagram(filename) {
|
function saveDiagram(filename) {
|
||||||
if(['lpf'].indexOf(filename.split('.')[filename.split('.').length-1]) == -1)
|
if(['lpf'].indexOf(filename.split('.')[filename.split('.').length-1]) == -1)
|
||||||
filename += '.lpf'
|
filename += '.lpf'
|
||||||
|
@ -183,8 +193,8 @@ ApplicationWindow {
|
||||||
"ymax": settings.ymax,
|
"ymax": settings.ymax,
|
||||||
"xaxisstep": settings.xaxisstep,
|
"xaxisstep": settings.xaxisstep,
|
||||||
"yaxisstep": settings.yaxisstep,
|
"yaxisstep": settings.yaxisstep,
|
||||||
"xaxislabel": settings.xaxislabel,
|
"xaxislabel": settings.xlabel,
|
||||||
"yaxislabel": settings.yaxislabel,
|
"yaxislabel": settings.ylabel,
|
||||||
"logscalex": settings.logscalex,
|
"logscalex": settings.logscalex,
|
||||||
"linewidth": settings.linewidth,
|
"linewidth": settings.linewidth,
|
||||||
"showxgrad": settings.showxgrad,
|
"showxgrad": settings.showxgrad,
|
||||||
|
@ -200,6 +210,10 @@ ApplicationWindow {
|
||||||
history.saved = true
|
history.saved = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogarithmPlotter::saveDiagram(string filename)
|
||||||
|
Loads the diagram from a certain \c filename.
|
||||||
|
*/
|
||||||
function loadDiagram(filename) {
|
function loadDiagram(filename) {
|
||||||
let basename = filename.split("/").pop()
|
let basename = filename.split("/").pop()
|
||||||
alert.show(qsTr("Loading file '%1'.").arg(basename))
|
alert.show(qsTr("Loading file '%1'.").arg(basename))
|
||||||
|
@ -215,8 +229,8 @@ ApplicationWindow {
|
||||||
settings.ymax = data["ymax"]
|
settings.ymax = data["ymax"]
|
||||||
settings.xaxisstep = data["xaxisstep"]
|
settings.xaxisstep = data["xaxisstep"]
|
||||||
settings.yaxisstep = data["yaxisstep"]
|
settings.yaxisstep = data["yaxisstep"]
|
||||||
settings.xaxislabel = data["xaxislabel"]
|
settings.xlabel = data["xaxislabel"]
|
||||||
settings.yaxislabel = data["yaxislabel"]
|
settings.ylabel = data["yaxislabel"]
|
||||||
settings.logscalex = data["logscalex"]
|
settings.logscalex = data["logscalex"]
|
||||||
if("showxgrad" in data)
|
if("showxgrad" in data)
|
||||||
settings.showxgrad = data["showxgrad"]
|
settings.showxgrad = data["showxgrad"]
|
||||||
|
@ -292,6 +306,10 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogarithmPlotter::copyDiagramToClipboard()
|
||||||
|
Copies the current diagram image to the clipboard.
|
||||||
|
*/
|
||||||
function copyDiagramToClipboard() {
|
function copyDiagramToClipboard() {
|
||||||
var file = Helper.gettmpfile()
|
var file = Helper.gettmpfile()
|
||||||
drawCanvas.save(file)
|
drawCanvas.save(file)
|
||||||
|
@ -299,6 +317,10 @@ ApplicationWindow {
|
||||||
alert.show(qsTr("Copied plot screenshot to clipboard!"))
|
alert.show(qsTr("Copied plot screenshot to clipboard!"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogarithmPlotter::showAlert(string alertText)
|
||||||
|
Shows an alert on the diagram.
|
||||||
|
*/
|
||||||
function showAlert(alertText) {
|
function showAlert(alertText) {
|
||||||
// This function is called from the backend and is used to show alerts from there.
|
// This function is called from the backend and is used to show alerts from there.
|
||||||
alert.show(alertText)
|
alert.show(alertText)
|
||||||
|
@ -315,6 +337,10 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogarithmPlotter::showUpdateMenu()
|
||||||
|
Shows the update menu in the AppMenuBar.
|
||||||
|
*/
|
||||||
function showUpdateMenu() {
|
function showUpdateMenu() {
|
||||||
appMenu.addMenu(updateMenu)
|
appMenu.addMenu(updateMenu)
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,13 +26,34 @@ import "../js/historylib.js" as HistoryLib
|
||||||
import "../js/utils.js" as Utils
|
import "../js/utils.js" as Utils
|
||||||
import "../js/mathlib.js" as MathLib
|
import "../js/mathlib.js" as MathLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype EditorDialog
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.ObjectLists
|
||||||
|
\brief Dialog used to edit properties of objects.
|
||||||
|
|
||||||
|
This class contains the dialog that allows to edit all properties of objects.
|
||||||
|
\todo In the future, this class should be optimized so that each property doesn't instanciate one instance of each setting type.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, ObjectLists
|
||||||
|
*/
|
||||||
D.Dialog {
|
D.Dialog {
|
||||||
id: objEditor
|
id: objEditor
|
||||||
|
/*!
|
||||||
|
\qmlproperty string EditorDialog::objType
|
||||||
|
Type of object being edited by the dialog.
|
||||||
|
*/
|
||||||
property string objType: 'Point'
|
property string objType: 'Point'
|
||||||
|
/*!
|
||||||
|
\qmlproperty int EditorDialog::objIndex
|
||||||
|
Index of the objects amongst the ones of it's type.
|
||||||
|
*/
|
||||||
property int objIndex: 0
|
property int objIndex: 0
|
||||||
|
/*!
|
||||||
|
\qmlproperty var EditorDialog::obj
|
||||||
|
Instance of the object being edited.
|
||||||
|
*/
|
||||||
property var obj: Objects.currentObjects[objType][objIndex]
|
property var obj: Objects.currentObjects[objType][objIndex]
|
||||||
property QtObject editingRow: QtObject{}
|
|
||||||
property var objectLists
|
|
||||||
title: "LogarithmPlotter"
|
title: "LogarithmPlotter"
|
||||||
width: 350
|
width: 350
|
||||||
height: 400
|
height: 400
|
||||||
|
@ -272,9 +293,13 @@ D.Dialog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void EditorDialog::show()
|
||||||
|
Shows the editor after the object to be edited is set.
|
||||||
|
*/
|
||||||
function show() {
|
function show() {
|
||||||
dlgCustomProperties.model = [] // Reset
|
dlgCustomProperties.model = [] // Reset
|
||||||
var objProps = Objects.types[objEditor.objType].properties()
|
let objProps = Objects.types[objEditor.objType].properties()
|
||||||
dlgCustomProperties.model = Object.keys(objProps).map(prop => [prop, objProps[prop]]) // Converted to 2-dimentional array.
|
dlgCustomProperties.model = Object.keys(objProps).map(prop => [prop, objProps[prop]]) // Converted to 2-dimentional array.
|
||||||
objEditor.open()
|
objEditor.open()
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,13 @@ import QtQuick.Controls 2.12
|
||||||
import "../js/objects.js" as Objects
|
import "../js/objects.js" as Objects
|
||||||
import "../js/historylib.js" as HistoryLib
|
import "../js/historylib.js" as HistoryLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype ObjectCreationGrid
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.ObjectLists
|
||||||
|
\brief Grid with buttons to create objects.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, ObjectLists
|
||||||
|
*/
|
||||||
Column {
|
Column {
|
||||||
id: createRow
|
id: createRow
|
||||||
property var objectEditor
|
property var objectEditor
|
||||||
|
@ -59,7 +66,6 @@ Column {
|
||||||
objectEditor.obj = Objects.currentObjects[modelData][Objects.currentObjects[modelData].length - 1]
|
objectEditor.obj = Objects.currentObjects[modelData][Objects.currentObjects[modelData].length - 1]
|
||||||
objectEditor.objType = modelData
|
objectEditor.objType = modelData
|
||||||
objectEditor.objIndex = Objects.currentObjects[modelData].length - 1
|
objectEditor.objIndex = Objects.currentObjects[modelData].length - 1
|
||||||
objectEditor.editingRow = objectLists.listViews[modelData].editingRows[objectEditor.objIndex]
|
|
||||||
objectEditor.show()
|
objectEditor.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,17 @@ import QtQuick.Controls 2.12
|
||||||
import "../js/objects.js" as Objects
|
import "../js/objects.js" as Objects
|
||||||
import "../js/historylib.js" as HistoryLib
|
import "../js/historylib.js" as HistoryLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype ObjectLists
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief Tab of the drawer that allows the user to manage the objects.
|
||||||
|
|
||||||
|
This item allows the user to syntheticly see all objects, while giving the user the ability
|
||||||
|
to show, hide, delete, change the location and color, as well as opening the editor dialog
|
||||||
|
for each object.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, ObjectCreationGrid, ObjectLists
|
||||||
|
*/
|
||||||
ListView {
|
ListView {
|
||||||
id: objectListList
|
id: objectListList
|
||||||
|
|
||||||
|
@ -116,7 +126,7 @@ ListView {
|
||||||
objEditor.obj = Objects.currentObjects[objType][index]
|
objEditor.obj = Objects.currentObjects[objType][index]
|
||||||
objEditor.objType = objType
|
objEditor.objType = objType
|
||||||
objEditor.objIndex = index
|
objEditor.objIndex = index
|
||||||
objEditor.editingRow = controlRow
|
//objEditor.editingRow = controlRow
|
||||||
objEditor.show()
|
objEditor.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,7 +221,6 @@ ListView {
|
||||||
// Object editor
|
// Object editor
|
||||||
EditorDialog {
|
EditorDialog {
|
||||||
id: objEditor
|
id: objEditor
|
||||||
objectLists: objectListList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create items
|
// Create items
|
||||||
|
@ -222,6 +231,10 @@ ListView {
|
||||||
objectLists: objectListList
|
objectLists: objectListList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void ObjectLists::update()
|
||||||
|
Updates the view of the ObjectLists.
|
||||||
|
*/
|
||||||
function update() {
|
function update() {
|
||||||
objectListList.changed()
|
objectListList.changed()
|
||||||
for(var objType in objectListList.listViews) {
|
for(var objType in objectListList.listViews) {
|
||||||
|
@ -229,6 +242,11 @@ ListView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void ObjectLists::paramTypeIn(var parameter, var types)
|
||||||
|
Checks if the type of the provided \c parameter is in \c types.
|
||||||
|
\note The type can be normal string types ('boolean', 'string', 'number'...) or object types (Enum, Dictionay, Object types...). If the latter, only the type of object type should be provided in \c types. E.g: if you want to check if the parameter is an enum, add "Enum" to types.
|
||||||
|
*/
|
||||||
function paramTypeIn(parameter, types = []) {
|
function paramTypeIn(parameter, types = []) {
|
||||||
if(types.includes(parameter.toString())) return true
|
if(types.includes(parameter.toString())) return true
|
||||||
if(typeof parameter == 'object' && 'type' in parameter)
|
if(typeof parameter == 'object' && 'type' in parameter)
|
||||||
|
|
|
@ -22,17 +22,60 @@ import "js/objects.js" as Objects
|
||||||
import "js/mathlib.js" as MathLib
|
import "js/mathlib.js" as MathLib
|
||||||
import "js/historylib.js" as HistoryLib
|
import "js/historylib.js" as HistoryLib
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype PickLocationOverlay
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\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
|
||||||
|
on a specific object. It allows the user to pick a new location on the canvas to place the object at.
|
||||||
|
This overlay allows to set the precision of the pick as well as whether the pick should be on the plot grid.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, LogGraphCanvas
|
||||||
|
*/
|
||||||
Item {
|
Item {
|
||||||
id: pickerRoot
|
id: pickerRoot
|
||||||
visible: false
|
visible: false
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty var PickLocationOverlay::canvas
|
||||||
|
logGraphCanvas instance.
|
||||||
|
*/
|
||||||
property var canvas
|
property var canvas
|
||||||
|
/*!
|
||||||
|
\qmlproperty string PickLocationOverlay::objType
|
||||||
|
Type of object whose position the user is picking.
|
||||||
|
*/
|
||||||
property string objType: 'Point'
|
property string objType: 'Point'
|
||||||
|
/*!
|
||||||
|
\qmlproperty string PickLocationOverlay::objType
|
||||||
|
Name of the object whose position the user is picking.
|
||||||
|
*/
|
||||||
property string objName: 'A'
|
property string objName: 'A'
|
||||||
property bool pickY: true
|
/*!
|
||||||
|
\qmlproperty bool PickLocationOverlay::pickX
|
||||||
|
true if the user should be picking a position on the x axis.
|
||||||
|
*/
|
||||||
property bool pickX: true
|
property bool pickX: true
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool PickLocationOverlay::pickY
|
||||||
|
true if the user should be picking a position on the y axis.
|
||||||
|
*/
|
||||||
|
property bool pickY: true
|
||||||
|
/*!
|
||||||
|
\qmlproperty string PickLocationOverlay::propertyX
|
||||||
|
Name of the object's property whose x value is being changed.
|
||||||
|
*/
|
||||||
property string propertyX: 'x'
|
property string propertyX: 'x'
|
||||||
|
/*!
|
||||||
|
\qmlproperty string PickLocationOverlay::propertyY
|
||||||
|
Name of the object's property whose y value is being changed.
|
||||||
|
*/
|
||||||
property string propertyY: 'y'
|
property string propertyY: 'y'
|
||||||
|
/*!
|
||||||
|
\qmlproperty int PickLocationOverlay::precision
|
||||||
|
Precision of the picked value (post-dot precision).
|
||||||
|
*/
|
||||||
property alias precision: precisionSlider.value
|
property alias precision: precisionSlider.value
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|
|
@ -20,7 +20,13 @@ import QtQuick 2.12
|
||||||
import QtQuick.Dialogs 1.3 as D
|
import QtQuick.Dialogs 1.3 as D
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype About
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Popup
|
||||||
|
\brief About popup of LogarithmPlotter.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter
|
||||||
|
*/
|
||||||
D.Dialog {
|
D.Dialog {
|
||||||
id: about
|
id: about
|
||||||
title: qsTr("About LogarithmPlotter")
|
title: qsTr("About LogarithmPlotter")
|
||||||
|
|
|
@ -17,7 +17,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
|
/*!
|
||||||
|
\qmltype Alert
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Popup
|
||||||
|
\brief Alert used to show status messages to the user.
|
||||||
|
|
||||||
|
This class (only one instance) allows messages to be displayed to the user that will fade in time.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter
|
||||||
|
*/
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: alert
|
id: alert
|
||||||
color: "black"
|
color: "black"
|
||||||
|
@ -27,8 +35,20 @@ Rectangle {
|
||||||
width: textItem.width + 10
|
width: textItem.width + 10
|
||||||
height: textItem.height + 10
|
height: textItem.height + 10
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int Alert::fadingX
|
||||||
|
X of the object that is being animated.
|
||||||
|
*/
|
||||||
property int fadingX: parent.width - width - 10
|
property int fadingX: parent.width - width - 10
|
||||||
|
/*!
|
||||||
|
\qmlproperty int Alert::fadeTime
|
||||||
|
Length in millisecond of the animation.
|
||||||
|
*/
|
||||||
property int fadeTime: 200
|
property int fadeTime: 200
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Alert::text
|
||||||
|
Text of the alert.
|
||||||
|
*/
|
||||||
property alias text: textItem.text
|
property alias text: textItem.text
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
@ -64,6 +84,10 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void Alert::show(string alertText)
|
||||||
|
Show an alert with a certain \c alertText.
|
||||||
|
*/
|
||||||
function show(alertText) {
|
function show(alertText) {
|
||||||
visible = true
|
visible = true
|
||||||
fadeTimer.restart()
|
fadeTimer.restart()
|
||||||
|
|
|
@ -19,6 +19,15 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype Changelog
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Popup
|
||||||
|
\brief Overlay used to display the current changelog to the user.
|
||||||
|
|
||||||
|
\note The changelog is either fetched from https://api.ad5001.eu/changelog/logarithmplotter/ or taken locally when a file named CHANGELOG.md exists within the main source code.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, GreetScreen
|
||||||
|
*/
|
||||||
Popup {
|
Popup {
|
||||||
id: changelogPopup
|
id: changelogPopup
|
||||||
x: (parent.width-width)/2
|
x: (parent.width-width)/2
|
||||||
|
@ -29,6 +38,10 @@ Popup {
|
||||||
focus: true
|
focus: true
|
||||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Changelog::changelogNeedsFetching
|
||||||
|
true when the changelog has yet to be loaded, set to false the moment it's loaded.
|
||||||
|
*/
|
||||||
property bool changelogNeedsFetching: true
|
property bool changelogNeedsFetching: true
|
||||||
|
|
||||||
onAboutToShow: if(changelogNeedsFetching) Helper.fetchChangelog()
|
onAboutToShow: if(changelogNeedsFetching) Helper.fetchChangelog()
|
||||||
|
|
|
@ -18,6 +18,13 @@
|
||||||
|
|
||||||
import QtQuick.Dialogs 1.3 as D
|
import QtQuick.Dialogs 1.3 as D
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype FileDialog
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Popup
|
||||||
|
\brief Dialog used to prompt the user to save or load Logarithm Plot Files.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, Settings
|
||||||
|
*/
|
||||||
D.FileDialog {
|
D.FileDialog {
|
||||||
id: fileDialog
|
id: fileDialog
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,15 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype GreetScreen
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Popup
|
||||||
|
\brief Overlay displayed when LogarithmPlotter is launched for the first time or when it was just updated.
|
||||||
|
|
||||||
|
It contains several settings as well as an easy access to the changelog
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, Settings, AppMenuBar, Changelog
|
||||||
|
*/
|
||||||
Popup {
|
Popup {
|
||||||
id: greetingPopup
|
id: greetingPopup
|
||||||
x: (parent.width-width)/2
|
x: (parent.width-width)/2
|
||||||
|
|
|
@ -19,20 +19,82 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype ComboBoxSetting
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Setting
|
||||||
|
\brief Combo box with an icon and label to make a proper setting.
|
||||||
|
|
||||||
|
\sa EditorDialog, Settings, Icon
|
||||||
|
*/
|
||||||
Item {
|
Item {
|
||||||
id: control
|
id: control
|
||||||
height: 30
|
height: 30
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlsignal ComboBoxSetting::activated(int newIndex)
|
||||||
|
|
||||||
|
Alias of ComboBox.activated.
|
||||||
|
The corresponding handler is \c onActivated.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#activated-signal
|
||||||
|
*/
|
||||||
signal activated(int newIndex)
|
signal activated(int newIndex)
|
||||||
|
/*!
|
||||||
|
\qmlsignal ComboBoxSetting::accepted()
|
||||||
|
|
||||||
|
Alias of ComboBox.accepted.
|
||||||
|
The corresponding handler is \c onAccepted.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#accepted-signal
|
||||||
|
*/
|
||||||
signal accepted()
|
signal accepted()
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ComboBoxSetting::label
|
||||||
|
Label of the setting.
|
||||||
|
*/
|
||||||
property string label: ''
|
property string label: ''
|
||||||
property alias model: combox.model
|
/*!
|
||||||
property alias editable: combox.editable
|
\qmlproperty string ComboBoxSetting::icon
|
||||||
property alias editText: combox.editText
|
Icon path of the setting.
|
||||||
property alias currentIndex: combox.currentIndex
|
*/
|
||||||
property string icon: ""
|
property string icon: ""
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty var ComboBoxSetting::model
|
||||||
|
Model of the combo box.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#model-prop
|
||||||
|
*/
|
||||||
|
property alias model: combox.model
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool ComboBoxSetting::editable
|
||||||
|
Whether the combo box accepts user-inputed values.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#editable-prop
|
||||||
|
*/
|
||||||
|
property alias editable: combox.editable
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ComboBoxSetting::editText
|
||||||
|
Text in the text field of an editable combo box.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#editText-prop
|
||||||
|
*/
|
||||||
|
property alias editText: combox.editText
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ComboBoxSetting::currentIndex
|
||||||
|
Index of the current item in the combo box.
|
||||||
|
The default value is -1 when count is 0, and 0 otherwise
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#currentIndex-prop
|
||||||
|
*/
|
||||||
|
property alias currentIndex: combox.currentIndex
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ComboBoxSetting::currentIndex
|
||||||
|
Input text validator for an editable combo box
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#validator-prop
|
||||||
|
*/
|
||||||
|
property alias validator: combox.validator
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod int ComboBoxSetting::find(string elementName)
|
||||||
|
Returns the index of the specified \a elementName, or -1 if no match is found.
|
||||||
|
\sa https://doc.qt.io/qt-5/qml-qtquick-controls2-combobox.html#find-method
|
||||||
|
*/
|
||||||
function find(elementName) {
|
function find(elementName) {
|
||||||
return combox.find(elementName)
|
return combox.find(elementName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,23 @@
|
||||||
import QtQuick 2.7
|
import QtQuick 2.7
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype Icon
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Setting
|
||||||
|
\brief Colorable image.
|
||||||
|
|
||||||
|
\sa ComboBoxSetting, ListSetting, TextSetting
|
||||||
|
*/
|
||||||
Item {
|
Item {
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Icon::color
|
||||||
|
Overlay color of the icon.
|
||||||
|
*/
|
||||||
property color color: "#000000"
|
property color color: "#000000"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Icon::source
|
||||||
|
Path of the icon image source.
|
||||||
|
*/
|
||||||
property alias source: img.source
|
property alias source: img.source
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
|
|
|
@ -2,23 +2,81 @@ import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
import QtQml.Models 2.12
|
import QtQml.Models 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype ListSetting
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Setting
|
||||||
|
\brief Setting to create and edit lists and dictionaries.
|
||||||
|
|
||||||
|
\sa EditorDialog, Settings, Icon
|
||||||
|
*/
|
||||||
Column {
|
Column {
|
||||||
id: control
|
id: control
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlsignal ListSetting::changed()
|
||||||
|
|
||||||
|
Emitted when an entry of the setting has been changed.
|
||||||
|
The corresponding handler is \c onChanged.
|
||||||
|
*/
|
||||||
signal changed()
|
signal changed()
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::label
|
||||||
|
Label of the setting.
|
||||||
|
*/
|
||||||
property string label: ''
|
property string label: ''
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::icon
|
||||||
|
Icon path of the setting.
|
||||||
|
*/
|
||||||
property string icon: ''
|
property string icon: ''
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool ListSetting::dictionaryMode
|
||||||
|
true to set the export mode to dictionary, false for list.
|
||||||
|
*/
|
||||||
property bool dictionaryMode: false
|
property bool dictionaryMode: false
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::keyType
|
||||||
|
Type for keys for dictionary, can be either "string" or "number".
|
||||||
|
*/
|
||||||
property string keyType: "string"
|
property string keyType: "string"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::keyType
|
||||||
|
Type for values of the dictionary or list, can be either "string" or "number".
|
||||||
|
*/
|
||||||
property string valueType: "string"
|
property string valueType: "string"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::preKeyLabel
|
||||||
|
Text to be put before the key for each entry.
|
||||||
|
*/
|
||||||
property string preKeyLabel: ""
|
property string preKeyLabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty string ListSetting::postKeyLabel
|
||||||
|
Text to be put after the key for each entry. Only for dictionaries.
|
||||||
|
*/
|
||||||
property string postKeyLabel: ": "
|
property string postKeyLabel: ": "
|
||||||
|
/*!
|
||||||
|
\qmlproperty var ListSetting::keyRegexp
|
||||||
|
Regular expression used in the validator for keys. Only for dictionaries.
|
||||||
|
*/
|
||||||
property var keyRegexp: /^.+$/
|
property var keyRegexp: /^.+$/
|
||||||
|
/*!
|
||||||
|
\qmlproperty var ListSetting::valueRegexp
|
||||||
|
Regular expression used in the validator for values.
|
||||||
|
*/
|
||||||
property var valueRegexp: /^.+$/
|
property var valueRegexp: /^.+$/
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool ListSetting::forbidAdding
|
||||||
|
If true, prevents the user from adding or removing new entries.
|
||||||
|
*/
|
||||||
property bool forbidAdding: false
|
property bool forbidAdding: false
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool ListSetting::model
|
||||||
|
Model of the list/dictionnary, in the form of [{key: < key >, val: < value > }].
|
||||||
|
|
||||||
|
Use the \a importModel method to set the model.
|
||||||
|
*/
|
||||||
property alias model: repeater.model
|
property alias model: repeater.model
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
|
@ -165,6 +223,10 @@ Column {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void ListSetting::importModel(var importer)
|
||||||
|
Imports either a list or a dictionnary in the model.
|
||||||
|
*/
|
||||||
function importModel(importer) {
|
function importModel(importer) {
|
||||||
model.clear()
|
model.clear()
|
||||||
for(var key in importer)
|
for(var key in importer)
|
||||||
|
@ -174,6 +236,11 @@ Column {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void ListSetting::exportModel()
|
||||||
|
Exports the model either a list or a dictionnary in the model depending on \a dictionaryMode.
|
||||||
|
*/
|
||||||
function exportModel() {
|
function exportModel() {
|
||||||
if(dictionaryMode) {
|
if(dictionaryMode) {
|
||||||
var ret = {}
|
var ret = {}
|
||||||
|
|
|
@ -19,18 +19,59 @@
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype TextSetting
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter.Setting
|
||||||
|
\brief Setting to edit strings and numbers.
|
||||||
|
|
||||||
|
\sa EditorDialog, Settings, Icon
|
||||||
|
*/
|
||||||
Item {
|
Item {
|
||||||
id: control
|
id: control
|
||||||
height: 30
|
height: 30
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlsignal TextSetting::changed(string newValue)
|
||||||
|
|
||||||
|
Emitted when the value of the text has been changed.
|
||||||
|
The corresponding handler is \c onChanged.
|
||||||
|
*/
|
||||||
signal changed(string newValue)
|
signal changed(string newValue)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool TextSetting::isInt
|
||||||
|
If true, the input is being parsed an int before being emitting the \a changed signal.
|
||||||
|
*/
|
||||||
property bool isInt: false
|
property bool isInt: false
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool TextSetting::isDouble
|
||||||
|
If true, the input is being parsed an double before being emitting the \a changed signal.
|
||||||
|
*/
|
||||||
property bool isDouble: false
|
property bool isDouble: false
|
||||||
|
/*!
|
||||||
|
\qmlproperty double TextSetting::min
|
||||||
|
Minimum value for numbers that can be entered into the input.
|
||||||
|
*/
|
||||||
property double min: -1
|
property double min: -1
|
||||||
property string label
|
/*!
|
||||||
|
\qmlproperty string TextSetting::defValue
|
||||||
|
Default value of the input.
|
||||||
|
*/
|
||||||
property string defValue
|
property string defValue
|
||||||
|
/*!
|
||||||
|
\qmlproperty string TextSetting::value
|
||||||
|
Value of the input.
|
||||||
|
*/
|
||||||
property alias value: input.text
|
property alias value: input.text
|
||||||
|
/*!
|
||||||
|
\qmlproperty string TextSetting::label
|
||||||
|
Label of the setting.
|
||||||
|
*/
|
||||||
|
property string label
|
||||||
|
/*!
|
||||||
|
\qmlproperty string TextSetting::icon
|
||||||
|
Icon path of the setting.
|
||||||
|
*/
|
||||||
property string icon: ""
|
property string icon: ""
|
||||||
|
|
||||||
Icon {
|
Icon {
|
||||||
|
|
|
@ -22,6 +22,15 @@ import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting
|
||||||
import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup
|
import eu.ad5001.LogarithmPlotter.Popup 1.0 as Popup
|
||||||
import "js/utils.js" as Utils
|
import "js/utils.js" as Utils
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmltype Settings
|
||||||
|
\inqmlmodule eu.ad5001.LogarithmPlotter
|
||||||
|
\brief Tab of the drawer that allows the user to customize how the diagram looks.
|
||||||
|
|
||||||
|
All canvas settings can found in this scrollable view, as well as buttons to copy and save the graph.
|
||||||
|
|
||||||
|
\sa LogarithmPlotter, LogGraphCanvas
|
||||||
|
*/
|
||||||
ScrollView {
|
ScrollView {
|
||||||
id: settings
|
id: settings
|
||||||
|
|
||||||
|
@ -30,20 +39,93 @@ ScrollView {
|
||||||
property int settingWidth: settings.width - ScrollBar.vertical.width
|
property int settingWidth: settings.width - ScrollBar.vertical.width
|
||||||
property Canvas canvas
|
property Canvas canvas
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::xzoom
|
||||||
|
Zoom on the x axis of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double xzoom: 100
|
property double xzoom: 100
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::yzoom
|
||||||
|
Zoom on the y axis of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double yzoom: 10
|
property double yzoom: 10
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::xmin
|
||||||
|
Minimum x of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double xmin: 5/10
|
property double xmin: 5/10
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::ymax
|
||||||
|
Maximum y of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double ymax: 25
|
property double ymax: 25
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Settings::xaxisstep
|
||||||
|
Step of the x axis graduation, provided from settings.
|
||||||
|
\note: Only available in non-logarithmic mode.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string xaxisstep: "4"
|
property string xaxisstep: "4"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Settings::yaxisstep
|
||||||
|
Step of the y axis graduation, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property string yaxisstep: "4"
|
property string yaxisstep: "4"
|
||||||
property string xaxislabel: ""
|
/*!
|
||||||
property string yaxislabel: ""
|
\qmlproperty string Settings::xlabel
|
||||||
|
Label used on the x axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property string xlabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty string Settings::ylabel
|
||||||
|
Label used on the y axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property string ylabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::linewidth
|
||||||
|
Width of lines that will be drawn into the canvas, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double linewidth: 1
|
property double linewidth: 1
|
||||||
|
/*!
|
||||||
|
\qmlproperty double Settings::textsize
|
||||||
|
Font size of the text that will be drawn into the canvas, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property double textsize: 14
|
property double textsize: 14
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool Settings::logscalex
|
||||||
|
true if the canvas should be in logarithmic mode, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool logscalex: true
|
property bool logscalex: true
|
||||||
property string saveFilename: ""
|
/*!
|
||||||
|
\qmlproperty bool Settings::showxgrad
|
||||||
|
true if the x graduation should be shown, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool showxgrad: true
|
property bool showxgrad: true
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool Settings::showygrad
|
||||||
|
true if the y graduation should be shown, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
property bool showygrad: true
|
property bool showygrad: true
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool Settings::saveFilename
|
||||||
|
Path of the currently opened file. Empty if no file is opened.
|
||||||
|
*/
|
||||||
|
property string saveFilename: ""
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
spacing: 10
|
spacing: 10
|
||||||
|
@ -59,10 +141,10 @@ ScrollView {
|
||||||
root.saveDiagram(filePath)
|
root.saveDiagram(filePath)
|
||||||
} else {
|
} else {
|
||||||
root.loadDiagram(filePath)
|
root.loadDiagram(filePath)
|
||||||
if(xAxisLabel.find(settings.xaxislabel) == -1) xAxisLabel.model.append({text: settings.xaxislabel})
|
if(xAxisLabel.find(settings.xlabel) == -1) xAxisLabel.model.append({text: settings.xlabel})
|
||||||
xAxisLabel.editText = settings.xaxislabel
|
xAxisLabel.editText = settings.xlabel
|
||||||
if(yAxisLabel.find(settings.yaxislabel) == -1) yAxisLabel.model.append({text: settings.yaxislabel})
|
if(yAxisLabel.find(settings.ylabel) == -1) yAxisLabel.model.append({text: settings.ylabel})
|
||||||
yAxisLabel.editText = settings.yaxislabel
|
yAxisLabel.editText = settings.ylabel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -238,19 +320,19 @@ ScrollView {
|
||||||
ListElement { text: "x" }
|
ListElement { text: "x" }
|
||||||
ListElement { text: "ω (rad/s)" }
|
ListElement { text: "ω (rad/s)" }
|
||||||
}
|
}
|
||||||
currentIndex: find(settings.xaxislabel)
|
currentIndex: find(settings.xlabel)
|
||||||
editable: true
|
editable: true
|
||||||
onAccepted: function(){
|
onAccepted: function(){
|
||||||
editText = Utils.parseName(editText, false)
|
editText = Utils.parseName(editText, false)
|
||||||
if (find(editText) === -1) model.append({text: editText})
|
if (find(editText) === -1) model.append({text: editText})
|
||||||
settings.xaxislabel = editText
|
settings.xlabel = editText
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
onActivated: function(selectedId) {
|
onActivated: function(selectedId) {
|
||||||
settings.xaxislabel = model.get(selectedId).text
|
settings.xlabel = model.get(selectedId).text
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
Component.onCompleted: editText = settings.xaxislabel
|
Component.onCompleted: editText = settings.xlabel
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.ComboBoxSetting {
|
Setting.ComboBoxSetting {
|
||||||
|
@ -267,19 +349,19 @@ ScrollView {
|
||||||
ListElement { text: "φ (deg)" }
|
ListElement { text: "φ (deg)" }
|
||||||
ListElement { text: "φ (rad)" }
|
ListElement { text: "φ (rad)" }
|
||||||
}
|
}
|
||||||
currentIndex: find(settings.yaxislabel)
|
currentIndex: find(settings.ylabel)
|
||||||
editable: true
|
editable: true
|
||||||
onAccepted: function(){
|
onAccepted: function(){
|
||||||
editText = Utils.parseName(editText, false)
|
editText = Utils.parseName(editText, false)
|
||||||
if (find(editText) === -1) model.append({text: editText, yaxisstep: root.yaxisstep})
|
if (find(editText) === -1) model.append({text: editText, yaxisstep: root.yaxisstep})
|
||||||
settings.yaxislabel = editText
|
settings.ylabel = editText
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
onActivated: function(selectedId) {
|
onActivated: function(selectedId) {
|
||||||
settings.yaxislabel = model.get(selectedId).text
|
settings.ylabel = model.get(selectedId).text
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
Component.onCompleted: editText = settings.yaxislabel
|
Component.onCompleted: editText = settings.ylabel
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
|
@ -349,21 +431,32 @@ ScrollView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::save()
|
||||||
|
Saves the current canvas in the opened file. If no file is currently opened, prompts to pick a save location.
|
||||||
|
*/
|
||||||
function save() {
|
function save() {
|
||||||
if(settings.saveFilename == "") {
|
if(settings.saveFilename == "") {
|
||||||
console.log(fdiag, fdiag.exportMode)
|
saveAs()
|
||||||
fdiag.exportMode = true
|
|
||||||
fdiag.open()
|
|
||||||
} else {
|
} else {
|
||||||
root.saveDiagram(settings.saveFilename)
|
root.saveDiagram(settings.saveFilename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::saveAs()
|
||||||
|
Prompts the user to pick a new save location.
|
||||||
|
*/
|
||||||
function saveAs() {
|
function saveAs() {
|
||||||
fdiag.exportMode = true
|
fdiag.exportMode = true
|
||||||
fdiag.open()
|
fdiag.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlmethod void LogGraphCanvas::saveAs()
|
||||||
|
Prompts the user to pick a diagram to load.
|
||||||
|
*/
|
||||||
function load() {
|
function load() {
|
||||||
fdiag.exportMode = false
|
fdiag.exportMode = false
|
||||||
fdiag.open()
|
fdiag.open()
|
||||||
|
|
|
@ -145,10 +145,8 @@ class EditedProperty extends Action {
|
||||||
let prev = "";
|
let prev = "";
|
||||||
let next = "";
|
let next = "";
|
||||||
if(this.propertyType instanceof Object) {
|
if(this.propertyType instanceof Object) {
|
||||||
console.log(this.propertyType.type)
|
|
||||||
switch(this.propertyType.type) {
|
switch(this.propertyType.type) {
|
||||||
case "Enum":
|
case "Enum":
|
||||||
console.log(this.propertyType.translatedValues, this.previousValue, this.propertyType.values.indexOf(this.previousValue))
|
|
||||||
prev = this.propertyType.translatedValues[this.propertyType.values.indexOf(this.previousValue)]
|
prev = this.propertyType.translatedValues[this.propertyType.values.indexOf(this.previousValue)]
|
||||||
next = this.propertyType.translatedValues[this.propertyType.values.indexOf(this.newValue)]
|
next = this.propertyType.translatedValues[this.propertyType.values.indexOf(this.newValue)]
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue