diff --git a/client/ui/controllers/focusController.cpp b/client/ui/controllers/focusController.cpp index d32f75558..54bdc7d85 100644 --- a/client/ui/controllers/focusController.cpp +++ b/client/ui/controllers/focusController.cpp @@ -10,16 +10,15 @@ FocusController::FocusController(QQmlApplicationEngine *engine, QObject *parent) m_focusChain {}, m_focusedItem { nullptr }, m_rootObjects {}, - m_defaultFocusItem { QSharedPointer() }, + m_defaultFocusItem { nullptr }, m_lvfc { nullptr } { - QObject::connect(m_engine.get(), &QQmlApplicationEngine::objectCreated, this, - [this](QObject *object, const QUrl &url) { - QQuickItem *newDefaultFocusItem = object->findChild("defaultFocusItem"); - if (newDefaultFocusItem && m_defaultFocusItem != newDefaultFocusItem) { - m_defaultFocusItem.reset(newDefaultFocusItem); - } - }); + QObject::connect(m_engine, &QQmlApplicationEngine::objectCreated, this, [this](QObject *object, const QUrl &url) { + QQuickItem *newDefaultFocusItem = object->findChild("defaultFocusItem"); + if (newDefaultFocusItem && m_defaultFocusItem != newDefaultFocusItem) { + m_defaultFocusItem = newDefaultFocusItem; + } + }); QObject::connect(this, &FocusController::focusedItemChanged, this, [this]() { m_focusedItem->forceActiveFocus(Qt::TabFocusReason); }); @@ -65,7 +64,7 @@ void FocusController::setFocusItem(QQuickItem *item) void FocusController::setFocusOnDefaultItem() { - setFocusItem(m_defaultFocusItem.get()); + setFocusItem(m_defaultFocusItem); } void FocusController::pushRootObject(QObject *object) diff --git a/client/ui/controllers/focusController.h b/client/ui/controllers/focusController.h index dfcac57a9..11074dae6 100644 --- a/client/ui/controllers/focusController.h +++ b/client/ui/controllers/focusController.h @@ -42,11 +42,11 @@ class FocusController : public QObject void focusPreviousListViewItem(); void dropListView(); - QSharedPointer m_engine; // Pointer to engine to get root object - QList m_focusChain; // List of current objects to be focused - QQuickItem *m_focusedItem; // Pointer to the active focus item - QStack m_rootObjects; - QSharedPointer m_defaultFocusItem; + QQmlApplicationEngine *m_engine; // Pointer to engine to get root object + QList m_focusChain; // List of current objects to be focused + QQuickItem *m_focusedItem; // Pointer to the active focus item + QStack m_rootObjects; // Pointer to stack of roots for focus chain + QQuickItem *m_defaultFocusItem; ListViewFocusController *m_lvfc; // ListView focus manager diff --git a/client/ui/models/apiServicesModel.cpp b/client/ui/models/apiServicesModel.cpp index 81a10f873..3e6841953 100644 --- a/client/ui/models/apiServicesModel.cpp +++ b/client/ui/models/apiServicesModel.cpp @@ -70,7 +70,7 @@ QVariant ApiServicesModel::data(const QModelIndex &index, int role) const .arg(speed); } else if (serviceType == serviceType::amneziaFree){ QString description = tr("VPN to access blocked sites in regions with high levels of Internet censorship. "); - if (isServiceAvailable) { + if (!isServiceAvailable) { description += tr("

Not available in your region. If you have VPN enabled, disable it, return to the previous screen, and try again."); } return description; @@ -86,7 +86,7 @@ QVariant ApiServicesModel::data(const QModelIndex &index, int role) const } case IsServiceAvailableRole: { if (serviceType == serviceType::amneziaFree) { - if (isServiceAvailable) { + if (!isServiceAvailable) { return false; } } diff --git a/client/ui/qml/Controls2/DrawerType2.qml b/client/ui/qml/Controls2/DrawerType2.qml index 4c9bd0107..e67e36a15 100644 --- a/client/ui/qml/Controls2/DrawerType2.qml +++ b/client/ui/qml/Controls2/DrawerType2.qml @@ -12,7 +12,7 @@ Item { readonly property string drawerExpandedStateName: "expanded" readonly property string drawerCollapsedStateName: "collapsed" - readonly property bool isOpened: isExpandedStateActive() || (isCollapsedStateActive && (dragArea.drag.active === true)) + readonly property bool isOpened: isExpandedStateActive() || (isCollapsedStateActive() && (dragArea.drag.active === true)) readonly property bool isClosed: isCollapsedStateActive() && (dragArea.drag.active === false) property Component collapsedStateContent @@ -123,7 +123,7 @@ Item { id: background anchors.fill: parent - color: root.isCollapsed ? AmneziaStyle.color.transparent : AmneziaStyle.color.translucentMidnightBlack + color: root.isCollapsedStateActive() ? AmneziaStyle.color.transparent : AmneziaStyle.color.translucentMidnightBlack Behavior on color { PropertyAnimation { duration: 200 } diff --git a/client/ui/qml/Controls2/DropDownType.qml b/client/ui/qml/Controls2/DropDownType.qml index 60751e214..ae6dac851 100644 --- a/client/ui/qml/Controls2/DropDownType.qml +++ b/client/ui/qml/Controls2/DropDownType.qml @@ -216,9 +216,7 @@ Item { ColumnLayout { id: header - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right + anchors.fill: parent anchors.topMargin: 16 BackButtonType { @@ -226,31 +224,21 @@ Item { backButtonImage: root.headerBackButtonImage backButtonFunction: function() { menu.closeTriggered() } } - } - - Column { - id: col - anchors.top: header.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.topMargin: 16 - - spacing: 16 Header2Type { - anchors.left: parent.left - anchors.right: parent.right - anchors.leftMargin: 16 - anchors.rightMargin: 16 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + Layout.bottomMargin: 16 + Layout.fillWidth: true headerText: root.headerText - - width: parent.width } Loader { id: listViewLoader sourceComponent: root.listView + + Layout.fillHeight: true } } } diff --git a/client/ui/qml/Controls2/ListViewWithRadioButtonType.qml b/client/ui/qml/Controls2/ListViewWithRadioButtonType.qml index eafc1f5a3..bd7ca32e9 100644 --- a/client/ui/qml/Controls2/ListViewWithRadioButtonType.qml +++ b/client/ui/qml/Controls2/ListViewWithRadioButtonType.qml @@ -30,6 +30,8 @@ ListView { property bool isFocusable: true + ScrollBar.vertical: ScrollBarType {} + ButtonGroup { id: buttonGroup } diff --git a/client/ui/qml/Controls2/PageType.qml b/client/ui/qml/Controls2/PageType.qml index c2ed51975..d7f3317f3 100644 --- a/client/ui/qml/Controls2/PageType.qml +++ b/client/ui/qml/Controls2/PageType.qml @@ -20,7 +20,6 @@ Item { id: timer interval: 200 // Milliseconds onTriggered: { - console.debug(">>> PageType timer triggered") FocusController.resetRootObject() FocusController.setFocusOnDefaultItem() } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index d5cf8b6e5..ae29b80cd 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -266,11 +266,11 @@ PageType { objectName: "rowLayoutLabel" Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter Layout.topMargin: 8 - Layout.bottomMargin: drawer.isCollapsed ? 44 : ServersModel.isDefaultServerFromApi ? 61 : 16 + Layout.bottomMargin: drawer.isCollapsedStateActive ? 44 : ServersModel.isDefaultServerFromApi ? 61 : 16 spacing: 0 BasicButtonType { - enabled: (ServersModel.defaultServerImagePathCollapsed !== "") && drawer.isCollapsed + enabled: (ServersModel.defaultServerImagePathCollapsed !== "") && drawer.isCollapsedStateActive hoverEnabled: enabled implicitHeight: 36 @@ -288,8 +288,9 @@ PageType { buttonTextLabel.font.pixelSize: 13 buttonTextLabel.font.weight: 400 - text: drawer.isCollapsed ? ServersModel.defaultServerDescriptionCollapsed : ServersModel.defaultServerDescriptionExpanded + text: drawer.isCollapsedStateActive ? ServersModel.defaultServerDescriptionCollapsed : ServersModel.defaultServerDescriptionExpanded leftImageSource: ServersModel.defaultServerImagePathCollapsed + leftImageColor: "" changeLeftImageSize: false rightImageSource: hoverEnabled ? "qrc:/images/controls/chevron-down.svg" : "" @@ -347,7 +348,6 @@ PageType { objectName: "containersListView" rootWidth: root.width - height: 500 // TODO: make calculated Connections { objectName: "rowLayoutConnections" diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 44cedc11b..3594cd9dd 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -36,13 +36,13 @@ PageType { ListView { id: listview + property bool isFocusable: true + anchors.top: backButtonLayout.bottom anchors.bottom: parent.bottom width: parent.width - property bool isFocusable: true - Keys.onTabPressed: { FocusController.nextKeyTabItem() } @@ -138,26 +138,6 @@ PageType { checkEmptyText: true } - TextFieldWithHeaderType { - id: mtuTextField - Layout.fillWidth: true - Layout.topMargin: 16 - - headerText: qsTr("MTU") - textFieldText: mtu - textField.validator: IntValidator { bottom: 576; top: 65535 } - - textField.onEditingFinished: { - if (textFieldText === "") { - textFieldText = "0" - } - if (textFieldText !== mtu) { - mtu = textFieldText - } - } - checkEmptyText: true - } - TextFieldWithHeaderType { id: junkPacketCountTextField Layout.fillWidth: true diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 2b1f3f447..6c5ad23f0 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -176,7 +176,6 @@ PageType { headerText: qsTr("Hash") drawerParent: root - parentFlickable: fl listView: ListViewWithRadioButtonType { id: hashListView @@ -225,7 +224,6 @@ PageType { headerText: qsTr("Cipher") drawerParent: root - parentFlickable: fl listView: ListViewWithRadioButtonType { id: cipherListView diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml index d78ae6b91..7413df385 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml @@ -16,8 +16,6 @@ import "../Components" PageType { id: root - //defaultActiveFocusItem: listview.currentItem.mtuTextField.textField - Item { id: focusItem onFocusChanged: { diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml index 68d9611dc..f83d97fdf 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml @@ -122,26 +122,6 @@ PageType { checkEmptyText: true } - TextFieldWithHeaderType { - id: mtuTextField - Layout.fillWidth: true - Layout.topMargin: 16 - - headerText: qsTr("MTU") - textFieldText: mtu - textField.validator: IntValidator { bottom: 576; top: 65535 } - - textField.onEditingFinished: { - if (textFieldText === "") { - textFieldText = "0" - } - if (textFieldText !== mtu) { - mtu = textFieldText - } - } - checkEmptyText: true - } - BasicButtonType { id: saveButton Layout.fillWidth: true diff --git a/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml b/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml index dd097a1af..30968b38b 100644 --- a/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml +++ b/client/ui/qml/Pages2/PageSettingsApiLanguageList.qml @@ -18,13 +18,13 @@ PageType { ListView { id: menuContent - property var selectedText + property bool isFocusable: true width: parent.width - height: menuContent.contentItem.height + height: parent.height clip: true - interactive: false + interactive: true model: ApiCountryModel ButtonGroup { @@ -34,8 +34,8 @@ PageType { delegate: ColumnLayout { id: content - implicitWidth: parent.width - implicitHeight: content.implicitHeight + width: menuContent.width + height: content.implicitHeight RowLayout { VerticalRadioButton { diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index c5fc0bc15..6f77a521b 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -221,15 +221,8 @@ PageType { SettingsController.clearSettings() PageController.goToPageHome() } - - if (!GC.isMobile()) { - // root.defaultActiveFocusItem.forceActiveFocus() - } } var noButtonFunction = function() { - if (!GC.isMobile()) { - // root.defaultActiveFocusItem.forceActiveFocus() - } } showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index b6ade37a9..11e49cf9f 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -109,15 +109,8 @@ PageType { SettingsController.secondaryDns = "1.0.0.1" secondaryDns.textFieldText = SettingsController.secondaryDns PageController.showNotificationMessage(qsTr("Settings have been reset")) - - if (!GC.isMobile()) { - // defaultActiveFocusItem.forceActiveFocus() - } } var noButtonFunction = function() { - if (!GC.isMobile()) { - // defaultActiveFocusItem.forceActiveFocus() - } } showQuestionDrawer(headerText, "", yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 049df1ddc..f5c85a5f1 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -355,6 +355,7 @@ PageType { serverSelectorListView.selectedIndex = 0 } + serverSelectorListView.positionViewAtIndex(selectedIndex, ListView.Beginning) serverSelectorListView.triggerCurrentItem() } @@ -410,6 +411,7 @@ PageType { function onSeverSelectorIndexChanged() { var defaultContainer = proxyContainersModel.mapFromSource(ServersModel.getProcessedServerData("defaultContainer")) protocolSelectorListView.selectedIndex = defaultContainer + protocolSelectorListView.positionViewAtIndex(selectedIndex, ListView.Beginning) protocolSelectorListView.triggerCurrentItem() } } @@ -603,6 +605,7 @@ PageType { } clip: true + interactive: false reuseItems: true delegate: Item { @@ -667,7 +670,11 @@ PageType { ParagraphTextType { color: AmneziaStyle.color.mutedGray visible: creationDate - Layout.fillWidth: true + Layout.maximumWidth: parent.width + + maximumLineCount: 2 + wrapMode: Text.Wrap + elide: Qt.ElideRight text: qsTr("Creation date: %1").arg(creationDate) } @@ -675,7 +682,11 @@ PageType { ParagraphTextType { color: AmneziaStyle.color.mutedGray visible: latestHandshake - Layout.fillWidth: true + Layout.maximumWidth: parent.width + + maximumLineCount: 2 + wrapMode: Text.Wrap + elide: Qt.ElideRight text: qsTr("Latest handshake: %1").arg(latestHandshake) } @@ -683,7 +694,11 @@ PageType { ParagraphTextType { color: AmneziaStyle.color.mutedGray visible: dataReceived - Layout.fillWidth: true + Layout.maximumWidth: parent.width + + maximumLineCount: 2 + wrapMode: Text.Wrap + elide: Qt.ElideRight text: qsTr("Data received: %1").arg(dataReceived) } @@ -691,7 +706,11 @@ PageType { ParagraphTextType { color: AmneziaStyle.color.mutedGray visible: dataSent - Layout.fillWidth: true + Layout.maximumWidth: parent.width + + maximumLineCount: 2 + wrapMode: Text.Wrap + elide: Qt.ElideRight text: qsTr("Data sent: %1").arg(dataSent) } @@ -699,7 +718,9 @@ PageType { ParagraphTextType { color: AmneziaStyle.color.mutedGray visible: allowedIps - Layout.fillWidth: true + Layout.maximumWidth: parent.width + + wrapMode: Text.Wrap text: qsTr("Allowed IPs: %1").arg(allowedIps) }