summaryrefslogtreecommitdiffstats
path: root/src/settingsui/network
diff options
context:
space:
mode:
authorTeemu Holappa <teemu.holappa@theqtcompany.com>2016-02-11 11:50:55 +0200
committerTeemu Holappa <teemu.holappa@theqtcompany.com>2016-02-17 11:57:20 +0000
commitf1d884b6dad5a93d7a3077b6b05d3ec7fcd9a6ea (patch)
tree9d48669bdf1e8877b19c3a98cd8bbd8c90df5290 /src/settingsui/network
parentb4088adc7f2666d468a478e379b94c5cb4494c1b (diff)
Refactored Qml plugins into modules.
Separated C++ and Qml interfaces. All the UI's from plugins are moved to the settingsui folder. Change-Id: Id6a6623346b18321357bc42d24121c4d9cdfd098 Reviewed-by: Kimmo Ollila <kimmo.ollila@theqtcompany.com>
Diffstat (limited to 'src/settingsui/network')
-rw-r--r--src/settingsui/network/EditWiredSettings.qml641
-rw-r--r--src/settingsui/network/IpAddressTextField.qml43
-rw-r--r--src/settingsui/network/NetworkDetails.qml42
-rw-r--r--src/settingsui/network/NetworkSettings.qml137
-rw-r--r--src/settingsui/network/WifiSelectorDelegate.qml90
-rw-r--r--src/settingsui/network/WifiSettings.qml189
-rw-r--r--src/settingsui/network/WifiSignalMonitor.qml83
-rw-r--r--src/settingsui/network/WiredSettings.qml207
8 files changed, 1432 insertions, 0 deletions
diff --git a/src/settingsui/network/EditWiredSettings.qml b/src/settingsui/network/EditWiredSettings.qml
new file mode 100644
index 0000000..1249e46
--- /dev/null
+++ b/src/settingsui/network/EditWiredSettings.qml
@@ -0,0 +1,641 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles.Flat 1.0 as Flat
+import "../common"
+import com.theqtcompany.settings.network 1.0
+
+Item {
+ id: root
+ property string title: qsTr("Ethernet Settings")
+ property var service: undefined
+
+ property bool ipv4Changed: false
+ property bool ipv6Changed: false
+ property bool nameserversChanged: false
+ property bool domainsChanged: false
+ property bool proxyChanged: false
+
+ Component.onDestruction: {
+ //Clear all unsaved changes from models
+ service.proxy.excludes.resetChanges();
+ service.nameservers.resetChanges();
+ service.domains.resetChanges();
+ }
+
+ Component.onCompleted: titlebar.title = service.name;
+
+ Flickable {
+ anchors.fill: parent
+ anchors.top: saveButton.bottom
+ anchors.margins: Math.round(40 * Flat.FlatStyle.scaleFactor)
+ anchors.bottomMargin: Math.round(20 * Flat.FlatStyle.scaleFactor)
+ contentHeight: content.height
+ contentWidth: width
+ interactive: !ipv4Method.popupVisible && !ipv6Method.popupVisible && !proxyMethodSel.popupVisible
+ Column {
+ id: content
+ width: parent.width
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ property int titleWidth: Math.round(width * 0.382)
+ property int groupWidth: Math.round(width - saveButton.width - 10 * Flat.FlatStyle.scaleFactor)
+
+ //IPv4 Config
+ GroupBox {
+ flat: false
+ width: content.groupWidth
+ Layout.fillWidth: true
+ title: qsTr("IPv4")
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ ListModel {
+ id: methodsModel
+
+ ListElement {
+ text: "DHCP"
+ method: NetworkSettingsIPv4.Dhcp
+ }
+ ListElement {
+ text: "Manual"
+ method: NetworkSettingsIPv4.Manual
+ }
+ ListElement {
+ text: "Off"
+ method: NetworkSettingsIPv4.Off
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Connection method")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+
+ CustomCombobox {
+ id: ipv4Method
+ model: methodsModel
+ Component.onCompleted: selectedIndex = service.ipv4.method
+
+ onSelectedIndexChanged : {
+ ipv4Changed = true;
+ service.ipv4.method = model.get(selectedIndex).method;
+ }
+ delegate: FlatStyledDropdownDelegate { }
+ }
+ }
+
+ Column {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.ipv4.method === NetworkSettingsIPv4.Dhcp
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv4.address
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Mask")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv4.mask
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Router")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv4.gateway
+ }
+ }
+ }
+
+ Column {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.ipv4.method === NetworkSettingsIPv4.Manual
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ IpAddressTextField {
+ id: ipv4Address
+ text: service.ipv4.address
+ onTextChanged: ipv4Changed = true;
+
+ onAccepted: if (text.length > 0) service.ipv4.address = text
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Mask")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ IpAddressTextField {
+ id: ipv4Mask
+ text: service.ipv4.mask
+ onTextChanged: ipv4Changed = true;
+ onAccepted: if (text.length > 0) service.ipv4.mask = text
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Router")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ IpAddressTextField {
+ id: ipv4Gateway
+ text: service.ipv4.gateway
+
+ onTextChanged: ipv4Changed = true
+
+ onAccepted: if (text.length > 0) service.ipv4.gateway = text
+ }
+ }
+ }
+ }
+ }
+
+ //IPv6 Config
+ GroupBox {
+ flat: false
+ width: content.groupWidth
+ Layout.fillWidth: true
+ title: qsTr("IPv6")
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ ListModel {
+ id: ipv6methodsmodel
+
+ ListElement {
+ text: qsTr("Auto")
+ method: NetworkSettingsIPv6.Auto
+ }
+ ListElement {
+ text: qsTr("Manual")
+ method: NetworkSettingsIPv6.Manual
+ }
+ ListElement {
+ text: qsTr("Off")
+ method: NetworkSettingsIPv6.Off
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Connection method: ")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+
+ CustomCombobox {
+ id: ipv6Method
+ model: ipv6methodsmodel
+ Component.onCompleted: selectedIndex = service.ipv6.method
+ onSelectedIndexChanged : {
+ ipv6Changed = true;
+ service.ipv6.method = model.get(selectedIndex).method;
+ }
+ delegate: FlatStyledDropdownDelegate { }
+ }
+ }
+
+ Column {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.ipv6.method === NetworkSettingsIPv6.Auto
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv6.address
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Router")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv6.gateway
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Prefix length")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextLabel {
+ text: service.ipv6.prefixLength
+ }
+ }
+ }
+
+ Column {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.ipv6.method === NetworkSettingsIPv6.Manual
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ id: ipv6Address
+ text: service.ipv6.address
+ onTextChanged: ipv6Changed = true;
+ onAccepted: if (text.length > 0) service.ipv6.address = text
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Router")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ id: ipv6Gateway
+ text: service.ipv6.gateway
+ onTextChanged: ipv6Changed = true;
+ onAccepted: if (text.length > 0) service.ipv4.gateway = text
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Prefix length")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ id: ipv6PrefixLength
+ text: service.ipv6.prefixLength
+ validator: IntValidator { bottom: 0; top: 255 }
+
+ onTextChanged: ipv6Changed = true
+
+ onAccepted: if (text.length > 0) service.ipv6.prefixLength = parseInt(text)
+ }
+ }
+ }
+ }
+ }
+
+ GroupBox {
+ flat: false
+ width: content.groupWidth
+ Layout.fillWidth: true
+ title: qsTr("Name servers")
+
+ ColumnLayout {
+ anchors.fill: parent
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ Column {
+ Repeater {
+ model: service.nameservers
+
+ Row {
+ TextField {
+ text: edit
+ onTextChanged: {
+ nameserversChanged = true;
+ edit = text;
+ }
+ }
+ Button {
+ implicitWidth: height
+ text: "-"
+ onClicked: {
+ service.nameservers.remove(index);
+ nameserversChanged = true;
+ }
+ }
+ Button {
+ implicitWidth: height
+ visible: index==service.nameservers.count-1
+ text: "+"
+ onClicked: service.nameservers.append("")
+ }
+ }
+ }
+ }
+ Row {
+ TextField {
+ id: nameServerEntryItem
+ visible: service.nameservers.count === 0
+ text: ""
+ onAccepted: service.nameservers.append(text)
+ }
+ Button {
+ implicitWidth: height
+ visible: nameServerEntryItem.visible
+ text: "+"
+ onClicked: nameServerEntryItem.accepted()
+ }
+ }
+ }
+ }
+ }
+
+ GroupBox {
+ flat: false
+ width: content.groupWidth
+ Layout.fillWidth: true
+ title: qsTr("Domains")
+
+ ColumnLayout {
+ anchors.fill: parent
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Address")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ Column {
+ Repeater {
+ model: service.domains
+ Row {
+ TextField {
+ text: edit
+ onTextChanged: {
+ root.domainsChanged = true;
+ edit = text;
+ }
+ }
+ Button {
+ implicitWidth: height
+ text: "-"
+ onClicked: {
+ service.domains.remove(index);
+ domainsChanged.domainsChanged = true;
+ }
+ }
+ Button {
+ implicitWidth: height
+ visible: index==service.domains.count-1
+ text: "+"
+ onClicked: service.domains.append("")
+ }
+ }
+ }
+ }
+ Row {
+ TextField {
+ id: domainsEntryItem
+ visible: service.domains.count === 0
+ text: ""
+ onAccepted: service.domains.append(text)
+ }
+ Button {
+ implicitWidth: height
+ visible: domainsEntryItem.visible
+ text: "+"
+ onClicked: domainsEntryItem.accepted()
+ }
+ }
+ }
+ }
+ }
+
+ GroupBox {
+ flat: false
+ width: content.groupWidth
+ Layout.fillWidth: true
+ title: qsTr("Proxy Settings")
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ ListModel {
+ id: proxyMethodModel
+
+ ListElement {
+ text: qsTr("Direct")
+ method: NetworkSettingsProxy.Direct
+ }
+ ListElement {
+ text: qsTr("Auto")
+ method: NetworkSettingsProxy.Auto
+ }
+ ListElement {
+ text: qsTr("Manual")
+ method: NetworkSettingsProxy.Manual
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Configuration")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+
+ CustomCombobox {
+ id: proxyMethodSel
+ model: proxyMethodModel
+ Component.onCompleted: selectedIndex = service.proxy.method
+ onSelectedIndexChanged : {
+ proxyChanged = true;
+ service.proxy.method = model.get(selectedIndex).method;
+ }
+ delegate: FlatStyledDropdownDelegate { }
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.proxy.method !== NetworkSettingsProxy.Direct
+ TextLabel {
+ text: service.proxy.method === NetworkSettingsProxy.Manual ? qsTr("Proxy address") : qsTr("Automatic configuration URL")
+
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ id: proxyUrl
+ text: service.proxy.url
+ onTextChanged: proxyChanged = true;
+ onAccepted: service.proxy.url = text;
+ }
+ }
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: service.proxy.method === NetworkSettingsProxy.Manual
+
+ TextLabel {
+ text: qsTr("No proxy for")
+ width: content.titleWidth
+ horizontalAlignment: Text.AlignRight
+ }
+
+ Column {
+ Repeater {
+ model: service.proxy.excludes
+
+ Row {
+ TextField {
+ text: edit
+ onTextChanged: edit = text
+ }
+ Button {
+ implicitWidth: height
+ text: "-"
+ onClicked: {
+ service.proxy.excludes.remove(index);
+ proxyChanged = true;
+ }
+ }
+ Button {
+ implicitWidth: height
+ visible: index==service.proxy.excludes.count-1
+ text: "+"
+ onClicked: service.proxy.excludes.append("")
+ }
+ }
+ }
+ }
+ Row {
+ TextField {
+ id: proxyEntryItem
+ visible: service.proxy.excludes.count === 0
+ text: ""
+ onAccepted: service.proxy.excludes.append(text)
+ }
+ Button {
+ implicitWidth: height
+ visible: proxyEntryItem.visible
+ text: "+"
+ onClicked: proxyEntryItem.accepted()
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Button {
+ id: saveButton
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.margins: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ anchors.rightMargin: Math.round(40 * Flat.FlatStyle.scaleFactor)
+ text: qsTr("Save")
+
+ onClicked: {
+ if (ipv4Changed) {
+ ipv4Address.accepted();
+ ipv4Mask.accepted();
+ ipv4Gateway.accepted();
+ service.setupIpv4Config();
+ }
+
+ if (ipv6Changed) {
+ ipv6Address.accepted();
+ ipv6Gateway.accepted();
+ ipv6PrefixLength.accepted();
+ service.setupIpv6Config();
+ }
+
+ if (nameserversChanged) {
+ service.setupNameserversConfig();
+ }
+
+ if (domainsChanged) {
+ service.setupDomainsConfig();
+ }
+ if (proxyChanged) {
+ proxyUrl.accepted();
+ service.setupNetworkSettingsProxy();
+ }
+ stackView.pop();
+ }
+ }
+}
diff --git a/src/settingsui/network/IpAddressTextField.qml b/src/settingsui/network/IpAddressTextField.qml
new file mode 100644
index 0000000..102d458
--- /dev/null
+++ b/src/settingsui/network/IpAddressTextField.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+
+TextField {
+ Layout.fillWidth: true
+ validator: RegExpValidator { regExp: /^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$/ }
+}
diff --git a/src/settingsui/network/NetworkDetails.qml b/src/settingsui/network/NetworkDetails.qml
new file mode 100644
index 0000000..3e71be0
--- /dev/null
+++ b/src/settingsui/network/NetworkDetails.qml
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+
+Loader {
+ id: root
+ property var selectedInterface:undefined
+ anchors.fill: parent
+}
diff --git a/src/settingsui/network/NetworkSettings.qml b/src/settingsui/network/NetworkSettings.qml
new file mode 100644
index 0000000..2eed812
--- /dev/null
+++ b/src/settingsui/network/NetworkSettings.qml
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles.Flat 1.0 as Flat
+import "../common"
+import com.theqtcompany.settings.network 1.0
+
+Item {
+ property string title: qsTr("Network Settings")
+ GroupBox {
+ id: networkSelect
+ anchors.fill: parent
+ anchors.rightMargin: parent.width * 0.618
+ anchors.leftMargin: Math.round(20 * Flat.FlatStyle.scaleFactor)
+ anchors.topMargin: Math.round(20 * Flat.FlatStyle.scaleFactor)
+ title: qsTr("Select Connection")
+
+ function stateToStr(serviceState) {
+ switch (serviceState) {
+ case NetworkService.Idle:
+ return qsTr("Idle");
+ case NetworkService.Failure:
+ return qsTr("Failure");
+ case NetworkService.Association:
+ return qsTr("Association");
+ case NetworkService.Configuration:
+ return qsTr("Configuration");
+ case NetworkService.Ready:
+ return qsTr("Ready");
+ case NetworkService.Disconnect:
+ return qsTr("Disconnect");
+ case NetworkService.Online:
+ return qsTr("Online");
+ default:
+ return qsTr("Undefined");
+ }
+ }
+
+ ColumnLayout {
+ width: networkSelect.width
+ ExclusiveGroup {
+ id: exgroup
+ }
+
+ Repeater {
+ model: NetworkSettingsManager.interfaces
+
+ Button {
+ implicitWidth: networkSelect.width - Math.round(20 * Flat.FlatStyle.scaleFactor)
+ implicitHeight: Math.round(54 * Flat.FlatStyle.scaleFactor)
+ checkable: true
+ exclusiveGroup: exgroup
+
+ Row {
+ anchors.fill: parent
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+
+ Image {
+ id: typeId
+ height: parent.height
+ width: height
+ }
+
+ Column {
+ height: Math.round(parent.height * 0.7)
+ spacing: 0
+ anchors.verticalCenter: parent.verticalCenter
+ TextLabel {
+ text: name
+ }
+
+ TextLabel {
+ text: networkSelect.stateToStr(modelData.state)
+ font.pixelSize: Math.round(12 * Flat.FlatStyle.scaleFactor)
+ }
+
+ }
+ }
+
+ onCheckedChanged: {
+ if (checked) {
+ networkDetails.selectedInterface = modelData
+ networkDetails.selectedInterface.scanServices()
+ if (type === NetworkSettingsType.Wired) {
+ networkDetails.source = "WiredSettings.qml";
+ }
+ else if (type === NetworkSettingsType.Wifi) {
+ networkDetails.source = "WifiSettings.qml";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ NetworkDetails {
+ id: networkDetails
+ anchors.fill: parent
+ anchors.leftMargin: networkSelect.width + Math.round(20 * Flat.FlatStyle.scaleFactor)
+ }
+}
diff --git a/src/settingsui/network/WifiSelectorDelegate.qml b/src/settingsui/network/WifiSelectorDelegate.qml
new file mode 100644
index 0000000..72216a6
--- /dev/null
+++ b/src/settingsui/network/WifiSelectorDelegate.qml
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+import "../common"
+import com.theqtcompany.settings.network 1.0
+import QtQuick.Controls.Styles.Flat 1.0 as Flat
+
+Item {
+ id: root
+ property bool checkable: true
+ property bool checked: false
+ property bool pressed: false
+ property bool connect: modelData["connected"]
+ signal clicked()
+
+ MouseArea {
+ id: delegateButton
+ anchors.fill: parent
+ hoverEnabled: true
+ onPressed: root.pressed = true
+ onClicked: root.clicked()
+ onEntered: checked = !checked
+
+ Rectangle {
+ anchors.fill: parent
+ color: root.checked ? Flat.FlatStyle.disabledColor : "transparent"
+ opacity: root.checked ? 0.15 : 1.0
+ }
+ Rectangle {
+ color: Flat.FlatStyle.darkFrameColor
+ width: parent.width
+ height: Flat.FlatStyle.onePixel
+ anchors.bottom: parent.bottom
+ }
+ TextLabel {
+ id: text
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.margins: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ horizontalAlignment: Text.AlignLeft
+ text: modelData["name"]
+ }
+ WifiSignalMonitor {
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.margins: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ height: Math.round(parent.height * .8)
+ width: height
+ signalStrength: modelData["signalStrength"]
+ connected: modelData["connected"]
+ }
+ }
+}
diff --git a/src/settingsui/network/WifiSettings.qml b/src/settingsui/network/WifiSettings.qml
new file mode 100644
index 0000000..352ec3c
--- /dev/null
+++ b/src/settingsui/network/WifiSettings.qml
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles.Flat 1.0 as Flat
+import "../common"
+import com.theqtcompany.settings.network 1.0
+
+Item {
+ id: root
+ anchors.fill: parent
+ anchors.margins: Math.round(20 * Flat.FlatStyle.scaleFactor)
+
+ Component.onCompleted: {
+ NetworkSettingsManager.services.type = NetworkSettingsType.Wifi;
+ }
+ GroupBox {
+ id: content
+ title: qsTr("Wireless Settings")
+ anchors.fill: parent
+ Layout.fillWidth: true
+ flat: true
+
+ ColumnLayout {
+ spacing: Math.round(20 * Flat.FlatStyle.scaleFactor)
+ width: parent.width
+ Row {
+ id: enableSwitch
+ width: parent.width
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ width: root.width*0.382
+ horizontalAlignment: Text.AlignRight
+ text: selectedInterface.powered ? qsTr("Disable Wifi") : qsTr("Enable Wifi")
+ }
+ Switch {
+ checked: selectedInterface.powered
+ onCheckedChanged: selectedInterface.powered = checked
+ }
+ }
+
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ width: parent.width
+
+ TextLabel {
+ id: labelText
+ text: qsTr("Selected network ")
+ width: content.width*0.382
+ horizontalAlignment: Text.AlignRight
+ }
+
+ CustomCombobox {
+ id: networkSelection
+ model: NetworkSettingsManager.services
+ visible: selectedInterface.powered
+ width: Math.round(200 * Flat.FlatStyle.scaleFactor)
+ textRole: "name"
+ onSelectedIndexChanged : if (selectedIndex >= 0) model.itemFromRow(selectedIndex).connectService();
+
+ delegate: WifiSelectorDelegate {
+ id: delegate
+ onConnectChanged: if (connect) networkSelection.setSelectIndexToVal(modelData.name, "name");
+ }
+ }
+ }
+
+ GroupBox {
+ id: connectView
+ title: qsTr("Enter a password")
+ flat: false
+ visible: false
+ ColumnLayout {
+ Row {
+ id: errorView
+ property alias text: text.text
+ visible: text.text !== ""
+
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ Image {
+ source: "../icons/Alert_yellow_1x.png"
+ }
+ Text {
+ id: text
+ color: "#face20"
+ text: ""
+ }
+ }
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ visible: false
+ TextLabel {
+ text: qsTr("User name")
+ width: root.width*0.382
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ text: ""
+ inputMethodHints: Qt.ImhNoPredictiveText
+ }
+ }
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ TextLabel {
+ text: qsTr("Password")
+ horizontalAlignment: Text.AlignRight
+ }
+ TextField {
+ id: password
+ text: ""
+ echoMode: TextInput.Password
+ inputMethodHints: Qt.ImhNoPredictiveText
+ }
+ }
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ Button {
+ text: qsTr("Connect")
+ onClicked: {
+ connectView.visible = false
+ NetworkSettingsUserAgent.setUserCredentials("", password.text)
+ }
+ }
+ Button {
+ text: qsTr("Cancel")
+ onClicked:connectView.visible = false
+ }
+ }
+ }
+ }
+
+ Button {
+ id: disconnect
+ text: qsTr("Disconnect")
+ visible: selectedInterface.state === NetworkSettingsState.Online ||
+ selectedInterface.state === NetworkSettingsState.Ready
+ onClicked: {
+ NetworkSettingsManager.services.itemFromRow(networkSelection.selectedIndex).disconnectService();
+ networkSelection.selectedIndex = -1;
+ }
+ }
+ }
+
+ Connections {
+ target: NetworkSettingsUserAgent
+ onShowUserCredentialsInput : {
+ connectView.visible = true
+ }
+ onError: {
+ errorView.visible = true
+ connectView.visible = true
+ }
+ }
+ }
+}
diff --git a/src/settingsui/network/WifiSignalMonitor.qml b/src/settingsui/network/WifiSignalMonitor.qml
new file mode 100644
index 0000000..35d9e53
--- /dev/null
+++ b/src/settingsui/network/WifiSignalMonitor.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+
+Item {
+ id: root
+
+ property bool scanning: false
+ property int signalStrength: 100
+ property bool connected: false
+
+ onSignalStrengthChanged: {
+ sprite.visible = true;
+
+ if (signalStrength < 10) {
+ sprite.visible = false;
+ }
+ else if (signalStrength < 30) {
+ sprite.currentFrame = 0;
+ }
+ else if (signalStrength < 60) {
+ sprite.currentFrame = 1;
+ }
+ else if (signalStrength < 80) {
+ sprite.currentFrame = 2;
+ }
+ else if (signalStrength <= 100) {
+ sprite.currentFrame = 3;
+ }
+ }
+
+ Image {
+ anchors.fill: parent
+ source: "Wifi_lightgray_2x.png"
+ }
+
+ AnimatedSprite {
+ id: sprite
+ anchors.fill: parent
+ source: connected ? "WifiAnim_qt_2x.png" : "WifiAnim_black_2x.png"
+ frameDuration: 500
+ frameCount: 4
+ currentFrame: 3
+ frameSync: false
+ frameWidth: 32
+ frameHeight: 32
+ loops: 40
+ running: scanning
+ }
+}
diff --git a/src/settingsui/network/WiredSettings.qml b/src/settingsui/network/WiredSettings.qml
new file mode 100644
index 0000000..aad97fe
--- /dev/null
+++ b/src/settingsui/network/WiredSettings.qml
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Device Utilities module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.5
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles.Flat 1.0 as Flat
+import "../common"
+import com.theqtcompany.settings.network 1.0
+
+Item {
+ id: root
+ anchors.fill: parent
+ anchors.margins: Math.round(20 * Flat.FlatStyle.scaleFactor)
+ property bool editMode: false
+ property var service: null
+ property string title: qsTr("Network");
+
+ Component.onCompleted: {
+ NetworkSettingsManager.services.type = NetworkSettingsType.Wired;
+ root.service = NetworkSettingsManager.services.itemFromRow(0);
+ }
+
+ ListModel {
+ id: methodsModel
+
+ ListElement {
+ text: "DHCP"
+ method: NetworkSettingsIPv4.Dhcp
+ }
+ ListElement {
+ text: "Manual"
+ method: NetworkSettingsIPv4.Manual
+ }
+ ListElement {
+ text: "Off"
+ method: NetworkSettingsIPv4.Off
+ }
+ }
+
+ GroupBox {
+ title: qsTr("Ethernet Connection")
+ anchors.fill: parent
+ Layout.fillWidth: true
+ flat: true
+ Column {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ Row {
+ TextLabel {
+ text: qsTr("Connection method: ")
+ }
+
+ CustomCombobox {
+ id: ipv4Method
+ model: methodsModel
+ Component.onCompleted: selectedIndex = service.ipv4.method
+ onSelectedIndexChanged : {
+ if (model.get(selectedIndex).method !== NetworkSettingsIPv4.Dhcp) {
+ service.ipv4.method = model.get(selectedIndex).method;
+ editMode = true;
+ }
+ else {
+ //Enable DHCP
+ if (service.ipv4.method !== model.get(selectedIndex).method) {
+ service.ipv4.method = model.get(selectedIndex).method;
+ service.setupIpv4Config();
+ }
+
+ editMode = false;
+ }
+ }
+ delegate: FlatStyledDropdownDelegate { }
+ }
+ }
+
+ Row {
+ visible: service.ipv4.method !== NetworkSettingsIPv4.Off
+ TextLabel {
+ text: qsTr("IP Address: ")
+ }
+ TextLabel {
+ text: service.ipv4.address
+ visible: !editMode
+ }
+ IpAddressTextField {
+ id: ipv4Address
+ placeholderText: service.ipv4.address
+ visible: editMode
+ onAccepted: if (text.length > 0) service.ipv4.address = text
+ }
+ }
+
+ Row {
+ visible: service.ipv4.method !== NetworkSettingsIPv4.Off
+ TextLabel {
+ text: qsTr("Mask: ")
+ }
+ TextLabel {
+ text: service.ipv4.mask
+ visible: !editMode
+ }
+ IpAddressTextField {
+ id: ipv4Mask
+ placeholderText: service.ipv4.mask
+ visible: editMode
+ onAccepted: if (text.length > 0) service.ipv4.mask = text
+ }
+ }
+
+ Row {
+ visible: service.ipv4.method !== NetworkSettingsIPv4.Off
+ TextLabel {
+ text: qsTr("Router: ")
+ }
+ TextLabel {
+ text: service.ipv4.gateway
+ visible: !editMode
+ }
+ IpAddressTextField {
+ id: ipv4Gateway
+ placeholderText: service.ipv4.gateway
+ visible: editMode
+ onAccepted: if (text.length > 0) service.ipv4.gateway = text
+ }
+ }
+
+ Row {
+ visible: service.ipv4.method !== NetworkSettingsIPv4.Off
+ TextLabel {
+ text: qsTr("DNS server: ")
+ }
+ Row {
+ spacing: Math.round(10 * Flat.FlatStyle.scaleFactor)
+ Repeater {
+ model: service.nameservers
+
+ TextLabel {
+ text: display
+ }
+ }
+ }
+ }
+
+ Row {
+ Button {
+ text: qsTr("Save")
+ visible: editMode
+
+ onClicked: {
+ ipv4Address.accepted();
+ ipv4Mask.accepted();
+ ipv4Gateway.accepted();
+ service.setupIpv4Config();
+ editMode = false;
+ }
+ }
+ Button {
+ text: qsTr("Cancel")
+ visible: editMode
+ onClicked: {
+ editMode = false;
+ methodSelection.currentIndex = service.ipv4.method
+ }
+ }
+ }
+ Button {
+ text: qsTr("Edit")
+ visible: !editMode
+
+ onClicked: stackView.push({item: Qt.resolvedUrl("EditWiredSettings.qml"), properties: {service: root.service}});
+ }
+ }
+ }
+}
+