forked from Shinonome/dots-hyprland
action center: toggle pages
This commit is contained in:
+113
-23
@@ -1,10 +1,13 @@
|
||||
pragma ComponentBehavior: Bound
|
||||
import Qt.labs.synchronizer
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
import Quickshell
|
||||
import qs
|
||||
import qs.services
|
||||
import qs.modules.common
|
||||
import qs.modules.common.widgets
|
||||
import qs.modules.common.models.quickToggles
|
||||
import qs.modules.common.functions
|
||||
import qs.modules.waffle.looks
|
||||
@@ -13,37 +16,124 @@ import qs.modules.waffle.actionCenter.toggles
|
||||
Item {
|
||||
id: root
|
||||
|
||||
property int columns: 3
|
||||
property int rows: 2
|
||||
property int currentPage: 0
|
||||
property alias columns: grid.columns
|
||||
property alias rows: grid.rows
|
||||
readonly property int itemsPerPage: columns * rows
|
||||
readonly property int pages: Math.ceil(toggles.length / itemsPerPage)
|
||||
property list<string> toggles: Config.options.waffles.actionCenter.toggles
|
||||
property list<string> togglesInCurrentPage: toggles.slice(currentPage * itemsPerPage, (currentPage + 1) * itemsPerPage)
|
||||
|
||||
property real padding: 22
|
||||
implicitHeight: grid.implicitHeight + padding * 2
|
||||
property real reducedBottomPadding: 12
|
||||
implicitHeight: swipeView.implicitHeight + (padding - swipeView.padding) * 2 - reducedBottomPadding
|
||||
|
||||
GridLayout {
|
||||
id: grid
|
||||
anchors {
|
||||
fill: parent
|
||||
margins: parent.padding
|
||||
}
|
||||
function togglesInPage(index) {
|
||||
var start = index * root.itemsPerPage;
|
||||
var end = start + root.itemsPerPage;
|
||||
return root.toggles.slice(start, end);
|
||||
}
|
||||
|
||||
columns: 3
|
||||
rows: 2
|
||||
rowSpacing: 12
|
||||
columnSpacing: 12
|
||||
uniformCellHeights: true
|
||||
uniformCellWidths: true
|
||||
|
||||
Repeater {
|
||||
model: ScriptModel {
|
||||
values: root.togglesInCurrentPage
|
||||
}
|
||||
delegate: ActionCenterTogglesDelegateChooser {}
|
||||
function decreasePage() {
|
||||
if (root.currentPage > 0) {
|
||||
root.currentPage -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: pages indicator on the right
|
||||
function increasePage() {
|
||||
if (root.currentPage < (root.pages - 1)) {
|
||||
root.currentPage += 1;
|
||||
}
|
||||
}
|
||||
|
||||
clip: true
|
||||
SwipeView {
|
||||
id: swipeView
|
||||
anchors {
|
||||
fill: parent
|
||||
topMargin: root.padding - swipeView.padding
|
||||
bottomMargin: root.padding - swipeView.padding - root.reducedBottomPadding
|
||||
}
|
||||
padding: 4
|
||||
leftPadding: root.padding
|
||||
rightPadding: root.padding
|
||||
spacing: padding
|
||||
|
||||
orientation: Qt.Vertical
|
||||
clip: true
|
||||
Synchronizer on currentIndex {
|
||||
property alias source: root.currentPage
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: root.pages
|
||||
delegate: GridLayout {
|
||||
id: grid
|
||||
required property int index
|
||||
// width: SwipeView.view.width - root.padding * 2
|
||||
// height: SwipeView.view.height - root.padding * 2
|
||||
|
||||
columns: root.columns
|
||||
rows: root.rows
|
||||
rowSpacing: 12
|
||||
columnSpacing: 12
|
||||
|
||||
Repeater {
|
||||
model: ScriptModel {
|
||||
values: root.togglesInPage(grid.index)
|
||||
}
|
||||
delegate: ActionCenterTogglesDelegateChooser {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 6
|
||||
spacing: 6
|
||||
|
||||
FluentIcon {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
implicitSize: 12
|
||||
icon: "caret-up"
|
||||
color: Looks.colors.controlBg
|
||||
filled: true
|
||||
opacity: root.currentPage > 0 ? 1 : 0
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: root.pages
|
||||
delegate: Item {
|
||||
required property int index
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
implicitWidth: 6
|
||||
implicitHeight: 6
|
||||
|
||||
Circle {
|
||||
anchors.centerIn: parent
|
||||
diameter: index === root.currentPage ? 6 : 4
|
||||
color: Looks.colors.controlBg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FluentIcon {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
implicitSize: 12
|
||||
icon: "caret-down"
|
||||
color: Looks.colors.controlBg
|
||||
filled: true
|
||||
opacity: root.currentPage < (root.pages - 1) ? 1 : 0
|
||||
}
|
||||
}
|
||||
|
||||
FocusedScrollMouseArea {
|
||||
z: 999
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
hoverEnabled: false
|
||||
onScrollUp: decreasePage();
|
||||
onScrollDown: increasePage();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user