diff options
| author | ATMDA <atdma2600@gmail.com> | 2025-11-10 11:51:43 -0500 |
|---|---|---|
| committer | ATMDA <atdma2600@gmail.com> | 2025-11-10 11:51:43 -0500 |
| commit | 817156aec079852141d52d484dd14eec3fa0a88e (patch) | |
| tree | 33ffa5bd9aa5611c05661202b54489d25335e513 | |
| parent | controlcenter: ethernet panel (debug) (diff) | |
| download | caelestia-shell-817156aec079852141d52d484dd14eec3fa0a88e.tar.gz caelestia-shell-817156aec079852141d52d484dd14eec3fa0a88e.tar.bz2 caelestia-shell-817156aec079852141d52d484dd14eec3fa0a88e.zip | |
controlcenter: polished ethernet panel
| -rw-r--r-- | modules/controlcenter/ethernet/EthernetDetails.qml | 95 | ||||
| -rw-r--r-- | modules/controlcenter/ethernet/EthernetList.qml | 5 | ||||
| -rw-r--r-- | modules/controlcenter/ethernet/EthernetSettings.qml | 50 | ||||
| -rw-r--r-- | services/Network.qml | 112 |
4 files changed, 205 insertions, 57 deletions
diff --git a/modules/controlcenter/ethernet/EthernetDetails.qml b/modules/controlcenter/ethernet/EthernetDetails.qml index 9be3ddc..1db3db0 100644 --- a/modules/controlcenter/ethernet/EthernetDetails.qml +++ b/modules/controlcenter/ethernet/EthernetDetails.qml @@ -16,6 +16,20 @@ Item { required property Session session readonly property var device: session.ethernet.active + Component.onCompleted: { + if (device && device.interface) { + Network.updateEthernetDeviceDetails(device.interface); + } + } + + onDeviceChanged: { + if (device && device.interface) { + Network.updateEthernetDeviceDetails(device.interface); + } else { + Network.ethernetDeviceDetails = null; + } + } + StyledFlickable { anchors.fill: parent @@ -79,9 +93,8 @@ Item { checked: root.device?.connected ?? false toggle.onToggled: { if (checked) { - if (root.device?.connection) { - Network.connectEthernet(root.device.connection); - } + // Use connection name if available, otherwise use interface + Network.connectEthernet(root.device?.connection || "", root.device?.interface || ""); } else { if (root.device?.connection) { Network.disconnectEthernet(root.device.connection); @@ -155,6 +168,82 @@ Item { } } + StyledText { + Layout.topMargin: Appearance.spacing.large + text: qsTr("Connection information") + font.pointSize: Appearance.font.size.larger + font.weight: 500 + } + + StyledText { + text: qsTr("Network connection details") + color: Colours.palette.m3outline + } + + StyledRect { + Layout.fillWidth: true + implicitHeight: connectionInfo.implicitHeight + Appearance.padding.large * 2 + + radius: Appearance.rounding.normal + color: Colours.tPalette.m3surfaceContainer + + ColumnLayout { + id: connectionInfo + + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: Appearance.padding.large + + spacing: Appearance.spacing.small / 2 + + StyledText { + text: qsTr("IP Address") + } + + StyledText { + text: Network.ethernetDeviceDetails?.ipAddress || qsTr("Not available") + color: Colours.palette.m3outline + font.pointSize: Appearance.font.size.small + } + + StyledText { + Layout.topMargin: Appearance.spacing.normal + text: qsTr("Subnet Mask") + } + + StyledText { + text: Network.ethernetDeviceDetails?.subnet || qsTr("Not available") + color: Colours.palette.m3outline + font.pointSize: Appearance.font.size.small + } + + StyledText { + Layout.topMargin: Appearance.spacing.normal + text: qsTr("Gateway") + } + + StyledText { + text: Network.ethernetDeviceDetails?.gateway || qsTr("Not available") + color: Colours.palette.m3outline + font.pointSize: Appearance.font.size.small + } + + StyledText { + Layout.topMargin: Appearance.spacing.normal + text: qsTr("DNS Servers") + } + + StyledText { + text: (Network.ethernetDeviceDetails && Network.ethernetDeviceDetails.dns && Network.ethernetDeviceDetails.dns.length > 0) ? Network.ethernetDeviceDetails.dns.join(", ") : qsTr("Not available") + color: Colours.palette.m3outline + font.pointSize: Appearance.font.size.small + wrapMode: Text.Wrap + Layout.maximumWidth: parent.width + } + } + } + } } diff --git a/modules/controlcenter/ethernet/EthernetList.qml b/modules/controlcenter/ethernet/EthernetList.qml index d239fc6..6ed50fd 100644 --- a/modules/controlcenter/ethernet/EthernetList.qml +++ b/modules/controlcenter/ethernet/EthernetList.qml @@ -144,8 +144,9 @@ ColumnLayout { function onClicked(): void { if (modelData.connected && modelData.connection) { Network.disconnectEthernet(modelData.connection); - } else if (modelData.connection) { - Network.connectEthernet(modelData.connection); + } else { + // Use connection name if available, otherwise use interface + Network.connectEthernet(modelData.connection || "", modelData.interface || ""); } } } diff --git a/modules/controlcenter/ethernet/EthernetSettings.qml b/modules/controlcenter/ethernet/EthernetSettings.qml index b780b55..33b1449 100644 --- a/modules/controlcenter/ethernet/EthernetSettings.qml +++ b/modules/controlcenter/ethernet/EthernetSettings.qml @@ -81,56 +81,6 @@ ColumnLayout { } } } - - StyledText { - Layout.topMargin: Appearance.spacing.large - text: qsTr("Debug Info") - font.pointSize: Appearance.font.size.larger - font.weight: 500 - } - - StyledRect { - Layout.fillWidth: true - implicitHeight: debugInfo.implicitHeight + Appearance.padding.large * 2 - - radius: Appearance.rounding.normal - color: Colours.tPalette.m3surfaceContainer - - ColumnLayout { - id: debugInfo - - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.margins: Appearance.padding.large - - spacing: Appearance.spacing.small / 2 - - StyledText { - text: qsTr("Process running: %1").arg(Network.ethernetProcessRunning ? "Yes" : "No") - font.pointSize: Appearance.font.size.small - } - - StyledText { - text: qsTr("List length: %1").arg(Network.ethernetDevices.length) - font.pointSize: Appearance.font.size.small - } - - StyledText { - text: qsTr("Device count: %1").arg(Network.ethernetDeviceCount) - font.pointSize: Appearance.font.size.small - } - - StyledText { - Layout.topMargin: Appearance.spacing.normal - text: qsTr("Debug: %1").arg(Network.ethernetDebugInfo || "No info") - font.pointSize: Appearance.font.size.small - color: Colours.palette.m3outline - wrapMode: Text.Wrap - Layout.maximumWidth: parent.width - } - } - } } diff --git a/services/Network.qml b/services/Network.qml index 1dee367..acd4bcb 100644 --- a/services/Network.qml +++ b/services/Network.qml @@ -24,6 +24,7 @@ Singleton { property int ethernetDeviceCount: 0 property string ethernetDebugInfo: "" property bool ethernetProcessRunning: false + property var ethernetDeviceDetails: null function enableWifi(enabled: bool): void { const cmd = enabled ? "on" : "off"; @@ -88,14 +89,46 @@ Singleton { } - function connectEthernet(connectionName: string): void { - connectEthernetProc.exec(["nmcli", "connection", "up", connectionName]); + function connectEthernet(connectionName: string, interfaceName: string): void { + if (connectionName && connectionName.length > 0) { + // Use connection name if available + connectEthernetProc.exec(["nmcli", "connection", "up", connectionName]); + } else if (interfaceName && interfaceName.length > 0) { + // Fallback to device interface if no connection name + connectEthernetProc.exec(["nmcli", "device", "connect", interfaceName]); + } } function disconnectEthernet(connectionName: string): void { disconnectEthernetProc.exec(["nmcli", "connection", "down", connectionName]); } + function updateEthernetDeviceDetails(interfaceName: string): void { + if (interfaceName && interfaceName.length > 0) { + getEthernetDetailsProc.exec(["nmcli", "device", "show", interfaceName]); + } else { + ethernetDeviceDetails = null; + } + } + + 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"] @@ -484,6 +517,13 @@ Singleton { onExited: { 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); + } + }); } stdout: SplitParser { onRead: getEthernetDevices() @@ -503,6 +543,10 @@ Singleton { onExited: { getEthernetDevices(); + // Clear device details after disconnection + Qt.callLater(() => { + root.ethernetDeviceDetails = null; + }); } stdout: SplitParser { onRead: getEthernetDevices() @@ -517,6 +561,70 @@ Singleton { } } + Process { + id: getEthernetDetailsProc + + environment: ({ + LANG: "C.UTF-8", + LC_ALL: "C.UTF-8" + }) + stdout: StdioCollector { + onStreamFinished: { + const output = text.trim(); + if (!output || output.length === 0) { + root.ethernetDeviceDetails = null; + return; + } + + const lines = output.split("\n"); + const details = { + ipAddress: "", + gateway: "", + dns: [], + subnet: "", + macAddress: "", + speed: "" + }; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const parts = line.split(":"); + if (parts.length >= 2) { + const key = parts[0].trim(); + const value = parts.slice(1).join(":").trim(); + + if (key.startsWith("IP4.ADDRESS")) { + // Extract IP and subnet from format like "10.13.1.45/24" + const ipParts = value.split("/"); + details.ipAddress = ipParts[0] || ""; + if (ipParts[1]) { + // Convert CIDR notation to subnet mask + details.subnet = root.cidrToSubnetMask(ipParts[1]); + } else { + details.subnet = ""; + } + } else if (key === "IP4.GATEWAY") { + details.gateway = value; + } else if (key.startsWith("IP4.DNS")) { + details.dns.push(value); + } else if (key === "WIRED-PROPERTIES.MAC") { + details.macAddress = value; + } else if (key === "WIRED-PROPERTIES.SPEED") { + details.speed = value; + } + } + } + + root.ethernetDeviceDetails = details; + } + } + onExited: { + if (exitCode !== 0) { + root.ethernetDeviceDetails = null; + } + } + } + component AccessPoint: QtObject { required property var lastIpcObject readonly property string ssid: lastIpcObject.ssid |