refactored default state stuff to be in the container component instead of repeated 4 times

This commit is contained in:
2026-08-12 12:27:12 +01:00
parent 802b077362
commit dc82f5a0ae
5 changed files with 97 additions and 194 deletions

View File

@@ -18,61 +18,16 @@ Container {
animOffset: 150 animOffset: 150
boxColor: Colors.green boxColor: Colors.green
boxHeight: 25
boxHeightOpened: root.batteryDisplayHeight
boxRadius: radius boxRadius: radius
boxWidth: 60
boxWidthOpened: 410
defaultItem: icon defaultItem: icon
exclusiveMonitor: root.monitor exclusiveMonitor: root.monitor
exclusiveToScreen: true exclusiveToScreen: true
forceHidden: !BatteryManager.hasLaptopBattery forceHidden: !BatteryManager.hasLaptopBattery
openedItem: batteryDisplay
states: [
State {
name: "closed"
when: root.hovered == false && root.opened == false
PropertyChanges {
root.boxHeight: 25
root.boxRadius: root.radius
root.boxWidth: 60
}
},
State {
name: "hovered"
when: root.hovered == true && root.opened == false
PropertyChanges {
root.boxHeight: 28
root.boxWidth: 64
}
},
State {
name: "opened"
when: root.opened == true && root.hovered == true
PropertyChanges {
root.boxHeight: root.batteryDisplayHeight
root.boxRadius: 12
root.boxWidth: 450
}
StateChangeScript {
script: {
stack.replace(batteryDisplay);
}
}
}
]
hover.onHoveredChanged: {
if (hover.hovered == false) {
root.opened = false;
if (root.state != "icon") {
root.stack.replace(icon);
}
}
}
tap.onTapped: {
root.opened = true;
}
Component { Component {
id: icon id: icon

View File

@@ -14,67 +14,19 @@ Container {
property double devicePlaqueHeight: 60 property double devicePlaqueHeight: 60
property double devicePlaqueSpacing: 4 property double devicePlaqueSpacing: 4
required property HyprlandMonitor monitor required property HyprlandMonitor monitor
property bool opened: false
animOffset: 200 animOffset: 200
boxColor: Colors.peach boxColor: Colors.peach
boxHeight: 25 boxHeight: 25
boxHeightOpened: (root.devicePlaqueHeight * BluetoothManager.getConnectedDevicesList().length) + (
root.devicePlaqueSpacing * (BluetoothManager.getConnectedDevicesList().length + 1)) + 2
boxWidth: 33 boxWidth: 33
boxWidthOpened: 350
defaultItem: icon defaultItem: icon
exclusiveMonitor: root.monitor exclusiveMonitor: root.monitor
exclusiveToScreen: true exclusiveToScreen: true
forceHidden: !BluetoothManager.anyConnected forceHidden: !BluetoothManager.anyConnected
openedItem: deviceList
states: [
State {
name: "closed"
when: root.hovered == false && root.opened == false
PropertyChanges {
root.boxHeight: 25
root.boxRadius: 9
root.boxWidth: 33
}
},
State {
name: "hovered"
when: root.hovered == true && root.opened == false
PropertyChanges {
root.boxHeight: 28
root.boxWidth: 35
}
},
State {
name: "opened"
when: root.opened == true && root.hovered == true
PropertyChanges {
root.boxHeight: (root.devicePlaqueHeight * BluetoothManager.getConnectedDevicesList().length) + (
root.devicePlaqueSpacing * (BluetoothManager.getConnectedDevicesList().length + 1)) + 2
root.boxRadius: 12
root.boxWidth: 350
}
StateChangeScript {
script: {
stack.replace(deviceList);
}
}
}
]
hover.onHoveredChanged: {
if (hover.hovered == false) {
root.opened = false;
if (root.state != "icon") {
root.stack.replace(icon);
}
}
}
tap.onTapped: {
root.opened = true;
}
Component { Component {
id: icon id: icon

View File

@@ -13,66 +13,18 @@ Container {
required property HyprlandMonitor monitor required property HyprlandMonitor monitor
property double networkDisplayHeight: 80 property double networkDisplayHeight: 80
property bool opened: false
animOffset: 250 animOffset: 250
boxColor: Colors.red boxColor: Colors.red
boxHeight: 25 boxHeight: 25
boxHeightOpened: root.networkDisplayHeight
boxWidth: 33 boxWidth: 33
boxWidthOpened: 350
defaultItem: icon defaultItem: icon
exclusiveMonitor: root.monitor exclusiveMonitor: root.monitor
exclusiveToScreen: true exclusiveToScreen: true
forceHidden: !NetworkManager.connectedWifi forceHidden: !NetworkManager.connectedWifi
openedItem: networkDisplay
states: [
State {
name: "closed"
when: root.hovered == false && root.opened == false
PropertyChanges {
root.boxHeight: 25
root.boxRadius: 9
root.boxWidth: 33
}
},
State {
name: "hovered"
when: root.hovered == true && root.opened == false
PropertyChanges {
root.boxHeight: 28
root.boxWidth: 35
}
},
State {
name: "opened"
when: root.opened == true && root.hovered == true
PropertyChanges {
root.boxHeight: root.networkDisplayHeight
root.boxRadius: 12
root.boxWidth: 350
}
StateChangeScript {
script: {
stack.replace(wifiInfo);
}
}
}
]
hover.onHoveredChanged: {
if (hover.hovered == false) {
root.opened = false;
if (root.state != "icon") {
root.stack.replace(icon);
}
}
}
tap.onTapped: {
root.opened = true;
}
Component { Component {
id: icon id: icon
@@ -86,7 +38,7 @@ Container {
} }
Component { Component {
id: wifiInfo id: networkDisplay
Item { Item {
id: networkDisplayRoot id: networkDisplayRoot

View File

@@ -22,7 +22,6 @@ Container {
property double notificationHeight: 100 property double notificationHeight: 100
property double notificationWidth: 350 property double notificationWidth: 350
property bool notified: false property bool notified: false
property bool overriden: false
boxColor: Colors.mauve boxColor: Colors.mauve
defaultItem: time defaultItem: time
@@ -30,43 +29,6 @@ Container {
exclusiveToScreen: true exclusiveToScreen: true
states: [ states: [
State {
name: "closed"
when: root.hovered == false && root.overriden == false
PropertyChanges {
root.boxHeight: 28
root.boxRadius: 9
root.boxWidth: 100
}
StateChangeScript {
script: {
if (!root.stack.currentItem) {
return;
}
if (root.stack.currentItem.component != "time") {
root.stack.replace(time);
}
}
}
},
State {
name: "hovered"
when: root.hovered == true && root.overriden == false
PropertyChanges {
root.boxHeight: MprisManager.getPlaying() == false ? 32 : root.mprisHeight
root.boxRadius: 12
root.boxWidth: MprisManager.getPlaying() == false ? 107 : root.mprisWidth
}
StateChangeScript {
script: {
root.stack.replace(MprisManager.getPlaying() == true ? mprisToast : time);
}
}
},
State { State {
name: "notified" name: "notified"
when: root.notified == true when: root.notified == true
@@ -105,6 +67,16 @@ Container {
} }
] ]
onHoveredChanged: {
if (root.hovered == true && MprisManager.getPlaying() == true) {
root.overriden = true;
root.mpris = true;
} else {
root.overriden = false;
root.mpris = true;
}
}
Connections { Connections {
function onNewNotification() { function onNewNotification() {
notification => { notification => {

View File

@@ -14,8 +14,12 @@ Item {
property double animOffset: 0 property double animOffset: 0
property color boxColor: Colors.surface0 property color boxColor: Colors.surface0
property double boxHeight: 28 property double boxHeight: 28
property double boxHeightOpened: 150
property bool boxOpened: false
property double boxRadius: 9 property double boxRadius: 9
property double boxRadiusOpened: 12
property double boxWidth: 100 property double boxWidth: 100
property double boxWidthOpened: 200
readonly property double calculatedTopMargin: { readonly property double calculatedTopMargin: {
if (!root.exclusiveToScreen) { if (!root.exclusiveToScreen) {
return visibleTopMargin; return visibleTopMargin;
@@ -38,6 +42,8 @@ Item {
property alias hover: hoverHandler property alias hover: hoverHandler
property bool hoverableWhenHidden: false property bool hoverableWhenHidden: false
property bool hovered: false property bool hovered: false
property Component openedItem
property bool overriden: false
property alias rect: container property alias rect: container
property alias stack: containerContent property alias stack: containerContent
property alias tap: tapHandler property alias tap: tapHandler
@@ -50,13 +56,13 @@ Item {
Behavior on anchors.topMargin { Behavior on anchors.topMargin {
animation: defaultCurve animation: defaultCurve
} }
Behavior on boxHeight { Behavior on boxRadius {
SpringAnimation { SpringAnimation {
damping: 0.3 damping: 0.3
spring: 4 spring: 4
} }
} }
Behavior on boxRadius { Behavior on implicitHeight {
SpringAnimation { SpringAnimation {
damping: 0.3 damping: 0.3
spring: 4 spring: 4
@@ -68,6 +74,56 @@ Item {
spring: 4 spring: 4
} }
} }
states: [
State {
name: "closed"
when: root.hovered == false && root.boxOpened == false && root.overriden == false
PropertyChanges {
container.radius: root.boxRadius
root.implicitHeight: root.boxHeight
root.implicitWidth: root.boxWidth
}
StateChangeScript {
script: {
stack.replace(root.defaultItem);
}
}
},
State {
name: "hovered"
when: root.hovered == true && root.boxOpened == false && root.overriden == false
PropertyChanges {
container.radius: root.boxRadius + 3
root.implicitHeight: root.boxHeight + 2
root.implicitWidth: root.boxWidth + 2
}
StateChangeScript {
script: {
stack.replace(root.defaultItem);
}
}
},
State {
name: "opened"
when: root.boxOpened == true && root.hovered == true && root.overriden == false
PropertyChanges {
container.radius: root.boxRadiusOpened
root.implicitHeight: root.boxHeightOpened
root.implicitWidth: root.boxWidthOpened
}
StateChangeScript {
script: {
stack.replace(root.openedItem);
}
}
}
]
onForceHiddenChanged: { onForceHiddenChanged: {
if (root.forceHidden == true) { if (root.forceHidden == true) {
@@ -125,12 +181,22 @@ Item {
root.hovered = true; root.hovered = true;
} else { } else {
root.hovered = false; root.hovered = false;
root.boxOpened = false;
if (root.state == "closed") {
root.stack.replace(root.defaultItem);
}
} }
} }
} }
TapHandler { TapHandler {
id: tapHandler id: tapHandler
onTapped: {
if (root.openedItem) {
root.boxOpened = true;
}
}
} }
Rectangle { Rectangle {
@@ -141,6 +207,12 @@ Item {
color: root.boxColor color: root.boxColor
radius: root.boxRadius radius: root.boxRadius
Behavior on radius {
NumberAnimation {
duration: 300
}
}
StackView { StackView {
id: containerContent id: containerContent