Reverted the labeled NSlider, which tends to trigger hard crashes when opening the settings
This commit is contained in:
parent
25c9217b6b
commit
050877bcb0
4 changed files with 123 additions and 192 deletions
|
|
@ -43,7 +43,7 @@ NLoader {
|
||||||
NText {
|
NText {
|
||||||
text: "DemoPanel"
|
text: "DemoPanel"
|
||||||
color: Colors.accentPrimary
|
color: Colors.accentPrimary
|
||||||
font.pointSize: Style.fontSizeXL* scaling
|
font.pointSize: Style.fontSizeXL * scaling
|
||||||
font.weight: Style.fontWeightBold
|
font.weight: Style.fontWeightBold
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
}
|
}
|
||||||
|
|
@ -60,20 +60,25 @@ NLoader {
|
||||||
color: Colors.accentSecondary
|
color: Colors.accentSecondary
|
||||||
font.weight: Style.fontWeightBold
|
font.weight: Style.fontWeightBold
|
||||||
}
|
}
|
||||||
|
NText {
|
||||||
|
text: `${Math.round(Scaling.overrideScale * 100)}%`
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
}
|
||||||
RowLayout {
|
RowLayout {
|
||||||
spacing: Style.marginSmall * scaling
|
spacing: Style.marginSmall * scaling
|
||||||
NSlider {
|
NSlider {
|
||||||
label: "Scaling"
|
id: scaleSlider
|
||||||
description: "Scaling goes brrrr"
|
from: 0.6
|
||||||
valueSuffix: "%"
|
to: 1.8
|
||||||
from: 60
|
stepSize: 0.01
|
||||||
to: 180
|
value: Scaling.overrideScale
|
||||||
stepSize: 1
|
|
||||||
value: Scaling.overrideScale * 100
|
|
||||||
implicitWidth: bgRect.width * 0.75
|
implicitWidth: bgRect.width * 0.75
|
||||||
onPressedChanged: function (pressed, value) {
|
onMoved: {
|
||||||
|
|
||||||
|
}
|
||||||
|
onPressedChanged: {
|
||||||
|
Scaling.overrideScale = value
|
||||||
Scaling.overrideEnabled = true
|
Scaling.overrideEnabled = true
|
||||||
Scaling.overrideScale = value / 100
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NIconButton {
|
NIconButton {
|
||||||
|
|
|
||||||
|
|
@ -10,13 +10,15 @@ import qs.Widgets
|
||||||
NLoader {
|
NLoader {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
readonly property real scaling: Scaling.scale(screen)
|
||||||
|
|
||||||
content: Component {
|
content: Component {
|
||||||
NPanel {
|
NPanel {
|
||||||
id: panel
|
id: panel
|
||||||
|
|
||||||
WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
|
WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand
|
||||||
|
|
||||||
readonly property real scaling: Scaling.scale(screen)
|
|
||||||
property int currentTabIndex: 0
|
property int currentTabIndex: 0
|
||||||
property var tabsModel: [{
|
property var tabsModel: [{
|
||||||
"label": "General",
|
"label": "General",
|
||||||
|
|
@ -74,8 +76,8 @@ NLoader {
|
||||||
border.color: Colors.backgroundTertiary
|
border.color: Colors.backgroundTertiary
|
||||||
border.width: Math.max(1, Style.borderMedium * scaling)
|
border.width: Math.max(1, Style.borderMedium * scaling)
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
width: (screen.width / 2) * scaling
|
width: (screen.width * 0.5) * scaling
|
||||||
height: (screen.height / 2) * scaling
|
height: (screen.height * 0.5) * scaling
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|
|
||||||
|
|
@ -116,20 +116,20 @@ ColumnLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wallpaper Interval
|
// Wallpaper Interval
|
||||||
NSlider {
|
// NSlider {
|
||||||
label: "Wallpaper Interval"
|
// label: "Wallpaper Interval"
|
||||||
description: "How often to change wallpapers automatically (in seconds)"
|
// description: "How often to change wallpapers automatically (in seconds)"
|
||||||
valueSuffix: "s"
|
// valueSuffix: "s"
|
||||||
from: 10
|
// from: 10
|
||||||
to: 900
|
// to: 900
|
||||||
stepSize: 10
|
// stepSize: 10
|
||||||
value: Settings.data.wallpaper.randomInterval
|
// value: Settings.data.wallpaper.randomInterval
|
||||||
onPressedChanged: function (pressed, value) {
|
// onPressedChanged: function (pressed, value) {
|
||||||
Settings.data.wallpaper.randomInterval = Math.round(value)
|
// Settings.data.wallpaper.randomInterval = Math.round(value)
|
||||||
}
|
// }
|
||||||
cutoutColor: Colors.backgroundPrimary
|
// cutoutColor: Colors.backgroundPrimary
|
||||||
Layout.fillWidth: true
|
// Layout.fillWidth: true
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
NDivider {
|
NDivider {
|
||||||
|
|
@ -229,36 +229,36 @@ ColumnLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transition FPS
|
// Transition FPS
|
||||||
NSlider {
|
// NSlider {
|
||||||
label: "Transition FPS"
|
// label: "Transition FPS"
|
||||||
description: "Frames per second for transition animations"
|
// description: "Frames per second for transition animations"
|
||||||
valueSuffix: " FPS"
|
// valueSuffix: " FPS"
|
||||||
from: 30
|
// from: 30
|
||||||
to: 500
|
// to: 500
|
||||||
stepSize: 5
|
// stepSize: 5
|
||||||
value: Settings.data.wallpaper.swww.transitionFps
|
// value: Settings.data.wallpaper.swww.transitionFps
|
||||||
onPressedChanged: function (pressed, value) {
|
// onPressedChanged: function (pressed, value) {
|
||||||
Settings.data.wallpaper.swww.transitionFps = Math.round(value)
|
// Settings.data.wallpaper.swww.transitionFps = Math.round(value)
|
||||||
}
|
// }
|
||||||
cutoutColor: Colors.backgroundPrimary
|
// cutoutColor: Colors.backgroundPrimary
|
||||||
Layout.fillWidth: true
|
// Layout.fillWidth: true
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Transition Duration
|
// Transition Duration
|
||||||
NSlider {
|
// NSlider {
|
||||||
label: "Transition Duration"
|
// label: "Transition Duration"
|
||||||
description: "Duration of transition animations in seconds"
|
// description: "Duration of transition animations in seconds"
|
||||||
valueSuffix: "s"
|
// valueSuffix: "s"
|
||||||
from: 0.25
|
// from: 0.25
|
||||||
to: 10
|
// to: 10
|
||||||
stepSize: 0.05
|
// stepSize: 0.05
|
||||||
value: Settings.data.wallpaper.swww.transitionDuration
|
// value: Settings.data.wallpaper.swww.transitionDuration
|
||||||
onPressedChanged: function (pressed, value) {
|
// onPressedChanged: function (pressed, value) {
|
||||||
Settings.data.wallpaper.swww.transitionDuration = value
|
// Settings.data.wallpaper.swww.transitionDuration = value
|
||||||
}
|
// }
|
||||||
cutoutColor: Colors.backgroundPrimary
|
// cutoutColor: Colors.backgroundPrimary
|
||||||
Layout.fillWidth: true
|
// Layout.fillWidth: true
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Effects
|
import QtQuick.Effects
|
||||||
import QtQuick.Layouts
|
|
||||||
import qs.Services
|
import qs.Services
|
||||||
|
|
||||||
ColumnLayout {
|
Slider {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
readonly property real scaling: Scaling.scale(screen)
|
readonly property real scaling: Scaling.scale(screen)
|
||||||
|
|
@ -12,101 +11,27 @@ ColumnLayout {
|
||||||
readonly property real trackHeight: knobDiameter * 0.5
|
readonly property real trackHeight: knobDiameter * 0.5
|
||||||
readonly property real cutoutExtra: Style.baseWidgetSize * 0.1 * scaling
|
readonly property real cutoutExtra: Style.baseWidgetSize * 0.1 * scaling
|
||||||
|
|
||||||
property string label: ""
|
|
||||||
property string description: ""
|
|
||||||
property string valueSuffix: ""
|
|
||||||
property real from: 0.0
|
|
||||||
property real to: 1.0
|
|
||||||
property real stepSize: 0.01
|
|
||||||
property real value: 0.0
|
|
||||||
|
|
||||||
// Optional color to cut the track beneath the knob (should match surrounding background)
|
// Optional color to cut the track beneath the knob (should match surrounding background)
|
||||||
property var cutoutColor
|
property var cutoutColor
|
||||||
property var screen
|
property var screen
|
||||||
property bool snapAlways: true
|
property bool snapAlways: true
|
||||||
|
|
||||||
signal pressedChanged(bool pressed, real value)
|
|
||||||
signal moved(real value)
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
|
||||||
spacing: Style.marginSmall * scaling
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
spacing: Style.marginTiniest * scaling
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: label
|
|
||||||
font.pointSize: Style.fontSizeMedium * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
color: Colors.textPrimary
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: description
|
|
||||||
font.pointSize: Style.fontSizeSmall * scaling
|
|
||||||
color: Colors.textSecondary
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: {
|
|
||||||
var v
|
|
||||||
if (Number.isInteger(value)) {
|
|
||||||
v = value
|
|
||||||
} else {
|
|
||||||
v = value.toFixed(2)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valueSuffix != "") {
|
|
||||||
return v + valueSuffix
|
|
||||||
} else {
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
font.pointSize: Style.fontSizeMedium * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
color: Colors.textPrimary
|
|
||||||
Layout.alignment: Qt.AlignBottom | Qt.AlignRight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Slider {
|
|
||||||
id: slider
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
|
||||||
from: root.from
|
|
||||||
to: root.to
|
|
||||||
stepSize: root.stepSize
|
|
||||||
value: root.value
|
|
||||||
snapMode: snapAlways ? Slider.SnapAlways : Slider.SnapOnRelease
|
snapMode: snapAlways ? Slider.SnapAlways : Slider.SnapOnRelease
|
||||||
implicitWidth: root.width
|
|
||||||
implicitHeight: Math.max(trackHeight, knobDiameter)
|
implicitHeight: Math.max(trackHeight, knobDiameter)
|
||||||
onPressedChanged: {
|
|
||||||
root.pressedChanged(slider.pressed, slider.value)
|
|
||||||
}
|
|
||||||
onMoved: {
|
|
||||||
root.value = slider.value
|
|
||||||
root.moved(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
x: slider.leftPadding
|
x: root.leftPadding
|
||||||
y: slider.topPadding + slider.availableHeight / 2 - height / 2
|
y: root.topPadding + root.availableHeight / 2 - height / 2
|
||||||
implicitWidth: Style.sliderWidth
|
implicitWidth: Style.sliderWidth
|
||||||
implicitHeight: trackHeight
|
implicitHeight: trackHeight
|
||||||
width: slider.availableWidth
|
width: root.availableWidth
|
||||||
height: implicitHeight
|
height: implicitHeight
|
||||||
radius: height / 2
|
radius: height / 2
|
||||||
color: Colors.surfaceVariant
|
color: Colors.surfaceVariant
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: activeTrack
|
id: activeTrack
|
||||||
width: slider.visualPosition * parent.width
|
width: root.visualPosition * parent.width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
color: Colors.accentPrimary
|
color: Colors.accentPrimary
|
||||||
radius: parent.radius
|
radius: parent.radius
|
||||||
|
|
@ -118,9 +43,9 @@ ColumnLayout {
|
||||||
width: knobDiameter + cutoutExtra
|
width: knobDiameter + cutoutExtra
|
||||||
height: knobDiameter + cutoutExtra
|
height: knobDiameter + cutoutExtra
|
||||||
radius: width / 2
|
radius: width / 2
|
||||||
color: slider.cutoutColor !== undefined ? slider.cutoutColor : Colors.backgroundPrimary
|
color: root.cutoutColor !== undefined ? root.cutoutColor : Colors.backgroundPrimary
|
||||||
x: Math.max(0, Math.min(parent.width - width,
|
x: Math.max(0, Math.min(parent.width - width,
|
||||||
slider.visualPosition * (parent.width - knobDiameter) - cutoutExtra / 2))
|
root.visualPosition * (parent.width - root.knobDiameter) - cutoutExtra / 2))
|
||||||
y: (parent.height - height) / 2
|
y: (parent.height - height) / 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -128,8 +53,8 @@ ColumnLayout {
|
||||||
handle: Item {
|
handle: Item {
|
||||||
width: knob.implicitWidth
|
width: knob.implicitWidth
|
||||||
height: knob.implicitHeight
|
height: knob.implicitHeight
|
||||||
x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width)
|
x: root.leftPadding + root.visualPosition * (root.availableWidth - width)
|
||||||
y: slider.topPadding + slider.availableHeight / 2 - height / 2
|
y: root.topPadding + root.availableHeight / 2 - height / 2
|
||||||
|
|
||||||
// Subtle shadow for a more polished look (keeps theme colors)
|
// Subtle shadow for a more polished look (keeps theme colors)
|
||||||
MultiEffect {
|
MultiEffect {
|
||||||
|
|
@ -148,7 +73,7 @@ ColumnLayout {
|
||||||
implicitWidth: knobDiameter
|
implicitWidth: knobDiameter
|
||||||
implicitHeight: knobDiameter
|
implicitHeight: knobDiameter
|
||||||
radius: width * 0.5
|
radius: width * 0.5
|
||||||
color: slider.pressed ? Colors.surfaceVariant : Colors.surface
|
color: root.pressed ? Colors.surfaceVariant : Colors.surface
|
||||||
border.color: Colors.accentPrimary
|
border.color: Colors.accentPrimary
|
||||||
border.width: Math.max(1, Style.borderThick * scaling)
|
border.width: Math.max(1, Style.borderThick * scaling)
|
||||||
|
|
||||||
|
|
@ -159,8 +84,7 @@ ColumnLayout {
|
||||||
height: parent.height + 8 * scaling
|
height: parent.height + 8 * scaling
|
||||||
radius: width / 2
|
radius: width / 2
|
||||||
color: Colors.accentPrimary
|
color: Colors.accentPrimary
|
||||||
opacity: slider.pressed ? 0.16 : 0.0
|
opacity: root.pressed ? 0.16 : 0.0
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue