|
|
|
import QtQuick 2.12
|
|
|
|
import QtQuick.Controls 2.12
|
|
|
|
import QtQuick.Layouts 1.12
|
|
|
|
|
|
|
|
import NERvGear 1.0 as NVG
|
|
|
|
import NERvGear.Controls 1.0
|
|
|
|
import NERvGear.Templates 1.0 as T
|
|
|
|
import NERvGear.Preferences 1.0 as P
|
|
|
|
|
|
|
|
WidgetTemplate {
|
|
|
|
id: widget
|
|
|
|
title: qsTr("Ordinal Scale Bottom UI widget")
|
|
|
|
editing: styleDialog.active
|
|
|
|
|
|
|
|
readonly property var configs: widget.settings.styles
|
|
|
|
|
|
|
|
version: "1.0.1"
|
|
|
|
defaultValues: {
|
|
|
|
"Curve": true,
|
|
|
|
"Circle Color": "#fffcf9",
|
|
|
|
"Line Color": "#fffcf9",
|
|
|
|
"Line Width": 38,
|
|
|
|
"Shadow Color": "#e0e0e0",
|
|
|
|
"Shadow Size": 0.5,
|
|
|
|
"Battle UI": false,
|
|
|
|
"Clock Visible": true,
|
|
|
|
"Full Clock": true,
|
|
|
|
"Font Color": "#f5f5f5",
|
|
|
|
"Font Size": 44,
|
|
|
|
"Font Name": 0,
|
|
|
|
"Font Weight": 0,
|
|
|
|
"Text Vertical Offset": 16
|
|
|
|
}
|
|
|
|
|
|
|
|
property string line_color: configs["Line Color"]
|
|
|
|
property string shadowColor: configs["Shadow Color"]
|
|
|
|
property real shadowBlur: configs["Shadow Size"]
|
|
|
|
|
|
|
|
readonly property real h: Math.min(widget.width, widget.height)
|
|
|
|
readonly property real w: widget.width
|
|
|
|
readonly property real r: (w**2+4*h**2)/2/h
|
|
|
|
|
|
|
|
onConfigsChanged: {
|
|
|
|
line.requestPaint();
|
|
|
|
triangle.requestPaint();
|
|
|
|
}
|
|
|
|
|
|
|
|
Canvas {
|
|
|
|
id: triangle
|
|
|
|
anchors.centerIn: parent
|
|
|
|
anchors.verticalCenterOffset: height/2
|
|
|
|
width: 0.4*h
|
|
|
|
height: 0.4*h*Math.sin(Math.PI/6)
|
|
|
|
contextType: "2d"
|
|
|
|
onPaint: {
|
|
|
|
context.reset();
|
|
|
|
context.clearRect(0,0,width,height);
|
|
|
|
context.shadowBlur = shadowBlur;
|
|
|
|
context.shadowColor = shadowColor;
|
|
|
|
context.lineWidth = Math.max(0.08*configs["Line Width"], 0.1);
|
|
|
|
context.strokeStyle = line_color;
|
|
|
|
context.beginPath();
|
|
|
|
context.moveTo(0,0);
|
|
|
|
context.lineTo(width/2, height);
|
|
|
|
context.lineTo(width, 0);
|
|
|
|
context.lineTo(0, 0);
|
|
|
|
context.fillStyle = line_color;
|
|
|
|
context.fill();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Canvas {
|
|
|
|
id: line
|
|
|
|
anchors.centerIn: parent
|
|
|
|
width: widget.width
|
|
|
|
height: widget.height
|
|
|
|
contextType: "2d"
|
|
|
|
onPaint: {
|
|
|
|
context.reset();
|
|
|
|
context.clearRect(0,0,width,height);
|
|
|
|
context.shadowBlur = shadowBlur;
|
|
|
|
context.shadowColor = shadowColor;
|
|
|
|
context.lineWidth = Math.max(0.08*configs["Line Width"], 0.1);
|
|
|
|
context.strokeStyle = line_color;
|
|
|
|
if (configs["Curve"]) {
|
|
|
|
let deg = Math.asin(w/2/r)*0.95;
|
|
|
|
context.beginPath();
|
|
|
|
context.arc(w/2, r+h/2, r, deg+Math.PI*3/2, -deg+Math.PI*3/2, true);
|
|
|
|
} else {
|
|
|
|
context.beginPath();
|
|
|
|
context.moveTo(0, height/2);
|
|
|
|
context.lineTo(width, height/2);
|
|
|
|
}
|
|
|
|
context.stroke();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
menu: Menu {
|
|
|
|
Action {
|
|
|
|
text: qsTr("Settings") + "..."
|
|
|
|
onTriggered: styleDialog.active = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Loader {
|
|
|
|
id: styleDialog
|
|
|
|
active: false
|
|
|
|
sourceComponent: NVG.Window {
|
|
|
|
id: window
|
|
|
|
title: qsTr("Settings")
|
|
|
|
visible: true
|
|
|
|
minimumWidth: 380
|
|
|
|
minimumHeight: 500
|
|
|
|
width: minimumWidth
|
|
|
|
height: minimumHeight
|
|
|
|
|
|
|
|
transientParent: widget.NVG.View.window
|
|
|
|
|
|
|
|
property var configuration
|
|
|
|
|
|
|
|
Page {
|
|
|
|
id: cfg_page
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
|
|
header: TitleBar {
|
|
|
|
text: qsTr("Ordinal Scale Bottom UI widget")
|
|
|
|
|
|
|
|
standardButtons: Dialog.Save | Dialog.Reset
|
|
|
|
|
|
|
|
onAccepted: {
|
|
|
|
configuration = rootPreference.save();
|
|
|
|
widget.settings.styles = configuration;
|
|
|
|
styleDialog.active = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
onReset: {
|
|
|
|
rootPreference.load();
|
|
|
|
let cfg = rootPreference.save();
|
|
|
|
widget.settings.styles = cfg;
|
|
|
|
line.requestPaint();
|
|
|
|
triangle.requestPaint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
id: root
|
|
|
|
anchors.fill: parent
|
|
|
|
anchors.margins: 16
|
|
|
|
anchors.topMargin: 0
|
|
|
|
|
|
|
|
Flickable {
|
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
|
|
|
clip: true
|
|
|
|
contentWidth: preferenceLayout.implicitWidth
|
|
|
|
contentHeight: preferenceLayout.implicitHeight
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
id: preferenceLayout
|
|
|
|
width: root.width
|
|
|
|
|
|
|
|
P.PreferenceGroup {
|
|
|
|
id: rootPreference
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
|
|
|
label: qsTr("Configuration")
|
|
|
|
|
|
|
|
onPreferenceEdited: {
|
|
|
|
widget.settings.styles = rootPreference.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
P.SwitchPreference {
|
|
|
|
name: "Curve"
|
|
|
|
label: qsTr("Curve")
|
|
|
|
defaultValue: defaultValues["Curve"]
|
|
|
|
}
|
|
|
|
|
|
|
|
P.ColorPreference {
|
|
|
|
name: "Line Color"
|
|
|
|
label: qsTr("Line Color")
|
|
|
|
defaultValue: defaultValues["Line Color"]
|
|
|
|
}
|
|
|
|
|
|
|
|
P.SliderPreference {
|
|
|
|
name: "Line Width"
|
|
|
|
label: qsTr("Line Width")
|
|
|
|
from: 1
|
|
|
|
to: 100
|
|
|
|
stepSize: 1
|
|
|
|
defaultValue: defaultValues["Line Width"]
|
|
|
|
displayValue: value + "%"
|
|
|
|
}
|
|
|
|
|
|
|
|
P.ColorPreference {
|
|
|
|
name: "Shadow Color"
|
|
|
|
label: qsTr("Shadow Color")
|
|
|
|
defaultValue: defaultValues["Shadow Color"]
|
|
|
|
}
|
|
|
|
|
|
|
|
P.SliderPreference {
|
|
|
|
name: "Shadow Size"
|
|
|
|
label: qsTr("Shadow Size")
|
|
|
|
from: 0
|
|
|
|
to: 3
|
|
|
|
stepSize: 0.1
|
|
|
|
defaultValue: defaultValues["Shadow Size"]
|
|
|
|
displayValue: Math.round(value*10)/10 + "px"
|
|
|
|
}
|
|
|
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
if(!widget.settings.styles) {
|
|
|
|
configuration = rootPreference.save();
|
|
|
|
widget.settings.styles = configuration;
|
|
|
|
}
|
|
|
|
rootPreference.load(widget.settings.styles);
|
|
|
|
configuration = widget.settings.styles;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onClosing: {
|
|
|
|
widget.settings.styles = configuration;
|
|
|
|
styleDialog.active = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|