Files
dotfiles/.config/quickshell/nucleus-shell/modules/interface/settings/NetworkCard.qml

137 lines
4.6 KiB
QML

import QtQuick
import QtQuick.Layouts
import qs.config
import qs.modules.components
import qs.services
import qs.modules.functions
Item {
id: networkRow
property var connection
property bool isActive: false
property bool showConnect: false
property bool showDisconnect: false
property bool showPasswordField: false
property string password: ""
width: parent.width
implicitHeight: mainLayout.implicitHeight
function signalIcon(strength, secure) {
if (!connection) return "network_wifi";
if (connection.type === "ethernet") return "settings_ethernet";
if (strength >= 75) return "network_wifi";
if (strength >= 50) return "network_wifi_3_bar";
if (strength >= 25) return "network_wifi_2_bar";
if (strength > 0) return "network_wifi_1_bar";
return "network_wifi_1_bar";
}
ColumnLayout {
id: mainLayout
anchors.fill: parent
spacing: Metrics.spacing(10)
RowLayout {
spacing: Metrics.spacing(10)
// Signal icon with lock overlay
Item {
width: Metrics.spacing(32)
height: Metrics.spacing(32)
MaterialSymbol {
anchors.fill: parent
icon: connection ? signalIcon(connection.strength, connection.isSecure) : "network_wifi"
font.pixelSize: Metrics.fontSize(32)
}
// Lock overlay (anchors are safe because Item is not layout-managed)
MaterialSymbol {
icon: "lock"
visible: connection && connection.type === "wifi" && connection.isSecure
font.pixelSize: Metrics.fontSize(12)
anchors.right: parent.right
anchors.bottom: parent.bottom
}
}
ColumnLayout {
Layout.alignment: Qt.AlignVCenter
spacing: Metrics.spacing(0)
StyledText {
text: connection ? connection.name : ""
font.pixelSize: Metrics.fontSize(16)
font.bold: true
}
StyledText {
text: connection ? (
isActive ? "Connected" :
connection.type === "ethernet" ? connection.device || "Ethernet" :
connection.isSecure ? "Secured" : "Open"
) : ""
font.pixelSize: Metrics.fontSize(12)
color: isActive
? Appearance.m3colors.m3primary
: ColorUtils.transparentize(Appearance.m3colors.m3onSurface, 0.4)
}
}
Item { Layout.fillWidth: true }
StyledButton {
visible: showConnect && !showPasswordField
icon: "link"
onClicked: {
if (!connection) return;
if (connection.type === "ethernet") Network.connect(connection, "")
else if (connection.isSecure) showPasswordField = true
else Network.connect(connection, "")
}
}
StyledButton {
visible: showDisconnect && !showPasswordField
icon: "link_off"
onClicked: Network.disconnect()
}
}
// Password row
RowLayout {
visible: showPasswordField && connection && connection.type === "wifi"
spacing: Metrics.spacing(10)
StyledTextField {
padding: Metrics.padding(10)
Layout.fillWidth: true
placeholderText: "Enter password"
echoMode: parent.showPassword ? TextInput.Normal : TextInput.Password
onTextChanged: networkRow.password = text
onAccepted: {
if (!connection) return;
Network.connect(connection, networkRow.password)
showPasswordField = false
}
}
StyledButton {
property bool showPassword: false
icon: parent.showPassword ? "visibility" : "visibility_off"
onClicked: parent.showPassword = !parent.showPassword
}
StyledButton {
icon: "link"
onClicked: {
if (!connection) return;
Network.connect(connection, networkRow.password)
showPasswordField = false
}
}
}
}
}