diff --git a/modules/BluetoothMenu.qml b/modules/BluetoothMenu.qml index 1eb9d5f..0c2cfdb 100644 --- a/modules/BluetoothMenu.qml +++ b/modules/BluetoothMenu.qml @@ -10,19 +10,15 @@ M.HoverPanel { contentWidth: 250 property var _devices: [] - property bool _btEnabled: true property Process _scanner: Process { id: scanner running: true - command: ["sh", "-c", "bluetoothctl show 2>/dev/null | awk '/Powered:/{print $2; exit}';" + "echo '---DEVICES---';" + "bluetoothctl devices Paired 2>/dev/null | while read -r _ mac name; do " + "info=$(bluetoothctl info \"$mac\" 2>/dev/null); " + "conn=$(echo \"$info\" | grep -c 'Connected: yes'); " + "bat=$(echo \"$info\" | awk -F'[(): ]' '/Battery Percentage/{for(i=1;i<=NF;i++) if($i+0==$i && $i!=\"\") print $i}'); " + "echo \"$mac:$conn:${bat:-}:$name\"; " + "done"] + command: ["sh", "-c", "bluetoothctl devices Paired 2>/dev/null | while read -r _ mac name; do " + "info=$(bluetoothctl info \"$mac\" 2>/dev/null); " + "conn=$(echo \"$info\" | grep -c 'Connected: yes'); " + "bat=$(echo \"$info\" | awk -F'[(): ]' '/Battery Percentage/{for(i=1;i<=NF;i++) if($i+0==$i && $i!=\"\") print $i}'); " + "echo \"$mac:$conn:${bat:-}:$name\"; " + "done"] stdout: StdioCollector { onStreamFinished: { - const sections = text.split("---DEVICES---"); - menuWindow._btEnabled = (sections[0] || "").trim() === "yes"; - const devs = []; - for (const line of (sections[1] || "").trim().split("\n")) { + for (const line of text.trim().split("\n")) { if (!line) continue; const i1 = line.indexOf(":"); @@ -31,10 +27,10 @@ M.HoverPanel { if (i3 < 0) continue; devs.push({ - "mac": line.slice(0, i1), - "connected": line.slice(i1 + 1, i2) === "1", - "battery": parseInt(line.slice(i2 + 1, i3)) || -1, - "name": line.slice(i3 + 1) + mac: line.slice(0, i1), + connected: line.slice(i1 + 1, i2) === "1", + battery: parseInt(line.slice(i2 + 1, i3)) || -1, + name: line.slice(i3 + 1) }); } devs.sort((a, b) => { @@ -47,14 +43,6 @@ M.HoverPanel { } } - property Process _powerProc: Process { - id: powerProc - property string _action: "" - command: ["bluetoothctl", "power", _action] - onRunningChanged: if (!running) - scanner.running = true - } - property Process _toggleProc: Process { id: toggleProc property string action: "" @@ -64,70 +52,6 @@ M.HoverPanel { scanner.running = true } - // Bluetooth radio toggle header - Item { - width: menuWindow.contentWidth - height: 36 - - Rectangle { - anchors.fill: parent - anchors.leftMargin: 4 - anchors.rightMargin: 4 - color: btHeaderArea.containsMouse ? M.Theme.base02 : "transparent" - radius: M.Theme.radius - } - - Text { - id: btHeaderIcon - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "\uF294" - color: menuWindow._btEnabled ? menuWindow.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize + 1 - font.family: M.Theme.iconFontFamily - } - - Text { - anchors.left: btHeaderIcon.right - anchors.leftMargin: 8 - anchors.verticalCenter: parent.verticalCenter - text: "Bluetooth" - color: menuWindow._btEnabled ? M.Theme.base05 : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - font.family: M.Theme.fontFamily - font.bold: true - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "\uF011" - color: menuWindow._btEnabled ? menuWindow.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - font.family: M.Theme.iconFontFamily - } - - MouseArea { - id: btHeaderArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - powerProc._action = menuWindow._btEnabled ? "off" : "on"; - powerProc.running = true; - } - } - } - - Rectangle { - width: menuWindow.contentWidth - 16 - height: 1 - anchors.horizontalCenter: parent.horizontalCenter - color: M.Theme.base03 - } - Repeater { model: menuWindow._devices @@ -136,7 +60,7 @@ M.HoverPanel { required property var modelData required property int index - width: menuWindow.contentWidth + width: menuWindow.panelWidth height: 32 Rectangle { @@ -201,11 +125,11 @@ M.HoverPanel { Text { visible: menuWindow._devices.length === 0 - width: menuWindow.contentWidth + width: menuWindow.panelWidth height: 32 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter - text: menuWindow._btEnabled ? "No paired devices" : "Bluetooth is off" + text: "No paired devices" color: M.Theme.base04 font.pixelSize: M.Theme.fontSize font.family: M.Theme.fontFamily diff --git a/modules/Disk.qml b/modules/Disk.qml index 45f145f..065f507 100644 --- a/modules/Disk.qml +++ b/modules/Disk.qml @@ -5,42 +5,26 @@ import "." as M M.BarSection { id: root spacing: Math.max(1, M.Theme.moduleSpacing - 2) - tooltip: "" + tooltip: root.freePct + "% free of " + root.totalTb.toFixed(1) + " TB" - property var _mounts: [] - property int _rootPct: 0 + property int freePct: 0 + property real totalTb: 0 Process { id: proc running: true - command: ["sh", "-c", "df -x tmpfs -x devtmpfs -x squashfs -x efivarfs -x overlay -B1 --output=target,size,used 2>/dev/null | awk 'NR>1 && $2+0>0 {print $1\"|\"$2\"|\"$3}'"] + command: ["sh", "-c", "df -B1 --output=size,avail / | tail -1"] stdout: StdioCollector { onStreamFinished: { - const lines = text.trim().split("\n").filter(l => l); - const mounts = []; - for (const line of lines) { - const parts = line.split("|"); - if (parts.length < 3) - continue; - const total = parseInt(parts[1]); - const used = parseInt(parts[2]); - if (total <= 0) - continue; - mounts.push({ - "target": parts[0], - "pct": Math.round(used / total * 100), - "usedBytes": used, - "totalBytes": total - }); + const parts = text.trim().split(/\s+/).map(Number); + const size = parts[0], avail = parts[1]; + if (size > 0) { + root.freePct = Math.round((avail / size) * 100); + root.totalTb = size / 1e12; } - root._mounts = mounts; - const rm = mounts.find(m => m.target === "/"); - if (rm) - root._rootPct = rm.pct; } } } - Timer { interval: M.Modules.disk.interval || 30000 running: true @@ -48,150 +32,15 @@ M.BarSection { onTriggered: proc.running = true } - function _fmt(bytes) { - if (bytes >= 1e12) - return (bytes / 1e12).toFixed(1) + "T"; - if (bytes >= 1e9) - return Math.round(bytes / 1e9) + "G"; - if (bytes >= 1e6) - return Math.round(bytes / 1e6) + "M"; - return bytes + "B"; - } - - function _barColor(pct) { - const t = Math.max(0, Math.min(100, pct)) / 100; - const a = t < 0.5 ? M.Theme.base0B : M.Theme.base0A; - const b = t < 0.5 ? M.Theme.base0A : M.Theme.base08; - const u = t < 0.5 ? t * 2 : (t - 0.5) * 2; - return Qt.rgba(a.r + (b.r - a.r) * u, a.g + (b.g - a.g) * u, a.b + (b.b - a.b) * u, 1); - } - - property bool _pinned: false - readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered - readonly property bool _showPanel: _anyHover || _pinned - - on_AnyHoverChanged: { - if (_anyHover) - _unpinTimer.stop(); - else if (_pinned) - _unpinTimer.start(); - } - - Timer { - id: _unpinTimer - interval: 500 - onTriggered: root._pinned = false - } - M.BarIcon { icon: "\uF0C9" + anchors.verticalCenter: parent.verticalCenter - TapHandler { - cursorShape: Qt.PointingHandCursor - onTapped: root._pinned = !root._pinned - } } M.BarLabel { - label: root._rootPct + "%" - minText: "100%" + label: root.freePct + "% " + root.totalTb.toFixed(1) + minText: "100% 9.9" + anchors.verticalCenter: parent.verticalCenter - TapHandler { - cursorShape: Qt.PointingHandCursor - onTapped: root._pinned = !root._pinned - } - } - - M.HoverPanel { - id: hoverPanel - showPanel: root._showPanel - screen: QsWindow.window?.screen ?? null - anchorItem: root - accentColor: root.accentColor - panelNamespace: "nova-disk" - contentWidth: 260 - - Item { - width: parent.width - height: 28 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "Disk" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 1 - font.family: M.Theme.fontFamily - } - } - - Repeater { - model: root._mounts - - delegate: Item { - required property var modelData - width: hoverPanel.contentWidth - height: 22 - - Text { - id: mountLabel - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: modelData.target - color: M.Theme.base05 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - elide: Text.ElideRight - width: 72 - } - - Item { - id: mountBar - anchors.left: mountLabel.right - anchors.leftMargin: 6 - anchors.right: sizeLabel.left - anchors.rightMargin: 6 - anchors.verticalCenter: parent.verticalCenter - height: 4 - - Rectangle { - anchors.fill: parent - color: M.Theme.base02 - radius: 2 - } - - Rectangle { - width: parent.width * (modelData.pct / 100) - height: parent.height - color: root._barColor(modelData.pct) - radius: 2 - Behavior on width { - NumberAnimation { - duration: 200 - } - } - } - } - - Text { - id: sizeLabel - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root._fmt(modelData.usedBytes) + "/" + root._fmt(modelData.totalBytes) - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - width: 72 - horizontalAlignment: Text.AlignRight - } - } - } - - Item { - width: 1 - height: 4 - } } } diff --git a/modules/Memory.qml b/modules/Memory.qml index 2c83502..d86c0ce 100644 --- a/modules/Memory.qml +++ b/modules/Memory.qml @@ -5,14 +5,9 @@ import "." as M M.BarSection { id: root spacing: Math.max(1, M.Theme.moduleSpacing - 2) - tooltip: "" + tooltip: "Memory: " + root.percent + "% used" property int percent: 0 - property real usedGb: 0 - property real totalGb: 0 - property real availGb: 0 - property real cachedGb: 0 - property real buffersGb: 0 FileView { id: meminfo @@ -24,22 +19,12 @@ M.BarSection { if (v) m[k.trim()] = parseInt(v.trim()); }); - const total = m.MemTotal || 0; - const avail = m.MemAvailable || 0; - const buffers = m.Buffers || 0; - const cached = (m.Cached || 0) + (m.SReclaimable || 0); - const used = total - avail; - if (total > 0) { - root.percent = Math.round(used / total * 100); - root.usedGb = used / 1048576; - root.totalGb = total / 1048576; - root.availGb = avail / 1048576; - root.cachedGb = cached / 1048576; - root.buffersGb = buffers / 1048576; - } + const total = m.MemTotal; + const avail = m.MemAvailable; + if (total > 0) + root.percent = Math.round(((total - avail) / total) * 100); } } - Timer { interval: M.Modules.memory.interval || 2000 running: true @@ -47,253 +32,15 @@ M.BarSection { onTriggered: meminfo.reload() } - function _fmt(gb) { - return gb >= 10 ? gb.toFixed(1) + "G" : gb.toFixed(2) + "G"; - } - - property bool _pinned: false - readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered - readonly property bool _showPanel: _anyHover || _pinned - - on_AnyHoverChanged: { - if (_anyHover) - _unpinTimer.stop(); - else if (_pinned) - _unpinTimer.start(); - } - - Timer { - id: _unpinTimer - interval: 500 - onTriggered: root._pinned = false - } - M.BarIcon { icon: "\uEFC5" + anchors.verticalCenter: parent.verticalCenter - TapHandler { - cursorShape: Qt.PointingHandCursor - onTapped: root._pinned = !root._pinned - } } M.BarLabel { label: root.percent + "%" minText: "100%" + anchors.verticalCenter: parent.verticalCenter - TapHandler { - cursorShape: Qt.PointingHandCursor - onTapped: root._pinned = !root._pinned - } - } - - M.HoverPanel { - id: hoverPanel - showPanel: root._showPanel - screen: QsWindow.window?.screen ?? null - anchorItem: root - accentColor: root.accentColor - panelNamespace: "nova-memory" - contentWidth: 240 - - // Header - Item { - width: parent.width - height: 28 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "Memory" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 1 - font.family: M.Theme.fontFamily - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root._fmt(root.usedGb) + " / " + root._fmt(root.totalGb) - color: root.accentColor - font.pixelSize: M.Theme.fontSize - font.family: M.Theme.fontFamily - font.bold: true - } - } - - // Usage bar - Item { - width: parent.width - height: 14 - - Item { - id: memBar - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - height: 6 - - Rectangle { - anchors.fill: parent - color: M.Theme.base02 - radius: 3 - } - - // Cached (base0D, behind used) - Rectangle { - width: parent.width * Math.min(1, (root.usedGb + root.cachedGb) / Math.max(root.totalGb, 0.001)) - height: parent.height - color: M.Theme.base0D - opacity: 0.4 - radius: 3 - Behavior on width { - NumberAnimation { - duration: 200 - } - } - } - - // Used (accentColor, on top) - Rectangle { - width: parent.width * Math.min(1, root.usedGb / Math.max(root.totalGb, 0.001)) - height: parent.height - color: root.accentColor - radius: 3 - Behavior on width { - NumberAnimation { - duration: 200 - } - } - } - } - } - - // Breakdown rows - Item { - width: parent.width - height: 18 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "Used" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root._fmt(root.usedGb) - color: M.Theme.base05 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - } - - Item { - width: parent.width - height: 18 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "Cached" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root._fmt(root.cachedGb) - color: M.Theme.base05 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - } - - Item { - width: parent.width - height: 18 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "Available" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: root._fmt(root.availGb) - color: M.Theme.base05 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - } - } - - // Process list separator - Rectangle { - width: parent.width - 16 - height: 1 - anchors.horizontalCenter: parent.horizontalCenter - color: M.Theme.base03 - } - - // Top processes by memory - Repeater { - model: M.ProcessList.byMem - - delegate: Item { - required property var modelData - width: hoverPanel.contentWidth - height: 20 - - Text { - id: procCmd - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: modelData.cmd - color: M.Theme.base05 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - elide: Text.ElideRight - width: parent.width - 80 - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: modelData.mem.toFixed(1) + "%" - color: M.Theme.base04 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily - width: 36 - horizontalAlignment: Text.AlignRight - } - } - } - - Item { - width: 1 - height: 4 - } } } diff --git a/modules/NetworkMenu.qml b/modules/NetworkMenu.qml index a2798d8..4f8e128 100644 --- a/modules/NetworkMenu.qml +++ b/modules/NetworkMenu.qml @@ -10,21 +10,18 @@ M.HoverPanel { contentWidth: 250 property var _networks: [] - property bool _wifiEnabled: true property Process _scanner: Process { id: scanner running: true - command: ["sh", "-c", "echo '---RADIO---';" + "nmcli radio wifi 2>/dev/null;" + "echo '---CONNS---';" + "nmcli -t -f NAME,UUID,TYPE,ACTIVE connection show 2>/dev/null;" + "echo '---WIFI---';" + "nmcli -t -f SSID,SIGNAL device wifi list --rescan no 2>/dev/null"] + command: ["sh", "-c", "echo '---CONNS---';" + "nmcli -t -f NAME,UUID,TYPE,ACTIVE connection show 2>/dev/null;" + "echo '---WIFI---';" + "nmcli -t -f SSID,SIGNAL device wifi list --rescan no 2>/dev/null"] stdout: StdioCollector { onStreamFinished: { - const radioSection = text.split("---CONNS---")[0].split("---RADIO---")[1] || ""; - menuWindow._wifiEnabled = radioSection.trim() === "enabled"; - const sections = text.split("---WIFI---"); const connLines = (sections[0] || "").split("---CONNS---")[1] || ""; const wifiLines = sections[1] || ""; + // Visible SSIDs with signal const visible = {}; for (const l of wifiLines.trim().split("\n")) { if (!l) @@ -35,6 +32,7 @@ M.HoverPanel { visible[ssid] = parseInt(parts[1]) || 0; } + // Saved connections — filter: show wired always, wifi only if visible const nets = []; for (const l of connLines.trim().split("\n")) { if (!l) @@ -50,14 +48,15 @@ M.HoverPanel { continue; nets.push({ - "name": name, - "uuid": uuid, - "isWifi": isWifi, - "active": active, - "signal": isWifi ? (visible[name] || 0) : -1 + name: name, + uuid: uuid, + isWifi: isWifi, + active: active, + signal: isWifi ? (visible[name] || 0) : -1 }); } + // Active first, then by signal (wifi) or name nets.sort((a, b) => { if (a.active !== b.active) return a.active ? -1 : 1; @@ -71,14 +70,6 @@ M.HoverPanel { } } - property Process _radioProc: Process { - id: radioProc - property string _state: "" - command: ["nmcli", "radio", "wifi", _state] - onRunningChanged: if (!running) - scanner.running = true - } - property Process _connectProc: Process { id: connectProc property string uuid: "" @@ -95,70 +86,6 @@ M.HoverPanel { scanner.running = true } - // Wi-Fi radio toggle header - Item { - width: menuWindow.contentWidth - height: 36 - - Rectangle { - anchors.fill: parent - anchors.leftMargin: 4 - anchors.rightMargin: 4 - color: headerArea.containsMouse ? M.Theme.base02 : "transparent" - radius: M.Theme.radius - } - - Text { - id: wifiHeaderIcon - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "\uF1EB" - color: menuWindow._wifiEnabled ? menuWindow.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize + 1 - font.family: M.Theme.iconFontFamily - } - - Text { - anchors.left: wifiHeaderIcon.right - anchors.leftMargin: 8 - anchors.verticalCenter: parent.verticalCenter - text: "Wi-Fi" - color: menuWindow._wifiEnabled ? M.Theme.base05 : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - font.family: M.Theme.fontFamily - font.bold: true - } - - Text { - anchors.right: parent.right - anchors.rightMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: "\uF011" - color: menuWindow._wifiEnabled ? menuWindow.accentColor : M.Theme.base04 - font.pixelSize: M.Theme.fontSize - font.family: M.Theme.iconFontFamily - } - - MouseArea { - id: headerArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - radioProc._state = menuWindow._wifiEnabled ? "off" : "on"; - radioProc.running = true; - } - } - } - - Rectangle { - width: menuWindow.contentWidth - 16 - height: 1 - anchors.horizontalCenter: parent.horizontalCenter - color: M.Theme.base03 - } - Repeater { model: menuWindow._networks @@ -167,7 +94,7 @@ M.HoverPanel { required property var modelData required property int index - width: menuWindow.contentWidth + width: menuWindow.panelWidth height: 32 Rectangle { @@ -234,13 +161,14 @@ M.HoverPanel { } } + // Empty state Text { visible: menuWindow._networks.length === 0 - width: menuWindow.contentWidth + width: menuWindow.panelWidth height: 32 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter - text: menuWindow._wifiEnabled ? "No networks available" : "Wi-Fi is off" + text: "No networks available" color: M.Theme.base04 font.pixelSize: M.Theme.fontSize font.family: M.Theme.fontFamily diff --git a/modules/ProcessList.qml b/modules/ProcessList.qml deleted file mode 100644 index b5bfbb9..0000000 --- a/modules/ProcessList.qml +++ /dev/null @@ -1,48 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell.Io -import "." as M - -QtObject { - id: root - - property var byCpu: [] - property var byMem: [] - property int maxItems: 8 - - property Process _proc: Process { - id: proc - running: true - command: ["sh", "-c", "ps aux --sort=-%cpu 2>/dev/null | awk 'NR>1 && NR<=50 {cmd=$11; for(i=12;i<=NF&&i<=13;i++) cmd=cmd\" \"$i; print $1\"|\"$2\"|\"$3\"|\"$4\"|\"cmd}'"] - stdout: StdioCollector { - onStreamFinished: { - const rows = []; - for (const line of text.trim().split("\n")) { - if (!line) - continue; - const p = line.split("|"); - if (p.length < 5) - continue; - const cmd = p[4].replace(/^.*\//, ""); - rows.push({ - "user": p[0], - "pid": parseInt(p[1]), - "cpu": parseFloat(p[2]), - "mem": parseFloat(p[3]), - "cmd": cmd || p[4] - }); - } - root.byCpu = rows.slice().sort((a, b) => b.cpu - a.cpu).slice(0, root.maxItems); - root.byMem = rows.slice().sort((a, b) => b.mem - a.mem).slice(0, root.maxItems); - } - } - } - - property Timer _timer: Timer { - interval: 2000 - running: true - repeat: true - onTriggered: proc.running = true - } -} diff --git a/modules/qmldir b/modules/qmldir index aa9d8dd..076eec8 100644 --- a/modules/qmldir +++ b/modules/qmldir @@ -32,7 +32,6 @@ Weather 1.0 Weather.qml PowerProfile 1.0 PowerProfile.qml IdleInhibitor 1.0 IdleInhibitor.qml Notifications 1.0 Notifications.qml -singleton ProcessList 1.0 ProcessList.qml singleton NotifService 1.0 NotifService.qml NotifItem 1.0 NotifItem.qml NotifPopup 1.0 NotifPopup.qml