mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-04-11 17:47:09 +00:00
137 lines
4.6 KiB
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|