mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-06-15 23:55:21 -04:00
463 lines
24 KiB
QML
463 lines
24 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import qs.Common
|
|
import qs.Modules.Settings.Widgets
|
|
import qs.Services
|
|
import qs.Widgets
|
|
|
|
Item {
|
|
id: networkEthernetTab
|
|
|
|
LayoutMirroring.enabled: I18n.isRtl
|
|
LayoutMirroring.childrenInherit: true
|
|
|
|
Component.onCompleted: {
|
|
NetworkService.addRef();
|
|
}
|
|
|
|
Component.onDestruction: {
|
|
NetworkService.removeRef();
|
|
}
|
|
|
|
DankFlickable {
|
|
anchors.fill: parent
|
|
clip: true
|
|
contentHeight: mainColumn.height + Theme.spacingXL
|
|
contentWidth: width
|
|
|
|
Column {
|
|
id: mainColumn
|
|
|
|
topPadding: 4
|
|
width: Math.min(600, parent.width - Theme.spacingL * 2)
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
spacing: Theme.spacingL
|
|
|
|
SettingsCard {
|
|
id: root
|
|
|
|
property string expandedEthDevice: ""
|
|
|
|
title: I18n.tr("Ethernet")
|
|
iconName: "settings_ethernet"
|
|
settingKey: "networkEthernet"
|
|
tags: ["ethernet", "wired", "network", "adapters", "connection"]
|
|
|
|
width: parent.width
|
|
|
|
Column {
|
|
id: ethernetSection
|
|
|
|
width: parent.width
|
|
spacing: Theme.spacingM
|
|
|
|
StyledText {
|
|
text: {
|
|
const devices = NetworkService.ethernetDevices;
|
|
const connected = devices.filter(d => d.connected).length;
|
|
if (devices.length === 0)
|
|
return I18n.tr("No adapters");
|
|
if (connected === 0)
|
|
return devices.length === 1 ? I18n.tr("%1 adapter, none connected").arg(devices.length) : I18n.tr("%1 adapters, none connected").arg(devices.length);
|
|
return I18n.tr("%1 connected").arg(connected);
|
|
}
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: NetworkService.ethernetConnected ? Theme.primary : Theme.surfaceVariantText
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
|
|
Rectangle {
|
|
width: parent.width
|
|
height: 1
|
|
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12)
|
|
}
|
|
|
|
Column {
|
|
width: parent.width
|
|
spacing: 4
|
|
visible: NetworkService.ethernetDevices.length > 0
|
|
|
|
StyledText {
|
|
text: I18n.tr("Adapters")
|
|
font.pixelSize: Theme.fontSizeMedium
|
|
font.weight: Font.Medium
|
|
color: Theme.surfaceText
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
|
|
Repeater {
|
|
model: NetworkService.ethernetDevices
|
|
|
|
delegate: Rectangle {
|
|
id: ethDeviceDelegate
|
|
required property var modelData
|
|
required property int index
|
|
|
|
readonly property bool isConnected: modelData.connected || false
|
|
readonly property bool isExpanded: root.expandedEthDevice === modelData.name
|
|
|
|
width: parent.width
|
|
height: isExpanded ? 56 + ethExpandedContent.height : 56
|
|
radius: Theme.cornerRadius
|
|
color: ethDeviceMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceLight
|
|
border.width: isConnected ? 2 : 0
|
|
border.color: Theme.primary
|
|
clip: true
|
|
|
|
Behavior on height {
|
|
NumberAnimation {
|
|
duration: 150
|
|
easing.type: Easing.OutQuad
|
|
}
|
|
}
|
|
|
|
Column {
|
|
anchors.fill: parent
|
|
spacing: 0
|
|
|
|
Item {
|
|
width: parent.width
|
|
height: 56
|
|
|
|
Row {
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.spacingM
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.right: ethDeviceActions.left
|
|
anchors.rightMargin: Theme.spacingS
|
|
spacing: Theme.spacingS
|
|
|
|
DankIcon {
|
|
name: "lan"
|
|
size: 20
|
|
color: isConnected ? Theme.primary : Theme.surfaceText
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Column {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: 2
|
|
width: parent.width - 20 - Theme.spacingS
|
|
|
|
StyledText {
|
|
text: modelData.name || I18n.tr("Unknown")
|
|
font.pixelSize: Theme.fontSizeMedium
|
|
color: isConnected ? Theme.primary : Theme.surfaceText
|
|
font.weight: isConnected ? Font.Medium : Font.Normal
|
|
elide: Text.ElideRight
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
|
|
Row {
|
|
anchors.left: parent.left
|
|
spacing: Theme.spacingXS
|
|
|
|
StyledText {
|
|
text: {
|
|
switch (modelData.state) {
|
|
case "activated":
|
|
return I18n.tr("Connected");
|
|
case "disconnected":
|
|
return I18n.tr("Disconnected");
|
|
case "unavailable":
|
|
return I18n.tr("Unavailable");
|
|
default:
|
|
return modelData.state || I18n.tr("Unknown");
|
|
}
|
|
}
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: isConnected ? Theme.primary : Theme.surfaceVariantText
|
|
}
|
|
|
|
StyledText {
|
|
text: "•"
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: Theme.surfaceVariantText
|
|
visible: (modelData.ip || "").length > 0
|
|
}
|
|
|
|
StyledText {
|
|
text: modelData.ip || ""
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: Theme.surfaceVariantText
|
|
visible: (modelData.ip || "").length > 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Row {
|
|
id: ethDeviceActions
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Theme.spacingS
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: Theme.spacingXS
|
|
|
|
Rectangle {
|
|
width: 28
|
|
height: 28
|
|
radius: 14
|
|
color: ethExpandBtn.containsMouse ? Theme.surfacePressed : "transparent"
|
|
visible: isConnected
|
|
|
|
DankIcon {
|
|
anchors.centerIn: parent
|
|
name: isExpanded ? "expand_less" : "expand_more"
|
|
size: 18
|
|
color: Theme.surfaceText
|
|
}
|
|
|
|
MouseArea {
|
|
id: ethExpandBtn
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: {
|
|
if (isExpanded) {
|
|
root.expandedEthDevice = "";
|
|
} else {
|
|
root.expandedEthDevice = modelData.name;
|
|
NetworkService.fetchWiredNetworkInfo(NetworkService.ethernetConnectionUuid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
width: 28
|
|
height: 28
|
|
radius: 14
|
|
color: ethDisconnectBtn.containsMouse ? Theme.errorHover : "transparent"
|
|
visible: isConnected
|
|
|
|
DankIcon {
|
|
anchors.centerIn: parent
|
|
name: "link_off"
|
|
size: 18
|
|
color: ethDisconnectBtn.containsMouse ? Theme.error : Theme.surfaceVariantText
|
|
}
|
|
|
|
MouseArea {
|
|
id: ethDisconnectBtn
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: NetworkService.disconnectEthernetDevice(modelData.name)
|
|
}
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
id: ethDeviceMouseArea
|
|
anchors.fill: parent
|
|
anchors.rightMargin: ethDeviceActions.width + Theme.spacingM
|
|
hoverEnabled: true
|
|
}
|
|
}
|
|
|
|
Column {
|
|
id: ethExpandedContent
|
|
width: parent.width
|
|
visible: isExpanded
|
|
|
|
Rectangle {
|
|
width: parent.width - Theme.spacingM * 2
|
|
height: 1
|
|
x: Theme.spacingM
|
|
color: Theme.outlineLight
|
|
}
|
|
|
|
Item {
|
|
width: parent.width
|
|
height: ethDetailsColumn.implicitHeight + Theme.spacingM * 2
|
|
|
|
Column {
|
|
id: ethDetailsColumn
|
|
anchors.fill: parent
|
|
anchors.margins: Theme.spacingM
|
|
spacing: Theme.spacingS
|
|
|
|
Flow {
|
|
width: parent.width
|
|
spacing: Theme.spacingXS
|
|
|
|
Repeater {
|
|
model: {
|
|
const fields = [];
|
|
const dev = modelData;
|
|
if (!dev)
|
|
return fields;
|
|
|
|
if (dev.ip)
|
|
fields.push({
|
|
label: I18n.tr("IP"),
|
|
value: dev.ip
|
|
});
|
|
if (dev.speed && dev.speed > 0)
|
|
fields.push({
|
|
label: I18n.tr("Speed"),
|
|
value: dev.speed + " Mbps"
|
|
});
|
|
if (dev.hwAddress)
|
|
fields.push({
|
|
label: I18n.tr("MAC"),
|
|
value: dev.hwAddress
|
|
});
|
|
if (dev.driver)
|
|
fields.push({
|
|
label: I18n.tr("Driver"),
|
|
value: dev.driver
|
|
});
|
|
fields.push({
|
|
label: I18n.tr("State"),
|
|
value: dev.state || I18n.tr("Unknown")
|
|
});
|
|
|
|
return fields;
|
|
}
|
|
|
|
delegate: Rectangle {
|
|
required property var modelData
|
|
required property int index
|
|
|
|
width: ethFieldContent.width + Theme.spacingM * 2
|
|
height: 32
|
|
radius: Theme.cornerRadius - 2
|
|
color: Theme.surfaceContainerHigh
|
|
border.width: 1
|
|
border.color: Theme.outlineLight
|
|
|
|
Row {
|
|
id: ethFieldContent
|
|
anchors.centerIn: parent
|
|
spacing: Theme.spacingXS
|
|
|
|
StyledText {
|
|
text: modelData.label + ":"
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: Theme.surfaceVariantText
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
StyledText {
|
|
text: modelData.value
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: Theme.surfaceText
|
|
font.weight: Font.Medium
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
width: parent.width
|
|
height: NetworkService.networkWiredInfoLoading ? 40 : 0
|
|
visible: NetworkService.networkWiredInfoLoading
|
|
|
|
DankSpinner {
|
|
anchors.centerIn: parent
|
|
size: 20
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Column {
|
|
width: parent.width
|
|
spacing: Theme.spacingS
|
|
visible: NetworkService.wiredConnections.length > 0
|
|
|
|
Rectangle {
|
|
width: parent.width
|
|
height: 1
|
|
color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12)
|
|
}
|
|
|
|
StyledText {
|
|
text: I18n.tr("Saved Configurations")
|
|
font.pixelSize: Theme.fontSizeMedium
|
|
font.weight: Font.Medium
|
|
color: Theme.surfaceText
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
|
|
Repeater {
|
|
model: NetworkService.wiredConnections
|
|
|
|
delegate: Rectangle {
|
|
required property var modelData
|
|
required property int index
|
|
|
|
width: parent.width
|
|
height: 48
|
|
radius: Theme.cornerRadius
|
|
color: wiredMouseArea.containsMouse ? Theme.primaryHoverLight : Theme.surfaceLight
|
|
border.width: modelData.isActive ? 2 : 0
|
|
border.color: Theme.primary
|
|
|
|
Row {
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.spacingM
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: Theme.spacingS
|
|
|
|
DankIcon {
|
|
name: "lan"
|
|
size: 20
|
|
color: modelData.isActive ? Theme.primary : Theme.surfaceText
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Column {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: 2
|
|
|
|
StyledText {
|
|
text: modelData.id || I18n.tr("Unknown")
|
|
font.pixelSize: Theme.fontSizeMedium
|
|
color: modelData.isActive ? Theme.primary : Theme.surfaceText
|
|
font.weight: modelData.isActive ? Font.Medium : Font.Normal
|
|
}
|
|
|
|
StyledText {
|
|
text: modelData.isActive ? I18n.tr("Active") : ""
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
color: Theme.primary
|
|
visible: modelData.isActive
|
|
}
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
id: wiredMouseArea
|
|
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: {
|
|
if (!modelData.isActive) {
|
|
NetworkService.connectToSpecificWiredConfig(modelData.uuid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|