summaryrefslogtreecommitdiff
path: root/raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-07-03 13:24:36 +0200
committerNippy <nippy@rp1.hu>2026-07-03 13:24:36 +0200
commit7de9210d7806e34d47803c361d7a95e29e877de3 (patch)
treee74edd19540e43e3c2926dd37b8151603d809294 /raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml
parentaf5dd5ec4bf911af75912f3cea6f53d5a8676f12 (diff)
downloadRaveOS-PKGBUILD-7de9210d7806e34d47803c361d7a95e29e877de3.tar.gz
RaveOS-PKGBUILD-7de9210d7806e34d47803c361d7a95e29e877de3.zip
new sddm
Diffstat (limited to 'raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml')
-rw-r--r--raveos-sddm-theme/sddm-rave-theme/Components/NetworkIndicator.qml243
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()
+ }
+}