Organize #12

Merged
Zacharias-Brohn merged 4 commits from organize into settingsWindow 2026-02-23 18:23:28 +01:00
41 changed files with 1784 additions and 104 deletions
+1 -1
View File
@@ -30,5 +30,5 @@ if("shell" IN_LIST ENABLE_MODULES)
foreach(dir assets scripts Components Config Modules Daemons Drawers Effects Helpers Paths) foreach(dir assets scripts Components Config Modules Daemons Drawers Effects Helpers Paths)
install(DIRECTORY ${dir} DESTINATION "${INSTALL_QSCONFDIR}") install(DIRECTORY ${dir} DESTINATION "${INSTALL_QSCONFDIR}")
endforeach() endforeach()
install(FILES shell.qml Bar.qml Wallpaper.qml DESTINATION "${INSTALL_QSCONFDIR}") install(FILES shell.qml DESTINATION "${INSTALL_QSCONFDIR}")
endif() endif()
+323
View File
@@ -0,0 +1,323 @@
pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
Component.onCompleted: {
// Trigger ethernet device detection after initialization
Qt.callLater(() => {
getEthernetDevices();
});
// Load saved connections on startup
Nmcli.loadSavedConnections(() => {
root.savedConnections = Nmcli.savedConnections;
root.savedConnectionSsids = Nmcli.savedConnectionSsids;
});
// Get initial WiFi status
Nmcli.getWifiStatus(enabled => {
root.wifiEnabled = enabled;
});
// Sync networks from Nmcli on startup
Qt.callLater(() => {
syncNetworksFromNmcli();
}, 100);
}
readonly property list<AccessPoint> networks: []
readonly property AccessPoint active: networks.find(n => n.active) ?? null
property bool wifiEnabled: true
readonly property bool scanning: Nmcli.scanning
property list<var> ethernetDevices: []
readonly property var activeEthernet: ethernetDevices.find(d => d.connected) ?? null
property int ethernetDeviceCount: 0
property bool ethernetProcessRunning: false
property var ethernetDeviceDetails: null
property var wirelessDeviceDetails: null
function enableWifi(enabled: bool): void {
Nmcli.enableWifi(enabled, result => {
if (result.success) {
root.getWifiStatus();
Nmcli.getNetworks(() => {
syncNetworksFromNmcli();
});
}
});
}
function toggleWifi(): void {
Nmcli.toggleWifi(result => {
if (result.success) {
root.getWifiStatus();
Nmcli.getNetworks(() => {
syncNetworksFromNmcli();
});
}
});
}
function rescanWifi(): void {
Nmcli.rescanWifi();
}
property var pendingConnection: null
signal connectionFailed(string ssid)
function connectToNetwork(ssid: string, password: string, bssid: string, callback: var): void {
// Set up pending connection tracking if callback provided
if (callback) {
const hasBssid = bssid !== undefined && bssid !== null && bssid.length > 0;
root.pendingConnection = {
ssid: ssid,
bssid: hasBssid ? bssid : "",
callback: callback
};
}
Nmcli.connectToNetwork(ssid, password, bssid, result => {
if (result && result.success) {
// Connection successful
if (callback)
callback(result);
root.pendingConnection = null;
} else if (result && result.needsPassword) {
// Password needed - callback will handle showing dialog
if (callback)
callback(result);
} else {
// Connection failed
if (result && result.error) {
root.connectionFailed(ssid);
}
if (callback)
callback(result);
root.pendingConnection = null;
}
});
}
function connectToNetworkWithPasswordCheck(ssid: string, isSecure: bool, callback: var, bssid: string): void {
// Set up pending connection tracking
const hasBssid = bssid !== undefined && bssid !== null && bssid.length > 0;
root.pendingConnection = {
ssid: ssid,
bssid: hasBssid ? bssid : "",
callback: callback
};
Nmcli.connectToNetworkWithPasswordCheck(ssid, isSecure, result => {
if (result && result.success) {
// Connection successful
if (callback)
callback(result);
root.pendingConnection = null;
} else if (result && result.needsPassword) {
// Password needed - callback will handle showing dialog
if (callback)
callback(result);
} else {
// Connection failed
if (result && result.error) {
root.connectionFailed(ssid);
}
if (callback)
callback(result);
root.pendingConnection = null;
}
}, bssid);
}
function disconnectFromNetwork(): void {
// Try to disconnect - use connection name if available, otherwise use device
Nmcli.disconnectFromNetwork();
// Refresh network list after disconnection
Qt.callLater(() => {
Nmcli.getNetworks(() => {
syncNetworksFromNmcli();
});
}, 500);
}
function forgetNetwork(ssid: string): void {
// Delete the connection profile for this network
// This will remove the saved password and connection settings
Nmcli.forgetNetwork(ssid, result => {
if (result.success) {
// Refresh network list after deletion
Qt.callLater(() => {
Nmcli.getNetworks(() => {
syncNetworksFromNmcli();
});
}, 500);
}
});
}
property list<string> savedConnections: []
property list<string> savedConnectionSsids: []
// Sync saved connections from Nmcli when they're updated
Connections {
target: Nmcli
function onSavedConnectionsChanged() {
root.savedConnections = Nmcli.savedConnections;
}
function onSavedConnectionSsidsChanged() {
root.savedConnectionSsids = Nmcli.savedConnectionSsids;
}
}
function syncNetworksFromNmcli(): void {
const rNetworks = root.networks;
const nNetworks = Nmcli.networks;
// Build a map of existing networks by key
const existingMap = new Map();
for (const rn of rNetworks) {
const key = `${rn.frequency}:${rn.ssid}:${rn.bssid}`;
existingMap.set(key, rn);
}
// Build a map of new networks by key
const newMap = new Map();
for (const nn of nNetworks) {
const key = `${nn.frequency}:${nn.ssid}:${nn.bssid}`;
newMap.set(key, nn);
}
// Remove networks that no longer exist
for (const [key, network] of existingMap) {
if (!newMap.has(key)) {
const index = rNetworks.indexOf(network);
if (index >= 0) {
rNetworks.splice(index, 1);
network.destroy();
}
}
}
// Add or update networks from Nmcli
for (const [key, nNetwork] of newMap) {
const existing = existingMap.get(key);
if (existing) {
// Update existing network's lastIpcObject
existing.lastIpcObject = nNetwork.lastIpcObject;
} else {
// Create new AccessPoint from Nmcli's data
rNetworks.push(apComp.createObject(root, {
lastIpcObject: nNetwork.lastIpcObject
}));
}
}
}
component AccessPoint: QtObject {
required property var lastIpcObject
readonly property string ssid: lastIpcObject.ssid
readonly property string bssid: lastIpcObject.bssid
readonly property int strength: lastIpcObject.strength
readonly property int frequency: lastIpcObject.frequency
readonly property bool active: lastIpcObject.active
readonly property string security: lastIpcObject.security
readonly property bool isSecure: security.length > 0
}
Component {
id: apComp
AccessPoint {}
}
function hasSavedProfile(ssid: string): bool {
// Use Nmcli's hasSavedProfile which has the same logic
return Nmcli.hasSavedProfile(ssid);
}
function getWifiStatus(): void {
Nmcli.getWifiStatus(enabled => {
root.wifiEnabled = enabled;
});
}
function getEthernetDevices(): void {
root.ethernetProcessRunning = true;
Nmcli.getEthernetInterfaces(interfaces => {
root.ethernetDevices = Nmcli.ethernetDevices;
root.ethernetDeviceCount = Nmcli.ethernetDevices.length;
root.ethernetProcessRunning = false;
});
}
function connectEthernet(connectionName: string, interfaceName: string): void {
Nmcli.connectEthernet(connectionName, interfaceName, result => {
if (result.success) {
getEthernetDevices();
// Refresh device details after connection
Qt.callLater(() => {
const activeDevice = root.ethernetDevices.find(function (d) {
return d.connected;
});
if (activeDevice && activeDevice.interface) {
updateEthernetDeviceDetails(activeDevice.interface);
}
}, 1000);
}
});
}
function disconnectEthernet(connectionName: string): void {
Nmcli.disconnectEthernet(connectionName, result => {
if (result.success) {
getEthernetDevices();
// Clear device details after disconnection
Qt.callLater(() => {
root.ethernetDeviceDetails = null;
});
}
});
}
function updateEthernetDeviceDetails(interfaceName: string): void {
Nmcli.getEthernetDeviceDetails(interfaceName, details => {
root.ethernetDeviceDetails = details;
});
}
function updateWirelessDeviceDetails(): void {
// Find the wireless interface by looking for wifi devices
// Pass empty string to let Nmcli find the active interface automatically
Nmcli.getWirelessDeviceDetails("", details => {
root.wirelessDeviceDetails = details;
});
}
function cidrToSubnetMask(cidr: string): string {
// Convert CIDR notation (e.g., "24") to subnet mask (e.g., "255.255.255.0")
const cidrNum = parseInt(cidr);
if (isNaN(cidrNum) || cidrNum < 0 || cidrNum > 32) {
return "";
}
const mask = (0xffffffff << (32 - cidrNum)) >>> 0;
const octets = [(mask >>> 24) & 0xff, (mask >>> 16) & 0xff, (mask >>> 8) & 0xff, mask & 0xff];
return octets.join(".");
}
Process {
running: true
command: ["nmcli", "m"]
stdout: SplitParser {
onRead: {
Nmcli.getNetworks(() => {
syncNetworksFromNmcli();
});
getEthernetDevices();
}
}
}
}
+1352
View File
File diff suppressed because it is too large Load Diff
View File
+2 -2
View File
@@ -1,6 +1,6 @@
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Shapes import qs.Components
import qs.Modules as Modules import qs.Modules as Modules
import qs.Modules.Notifications as Notifications import qs.Modules.Notifications as Notifications
import qs.Modules.Notifications.Sidebar as Sidebar import qs.Modules.Notifications.Sidebar as Sidebar
@@ -33,7 +33,7 @@ Item {
// anchors.margins: 8 // anchors.margins: 8
anchors.topMargin: Config.barConfig.autoHide && !visibilities.bar ? 0 : bar.implicitHeight anchors.topMargin: Config.barConfig.autoHide && !visibilities.bar ? 0 : bar.implicitHeight
Behavior on anchors.topMargin { Behavior on anchors.topMargin {
Modules.Anim {} Anim {}
} }
Osd.Wrapper { Osd.Wrapper {
@@ -1,7 +1,6 @@
pragma Singleton pragma Singleton
import Quickshell import Quickshell
import Quickshell.Services.Notifications
Singleton { Singleton {
id: root id: root
+1 -1
View File
@@ -5,7 +5,7 @@ import Quickshell
import Quickshell.Wayland import Quickshell.Wayland
import QtQuick import QtQuick
import QtQuick.Effects import QtQuick.Effects
import qs.Modules import qs.Components
import qs.Config import qs.Config
import qs.Helpers import qs.Helpers
+1
View File
@@ -1,5 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
import qs.Components
import qs.Config import qs.Config
ShapePath { ShapePath {
+1 -2
View File
@@ -4,10 +4,9 @@ import Quickshell
import Quickshell.Services.SystemTray import Quickshell.Services.SystemTray
import QtQuick import QtQuick
import qs.Config import qs.Config
import qs.Components
import qs.Modules.Calendar import qs.Modules.Calendar
import qs.Modules.WSOverview import qs.Modules.WSOverview
import qs.Modules.Polkit
import qs.Modules.Dashboard
import qs.Modules.Network import qs.Modules.Network
import qs.Modules.UPower import qs.Modules.UPower
+1 -3
View File
@@ -1,7 +1,5 @@
import qs.Components import qs.Components
import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
@@ -62,6 +60,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
+1 -1
View File
@@ -5,7 +5,7 @@ import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import qs.Config import qs.Config
import qs.Modules import qs.Components
Item { Item {
id: root id: root
+1 -2
View File
@@ -2,7 +2,6 @@ import QtQuick
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
Row { Row {
id: root id: root
@@ -91,7 +90,7 @@ Row {
} }
Behavior on value { Behavior on value {
Modules.Anim { Anim {
duration: Appearance.anim.durations.large duration: Appearance.anim.durations.large
} }
} }
+2 -5
View File
@@ -1,12 +1,9 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import ZShell
import Quickshell import Quickshell
import QtQuick import QtQuick
import qs.Components import qs.Components
import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
Item { Item {
id: root id: root
@@ -46,7 +43,7 @@ Item {
from: "" from: ""
to: "visible" to: "visible"
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
@@ -57,7 +54,7 @@ Item {
from: "visible" from: "visible"
to: "" to: ""
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
+13 -15
View File
@@ -5,9 +5,7 @@ import QtQuick
import qs.Modules.Launcher.Services import qs.Modules.Launcher.Services
import qs.Modules.Launcher.Items import qs.Modules.Launcher.Items
import qs.Components import qs.Components
import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
CustomListView { CustomListView {
id: root id: root
@@ -41,7 +39,7 @@ CustomListView {
implicitHeight: root.currentItem?.implicitHeight ?? 0 implicitHeight: root.currentItem?.implicitHeight ?? 0
Behavior on y { Behavior on y {
Modules.Anim { Anim {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects easing.bezierCurve: Appearance.anim.curves.expressiveEffects
} }
@@ -92,7 +90,7 @@ CustomListView {
transitions: Transition { transitions: Transition {
SequentialAnimation { SequentialAnimation {
ParallelAnimation { ParallelAnimation {
Modules.Anim { Anim {
target: root target: root
property: "opacity" property: "opacity"
from: 1 from: 1
@@ -100,7 +98,7 @@ CustomListView {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects easing.bezierCurve: Appearance.anim.curves.expressiveEffects
} }
Modules.Anim { Anim {
target: root target: root
property: "scale" property: "scale"
from: 1 from: 1
@@ -114,7 +112,7 @@ CustomListView {
properties: "values,delegate" properties: "values,delegate"
} }
ParallelAnimation { ParallelAnimation {
Modules.Anim { Anim {
target: root target: root
property: "opacity" property: "opacity"
from: 0 from: 0
@@ -122,7 +120,7 @@ CustomListView {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
easing.bezierCurve: Appearance.anim.curves.expressiveEffects easing.bezierCurve: Appearance.anim.curves.expressiveEffects
} }
Modules.Anim { Anim {
target: root target: root
property: "scale" property: "scale"
from: 0.9 from: 0.9
@@ -146,7 +144,7 @@ CustomListView {
add: Transition { add: Transition {
enabled: !root.state enabled: !root.state
Modules.Anim { Anim {
properties: "opacity,scale" properties: "opacity,scale"
from: 0 from: 0
to: 1 to: 1
@@ -156,7 +154,7 @@ CustomListView {
remove: Transition { remove: Transition {
enabled: !root.state enabled: !root.state
Modules.Anim { Anim {
properties: "opacity,scale" properties: "opacity,scale"
from: 1 from: 1
to: 0 to: 0
@@ -164,31 +162,31 @@ CustomListView {
} }
move: Transition { move: Transition {
Modules.Anim { Anim {
property: "y" property: "y"
} }
Modules.Anim { Anim {
properties: "opacity,scale" properties: "opacity,scale"
to: 1 to: 1
} }
} }
addDisplaced: Transition { addDisplaced: Transition {
Modules.Anim { Anim {
property: "y" property: "y"
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
} }
Modules.Anim { Anim {
properties: "opacity,scale" properties: "opacity,scale"
to: 1 to: 1
} }
} }
displaced: Transition { displaced: Transition {
Modules.Anim { Anim {
property: "y" property: "y"
} }
Modules.Anim { Anim {
properties: "opacity,scale" properties: "opacity,scale"
to: 1 to: 1
} }
+1 -3
View File
@@ -1,9 +1,7 @@
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
import qs.Components import qs.Components
import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
ShapePath { ShapePath {
id: root id: root
@@ -56,6 +54,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
+2 -3
View File
@@ -6,7 +6,6 @@ import qs.Modules.Launcher.Services
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
Item { Item {
id: root id: root
@@ -176,13 +175,13 @@ Item {
} }
Behavior on width { Behavior on width {
Modules.Anim { Anim {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
} }
} }
Behavior on opacity { Behavior on opacity {
Modules.Anim { Anim {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
} }
} }
+2 -3
View File
@@ -4,7 +4,6 @@ import Quickshell
import QtQuick import QtQuick
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
Item { Item {
id: root id: root
@@ -43,7 +42,7 @@ Item {
SequentialAnimation { SequentialAnimation {
id: showAnim id: showAnim
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
to: root.contentHeight to: root.contentHeight
@@ -61,7 +60,7 @@ Item {
ScriptAction { ScriptAction {
script: root.implicitHeight = root.implicitHeight script: root.implicitHeight = root.implicitHeight
} }
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
to: 0 to: 0
+13 -18
View File
@@ -1,16 +1,11 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Wayland import Quickshell.Wayland
import QtQuick import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Effects import QtQuick.Effects
import qs.Config import qs.Config
import qs.Helpers import qs.Helpers
import qs.Effects
import qs.Components import qs.Components
import qs.Modules as Modules
WlSessionLockSurface { WlSessionLockSurface {
id: root id: root
@@ -34,32 +29,32 @@ WlSessionLockSurface {
id: unlockAnim id: unlockAnim
ParallelAnimation { ParallelAnimation {
Modules.Anim { Anim {
target: lockContent target: lockContent
properties: "implicitWidth,implicitHeight" properties: "implicitWidth,implicitHeight"
to: lockContent.size to: lockContent.size
duration: Appearance.anim.durations.expressiveDefaultSpatial duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
} }
Modules.Anim { Anim {
target: lockBg target: lockBg
property: "radius" property: "radius"
to: lockContent.radius to: lockContent.radius
} }
Modules.Anim { Anim {
target: content target: content
property: "scale" property: "scale"
to: 0 to: 0
duration: Appearance.anim.durations.expressiveDefaultSpatial duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
} }
Modules.Anim { Anim {
target: content target: content
property: "opacity" property: "opacity"
to: 0 to: 0
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
} }
Modules.Anim { Anim {
target: lockIcon target: lockIcon
property: "opacity" property: "opacity"
to: 1 to: 1
@@ -69,7 +64,7 @@ WlSessionLockSurface {
PauseAnimation { PauseAnimation {
duration: Appearance.anim.durations.small duration: Appearance.anim.durations.small
} }
Modules.Anim { Anim {
target: lockContent target: lockContent
property: "opacity" property: "opacity"
to: 0 to: 0
@@ -90,7 +85,7 @@ WlSessionLockSurface {
SequentialAnimation { SequentialAnimation {
ParallelAnimation { ParallelAnimation {
Modules.Anim { Anim {
target: lockContent target: lockContent
property: "scale" property: "scale"
to: 1 to: 1
@@ -99,36 +94,36 @@ WlSessionLockSurface {
} }
} }
ParallelAnimation { ParallelAnimation {
Modules.Anim { Anim {
target: lockIcon target: lockIcon
property: "opacity" property: "opacity"
to: 0 to: 0
} }
Modules.Anim { Anim {
target: content target: content
property: "opacity" property: "opacity"
to: 1 to: 1
} }
Modules.Anim { Anim {
target: content target: content
property: "scale" property: "scale"
to: 1 to: 1
duration: Appearance.anim.durations.expressiveDefaultSpatial duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
} }
Modules.Anim { Anim {
target: lockBg target: lockBg
property: "radius" property: "radius"
to: Appearance.rounding.large * 1.5 to: Appearance.rounding.large * 1.5
} }
Modules.Anim { Anim {
target: lockContent target: lockContent
property: "implicitWidth" property: "implicitWidth"
to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult * Config.lock.sizes.ratio
duration: Appearance.anim.durations.expressiveDefaultSpatial duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
} }
Modules.Anim { Anim {
target: lockContent target: lockContent
property: "implicitHeight" property: "implicitHeight"
to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult to: (root.screen?.height ?? 0) * Config.lock.sizes.heightMult
+1 -2
View File
@@ -1,6 +1,5 @@
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
@@ -49,6 +48,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
+1 -2
View File
@@ -1,6 +1,5 @@
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
@@ -49,6 +48,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
@@ -1,6 +1,5 @@
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
@@ -50,6 +49,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
@@ -1,9 +1,11 @@
import Quickshell.Bluetooth
import Quickshell.Networking as QSNetwork
import QtQuick
import QtQuick.Layouts
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules import qs.Modules
import qs.Daemons import qs.Daemons
import QtQuick
import QtQuick.Layouts
CustomRect { CustomRect {
id: root id: root
@@ -28,12 +30,50 @@ CustomRect {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: 7 spacing: 7
Toggle {
visible: QSNetwork.Networking.devices.values.length > 0
icon: Network.wifiEnabled ? "wifi" : "wifi_off"
checked: Network.wifiEnabled
onClicked: Network.toggleWifi()
}
Toggle { Toggle {
id: toggle id: toggle
icon: "notifications_off" icon: NotifServer.dnd ? "notifications_off" : "notifications"
checked: NotifServer.dnd checked: !NotifServer.dnd
onClicked: NotifServer.dnd = !NotifServer.dnd onClicked: NotifServer.dnd = !NotifServer.dnd
} }
Toggle {
icon: Audio.sourceMuted ? "mic_off" : "mic"
checked: !Audio.sourceMuted
onClicked: {
const audio = Audio.source?.audio;
if ( audio )
audio.muted = !audio.muted;
}
}
Toggle {
icon: Audio.muted ? "volume_off" : "volume_up"
checked: !Audio.muted
onClicked: {
const audio = Audio.sink?.audio;
if ( audio )
audio.muted = !audio.muted;
}
}
Toggle {
visible: Bluetooth.defaultAdapter?.enabled ?? false
icon: Bluetooth.defaultAdapter?.enabled ? "bluetooth" : "bluetooth_disabled"
checked: Bluetooth.defaultAdapter?.enabled ?? false
onClicked: {
const adapter = Bluetooth.defaultAdapter
if ( adapter )
adapter.enabled = !adapter.enabled;
}
}
} }
} }
@@ -1,6 +1,5 @@
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import qs.Helpers import qs.Helpers
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
@@ -99,25 +98,25 @@ CustomRect {
} }
Behavior on anchors.bottomMargin { Behavior on anchors.bottomMargin {
Modules.Anim { Anim {
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
} }
} }
Behavior on opacity { Behavior on opacity {
Modules.Anim { Anim {
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
} }
} }
Behavior on scale { Behavior on scale {
Modules.Anim {} Anim {}
} }
} }
Behavior on implicitHeight { Behavior on implicitHeight {
Modules.Anim { Anim {
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
} }
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import Quickshell import Quickshell
import QtQuick import QtQuick
@@ -47,7 +46,7 @@ Item {
from: "" from: ""
to: "visible" to: "visible"
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
@@ -58,7 +57,7 @@ Item {
from: "visible" from: "visible"
to: "" to: ""
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
+2 -3
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
import QtQuick import QtQuick
Item { Item {
@@ -29,7 +28,7 @@ Item {
from: "" from: ""
to: "visible" to: "visible"
Modules.Anim { Anim {
target: root target: root
property: "implicitWidth" property: "implicitWidth"
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
@@ -40,7 +39,7 @@ Item {
from: "visible" from: "visible"
to: "" to: ""
Modules.Anim { Anim {
target: root target: root
property: "implicitWidth" property: "implicitWidth"
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
+1 -2
View File
@@ -1,7 +1,6 @@
import QtQuick import QtQuick
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Modules as Modules
Item { Item {
id: root id: root
@@ -23,7 +22,7 @@ Item {
} }
transitions: Transition { transitions: Transition {
Modules.Anim { Anim {
target: root target: root
property: "implicitHeight" property: "implicitHeight"
duration: MaterialEasing.expressiveEffectsTime duration: MaterialEasing.expressiveEffectsTime
+1 -3
View File
@@ -1,9 +1,7 @@
import QtQuick import QtQuick
import QtQuick.Shapes import QtQuick.Shapes
import qs.Components import qs.Components
import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
ShapePath { ShapePath {
id: root id: root
@@ -56,6 +54,6 @@ ShapePath {
} }
Behavior on fillColor { Behavior on fillColor {
Modules.CAnim {} CAnim {}
} }
} }
+2 -3
View File
@@ -6,7 +6,6 @@ import qs.Components
import qs.Helpers import qs.Helpers
import qs.Config import qs.Config
import qs.Daemons import qs.Daemons
import qs.Modules as Modules
Item { Item {
id: root id: root
@@ -125,13 +124,13 @@ Item {
visible: active visible: active
Behavior on Layout.preferredHeight { Behavior on Layout.preferredHeight {
Modules.Anim { Anim {
easing.bezierCurve: Appearance.anim.curves.emphasized easing.bezierCurve: Appearance.anim.curves.emphasized
} }
} }
Behavior on opacity { Behavior on opacity {
Modules.Anim {} Anim {}
} }
} }
} }
+2 -3
View File
@@ -5,7 +5,6 @@ import QtQuick
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import qs.Config import qs.Config
import qs.Modules as Modules
import qs.Daemons import qs.Daemons
Item { Item {
@@ -54,7 +53,7 @@ Item {
from: "" from: ""
to: "visible" to: "visible"
Modules.Anim { Anim {
target: root target: root
property: "implicitWidth" property: "implicitWidth"
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
@@ -64,7 +63,7 @@ Item {
from: "visible" from: "visible"
to: "" to: ""
Modules.Anim { Anim {
target: root target: root
property: "implicitWidth" property: "implicitWidth"
easing.bezierCurve: MaterialEasing.expressiveEffects easing.bezierCurve: MaterialEasing.expressiveEffects
+1 -2
View File
@@ -1,8 +1,7 @@
import qs.Modules
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Shapes import QtQuick.Shapes
import Quickshell import qs.Components
import qs.Config import qs.Config
Item { Item {
-3
View File
@@ -1,10 +1,7 @@
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Effects
import QtQuick import QtQuick
import Quickshell import Quickshell
import Quickshell.Services.SystemTray import Quickshell.Services.SystemTray
import Quickshell.Io
import Quickshell.Widgets
import qs.Modules import qs.Modules
import qs.Components import qs.Components
import qs.Config import qs.Config
-2
View File
@@ -1,7 +1,6 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import Quickshell.DBusMenu
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
@@ -9,7 +8,6 @@ import Quickshell.Hyprland
import QtQml import QtQml
import qs.Effects import qs.Effects
import qs.Config import qs.Config
import qs.Modules
PanelWindow { PanelWindow {
id: root id: root
-2
View File
@@ -1,11 +1,9 @@
import Quickshell
import Quickshell.Services.UPower import Quickshell.Services.UPower
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import qs.Components import qs.Components
import qs.Config import qs.Config
import qs.Helpers as Helpers import qs.Helpers as Helpers
import qs.Modules
Item { Item {
id: root id: root
+1
View File
@@ -1,5 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import qs.Components
import qs.Modules import qs.Modules
import qs.Config import qs.Config
@@ -1,6 +1,7 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import qs.Components
import qs.Helpers import qs.Helpers
import qs.Config import qs.Config
@@ -1,8 +1,6 @@
import Quickshell import Quickshell
import QtQuick import QtQuick
import Quickshell.Wayland import Quickshell.Wayland
import qs.Helpers
import qs.Modules
import qs.Config import qs.Config
Loader { Loader {
+1 -1
View File
@@ -2,8 +2,8 @@ import Quickshell
import Quickshell.Wayland import Quickshell.Wayland
import Quickshell.Hyprland import Quickshell.Hyprland
import QtQuick import QtQuick
import qs.Components
import qs.Config import qs.Config
import qs.Helpers
Item { Item {
id: root id: root
+2
View File
@@ -3,7 +3,9 @@
//@ pragma Env QS_NO_RELOAD_POPUP=1 //@ pragma Env QS_NO_RELOAD_POPUP=1
import Quickshell import Quickshell
import qs.Modules import qs.Modules
import qs.Modules.Wallpaper
import qs.Modules.Lock as Lock import qs.Modules.Lock as Lock
import qs.Drawers
import qs.Helpers import qs.Helpers
import qs.Modules.Polkit import qs.Modules.Polkit