Compare commits
No commits in common. "54363b25bccb1696182dabe00ec3c03b10363a09" and "f4920aadb6c350b03e5b323b5906c625d4e25712" have entirely different histories.
54363b25bc
...
f4920aadb6
17 changed files with 302 additions and 319 deletions
|
@ -38,7 +38,7 @@ export class BaseEvent {
|
||||||
export class BaseEventEmitter {
|
export class BaseEventEmitter {
|
||||||
static emits = []
|
static emits = []
|
||||||
|
|
||||||
/** @type {Record<string, Set<function>>} */
|
/** @type {Record<string, function[]>} */
|
||||||
#listeners = {}
|
#listeners = {}
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -53,8 +53,8 @@ export class BaseEventEmitter {
|
||||||
* @param {string} eventType - Name of the event to listen to. Throws an error if this object does not emit this kind of event.
|
* @param {string} eventType - Name of the event to listen to. Throws an error if this object does not emit this kind of event.
|
||||||
* @param {function(BaseEvent)} eventListener - The function to be called back when the event is emitted.
|
* @param {function(BaseEvent)} eventListener - The function to be called back when the event is emitted.
|
||||||
*/
|
*/
|
||||||
on(eventType, eventListener) {
|
addEventListener(eventType, eventListener) {
|
||||||
if(!this.constructor.emits.includes(eventType)) {
|
if(!this.emits.includes(eventType)) {
|
||||||
const className = this.constructor.name
|
const className = this.constructor.name
|
||||||
const eventTypes = this.constructor.emits.join(", ")
|
const eventTypes = this.constructor.emits.join(", ")
|
||||||
throw new Error(`Cannot listen to unknown event ${eventType} in class ${className}. ${className} only emits: ${eventTypes}`)
|
throw new Error(`Cannot listen to unknown event ${eventType} in class ${className}. ${className} only emits: ${eventTypes}`)
|
||||||
|
@ -70,13 +70,14 @@ export class BaseEventEmitter {
|
||||||
* @param {function(BaseEvent)} eventListener - The function previously registered as a listener.
|
* @param {function(BaseEvent)} eventListener - The function previously registered as a listener.
|
||||||
* @returns {boolean} True if the listener was removed, false if it was not found.
|
* @returns {boolean} True if the listener was removed, false if it was not found.
|
||||||
*/
|
*/
|
||||||
off(eventType, eventListener) {
|
removeEventListener(eventType, eventListener) {
|
||||||
if(!this.constructor.emits.includes(eventType)) {
|
if(!this.emits.includes(eventType)) {
|
||||||
const className = this.constructor.name
|
const className = this.constructor.name
|
||||||
const eventTypes = this.constructor.emits.join(", ")
|
const eventTypes = this.constructor.emits.join(", ")
|
||||||
throw new Error(`Cannot listen to unknown event ${eventType} in class ${className}. ${className} only emits: ${eventTypes}`)
|
throw new Error(`Cannot listen to unknown event ${eventType} in class ${className}. ${className} only emits: ${eventTypes}`)
|
||||||
}
|
}
|
||||||
return this.#listeners[eventType].delete(eventListener)
|
return this.#listeners[eventType].delete(eventListener)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,11 +88,8 @@ export class BaseEventEmitter {
|
||||||
emit(e) {
|
emit(e) {
|
||||||
if(!(e instanceof BaseEvent))
|
if(!(e instanceof BaseEvent))
|
||||||
throw new Error("Cannot emit non event object.")
|
throw new Error("Cannot emit non event object.")
|
||||||
if(!this.constructor.emits.includes(e.name)) {
|
if(!this.emits.includes(e.name))
|
||||||
const className = this.constructor.name
|
throw new Error(`Cannot emit event '${e.name}' from class ${this.constructor.name}. ${this.constructor.name} can only emits: ${this.constructor.emits.join(", ")}.`)
|
||||||
const eventTypes = this.constructor.emits.join(", ")
|
|
||||||
throw new Error(`Cannot emit event '${e.name}' from class ${className}. ${className} can only emit: ${eventTypes}`)
|
|
||||||
}
|
|
||||||
for(const listener of this.#listeners[e.name])
|
for(const listener of this.#listeners[e.name])
|
||||||
listener(e)
|
listener(e)
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,10 @@ function arrayFlatMap(callbackFn, thisArg) {
|
||||||
* @return {String}
|
* @return {String}
|
||||||
*/
|
*/
|
||||||
function stringReplaceAll(from, to) {
|
function stringReplaceAll(from, to) {
|
||||||
return this.split(from).join(to)
|
let str = this
|
||||||
|
while(str.includes(from))
|
||||||
|
str = str.replace(from, to)
|
||||||
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ import { Expression } from "../math/index.mjs"
|
||||||
import Latex from "./latex.mjs"
|
import Latex from "./latex.mjs"
|
||||||
import Objects from "./objects.mjs"
|
import Objects from "./objects.mjs"
|
||||||
import History from "./history.mjs"
|
import History from "./history.mjs"
|
||||||
import Settings from "./settings.mjs"
|
|
||||||
|
|
||||||
class CanvasAPI extends Module {
|
class CanvasAPI extends Module {
|
||||||
/** @type {CanvasInterface} */
|
/** @type {CanvasInterface} */
|
||||||
|
@ -85,7 +84,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get xmin() {
|
get xmin() {
|
||||||
if(!this.initialized) throw new Error("Attempting xmin before initialize!")
|
if(!this.initialized) throw new Error("Attempting xmin before initialize!")
|
||||||
return Settings.xmin
|
return this.#canvas.xmin
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -94,7 +93,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get xzoom() {
|
get xzoom() {
|
||||||
if(!this.initialized) throw new Error("Attempting xzoom before initialize!")
|
if(!this.initialized) throw new Error("Attempting xzoom before initialize!")
|
||||||
return Settings.xzoom
|
return this.#canvas.xzoom
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,7 +102,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get ymax() {
|
get ymax() {
|
||||||
if(!this.initialized) throw new Error("Attempting ymax before initialize!")
|
if(!this.initialized) throw new Error("Attempting ymax before initialize!")
|
||||||
return Settings.ymax
|
return this.#canvas.ymax
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,7 +111,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get yzoom() {
|
get yzoom() {
|
||||||
if(!this.initialized) throw new Error("Attempting yzoom before initialize!")
|
if(!this.initialized) throw new Error("Attempting yzoom before initialize!")
|
||||||
return Settings.yzoom
|
return this.#canvas.yzoom
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,7 +120,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get xlabel() {
|
get xlabel() {
|
||||||
if(!this.initialized) throw new Error("Attempting xlabel before initialize!")
|
if(!this.initialized) throw new Error("Attempting xlabel before initialize!")
|
||||||
return Settings.xlabel
|
return this.#canvas.xlabel
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,7 +129,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get ylabel() {
|
get ylabel() {
|
||||||
if(!this.initialized) throw new Error("Attempting ylabel before initialize!")
|
if(!this.initialized) throw new Error("Attempting ylabel before initialize!")
|
||||||
return Settings.ylabel
|
return this.#canvas.ylabel
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,7 +138,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get linewidth() {
|
get linewidth() {
|
||||||
if(!this.initialized) throw new Error("Attempting linewidth before initialize!")
|
if(!this.initialized) throw new Error("Attempting linewidth before initialize!")
|
||||||
return Settings.linewidth
|
return this.#canvas.linewidth
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -148,7 +147,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get textsize() {
|
get textsize() {
|
||||||
if(!this.initialized) throw new Error("Attempting textsize before initialize!")
|
if(!this.initialized) throw new Error("Attempting textsize before initialize!")
|
||||||
return Settings.textsize
|
return this.#canvas.textsize
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -157,7 +156,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get logscalex() {
|
get logscalex() {
|
||||||
if(!this.initialized) throw new Error("Attempting logscalex before initialize!")
|
if(!this.initialized) throw new Error("Attempting logscalex before initialize!")
|
||||||
return Settings.logscalex
|
return this.#canvas.logscalex
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -166,7 +165,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get showxgrad() {
|
get showxgrad() {
|
||||||
if(!this.initialized) throw new Error("Attempting showxgrad before initialize!")
|
if(!this.initialized) throw new Error("Attempting showxgrad before initialize!")
|
||||||
return Settings.showxgrad
|
return this.#canvas.showxgrad
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -175,7 +174,7 @@ class CanvasAPI extends Module {
|
||||||
*/
|
*/
|
||||||
get showygrad() {
|
get showygrad() {
|
||||||
if(!this.initialized) throw new Error("Attempting showygrad before initialize!")
|
if(!this.initialized) throw new Error("Attempting showygrad before initialize!")
|
||||||
return Settings.showygrad
|
return this.#canvas.showygrad
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -238,9 +237,9 @@ class CanvasAPI extends Module {
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_computeAxes() {
|
_computeAxes() {
|
||||||
let exprY = new Expression(`x*(${Settings.yaxisstep})`)
|
let exprY = new Expression(`x*(${this.#canvas.yaxisstep})`)
|
||||||
let y1 = exprY.execute(1)
|
let y1 = exprY.execute(1)
|
||||||
let exprX = new Expression(`x*(${Settings.xaxisstep})`)
|
let exprX = new Expression(`x*(${this.#canvas.xaxisstep})`)
|
||||||
let x1 = exprX.execute(1)
|
let x1 = exprX.execute(1)
|
||||||
this.axesSteps = {
|
this.axesSteps = {
|
||||||
x: {
|
x: {
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Objects from "./objects.mjs"
|
import Objects from "./objects.mjs"
|
||||||
import Settings from "./settings.mjs"
|
|
||||||
import ExprParser from "./expreval.mjs"
|
import ExprParser from "./expreval.mjs"
|
||||||
import Latex from "./latex.mjs"
|
import Latex from "./latex.mjs"
|
||||||
import History from "./history.mjs"
|
import History from "./history.mjs"
|
||||||
|
@ -27,7 +26,6 @@ import Preferences from "./preferences.mjs"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Objects,
|
Objects,
|
||||||
Settings,
|
|
||||||
ExprParser,
|
ExprParser,
|
||||||
Latex,
|
Latex,
|
||||||
History,
|
History,
|
||||||
|
|
|
@ -78,7 +78,7 @@ export class SettingsInterface extends Interface {
|
||||||
showygrad = BOOLEAN
|
showygrad = BOOLEAN
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CanvasInterface extends Interface {
|
export class CanvasInterface extends SettingsInterface {
|
||||||
imageLoaders = OBJECT
|
imageLoaders = OBJECT
|
||||||
/** @type {function(string): CanvasRenderingContext2D} */
|
/** @type {function(string): CanvasRenderingContext2D} */
|
||||||
getContext = FUNCTION
|
getContext = FUNCTION
|
||||||
|
|
|
@ -20,20 +20,22 @@ import { Module } from "./common.mjs"
|
||||||
import Objects from "./objects.mjs"
|
import Objects from "./objects.mjs"
|
||||||
import History from "./history.mjs"
|
import History from "./history.mjs"
|
||||||
import Canvas from "./canvas.mjs"
|
import Canvas from "./canvas.mjs"
|
||||||
import Settings from "./settings.mjs"
|
|
||||||
import { DialogInterface, RootInterface, SettingsInterface } from "./interface.mjs"
|
import { DialogInterface, RootInterface, SettingsInterface } from "./interface.mjs"
|
||||||
|
|
||||||
|
|
||||||
class IOAPI extends Module {
|
class IOAPI extends Module {
|
||||||
/** @type {RootInterface} */
|
/** @type {RootInterface} */
|
||||||
#rootElement
|
#rootElement
|
||||||
|
/** @type {SettingsInterface} */
|
||||||
|
#settings
|
||||||
/** @type {{show: function(string)}} */
|
/** @type {{show: function(string)}} */
|
||||||
#alert
|
#alert
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super("IO", {
|
super("IO", {
|
||||||
alert: DialogInterface,
|
alert: DialogInterface,
|
||||||
root: RootInterface
|
root: RootInterface,
|
||||||
|
settings: SettingsInterface
|
||||||
})
|
})
|
||||||
/**
|
/**
|
||||||
* Path of the currently opened file. Empty if no file is opened.
|
* Path of the currently opened file. Empty if no file is opened.
|
||||||
|
@ -45,11 +47,13 @@ class IOAPI extends Module {
|
||||||
/**
|
/**
|
||||||
* Initializes module with QML elements.
|
* Initializes module with QML elements.
|
||||||
* @param {RootInterface} root
|
* @param {RootInterface} root
|
||||||
|
* @param {SettingsInterface} settings
|
||||||
* @param {{show: function(string)}} alert
|
* @param {{show: function(string)}} alert
|
||||||
*/
|
*/
|
||||||
initialize({ root, alert }) {
|
initialize({ root, settings, alert }) {
|
||||||
super.initialize({ root, alert })
|
super.initialize({ root, settings, alert })
|
||||||
this.#rootElement = root
|
this.#rootElement = root
|
||||||
|
this.#settings = settings
|
||||||
this.#alert = alert
|
this.#alert = alert
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +66,7 @@ class IOAPI extends Module {
|
||||||
// Add extension if necessary
|
// Add extension if necessary
|
||||||
if(["lpf"].indexOf(filename.split(".")[filename.split(".").length - 1]) === -1)
|
if(["lpf"].indexOf(filename.split(".")[filename.split(".").length - 1]) === -1)
|
||||||
filename += ".lpf"
|
filename += ".lpf"
|
||||||
Settings.set("saveFilename", filename, false)
|
this.saveFilename = filename
|
||||||
let objs = {}
|
let objs = {}
|
||||||
for(let objType in Objects.currentObjects) {
|
for(let objType in Objects.currentObjects) {
|
||||||
objs[objType] = []
|
objs[objType] = []
|
||||||
|
@ -71,19 +75,19 @@ class IOAPI extends Module {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let settings = {
|
let settings = {
|
||||||
"xzoom": Settings.xzoom,
|
"xzoom": this.#settings.xzoom,
|
||||||
"yzoom": Settings.yzoom,
|
"yzoom": this.#settings.yzoom,
|
||||||
"xmin": Settings.xmin,
|
"xmin": this.#settings.xmin,
|
||||||
"ymax": Settings.ymax,
|
"ymax": this.#settings.ymax,
|
||||||
"xaxisstep": Settings.xaxisstep,
|
"xaxisstep": this.#settings.xaxisstep,
|
||||||
"yaxisstep": Settings.yaxisstep,
|
"yaxisstep": this.#settings.yaxisstep,
|
||||||
"xaxislabel": Settings.xlabel,
|
"xaxislabel": this.#settings.xlabel,
|
||||||
"yaxislabel": Settings.ylabel,
|
"yaxislabel": this.#settings.ylabel,
|
||||||
"logscalex": Settings.logscalex,
|
"logscalex": this.#settings.logscalex,
|
||||||
"linewidth": Settings.linewidth,
|
"linewidth": this.#settings.linewidth,
|
||||||
"showxgrad": Settings.showxgrad,
|
"showxgrad": this.#settings.showxgrad,
|
||||||
"showygrad": Settings.showygrad,
|
"showygrad": this.#settings.showygrad,
|
||||||
"textsize": Settings.textsize,
|
"textsize": this.#settings.textsize,
|
||||||
"history": History.serialize(),
|
"history": History.serialize(),
|
||||||
"width": this.#rootElement.width,
|
"width": this.#rootElement.width,
|
||||||
"height": this.#rootElement.height,
|
"height": this.#rootElement.height,
|
||||||
|
@ -109,24 +113,24 @@ class IOAPI extends Module {
|
||||||
if(data.hasOwnProperty("type") && data["type"] === "logplotv1") {
|
if(data.hasOwnProperty("type") && data["type"] === "logplotv1") {
|
||||||
History.clear()
|
History.clear()
|
||||||
// Importing settings
|
// Importing settings
|
||||||
Settings.set("saveFilename", filename, false)
|
this.#settings.saveFilename = filename
|
||||||
Settings.set("xzoom", parseFloat(data["xzoom"]) || 100, false)
|
this.#settings.xzoom = parseFloat(data["xzoom"]) || 100
|
||||||
Settings.set("yzoom", parseFloat(data["yzoom"]) || 10, false)
|
this.#settings.yzoom = parseFloat(data["yzoom"]) || 10
|
||||||
Settings.set("xmin", parseFloat(data["xmin"]) || 5 / 10, false)
|
this.#settings.xmin = parseFloat(data["xmin"]) || 5 / 10
|
||||||
Settings.set("ymax", parseFloat(data["ymax"]) || 24, false)
|
this.#settings.ymax = parseFloat(data["ymax"]) || 24
|
||||||
Settings.set("xaxisstep", data["xaxisstep"] || "4", false)
|
this.#settings.xaxisstep = data["xaxisstep"] || "4"
|
||||||
Settings.set("yaxisstep", data["yaxisstep"] || "4", false)
|
this.#settings.yaxisstep = data["yaxisstep"] || "4"
|
||||||
Settings.set("xlabel", data["xaxislabel"] || "", false)
|
this.#settings.xlabel = data["xaxislabel"] || ""
|
||||||
Settings.set("ylabel", data["yaxislabel"] || "", false)
|
this.#settings.ylabel = data["yaxislabel"] || ""
|
||||||
Settings.set("logscalex", data["logscalex"] === true, false)
|
this.#settings.logscalex = data["logscalex"] === true
|
||||||
if("showxgrad" in data)
|
if("showxgrad" in data)
|
||||||
Settings.set("showxgrad", data["showxgrad"], false)
|
this.#settings.showxgrad = data["showxgrad"]
|
||||||
if("showygrad" in data)
|
if("showygrad" in data)
|
||||||
Settings.set("showygrad", data["showygrad"], false)
|
this.#settings.textsize = data["showygrad"]
|
||||||
if("linewidth" in data)
|
if("linewidth" in data)
|
||||||
Settings.set("linewidth", data["linewidth"], false)
|
this.#settings.linewidth = data["linewidth"]
|
||||||
if("textsize" in data)
|
if("textsize" in data)
|
||||||
Settings.set("textsize", data["textsize"], false)
|
this.#settings.textsize = data["textsize"]
|
||||||
this.#rootElement.height = parseFloat(data["height"]) || 500
|
this.#rootElement.height = parseFloat(data["height"]) || 500
|
||||||
this.#rootElement.width = parseFloat(data["width"]) || 1000
|
this.#rootElement.width = parseFloat(data["width"]) || 1000
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,7 @@ class LatexAPI extends Module {
|
||||||
throw new EvalError("Unknown operator " + item.value + ".")
|
throw new EvalError("Unknown operator " + item.value + ".")
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case Instruction.IOP3: // Ternary operator
|
case Instruction.IOP3: // Thirdiary operator
|
||||||
n3 = nstack.pop()
|
n3 = nstack.pop()
|
||||||
n2 = nstack.pop()
|
n2 = nstack.pop()
|
||||||
n1 = nstack.pop()
|
n1 = nstack.pop()
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
import { Module } from "./common.mjs"
|
import { Module } from "./common.mjs"
|
||||||
import { BaseEvent } from "../events.mjs"
|
import { BaseEvent } from "../events.mjs"
|
||||||
import { HelperInterface } from "./interface.mjs"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,23 +47,20 @@ class ChangedEvent extends BaseEvent {
|
||||||
class SettingsAPI extends Module {
|
class SettingsAPI extends Module {
|
||||||
static emits = ["changed"]
|
static emits = ["changed"]
|
||||||
|
|
||||||
#nonConfigurable = ["saveFilename"]
|
|
||||||
|
|
||||||
#properties = new Map([
|
#properties = new Map([
|
||||||
["saveFilename", ""],
|
['xzoom', 100],
|
||||||
["xzoom", 100],
|
['yzoom', 10],
|
||||||
["yzoom", 10],
|
['xmin', .5],
|
||||||
["xmin", .5],
|
['ymax', 25],
|
||||||
["ymax", 25],
|
['xaxisstep', "4"],
|
||||||
["xaxisstep", "4"],
|
['yaxisstep', "4"],
|
||||||
["yaxisstep", "4"],
|
['xlabel', ""],
|
||||||
["xlabel", ""],
|
['ylabel', ""],
|
||||||
["ylabel", ""],
|
['linewidth', 1],
|
||||||
["linewidth", 1],
|
['textsize', 18],
|
||||||
["textsize", 18],
|
['logscalex', true],
|
||||||
["logscalex", true],
|
['showxgrad', true],
|
||||||
["showxgrad", true],
|
['showygrad', true],
|
||||||
["showygrad", true]
|
|
||||||
])
|
])
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -77,39 +73,32 @@ class SettingsAPI extends Module {
|
||||||
super.initialize({ helper })
|
super.initialize({ helper })
|
||||||
// Initialize default values.
|
// Initialize default values.
|
||||||
for(const key of this.#properties.keys()) {
|
for(const key of this.#properties.keys()) {
|
||||||
if(!this.#nonConfigurable.includes(key)) {
|
|
||||||
switch(typeof this.#properties.get(key)) {
|
switch(typeof this.#properties.get(key)) {
|
||||||
case "boolean":
|
case 'boolean':
|
||||||
this.set(key, helper.getSettingBool("default_graph."+key), false)
|
this.set(key, helper.getSettingBool(key), false)
|
||||||
break
|
break
|
||||||
case "number":
|
case 'number':
|
||||||
this.set(key, helper.getSettingInt("default_graph."+key), false)
|
this.set(key, helper.getSettingInt(key), false)
|
||||||
break
|
break
|
||||||
case "string":
|
case 'string':
|
||||||
this.set(key, helper.getSetting("default_graph."+key), false)
|
this.set(key, helper.getSetting(key), false)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a setting to a given value
|
* Sets a setting to a given value
|
||||||
*
|
*
|
||||||
* @param {string} property
|
|
||||||
* @param {string|number|boolean} value
|
|
||||||
* @param {boolean} byUser - Set to true if the user is at the origin of this change.
|
* @param {boolean} byUser - Set to true if the user is at the origin of this change.
|
||||||
*/
|
*/
|
||||||
set(property, value, byUser) {
|
set(property, value, byUser) {
|
||||||
if(!this.#properties.has(property)) {
|
if(!this.#properties.has(property))
|
||||||
throw new Error(`Property ${property} is not a setting.`)
|
throw new Error(`Property ${property} is not a setting.`)
|
||||||
}
|
|
||||||
const oldValue = this.#properties.get(property)
|
const oldValue = this.#properties.get(property)
|
||||||
const propType = typeof oldValue
|
const propType = typeof oldValue
|
||||||
if(byUser)
|
|
||||||
console.debug("Setting", property, "from", oldValue, "to", value, `(${typeof value}, ${byUser})`)
|
|
||||||
if(propType !== typeof value)
|
if(propType !== typeof value)
|
||||||
throw new Error(`Value of ${property} must be a ${propType} (${typeof value} provided).`)
|
throw new Error(`Value of ${property} must be a ${propType}.`)
|
||||||
this.#properties.set(property, value)
|
this.#properties.set(property, value)
|
||||||
this.emit(new ChangedEvent(property, oldValue, value, byUser === true))
|
this.emit(new ChangedEvent(property, oldValue, value, byUser === true))
|
||||||
}
|
}
|
||||||
|
@ -118,70 +107,67 @@ class SettingsAPI extends Module {
|
||||||
* Zoom on the x axis of the diagram.
|
* Zoom on the x axis of the diagram.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get xzoom() { return this.#properties.get("xzoom") }
|
get xzoom() { return this.#properties.get("xzoom"); }
|
||||||
/**
|
/**
|
||||||
* Zoom on the y axis of the diagram.
|
* Zoom on the y axis of the diagram.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get yzoom() { return this.#properties.get("yzoom") }
|
get yzoom() { return this.#properties.get("yzoom"); }
|
||||||
/**
|
/**
|
||||||
* Minimum x of the diagram.
|
* Minimum x of the diagram.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get xmin() { return this.#properties.get("xmin") }
|
get xmin() { return this.#properties.get("xmin"); }
|
||||||
/**
|
/**
|
||||||
* Maximum y of the diagram.
|
* Maximum y of the diagram.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get ymax() { return this.#properties.get("ymax") }
|
get ymax() { return this.#properties.get("ymax"); }
|
||||||
/**
|
/**
|
||||||
* Step of the x axis graduation (expression).
|
* Step of the x axis graduation (expression).
|
||||||
* @note Only available in non-logarithmic mode.
|
* @note Only available in non-logarithmic mode.
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
get xaxisstep() { return this.#properties.get("xaxisstep") }
|
get xaxisstep() { return this.#properties.get("xaxisstep"); }
|
||||||
/**
|
/**
|
||||||
* Step of the y axis graduation (expression).
|
* Step of the y axis graduation (expression).
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
get yaxisstep() { return this.#properties.get("yaxisstep") }
|
get yaxisstep() { return this.#properties.get("yaxisstep"); }
|
||||||
/**
|
/**
|
||||||
* Label used on the x axis.
|
* Label used on the x axis.
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
get xlabel() { return this.#properties.get("xlabel") }
|
get xlabel() { return this.#properties.get("xlabel"); }
|
||||||
/**
|
/**
|
||||||
* Label used on the y axis.
|
* Label used on the y axis.
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
get ylabel() { return this.#properties.get("ylabel") }
|
get ylabel() { return this.#properties.get("ylabel"); }
|
||||||
/**
|
/**
|
||||||
* Width of lines that will be drawn into the canvas.
|
* Width of lines that will be drawn into the canvas.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get linewidth() { return this.#properties.get("linewidth") }
|
get linewidth() { return this.#properties.get("linewidth"); }
|
||||||
/**
|
/**
|
||||||
* Font size of the text that will be drawn into the canvas.
|
* Font size of the text that will be drawn into the canvas.
|
||||||
* @returns {number}
|
* @returns {number}
|
||||||
*/
|
*/
|
||||||
get textsize() { return this.#properties.get("textsize") }
|
get textsize() { return this.#properties.get("textsize"); }
|
||||||
/**
|
/**
|
||||||
* true if the canvas should be in logarithmic mode, false otherwise.
|
* true if the canvas should be in logarithmic mode, false otherwise.
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
get logscalex() { return this.#properties.get("logscalex") }
|
get logscalex() { return this.#properties.get("logscalex"); }
|
||||||
/**
|
/**
|
||||||
* true if the x graduation should be shown, false otherwise.
|
* true if the x graduation should be shown, false otherwise.
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
get showxgrad() { return this.#properties.get("showxgrad") }
|
get showxgrad() { return this.#properties.get("showxgrad"); }
|
||||||
/**
|
/**
|
||||||
* true if the y graduation should be shown, false otherwise.
|
* true if the y graduation should be shown, false otherwise.
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
get showygrad() { return this.#properties.get("showygrad") }
|
get showygrad() { return this.#properties.get("showygrad"); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Modules.Settings = Modules.Settings || new SettingsAPI()
|
|
||||||
export default Modules.Settings
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ const XZOOM = new NumberSetting(
|
||||||
|
|
||||||
const YZOOM = new NumberSetting(
|
const YZOOM = new NumberSetting(
|
||||||
qsTranslate("Settings", "Y Zoom"),
|
qsTranslate("Settings", "Y Zoom"),
|
||||||
"default_graph.yzoom",
|
"default_graph.xzoom",
|
||||||
"yzoom",
|
"yzoom",
|
||||||
0.1
|
0.1
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,19 +35,6 @@ String.prototype.removeEnclosure = function() {
|
||||||
return this.substring(1, this.length - 1)
|
return this.substring(1, this.length - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Rounds to a certain number of decimal places.
|
|
||||||
* From https://stackoverflow.com/a/48764436
|
|
||||||
*
|
|
||||||
* @param {number} decimalPlaces
|
|
||||||
* @return {number}
|
|
||||||
*/
|
|
||||||
Number.prototype.toDecimalPrecision = function(decimalPlaces = 0) {
|
|
||||||
const p = Math.pow(10, decimalPlaces);
|
|
||||||
const n = (this * p) * (1 + Number.EPSILON);
|
|
||||||
return Math.round(n) / p;
|
|
||||||
}
|
|
||||||
|
|
||||||
const powerpos = {
|
const powerpos = {
|
||||||
"-": "⁻",
|
"-": "⁻",
|
||||||
"+": "⁺",
|
"+": "⁺",
|
||||||
|
|
|
@ -30,15 +30,104 @@ import Qt.labs.platform as Native
|
||||||
*/
|
*/
|
||||||
Canvas {
|
Canvas {
|
||||||
id: canvas
|
id: canvas
|
||||||
anchors.top: parent.top
|
anchors.top: separator.bottom
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
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
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::ymax
|
||||||
|
Maximum y of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::yzoom
|
||||||
|
Zoom on the y axis of the diagram, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
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"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::yaxisstep
|
||||||
|
Step of the y axis graduation, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property string yaxisstep: "4"
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::xlabel
|
||||||
|
Label used on the x axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property string xlabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty string LogGraphCanvas::ylabel
|
||||||
|
Label used on the y axis, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property string ylabel: ""
|
||||||
|
/*!
|
||||||
|
\qmlproperty double LogGraphCanvas::linewidth
|
||||||
|
Width of lines that will be drawn into the canvas, provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool LogGraphCanvas::logscalex
|
||||||
|
true if the canvas should be in logarithmic mode, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
/*!
|
||||||
|
\qmlproperty bool LogGraphCanvas::showygrad
|
||||||
|
true if the y graduation should be shown, false otherwise.
|
||||||
|
Provided from settings.
|
||||||
|
\sa Settings
|
||||||
|
*/
|
||||||
|
property bool showygrad: false
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty var LogGraphCanvas::imageLoaders
|
\qmlproperty var LogGraphCanvas::imageLoaders
|
||||||
Dictionary of format {image: [callback.image data]} containing data for defered image loading.
|
Dictionary of format {image: [callback.image data]} containing data for defered image loading.
|
||||||
*/
|
*/
|
||||||
property var imageLoaders: {}
|
property var imageLoaders: {}
|
||||||
|
/*!
|
||||||
|
\qmlproperty var LogGraphCanvas::ctx
|
||||||
|
Cache for the 2D context so that it may be used asynchronously.
|
||||||
|
*/
|
||||||
|
property var ctx
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
imageLoaders = {}
|
imageLoaders = {}
|
||||||
|
@ -66,7 +155,7 @@ Canvas {
|
||||||
Object.keys(imageLoaders).forEach((key) => {
|
Object.keys(imageLoaders).forEach((key) => {
|
||||||
if(isImageLoaded(key)) {
|
if(isImageLoaded(key)) {
|
||||||
// Calling callback
|
// Calling callback
|
||||||
imageLoaders[key][0](imageLoaders[key][1])
|
imageLoaders[key][0](canvas, ctx, imageLoaders[key][1])
|
||||||
delete imageLoaders[key]
|
delete imageLoaders[key]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -42,7 +42,7 @@ ApplicationWindow {
|
||||||
width: 1000
|
width: 1000
|
||||||
height: 500
|
height: 500
|
||||||
color: sysPalette.window
|
color: sysPalette.window
|
||||||
title: "LogarithmPlotter"
|
title: "LogarithmPlotter " + (settings.saveFilename != "" ? " - " + settings.saveFilename.split('/').pop() : "") + (history.saved ? "" : "*")
|
||||||
|
|
||||||
SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active }
|
SystemPalette { id: sysPalette; colorGroup: SystemPalette.Active }
|
||||||
SystemPalette { id: sysPaletteIn; colorGroup: SystemPalette.Disabled }
|
SystemPalette { id: sysPaletteIn; colorGroup: SystemPalette.Disabled }
|
||||||
|
@ -145,6 +145,20 @@ ApplicationWindow {
|
||||||
width: sidebar.inPortrait ? parent.width : parent.width - sidebar.width//*sidebar.position
|
width: sidebar.inPortrait ? parent.width : parent.width - sidebar.width//*sidebar.position
|
||||||
x: sidebar.width//*sidebar.position
|
x: sidebar.width//*sidebar.position
|
||||||
|
|
||||||
|
xmin: settings.xmin
|
||||||
|
ymax: settings.ymax
|
||||||
|
xzoom: settings.xzoom
|
||||||
|
yzoom: settings.yzoom
|
||||||
|
xlabel: settings.xlabel
|
||||||
|
ylabel: settings.ylabel
|
||||||
|
yaxisstep: settings.yaxisstep
|
||||||
|
xaxisstep: settings.xaxisstep
|
||||||
|
logscalex: settings.logscalex
|
||||||
|
linewidth: settings.linewidth
|
||||||
|
textsize: settings.textsize
|
||||||
|
showxgrad: settings.showxgrad
|
||||||
|
showygrad: settings.showygrad
|
||||||
|
|
||||||
property bool firstDrawDone: false
|
property bool firstDrawDone: false
|
||||||
|
|
||||||
onPainted: if(!firstDrawDone) {
|
onPainted: if(!firstDrawDone) {
|
||||||
|
@ -250,12 +264,5 @@ ApplicationWindow {
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
Modules.IO.initialize({ root, settings, alert })
|
Modules.IO.initialize({ root, settings, alert })
|
||||||
Modules.Latex.initialize({ latex: Latex, helper: Helper })
|
Modules.Latex.initialize({ latex: Latex, helper: Helper })
|
||||||
Modules.Settings.on("changed", (evt) => {
|
|
||||||
if(evt.property === "saveFilename") {
|
|
||||||
const fileName = evt.newValue.split('/').pop().split('\\').pop()
|
|
||||||
if(fileName !== "")
|
|
||||||
title = `${fileName}`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,7 +285,7 @@ Item {
|
||||||
const axisX = Modules.Canvas.axesSteps.x.value
|
const axisX = Modules.Canvas.axesSteps.x.value
|
||||||
const xpos = Modules.Canvas.px2x(picker.mouseX)
|
const xpos = Modules.Canvas.px2x(picker.mouseX)
|
||||||
if(snapToGridCheckbox.checked) {
|
if(snapToGridCheckbox.checked) {
|
||||||
if(Modules.Settings.logscalex) {
|
if(canvas.logscalex) {
|
||||||
// Calculate the logged power
|
// Calculate the logged power
|
||||||
let pow = Math.pow(10, Math.floor(Math.log10(xpos)))
|
let pow = Math.pow(10, Math.floor(Math.log10(xpos)))
|
||||||
return pow*Math.round(xpos/pow)
|
return pow*Math.round(xpos/pow)
|
||||||
|
|
|
@ -175,17 +175,17 @@ Item {
|
||||||
Icon {
|
Icon {
|
||||||
id: iconLabel
|
id: iconLabel
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: parent.icon == "" ? 0 : 3
|
anchors.topMargin: icon == "" ? 0 : 3
|
||||||
source: control.visible && parent.icon != "" ? "../icons/" + control.icon : ""
|
source: control.visible && icon != "" ? "../icons/" + control.icon : ""
|
||||||
width: height
|
width: height
|
||||||
height: parent.icon == "" || !visible ? 0 : 24
|
height: icon == "" || !visible ? 0 : 24
|
||||||
color: sysPalette.windowText
|
color: sysPalette.windowText
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
id: labelItem
|
id: labelItem
|
||||||
anchors.left: iconLabel.right
|
anchors.left: iconLabel.right
|
||||||
anchors.leftMargin: parent.icon == "" ? 0 : 5
|
anchors.leftMargin: icon == "" ? 0 : 5
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
height: parent.height
|
height: parent.height
|
||||||
width: Math.max(85, implicitWidth)
|
width: Math.max(85, implicitWidth)
|
||||||
|
@ -231,8 +231,8 @@ Item {
|
||||||
onEditingFinished: {
|
onEditingFinished: {
|
||||||
if(insertButton.focus || insertPopup.focus) return
|
if(insertButton.focus || insertPopup.focus) return
|
||||||
let value = text
|
let value = text
|
||||||
if(value != "" && value.toString() != parent.defValue) {
|
if(value != "" && value.toString() != defValue) {
|
||||||
let expr = parent.parse(value)
|
let expr = parse(value)
|
||||||
if(expr != null) {
|
if(expr != null) {
|
||||||
control.changed(expr)
|
control.changed(expr)
|
||||||
defValue = expr.toEditableString()
|
defValue = expr.toEditableString()
|
||||||
|
@ -280,10 +280,10 @@ Item {
|
||||||
acPopupContent.itemSelected = 0
|
acPopupContent.itemSelected = 0
|
||||||
|
|
||||||
|
|
||||||
if(event.text in parent.openAndCloseMatches && autoClosing) {
|
if(event.text in openAndCloseMatches && autoClosing) {
|
||||||
let start = selectionStart
|
let start = selectionStart
|
||||||
insert(selectionStart, event.text)
|
insert(selectionStart, event.text)
|
||||||
insert(selectionEnd, parent.openAndCloseMatches[event.text])
|
insert(selectionEnd, openAndCloseMatches[event.text])
|
||||||
cursorPosition = start+1
|
cursorPosition = start+1
|
||||||
event.accepted = true
|
event.accepted = true
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ Item {
|
||||||
Emitted when the value of the text has been changed.
|
Emitted when the value of the text has been changed.
|
||||||
The corresponding handler is \c onChanged.
|
The corresponding handler is \c onChanged.
|
||||||
*/
|
*/
|
||||||
signal changed(var newValue)
|
signal changed(string newValue)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty bool TextSetting::isInt
|
\qmlproperty bool TextSetting::isInt
|
||||||
|
|
|
@ -121,6 +121,11 @@ ScrollView {
|
||||||
\sa Settings
|
\sa Settings
|
||||||
*/
|
*/
|
||||||
property bool showygrad: Helper.getSettingBool('default_graph.showygrad')
|
property bool showygrad: Helper.getSettingBool('default_graph.showygrad')
|
||||||
|
/*!
|
||||||
|
\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
|
||||||
|
@ -131,18 +136,15 @@ ScrollView {
|
||||||
id: fdiag
|
id: fdiag
|
||||||
onAccepted: {
|
onAccepted: {
|
||||||
var filePath = fdiag.currentFile.toString().substr(7)
|
var filePath = fdiag.currentFile.toString().substr(7)
|
||||||
Modules.Settings.set("saveFilename", filePath)
|
settings.saveFilename = filePath
|
||||||
if(exportMode) {
|
if(exportMode) {
|
||||||
Modules.IO.saveDiagram(filePath)
|
Modules.IO.saveDiagram(filePath)
|
||||||
} else {
|
} else {
|
||||||
Modules.IO.loadDiagram(filePath)
|
Modules.IO.loadDiagram(filePath)
|
||||||
// Adding labels.
|
if(xAxisLabel.find(settings.xlabel) == -1) xAxisLabel.model.append({text: settings.xlabel})
|
||||||
if(xAxisLabel.find(Modules.Settings.xlabel) === -1)
|
xAxisLabel.editText = settings.xlabel
|
||||||
xAxisLabel.model.append({text: Modules.Settings.xlabel})
|
if(yAxisLabel.find(settings.ylabel) == -1) yAxisLabel.model.append({text: settings.ylabel})
|
||||||
xAxisLabel.editText = Modules.Settings.xlabel
|
yAxisLabel.editText = settings.ylabel
|
||||||
if(yAxisLabel.find(Modules.Settings.ylabel) === -1)
|
|
||||||
yAxisLabel.model.append({text: Modules.Settings.ylabel})
|
|
||||||
yAxisLabel.editText = Modules.Settings.ylabel
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,16 +158,11 @@ ScrollView {
|
||||||
min: 0.1
|
min: 0.1
|
||||||
icon: "settings/xzoom.svg"
|
icon: "settings/xzoom.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
value: settings.xzoom.toFixed(2)
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("xzoom", newValue, true)
|
settings.xzoom = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update(newValue) {
|
|
||||||
value = Modules.Settings.xzoom.toFixed(2)
|
|
||||||
maxX.update()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -176,16 +173,11 @@ ScrollView {
|
||||||
label: qsTr("Y Zoom")
|
label: qsTr("Y Zoom")
|
||||||
icon: "settings/yzoom.svg"
|
icon: "settings/yzoom.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
value: settings.yzoom.toFixed(2)
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("yzoom", newValue, true)
|
settings.yzoom = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update(newValue) {
|
|
||||||
value = Modules.Settings.yzoom.toFixed(2)
|
|
||||||
minY.update()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Positioning the graph
|
// Positioning the graph
|
||||||
|
@ -197,18 +189,14 @@ ScrollView {
|
||||||
label: qsTr("Min X")
|
label: qsTr("Min X")
|
||||||
icon: "settings/xmin.svg"
|
icon: "settings/xmin.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.xmin
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("xmin", newValue, true)
|
if(parseFloat(maxX.value) > newValue) {
|
||||||
|
settings.xmin = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
|
} else {
|
||||||
|
alert.show("Minimum x value must be inferior to maximum.")
|
||||||
}
|
}
|
||||||
|
|
||||||
function update(newValue) {
|
|
||||||
let newVal = Modules.Settings.xmin
|
|
||||||
if(newVal > 1e-5)
|
|
||||||
newVal = newVal.toDecimalPrecision(8)
|
|
||||||
value = newVal
|
|
||||||
maxX.update()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,16 +208,11 @@ ScrollView {
|
||||||
label: qsTr("Max Y")
|
label: qsTr("Max Y")
|
||||||
icon: "settings/ymax.svg"
|
icon: "settings/ymax.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.ymax
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("ymax", newValue, true)
|
settings.ymax = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
|
||||||
value = Modules.Settings.ymax
|
|
||||||
minY.update()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -240,24 +223,15 @@ ScrollView {
|
||||||
label: qsTr("Max X")
|
label: qsTr("Max X")
|
||||||
icon: "settings/xmax.svg"
|
icon: "settings/xmax.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: Modules.Canvas.px2x(canvas.width).toFixed(2)
|
||||||
onChanged: function(xvaluemax) {
|
onChanged: function(xvaluemax) {
|
||||||
if(xvaluemax > Modules.Settings.xmin) {
|
if(xvaluemax > settings.xmin) {
|
||||||
const newXZoom = Modules.Settings.xzoom * canvas.width/(Modules.Canvas.x2px(xvaluemax)) // Adjusting zoom to fit. = (end)/(px of current point)
|
settings.xzoom = settings.xzoom * canvas.width/(Modules.Canvas.x2px(xvaluemax)) // Adjusting zoom to fit. = (end)/(px of current point)
|
||||||
Modules.Settings.set("xzoom", newXZoom, true)
|
|
||||||
zoomX.update()
|
|
||||||
settings.changed()
|
settings.changed()
|
||||||
} else {
|
} else {
|
||||||
alert.show("Maximum x value must be superior to minimum.")
|
alert.show("Maximum x value must be superior to minimum.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
|
||||||
let newVal = Modules.Canvas.px2x(canvas.width)
|
|
||||||
if(newVal > 1e-5)
|
|
||||||
newVal = newVal.toDecimalPrecision(8)
|
|
||||||
value = newVal
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -268,21 +242,15 @@ ScrollView {
|
||||||
label: qsTr("Min Y")
|
label: qsTr("Min Y")
|
||||||
icon: "settings/ymin.svg"
|
icon: "settings/ymin.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: Modules.Canvas.px2y(canvas.height).toFixed(2)
|
||||||
onChanged: function(yvaluemin) {
|
onChanged: function(yvaluemin) {
|
||||||
if(yvaluemin < settings.ymax) {
|
if(yvaluemin < settings.ymax) {
|
||||||
const newYZoom = Modules.Settings.yzoom * canvas.height/(Modules.Canvas.y2px(yvaluemin)) // Adjusting zoom to fit. = (end)/(px of current point)
|
settings.yzoom = settings.yzoom * canvas.height/(Modules.Canvas.y2px(yvaluemin)) // Adjusting zoom to fit. = (end)/(px of current point)
|
||||||
Modules.Settings.set("yzoom", newYZoom, true)
|
|
||||||
zoomY.update()
|
|
||||||
settings.changed()
|
settings.changed()
|
||||||
} else {
|
} else {
|
||||||
alert.show("Minimum y value must be inferior to maximum.")
|
alert.show("Minimum y value must be inferior to maximum.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
|
||||||
value = Modules.Canvas.px2y(canvas.height).toDecimalPrecision(8)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -292,16 +260,12 @@ ScrollView {
|
||||||
label: qsTr("X Axis Step")
|
label: qsTr("X Axis Step")
|
||||||
icon: "settings/xaxisstep.svg"
|
icon: "settings/xaxisstep.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.xaxisstep
|
||||||
|
visible: !settings.logscalex
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("xaxisstep", newValue, true)
|
settings.xaxisstep = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
|
||||||
value = Modules.Settings.xaxisstep
|
|
||||||
visible = !Modules.Settings.logscalex
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -311,13 +275,11 @@ ScrollView {
|
||||||
label: qsTr("Y Axis Step")
|
label: qsTr("Y Axis Step")
|
||||||
icon: "settings/yaxisstep.svg"
|
icon: "settings/yaxisstep.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.yaxisstep
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("yaxisstep", newValue, true)
|
settings.yaxisstep = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() { value = Modules.Settings.yaxisstep }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -328,13 +290,11 @@ ScrollView {
|
||||||
min: 1
|
min: 1
|
||||||
icon: "settings/linewidth.svg"
|
icon: "settings/linewidth.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.linewidth
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("linewidth", newValue, true)
|
settings.linewidth = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() { value = Modules.Settings.linewidth }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.TextSetting {
|
Setting.TextSetting {
|
||||||
|
@ -345,13 +305,11 @@ ScrollView {
|
||||||
min: 1
|
min: 1
|
||||||
icon: "settings/textsize.svg"
|
icon: "settings/textsize.svg"
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
|
defValue: settings.textsize
|
||||||
onChanged: function(newValue) {
|
onChanged: function(newValue) {
|
||||||
Modules.Settings.set("textsize", newValue, true)
|
settings.textsize = newValue
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() { value = Modules.Settings.textsize }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.ComboBoxSetting {
|
Setting.ComboBoxSetting {
|
||||||
|
@ -360,31 +318,24 @@ ScrollView {
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
label: qsTr('X Label')
|
label: qsTr('X Label')
|
||||||
icon: "settings/xlabel.svg"
|
icon: "settings/xlabel.svg"
|
||||||
editable: true
|
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
ListElement { text: "" }
|
ListElement { text: "" }
|
||||||
ListElement { text: "x" }
|
ListElement { text: "x" }
|
||||||
ListElement { text: "ω (rad/s)" }
|
ListElement { text: "ω (rad/s)" }
|
||||||
}
|
}
|
||||||
|
currentIndex: find(settings.xlabel)
|
||||||
|
editable: true
|
||||||
onAccepted: function(){
|
onAccepted: function(){
|
||||||
editText = JS.Utils.parseName(editText, false)
|
editText = JS.Utils.parseName(editText, false)
|
||||||
if (find(editText) === -1) model.append({text: editText})
|
if (find(editText) === -1) model.append({text: editText})
|
||||||
currentIndex = find(editText)
|
settings.xlabel = editText
|
||||||
Modules.Settings.set("xlabel", editText, true)
|
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
onActivated: function(selectedId) {
|
onActivated: function(selectedId) {
|
||||||
Modules.Settings.set("xlabel", model.get(selectedId).text, true)
|
settings.xlabel = model.get(selectedId).text
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
Component.onCompleted: editText = settings.xlabel
|
||||||
function update() {
|
|
||||||
editText = Modules.Settings.xlabel
|
|
||||||
if(find(editText) === -1) model.append({text: editText})
|
|
||||||
currentIndex = find(editText)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Setting.ComboBoxSetting {
|
Setting.ComboBoxSetting {
|
||||||
|
@ -393,7 +344,6 @@ ScrollView {
|
||||||
width: settings.settingWidth
|
width: settings.settingWidth
|
||||||
label: qsTr('Y Label')
|
label: qsTr('Y Label')
|
||||||
icon: "settings/ylabel.svg"
|
icon: "settings/ylabel.svg"
|
||||||
editable: true
|
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
ListElement { text: "" }
|
ListElement { text: "" }
|
||||||
ListElement { text: "y" }
|
ListElement { text: "y" }
|
||||||
|
@ -402,52 +352,39 @@ ScrollView {
|
||||||
ListElement { text: "φ (deg)" }
|
ListElement { text: "φ (deg)" }
|
||||||
ListElement { text: "φ (rad)" }
|
ListElement { text: "φ (rad)" }
|
||||||
}
|
}
|
||||||
|
currentIndex: find(settings.ylabel)
|
||||||
|
editable: true
|
||||||
onAccepted: function(){
|
onAccepted: function(){
|
||||||
editText = JS.Utils.parseName(editText, false)
|
editText = JS.Utils.parseName(editText, false)
|
||||||
if(find(editText) === -1) model.append({text: editText})
|
if (find(editText) === -1) model.append({text: editText, yaxisstep: root.yaxisstep})
|
||||||
currentIndex = find(editText)
|
settings.ylabel = editText
|
||||||
Modules.Settings.set("ylabel", editText, true)
|
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
onActivated: function(selectedId) {
|
onActivated: function(selectedId) {
|
||||||
Modules.Settings.set("ylabel", model.get(selectedId).text, true)
|
settings.ylabel = model.get(selectedId).text
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
Component.onCompleted: editText = settings.ylabel
|
||||||
function update() {
|
|
||||||
editText = Modules.Settings.ylabel
|
|
||||||
if(find(editText) === -1) model.append({text: editText})
|
|
||||||
currentIndex = find(editText)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
id: logScaleX
|
id: logScaleX
|
||||||
|
checked: settings.logscalex
|
||||||
text: qsTr('X Log scale')
|
text: qsTr('X Log scale')
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Modules.Settings.set("logscalex", checked, true)
|
settings.logscalex = checked
|
||||||
if(Modules.Settings.xmin <= 0) // Reset xmin to prevent crash.
|
|
||||||
Modules.Settings.set("xmin", .5)
|
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
|
||||||
checked = Modules.Settings.logscalex
|
|
||||||
xAxisStep.update()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
id: showXGrad
|
id: showXGrad
|
||||||
|
checked: settings.showxgrad
|
||||||
text: qsTr('Show X graduation')
|
text: qsTr('Show X graduation')
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Modules.Settings.set("showxgrad", checked, true)
|
settings.showxgrad = checked
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() { checked = Modules.Settings.showxgrad }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
|
@ -455,10 +392,9 @@ ScrollView {
|
||||||
checked: settings.showygrad
|
checked: settings.showygrad
|
||||||
text: qsTr('Show Y graduation')
|
text: qsTr('Show Y graduation')
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Modules.Settings.set("showygrad", checked, true)
|
settings.showygrad = checked
|
||||||
settings.changed()
|
settings.changed()
|
||||||
}
|
}
|
||||||
function update() { checked = Modules.Settings.showygrad }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
|
@ -504,10 +440,10 @@ ScrollView {
|
||||||
Saves the current canvas in the opened file. If no file is currently opened, prompts to pick a save location.
|
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(Modules.Settings.saveFilename == "") {
|
if(settings.saveFilename == "") {
|
||||||
saveAs()
|
saveAs()
|
||||||
} else {
|
} else {
|
||||||
Modules.IO.saveDiagram(Modules.Settings.saveFilename)
|
Modules.IO.saveDiagram(settings.saveFilename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,30 +464,4 @@ ScrollView {
|
||||||
fdiag.exportMode = false
|
fdiag.exportMode = false
|
||||||
fdiag.open()
|
fdiag.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializing the settings
|
|
||||||
*/
|
|
||||||
Component.onCompleted: function() {
|
|
||||||
const matchedElements = new Map([
|
|
||||||
["xzoom", zoomX],
|
|
||||||
["yzoom", zoomY],
|
|
||||||
["xmin", minX],
|
|
||||||
["ymax", maxY],
|
|
||||||
["xaxisstep", xAxisStep],
|
|
||||||
["yaxisstep", yAxisStep],
|
|
||||||
["xlabel", xAxisLabel],
|
|
||||||
["ylabel", yAxisLabel],
|
|
||||||
["linewidth", lineWidth],
|
|
||||||
["textsize", textSize],
|
|
||||||
["logscalex", logScaleX],
|
|
||||||
["showxgrad", showXGrad],
|
|
||||||
["showygrad", showYGrad]
|
|
||||||
])
|
|
||||||
Modules.Settings.on("changed", (evt) => {
|
|
||||||
if(matchedElements.has(evt.property))
|
|
||||||
matchedElements.get(evt.property).update()
|
|
||||||
})
|
|
||||||
Modules.Settings.initialize({ helper: Helper })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import eu.ad5001.LogarithmPlotter.Setting 1.0 as Setting
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\qmltype ViewPositionChangeOverlay
|
\qmltype ViewPositionChangeOverlay
|
||||||
|
@ -79,7 +81,7 @@ Item {
|
||||||
property int prevY
|
property int prevY
|
||||||
/*!
|
/*!
|
||||||
\qmlproperty double ViewPositionChangeOverlay::baseZoomMultiplier
|
\qmlproperty double ViewPositionChangeOverlay::baseZoomMultiplier
|
||||||
How much should the zoom be multiplied/scrolled by for one scroll step (120° on the mouse wheel).
|
How much should the zoom be mutliplied/scrolled by for one scroll step (120° on the mouse wheel).
|
||||||
*/
|
*/
|
||||||
property double baseZoomMultiplier: 0.1
|
property double baseZoomMultiplier: 0.1
|
||||||
|
|
||||||
|
@ -89,15 +91,15 @@ Item {
|
||||||
cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor
|
cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor
|
||||||
property int positionChangeTimer: 0
|
property int positionChangeTimer: 0
|
||||||
|
|
||||||
function updatePosition(deltaX, deltaY, isEnd) {
|
function updatePosition(deltaX, deltaY) {
|
||||||
const unauthorized = [NaN, Infinity, -Infinity]
|
const unauthorized = [NaN, Infinity, -Infinity]
|
||||||
const xmin = (Modules.Canvas.px2x(Modules.Canvas.x2px(Modules.Settings.xmin)-deltaX))
|
const xmin = (Modules.Canvas.px2x(Modules.Canvas.x2px(settingsInstance.xmin)-deltaX))
|
||||||
const ymax = Modules.Settings.ymax + deltaY/Modules.Settings.yzoom
|
const ymax = settingsInstance.ymax + deltaY/canvas.yzoom
|
||||||
if(!unauthorized.includes(xmin))
|
if(!unauthorized.includes(xmin))
|
||||||
Modules.Settings.set("xmin", xmin, isEnd)
|
settingsInstance.xmin = xmin
|
||||||
if(!unauthorized.includes(ymax))
|
if(!unauthorized.includes(ymax))
|
||||||
Modules.Settings.set("ymax", ymax.toDecimalPrecision(6), isEnd)
|
settingsInstance.ymax = ymax.toFixed(4)
|
||||||
Modules.Canvas.requestPaint()
|
settingsInstance.changed()
|
||||||
parent.positionChanged(deltaX, deltaY)
|
parent.positionChanged(deltaX, deltaY)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -111,9 +113,9 @@ Item {
|
||||||
onPositionChanged: function(mouse) {
|
onPositionChanged: function(mouse) {
|
||||||
positionChangeTimer++
|
positionChangeTimer++
|
||||||
if(positionChangeTimer == 3) {
|
if(positionChangeTimer == 3) {
|
||||||
let deltaX = mouse.x - parent.prevX
|
let deltaX = mouse.x - prevX
|
||||||
let deltaY = mouse.y - parent.prevY
|
let deltaY = mouse.y - prevY
|
||||||
updatePosition(deltaX, deltaY, false)
|
updatePosition(deltaX, deltaY)
|
||||||
prevX = mouse.x
|
prevX = mouse.x
|
||||||
prevY = mouse.y
|
prevY = mouse.y
|
||||||
positionChangeTimer = 0
|
positionChangeTimer = 0
|
||||||
|
@ -121,35 +123,35 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
onReleased: function(mouse) {
|
onReleased: function(mouse) {
|
||||||
let deltaX = mouse.x - parent.prevX
|
let deltaX = mouse.x - prevX
|
||||||
let deltaY = mouse.y - parent.prevY
|
let deltaY = mouse.y - prevY
|
||||||
updatePosition(deltaX, deltaY, true)
|
updatePosition(deltaX, deltaY)
|
||||||
parent.endPositionChange(deltaX, deltaY)
|
parent.endPositionChange(deltaX, deltaY)
|
||||||
}
|
}
|
||||||
|
|
||||||
onWheel: function(wheel) {
|
onWheel: function(wheel) {
|
||||||
// Scrolling
|
// Scrolling
|
||||||
let scrollSteps = Math.round(wheel.angleDelta.y / 120)
|
let scrollSteps = Math.round(wheel.angleDelta.y / 120)
|
||||||
let zoomMultiplier = Math.pow(1+parent.baseZoomMultiplier, Math.abs(scrollSteps))
|
let zoomMultiplier = Math.pow(1+baseZoomMultiplier, Math.abs(scrollSteps))
|
||||||
// Avoid floating-point rounding errors by removing the zoom *after*
|
// Avoid floating-point rounding errors by removing the zoom *after*
|
||||||
let xZoomDelta = (Modules.Settings.xzoom*zoomMultiplier - Modules.Settings.xzoom)
|
let xZoomDelta = (settingsInstance.xzoom*zoomMultiplier - settingsInstance.xzoom)
|
||||||
let yZoomDelta = (Modules.Settings.yzoom*zoomMultiplier - Modules.Settings.yzoom)
|
let yZoomDelta = (settingsInstance.yzoom*zoomMultiplier - settingsInstance.yzoom)
|
||||||
if(scrollSteps < 0) { // Negative scroll
|
if(scrollSteps < 0) { // Negative scroll
|
||||||
xZoomDelta *= -1
|
xZoomDelta *= -1
|
||||||
yZoomDelta *= -1
|
yZoomDelta *= -1
|
||||||
}
|
}
|
||||||
let newXZoom = (Modules.Settings.xzoom+xZoomDelta).toDecimalPrecision(0)
|
let newXZoom = (settingsInstance.xzoom+xZoomDelta).toFixed(0)
|
||||||
let newYZoom = (Modules.Settings.yzoom+yZoomDelta).toDecimalPrecision(0)
|
let newYZoom = (settingsInstance.yzoom+yZoomDelta).toFixed(0)
|
||||||
// Check if we need to have more precision
|
// Check if we need to have more precision
|
||||||
if(newXZoom < 10)
|
if(newXZoom < 10)
|
||||||
newXZoom = (Modules.Settings.xzoom+xZoomDelta).toDecimalPrecision(4)
|
newXZoom = (settingsInstance.xzoom+xZoomDelta).toFixed(4)
|
||||||
if(newYZoom < 10)
|
if(newYZoom < 10)
|
||||||
newYZoom = (Modules.Settings.yzoom+yZoomDelta).toDecimalPrecision(4)
|
newYZoom = (settingsInstance.yzoom+yZoomDelta).toFixed(4)
|
||||||
if(newXZoom > 0.5)
|
if(newXZoom > 0.5)
|
||||||
Modules.Settings.set("xzoom", newXZoom)
|
settingsInstance.xzoom = newXZoom
|
||||||
if(newYZoom > 0.5)
|
if(newYZoom > 0.5)
|
||||||
Modules.Settings.set("yzoom", newYZoom)
|
settingsInstance.yzoom = newYZoom
|
||||||
Modules.Canvas.requestPaint()
|
settingsInstance.changed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue