diff options
Diffstat (limited to 'raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml')
| -rw-r--r-- | raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml b/raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml new file mode 100644 index 0000000..bed97c8 --- /dev/null +++ b/raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml @@ -0,0 +1,243 @@ +// Config created by Keyitdev https://git.rp1.hu/gabeszm/sddm-rave-theme +// Copyright (C) 2022-2025 Keyitdev +// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html + +import QtQuick 2.15 + +Row { + id: networkIndicator + + height: root.font.pointSize * 1.6 + spacing: root.font.pointSize * 0.5 + + // "none" | "wifi" | "ethernet" + property string netType: "none" + property int wifiQuality: 0 // 0-100 + property string activeIface: "" + property bool isConnected: netType !== "none" + + visible: isConnected + + property var wifiIfaces: [ + "wlan0","wlan1","wlp1s0","wlp2s0","wlp3s0", + "wlp4s0","wlp5s0","wlp6s0","wlp0s20f3" + ] + property var ethIfaces: [ + "eth0","eth1","eno1","eno2", + "enp1s0","enp2s0","enp3s0","enp4s0", + "enp0s3","enp0s31f6","ens33","ens3","ens18" + ] + + // ── Fájl olvasó ────────────────────────────────────────────────────────── + function readFile(path, cb) { + var xhr = new XMLHttpRequest() + xhr.open("GET", "file://" + path, true) + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + var res = xhr.responseText && xhr.responseText.trim() !== "" + ? xhr.responseText.trim() : null + cb(res) + } + } + xhr.send() + } + + // ── WiFi jelerősség /proc/net/wireless-ből ─────────────────────────────── + function readWifiSignal(iface) { + readFile("/proc/net/wireless", function(content) { + if (!content) { wifiQuality = 60; netCanvas.requestPaint(); return } + var lines = content.split("\n") + for (var i = 0; i < lines.length; i++) { + if (lines[i].indexOf(iface + ":") !== -1) { + // formátum: "wlan0: 0000 61. -49. -256 ..." + var parts = lines[i].trim().replace(/\./g,"").split(/\s+/) + // parts[2] = link quality (0–70 tartomány általában) + var q = parseFloat(parts[2]) || 0 + wifiQuality = Math.min(100, Math.round(q / 70 * 100)) + break + } + } + netCanvas.requestPaint() + }) + } + + // ── Interfész keresők ──────────────────────────────────────────────────── + function checkWifi(idx) { + if (idx >= wifiIfaces.length) { checkEth(0); return } + readFile("/sys/class/net/" + wifiIfaces[idx] + "/operstate", function(st) { + if (st === "up") { + activeIface = wifiIfaces[idx] + netType = "wifi" + readWifiSignal(wifiIfaces[idx]) + } else { + checkWifi(idx + 1) + } + }) + } + + // ── Ethernet keresés ───────────────────────────────────────────────────── + function checkEth(idx) { + if (idx >= ethIfaces.length) { netType = "none"; return } + readFile("/sys/class/net/" + ethIfaces[idx] + "/operstate", function(st) { + if (st === "up") { + activeIface = ethIfaces[idx] + netType = "ethernet" + netCanvas.requestPaint() + } else { + checkEth(idx + 1) + } + }) + } + + function refresh() { checkWifi(0) } + + Component.onCompleted: refresh() + + Timer { + interval: 15000 + repeat: true + running: true + onTriggered: networkIndicator.refresh() + } + + // ── Szín ───────────────────────────────────────────────────────────────── + function signalColor(q) { + if (q >= 65) return "#4ade80" // zöld – erős + if (q >= 40) return "#facc15" // sárga – közepes + return "#fb923c" // narancs – gyenge + } + + // ── UI ─────────────────────────────────────────────────────────────────── + Canvas { + id: netCanvas + width: root.font.pointSize * 2.0 + height: root.font.pointSize * 1.6 + anchors.verticalCenter: parent.verticalCenter + + // Qt Canvas nem támogatja ctx.roundRect() – saját helper + function rr(c, x, y, w, h, r) { + r = Math.min(Math.max(r, 0), Math.min(w, h) / 2) + c.beginPath() + c.moveTo(x + r, y) + c.arcTo(x + w, y, x + w, y + h, r) + c.arcTo(x + w, y + h, x, y + h, r) + c.arcTo(x, y + h, x, y, r) + c.arcTo(x, y, x + w, y, r) + c.closePath() + } + + onPaint: { + var ctx = getContext("2d") + ctx.clearRect(0, 0, width, height) + + if (networkIndicator.netType === "wifi") + drawWifi(ctx) + else if (networkIndicator.netType === "ethernet") + drawEthernet(ctx) + } + + // ── WiFi antenna ikon (4 ívelt sáv) ───────────────────────────── + function drawWifi(ctx) { + var q = networkIndicator.wifiQuality + var cx = width / 2 + var base = height * 0.96 + var dot = height * 0.08 + + // Sávok száma a minőség alapján + var bars = q >= 70 ? 4 : q >= 45 ? 3 : q >= 20 ? 2 : 1 + var col = networkIndicator.signalColor(q) + + var radii = [height*0.14, height*0.32, height*0.54, height*0.76] + var arcStart = Math.PI * 1.25 + var arcEnd = Math.PI * 1.75 + + for (var i = 0; i < 4; i++) { + ctx.beginPath() + ctx.arc(cx, base, radii[i], arcStart, arcEnd) + ctx.strokeStyle = col + ctx.globalAlpha = i < bars ? 0.90 : 0.22 + ctx.lineWidth = height * 0.10 + ctx.lineCap = "round" + ctx.stroke() + } + + // Középső pont (antenna) + ctx.beginPath() + ctx.arc(cx, base, dot, 0, Math.PI * 2) + ctx.fillStyle = col + ctx.globalAlpha = 0.95 + ctx.fill() + ctx.globalAlpha = 1.0 + } + + // ── Ethernet dugó ikon ─────────────────────────────────────────── + function drawEthernet(ctx) { + var col = "#4ade80" + var lw = height * 0.09 + ctx.strokeStyle = col + ctx.fillStyle = col + ctx.lineWidth = lw + ctx.lineCap = "round" + ctx.lineJoin = "round" + ctx.globalAlpha = 0.90 + + var cx = width / 2 + var cy = height / 2 + + // Kábel test (felső téglalap) + var bw = width * 0.70 + var bh = height * 0.38 + var bx = cx - bw / 2 + var by = cy - height * 0.30 + rr(ctx, bx, by, bw, bh, height * 0.06) + ctx.stroke() + + // 3 érintkező pin a téglalapban + var pinW = width * 0.08 + var pinH = height * 0.22 + var pinY = by - pinH + lw + var gap = bw / 4 + for (var p = 0; p < 3; p++) { + rr(ctx, bx + gap * (p + 0.5) - pinW/2, pinY, pinW, pinH, 2) + ctx.fill() + } + + // Kábel vonala lefelé + ctx.beginPath() + ctx.moveTo(cx, by + bh) + ctx.lineTo(cx, cy + height * 0.38) + ctx.stroke() + + // Dugó alap vonal + ctx.lineWidth = lw * 1.5 + ctx.beginPath() + ctx.moveTo(cx - width * 0.22, cy + height * 0.38) + ctx.lineTo(cx + width * 0.22, cy + height * 0.38) + ctx.stroke() + + ctx.globalAlpha = 1.0 + } + } + + // Felirat + Text { + id: netLabel + anchors.verticalCenter: parent.verticalCenter + text: { + if (networkIndicator.netType === "ethernet") return "Ethernet" + return networkIndicator.wifiQuality + "%" + } + color: networkIndicator.netType === "ethernet" + ? "#4ade80" + : networkIndicator.signalColor(networkIndicator.wifiQuality) + font.pointSize: root.font.pointSize * 0.82 + font.family: root.font.family + } + + onNetTypeChanged: { + netCanvas.requestPaint() + } + onWifiQualityChanged: { + netCanvas.requestPaint() + } +} |