kcms/cellularnetwork: Improve APN selection and available networks

This commit is contained in:
Devin Lin 2023-12-14 22:49:35 -08:00
parent a816ec5495
commit 09b3964906
2 changed files with 123 additions and 188 deletions

View file

@ -1,11 +1,14 @@
// SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org> // SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick 2.12 import QtQuick
import QtQuick.Layouts 1.2 import QtQuick.Layouts
import QtQuick.Controls 2.12 as Controls import QtQuick.Controls as Controls
import org.kde.kirigami 2.12 as Kirigami
import org.kde.kirigami as Kirigami
import org.kde.kcmutils import org.kde.kcmutils
import org.kde.kirigamiaddons.formcard 1 as FormCard
import cellularnetworkkcm 1.0 import cellularnetworkkcm 1.0
Kirigami.ScrollablePage { Kirigami.ScrollablePage {
@ -52,7 +55,9 @@ Kirigami.ScrollablePage {
model: modem.details.networks model: modem.details.networks
delegate: Kirigami.SwipeListItem { delegate: FormCard.FormRadioDelegate {
checked: modelData.isCurrentlyUsed
onClicked: { onClicked: {
if (!modelData.isCurrentlyUsed) { if (!modelData.isCurrentlyUsed) {
modelData.registerToNetwork(); modelData.registerToNetwork();
@ -60,31 +65,8 @@ Kirigami.ScrollablePage {
} }
} }
contentItem: RowLayout { text: modelData.operatorLong + " | " + modelData.operatorShort + "(" + modelData.operatorCode + ")"
Layout.fillWidth: true description: modelData.accessTechnology
ColumnLayout {
spacing: Kirigami.Units.smallSpacing
Kirigami.Heading {
level: 3
text: modelData.operatorLong + " | " + modelData.operatorShort + "(" + modelData.operatorCode + ")"
}
Controls.Label {
text: modelData.accessTechnology
}
}
Controls.RadioButton {
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
checked: modelData.isCurrentlyUsed
onClicked: {
if (!modelData.isCurrentlyUsed) {
modelData.registerToNetwork();
modem.details.scanNetworks();
}
checked = modelData.isCurrentlyUsed;
}
}
}
} }
} }
} }

View file

@ -1,178 +1,131 @@
// SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org> // SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick 2.12 import QtQuick
import QtQuick.Layouts 1.2 import QtQuick.Layouts
import QtQuick.Controls 2.12 as Controls import QtQuick.Controls as Controls
import org.kde.kirigami 2.12 as Kirigami import org.kde.kirigami as Kirigami
import cellularnetworkkcm 1.0
import cellularnetworkkcm
import org.kde.kirigamiaddons.formcard 1 as FormCard
Kirigami.ScrollablePage { Kirigami.ScrollablePage {
id: apnlist id: root
title: i18n("APNs") topPadding: Kirigami.Units.gridUnit
bottomPadding: Kirigami.Units.gridUnit
leftPadding: 0
rightPadding: 0
property Modem modem property Modem modem
property bool editMode: false
ListView { title: i18n("APNs")
id: profileListView actions: [
model: modem.profiles Kirigami.Action {
text: i18n("Edit")
icon.name: 'entry-edit'
checkable: true
onCheckedChanged: root.editMode = checked
}
]
Kirigami.PlaceholderMessage { property var dialog: EditProfileDialog {
anchors.centerIn: parent id: profileDialog
anchors.left: parent.left parent: root
anchors.right: parent.right modem: root.modem
anchors.margins: Kirigami.Units.largeSpacing profile: null
visible: profileListView.count === 0 pageWidth: root.width
text: i18n("No APNs configured") }
icon.name: "globe"
helpfulAction: Kirigami.Action { ColumnLayout {
icon.name: "list-add" spacing: 0
text: i18n("Add Connection")
onTriggered: { MessagesList {
profileDialog.profile = null; id: messagesList
profileDialog.open(); visible: count != 0
Layout.fillWidth: true
Layout.margins: Kirigami.Units.largeSpacing
model: kcm.messages
}
Kirigami.InlineMessage {
id: cannotFindWarning
Layout.margins: visible ? Kirigami.Units.largeSpacing : 0
Layout.topMargin: visible && !messagesList.visible ? Kirigami.Units.largeSpacing : 0
Layout.fillWidth: true
visible: false
type: Kirigami.MessageType.Warning
showCloseButton: true
text: i18n("Unable to autodetect connection settings for your carrier. Please find your carrier's APN settings by either contacting support or searching online.")
Connections {
target: modem
function onCouldNotAutodetectSettings() {
cannotFindWarning.visible = true;
} }
} }
} }
EditProfileDialog { FormCard.FormHeader {
id: profileDialog title: i18n("APN List")
modem: apnlist.modem
profile: null
pageWidth: apnlist.width
} }
header: ColumnLayout { FormCard.FormCard {
anchors.left: parent.left Repeater {
anchors.right: parent.right id: profilesRepeater
spacing: 0 model: modem.profiles
MessagesList { delegate: FormCard.FormRadioDelegate {
id: messagesList text: modelData.name
visible: count != 0 description: modelData.apn
Layout.fillWidth: true
Layout.margins: Kirigami.Units.largeSpacing
model: kcm.messages
}
Kirigami.InlineMessage {
id: cannotFindWarning
Layout.margins: visible ? Kirigami.Units.largeSpacing : 0
Layout.topMargin: visible && !messagesList.visible ? Kirigami.Units.largeSpacing : 0
Layout.fillWidth: true
visible: false
type: Kirigami.MessageType.Warning
showCloseButton: true
text: qsTr("Unable to autodetect connection settings for your carrier. Please find your carrier's APN settings by either contacting support or searching online.")
Connections {
target: modem
function onCouldNotAutodetectSettings() {
cannotFindWarning.visible = true;
}
}
}
Kirigami.SwipeListItem {
Layout.fillWidth: true
visible: profileListView.count !== 0
onClicked: {
profileDialog.profile = null;
profileDialog.open();
}
contentItem: Row {
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
anchors.verticalCenter: parent.verticalCenter
source: "list-add"
height: Kirigami.Units.gridUnit * 1.5
width: height
}
Kirigami.Heading {
level: 3
anchors.verticalCenter: parent.verticalCenter
Layout.alignment: Qt.AlignLeft
text: i18n("Add APN")
}
}
}
Kirigami.SwipeListItem {
Layout.fillWidth: true
onClicked: {
modem.addDetectedProfileSettings();
}
contentItem: Row {
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
anchors.verticalCenter: parent.verticalCenter
source: "list-add"
height: Kirigami.Units.gridUnit * 1.5
width: height
}
Kirigami.Heading {
level: 3
anchors.verticalCenter: parent.verticalCenter
Layout.alignment: Qt.AlignLeft
text: i18n("Autodetect APN")
}
}
}
}
delegate: Kirigami.SwipeListItem {
onClicked: modem.activateProfile(modelData.connectionUni)
actions: [
Kirigami.Action {
icon.name: "entry-edit"
text: i18n("Edit")
onTriggered: {
profileDialog.profile = modelData;
profileDialog.open();
}
},
Kirigami.Action {
icon.name: "delete"
text: i18n("Delete")
onTriggered: modem.removeProfile(modelData.connectionUni)
}
]
contentItem: RowLayout {
Layout.fillWidth: true
Controls.RadioButton {
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
checked: modem.activeConnectionUni == modelData.connectionUni checked: modem.activeConnectionUni == modelData.connectionUni
onClicked: { onClicked: {
if (!checked) { modem.activateProfile(modelData.connectionUni);
modem.activateProfile(modelData.connectionUni);
}
// reapply binding // reapply binding
checked = Qt.binding(() => { return modem.activeConnectionUni == modelData.connectionUni }); checked = Qt.binding(() => { return modem.activeConnectionUni == modelData.connectionUni });
} }
trailing: RowLayout {
Controls.ToolButton {
visible: root.editMode
icon.name: "entry-edit"
text: i18n("Edit")
display: Controls.ToolButton.IconOnly
onClicked: {
profileDialog.profile = modelData;
profileDialog.open();
}
}
Controls.ToolButton {
visible: root.editMode
icon.name: "delete"
text: i18n("Delete")
display: Controls.ToolButton.IconOnly
onClicked: modem.removeProfile(modelData.connectionUni)
}
}
} }
}
ColumnLayout { FormCard.FormButtonDelegate {
Layout.alignment: Qt.AlignLeft text: i18n("Add APN")
Layout.fillWidth: true icon.name: 'list-add'
spacing: Kirigami.Units.smallSpacing onClicked: {
profileDialog.profile = null;
profileDialog.open();
}
}
Kirigami.Heading { FormCard.FormButtonDelegate {
Layout.fillWidth: true text: i18n("Automatically detect APN")
level: 3 icon.name: 'list-add'
text: modelData.name onClicked: {
} modem.addDetectedProfileSettings();
Controls.Label {
Layout.fillWidth: true
text: modelData.apn
}
} }
} }
} }