From e6475dfe5a4209ad6142c2400dec6b9fc4ef5f07 Mon Sep 17 00:00:00 2001 From: Teemu Holappa Date: Wed, 12 Oct 2016 10:17:34 +0300 Subject: Fix Wifi utils connection view Fixed the access point selection combobox to show the connected service properly. Fixed layout problems when Virtual Keyboard is active. Change-Id: Id1b05c4e12655eb93df91a78b979ad8fcf3361f5 Reviewed-by: Samuli Piippo --- .../qnetworksettingsservicemodel.cpp | 64 +++- src/networksettings/qnetworksettingsservicemodel.h | 8 + src/settingsui/network/ComboBoxEntry.qml | 4 + src/settingsui/network/NetworkSettings.qml | 6 +- src/settingsui/network/WifiSettings.qml | 334 +++++++++++---------- 5 files changed, 255 insertions(+), 161 deletions(-) diff --git a/src/networksettings/qnetworksettingsservicemodel.cpp b/src/networksettings/qnetworksettingsservicemodel.cpp index 2755eda..ce8ea86 100644 --- a/src/networksettings/qnetworksettingsservicemodel.cpp +++ b/src/networksettings/qnetworksettingsservicemodel.cpp @@ -78,6 +78,7 @@ QVariant QNetworkSettingsServiceModel::data(const QModelIndex & index, int role) void QNetworkSettingsServiceModel::append(QNetworkSettingsService* item) { item->setParent(this); + connectStateChanges(item); beginResetModel(); m_items.append(item); @@ -87,14 +88,24 @@ void QNetworkSettingsServiceModel::append(QNetworkSettingsService* item) void QNetworkSettingsServiceModel::insert(int row, QNetworkSettingsService* item) { item->setParent(this); - + connectStateChanges(item); beginInsertRows(QModelIndex(), row, row); m_items.insert(row, item); endInsertRows(); } +void QNetworkSettingsServiceModel::connectStateChanges(QNetworkSettingsService* item) +{ + connect(item, &QNetworkSettingsService::stateChanged, this, &QNetworkSettingsServiceModel::connectionStatusChanged); + QNetworkSettingsWireless* wireless = item->wirelessConfig(); + if (wireless) + connect(wireless, &QNetworkSettingsWireless::signalStrengthChanged, this, &QNetworkSettingsServiceModel::signalStrengthChanged); +} + void QNetworkSettingsServiceModel::remove(int row) { + QNetworkSettingsService* item = m_items.at(row); + item->deleteLater(); beginRemoveRows(QModelIndex(), row, row); m_items.removeAt(row); endRemoveRows(); @@ -123,6 +134,34 @@ QList QNetworkSettingsServiceModel::getModel() return m_items; } +void QNetworkSettingsServiceModel::connectionStatusChanged() +{ + QNetworkSettingsService *s = qobject_cast(sender()); + + int row = 0; + foreach (QNetworkSettingsService* item, m_items) { + if (item == s) { + updated(row); + break; + } + row++; + } + +} + +void QNetworkSettingsServiceModel::signalStrengthChanged() +{ + QNetworkSettingsWireless *s = qobject_cast(sender()); + int row = 0; + foreach (QNetworkSettingsService* item, m_items) { + if (item->wirelessConfig() == s) { + updated(row); + break; + } + row++; + } +} + //Filter model /*! @@ -200,3 +239,26 @@ QVariant QNetworkSettingsServiceFilter::itemFromRow(const int row) const return QVariant::fromValue(QStringLiteral("")); } +/*! + \qmlmethod int NetworkSettingsServiceFilter::activeRow() + + Returns the connected service index in the model. + Returns negative number if no active connection is available. +*/ +int QNetworkSettingsServiceFilter::activeRow() const +{ + QNetworkSettingsServiceModel* model = qobject_cast(sourceModel()); + QList data = model->getModel(); + int row = 0; + foreach (QNetworkSettingsService* item, data) { + if (item->type() == m_type && + (item->state() == QNetworkSettingsState::Ready || + item->state() == QNetworkSettingsState::Online)) { + QModelIndex idx = model->index(row, 0); + QModelIndex mapped = mapFromSource(idx); + return mapped.row(); + } + row++; + } + return -1; +} diff --git a/src/networksettings/qnetworksettingsservicemodel.h b/src/networksettings/qnetworksettingsservicemodel.h index 3770775..ab225bd 100644 --- a/src/networksettings/qnetworksettingsservicemodel.h +++ b/src/networksettings/qnetworksettingsservicemodel.h @@ -58,7 +58,14 @@ public: Connected }; + +private Q_SLOTS: + void connectionStatusChanged(); + void signalStrengthChanged(); + private: + void connectStateChanges(QNetworkSettingsService* item); + QList m_items; QHash m_roleNames; }; @@ -74,6 +81,7 @@ public: QNetworkSettingsType::Types type() const; void setType(QNetworkSettingsType::Types type); Q_INVOKABLE QVariant itemFromRow(const int row) const; + Q_INVOKABLE int activeRow() const; Q_SIGNALS: void typeChanged(); private: diff --git a/src/settingsui/network/ComboBoxEntry.qml b/src/settingsui/network/ComboBoxEntry.qml index 71b997c..91655ed 100644 --- a/src/settingsui/network/ComboBoxEntry.qml +++ b/src/settingsui/network/ComboBoxEntry.qml @@ -42,6 +42,8 @@ RowLayout { property alias model: cb.model property alias count: cb.count property int titleWidth: -1 + signal activated(var index) + signal highlighted(var index) Label { id: label @@ -53,5 +55,7 @@ RowLayout { id: cb textRole: "text" Layout.fillWidth: true + onActivated: root.activated(index) + onHighlightedIndexChanged: root.highlighted(index) } } diff --git a/src/settingsui/network/NetworkSettings.qml b/src/settingsui/network/NetworkSettings.qml index 52ab1af..9385ee1 100644 --- a/src/settingsui/network/NetworkSettings.qml +++ b/src/settingsui/network/NetworkSettings.qml @@ -33,13 +33,15 @@ import QtDeviceUtilities.NetworkSettings 1.0 Item { property string title: qsTr("Network Settings") + GroupBox { id: networkSelect anchors.rightMargin: parent.width * 0.618 + anchors.left: parent.left anchors.leftMargin: 20 + anchors.top: parent.top anchors.topMargin: 20 - anchors.bottomMargin: 20 - anchors.fill: parent + title: qsTr("Select Connection") function stateToStr(serviceState) { diff --git a/src/settingsui/network/WifiSettings.qml b/src/settingsui/network/WifiSettings.qml index 7a0735c..f7cf823 100644 --- a/src/settingsui/network/WifiSettings.qml +++ b/src/settingsui/network/WifiSettings.qml @@ -37,201 +37,219 @@ Item { Component.onCompleted: NetworkSettingsManager.services.type = NetworkSettingsType.Wifi; property bool connecting: false - GroupBox { - id: content - title: qsTr("Wireless Settings") + Flickable { anchors.fill: parent + contentHeight: content.height + contentWidth: width - ColumnLayout { - spacing: 20 + GroupBox { + title: qsTr("Wireless Settings") width: parent.width - RowLayout { - spacing: 10 - id: enableSwitch + ColumnLayout { + id: content + spacing: 20 width: parent.width - Label { - Layout.preferredWidth: root.width * 0.382 - Layout.alignment: Qt.AlignVCenter - horizontalAlignment: Text.AlignRight - text: selectedInterface.powered ? qsTr("Wi-Fi ON") : qsTr("Wi-Fi OFF") - } - Switch { - checked: selectedInterface.powered - onCheckedChanged: { - selectedInterface.powered = checked - root.connecting = false - connectView.visible = false - } - } - } - RowLayout { - spacing: 10 - width: parent.width - - visible: selectedInterface.powered && networkSelection.count > 0 - Label { - Layout.preferredWidth: root.width * 0.382 - text: qsTr("Current network") - horizontalAlignment: Text.AlignRight - Layout.alignment: Qt.AlignVCenter - - } - ComboBoxEntry { - id: networkSelection - model: NetworkSettingsManager.services - - textRole: "name" - Layout.fillWidth: true - onCurrentIndexChanged: { - if (currentIndex >= 0) { - connectView.visible = false + RowLayout { + spacing: 10 + id: enableSwitch + width: parent.width - var service = model.itemFromRow(currentIndex) - if (service) { - root.connecting = true - service.connectService(); - } - } + Label { + Layout.preferredWidth: root.width * 0.382 + Layout.alignment: Qt.AlignVCenter + horizontalAlignment: Text.AlignRight + text: selectedInterface.powered ? qsTr("Wi-Fi ON") : qsTr("Wi-Fi OFF") } - - onCountChanged: { - if (count === 0) { + Switch { + checked: selectedInterface.powered + onCheckedChanged: { + selectedInterface.powered = checked root.connecting = false connectView.visible = false } } + } + RowLayout { + spacing: 10 + width: parent.width + + visible: selectedInterface.powered && networkSelection.count > 0 + Label { + Layout.preferredWidth: root.width * 0.382 + text: qsTr("Current network") + horizontalAlignment: Text.AlignRight + Layout.alignment: Qt.AlignVCenter - delegate: WifiSelectorDelegate { - width: networkSelection.width - onConnectChanged: if (connect) networkSelection.currentIndex = index } - } - } + ComboBoxEntry { + id: networkSelection + model: NetworkSettingsManager.services - Row { - id: infoRow - spacing: 10 - width: parent.width - visible: selectedInterface.powered && selectedInterface.state !== NetworkSettingsState.Online && (networkSelection.count == 0 || root.connecting) - Label { - id: scanningText - text: root.connecting ? qsTr("Connecting to the network...") : qsTr("Searching for Wi-Fi networks...") - horizontalAlignment: Text.AlignLeft - } - WifiSignalMonitor { - id: scanningIcon - scanning: true - height: scanningText.height - width: height - } - } + textRole: "name" + Layout.fillWidth: true + onActivated: { + if (index >= 0) { + connectView.visible = false - GroupBox { - id: connectView - title: qsTr("Enter a password") - visible: false - Layout.fillWidth: true - ColumnLayout { - width: parent.width + var service = model.itemFromRow(index) + if (service) { + root.connecting = true + service.connectService(); + } + } + } - RowLayout { - id: errorView - visible: text.text !== "" - spacing: 10 - property alias text: text.text + onCountChanged: { + if (count === 0) { + root.connecting = false + connectView.visible = false + } + } - Image { - source: "../icons/Alert_yellow_1x.png" - Layout.alignment: Qt.AlignVCenter + Component.onCompleted: { + networkSelection.currentIndex = model.activeRow() } - Text { - id: text - color: "#face20" - text: "" - Layout.alignment: Qt.AlignVCenter + + delegate: WifiSelectorDelegate { + width: networkSelection.width + onConnectChanged: if (connect) networkSelection.currentIndex = index } } - RowLayout { - spacing: 10 - visible: false - width: parent.width + } - Label { - text: qsTr("User name:") - horizontalAlignment: Text.AlignRight - Layout.preferredWidth: root.width * 0.382 - Layout.alignment: Qt.AlignVCenter - } - TextField { - text: "" - inputMethodHints: Qt.ImhNoPredictiveText - Layout.alignment: Qt.AlignVCenter - Layout.fillWidth: true + Row { + id: infoRow + spacing: 10 + width: parent.width + visible: selectedInterface.powered && selectedInterface.state !== NetworkSettingsState.Online + Label { + id: scanningText + text: { + if (networkSelection.count == 0) + return qsTr("Searching for Wi-Fi networks...") + else if (root.connecting) + return qsTr("Connecting to the network...") + else + return "" } + horizontalAlignment: Text.AlignLeft + } + WifiSignalMonitor { + id: scanningIcon + scanning: true + visible: scanningText.text !== "" + height: scanningText.height + width: height } - RowLayout { - spacing: 10 + } + + GroupBox { + id: connectView + title: qsTr("Enter a password") + visible: false + Layout.fillWidth: true + ColumnLayout { width: parent.width - Label { - text: qsTr("Password:") - horizontalAlignment: Text.AlignRight - Layout.preferredWidth: root.width * 0.382 - Layout.alignment: Qt.AlignVCenter + RowLayout { + id: errorView + visible: text.text !== "" + spacing: 10 + property alias text: text.text + + Image { + source: "../icons/Alert_yellow_1x.png" + Layout.alignment: Qt.AlignVCenter + } + Text { + id: text + color: "#face20" + text: "" + Layout.alignment: Qt.AlignVCenter + } } - TextField { - id: password - text: "" - echoMode: TextInput.Password - inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData - Layout.alignment: Qt.AlignVCenter - Layout.fillWidth: true + RowLayout { + spacing: 10 + visible: false + width: parent.width + + Label { + text: qsTr("User name:") + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: root.width * 0.382 + Layout.alignment: Qt.AlignVCenter + } + TextField { + text: "" + inputMethodHints: Qt.ImhNoPredictiveText + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + } } - } - RowLayout { - spacing: 10 + RowLayout { + spacing: 10 + width: parent.width - Button { - text: qsTr("Connect") - onClicked: { - connectView.visible = false - NetworkSettingsManager.userAgent.setUserCredentials("", password.text) + Label { + text: qsTr("Password:") + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: root.width * 0.382 + Layout.alignment: Qt.AlignVCenter + } + TextField { + id: password + text: "" + echoMode: TextInput.Password + inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true } } - Button { - text: qsTr("Cancel") - onClicked: { - networkSelection.currentIndex = -1 - connectView.visible = false + RowLayout { + spacing: 10 + + Button { + text: qsTr("Connect") + onClicked: { + connectView.visible = false + NetworkSettingsManager.userAgent.setUserCredentials("", password.text) + } + } + Button { + text: qsTr("Cancel") + onClicked: { + networkSelection.currentIndex = -1 + connectView.visible = false + } } } } } - } - Button { - id: disconnect - text: qsTr("Disconnect") - visible: selectedInterface.state === NetworkSettingsState.Online || - selectedInterface.state === NetworkSettingsState.Ready - onClicked: { - console.log("disconnect"); - NetworkSettingsManager.services.itemFromRow(networkSelection.selectedIndex).disconnectService(); - networkSelection.selectedIndex = -1; + Button { + id: disconnect + text: qsTr("Disconnect") + visible: selectedInterface.state === NetworkSettingsState.Online || + selectedInterface.state === NetworkSettingsState.Ready + onClicked: { + NetworkSettingsManager.services.itemFromRow(networkSelection.currentIndex).disconnectService(); + networkSelection.currentIndex = -1; + root.connecting = false + } } } - } - Connections { - target: NetworkSettingsManager.userAgent - onShowUserCredentialsInput : { - connectView.visible = true - root.connecting = false - } - onError: { - errorView.visible = true - connectView.visible = true - root.connecting = false + Connections { + target: NetworkSettingsManager.userAgent + onShowUserCredentialsInput : { + connectView.visible = true + root.connecting = false + } + onError: { + errorView.visible = true + connectView.visible = true + root.connecting = false + } } } } -- cgit v1.2.3