diff --git a/storybook/pages/PrimaryNavSidebarPage.qml b/storybook/pages/PrimaryNavSidebarPage.qml index a72bf9f4afa..f5a4856841c 100644 --- a/storybook/pages/PrimaryNavSidebarPage.qml +++ b/storybook/pages/PrimaryNavSidebarPage.qml @@ -219,11 +219,11 @@ SplitView { showCreateCommunityBadge: ctrlShowCreateCommunityBadge.checked profileSectionHasNotification: ctrlSettingsHasNotification.checked - onItemActivated: function (sectionType, id) { + onItemActivated: function (sectionType, sectionId) { logs.logEvent("onItemActivated", ["sectionType", "sectionId"], arguments) - sectionsModel.setActiveSection(id) + sectionsModel.setActiveSection(sectionId) d.activeSectionType = sectionType - d.activeSectionId = id + d.activeSectionId = sectionId } onActivityCenterRequested: function (shouldShow) { logs.logEvent("onActivityCenterRequested", ["shouldShow"], arguments) diff --git a/storybook/pages/StatusAppNavBarPage.qml b/storybook/pages/StatusAppNavBarPage.qml deleted file mode 100644 index 3c9d1b2a414..00000000000 --- a/storybook/pages/StatusAppNavBarPage.qml +++ /dev/null @@ -1,101 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import StatusQ.Layout -import StatusQ.Controls -import StatusQ.Core.Theme - -SplitView { - orientation: Qt.Vertical - - StatusSectionLayout { - navBar: StatusAppNavBar { - anchors.fill: parent - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - regularItemsModel: ListModel { - ListElement { - sectionId: "mainApp" - sectionType: 100 - name: "API Documentation" - active: true - image: "" - icon: "edit" - color: "" - hasNotification: false - notificationsCount: 0 - } - ListElement { - sectionId: "examples" - sectionType: 101 - name: "Examples" - active: false - image: "" - icon: "show" - color: "" - hasNotification: false - notificationsCount: 0 - } - ListElement { - sectionId: "demoApp" - sectionType: 102 - name: "Demo Application" - active: false - image: "" - icon: "status" - color: "" - hasNotification: false - notificationsCount: 0 - } - ListElement { - sectionId: "qrScanner" - sectionType: 103 - name: "QR Scanner" - active: false - image: "" - icon: "qr-scan" - color: "" - hasNotification: false - notificationsCount: 0 - } - } - regularItemDelegate: StatusNavBarTabButton { - anchors.horizontalCenter: parent.horizontalCenter - name: model.icon.length > 0? "" : model.name - icon.name: model.icon - icon.source: model.image - tooltip.text: model.name - autoExclusive: true - checked: model.active - badge.value: model.notificationsCount - badge.visible: model.hasNotification - badge.border.color: hovered ? Theme.palette.statusBadge.hoverBorderColor : Theme.palette.statusBadge.borderColor - badge.border.width: 2 - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - delegateHeight: 40 - } - - centerPanel: Rectangle { - color: Theme.palette.statusAppNavBar.backgroundColor - border.width: 1 - Text { - anchors.centerIn: parent - text: "Dummy center Item" - } - } - } - - Item { - SplitView.preferredWidth: 300 - SplitView.preferredHeight: childrenRect.height - - CheckBox { - id: thirdpartyServicesCtrl - text: "Enable ThirdParty Services" - checked: true - } - } -} - -// category: Panels -// https://www.figma.com/design/idUoxN7OIW2Jpp3PMJ1Rl8/Settings----Desktop-Legacy?node-id=26301-22122&m=dev diff --git a/storybook/pages/StatusNavBarTabButtonPage.qml b/storybook/pages/StatusNavBarTabButtonPage.qml deleted file mode 100644 index 71e54860c6c..00000000000 --- a/storybook/pages/StatusNavBarTabButtonPage.qml +++ /dev/null @@ -1,141 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import StatusQ.Controls -import StatusQ.Components.private -import StatusQ.Core.Theme -import StatusQ.Popups - -import shared.controls.chat.menuItems - -import Models -import Storybook - -SplitView { - id: root - - ButtonGroup { - buttons: column.children - onClicked: button => console.info("Clicked button:", button.tooltip.text) - } - - Rectangle { - SplitView.fillWidth: true - SplitView.fillHeight: true - - color: thirdpartyServicesCtrl.checked ? Theme.palette.statusAppNavBar.backgroundColor: Theme.palette.privacyColors.primary - - Column { - id: column - spacing: 8 - anchors.centerIn: parent - - StatusNavBarTabButton { - name: "name only" - tooltip.text: "With 'name' only, active" - checked: true - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.name: "help" - tooltip.text: "With icon" - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.name: "help" - tooltip.text: "Disabled with icon" - enabled: false - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.source: ModelsData.icons.socks - tooltip.text: "With image" - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.name: "help" - tooltip.text: "With icon & badge dot" - badge.visible: true - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.name: "help" - tooltip.text: "With icon & badge value (small)" - badge.value: 3 - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - icon.name: "help" - tooltip.text: "With icon & badge value (big)" - badge.value: 100 - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - } - StatusNavBarTabButton { - id: communityButton - icon.name: "communities" - tooltip.text: ctrlNewBadgeGradient.checked ? "With custom badge gradient" : "With blue notification dot" - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - - StatusNewItemGradient { id: grad } - badge.visible: true - badge.gradient: ctrlNewBadgeGradient.checked ? grad : undefined - - // BUG: Binding below doesn't work - // Binding on badge.gradient { - // value: StatusNewItemGradient {} - // when: ctrlNewBadgeGradient.checked - // } - } - StatusNavBarTabButton { - icon.name: "info" - tooltip.text: "With context menu" - thirdpartyServicesEnabled: thirdpartyServicesCtrl.checked - popupMenu: popupMenuComp - } - } - } - - Component { - id: popupMenuComp - StatusMenu { - StatusAction { - text: qsTr("Invite People") - icon.name: "share-ios" - } - - StatusAction { - text: qsTr("Community Info") - icon.name: "info" - } - - StatusAction { - text: qsTr("Community Rules") - icon.name: "text" - } - - StatusMenuSeparator {} - - MuteChatMenuItem { - title: qsTr("Mute Community") - } - } - } - - Column { - SplitView.fillWidth: true - SplitView.fillHeight: true - CheckBox { - id: ctrlNewBadgeGradient - text: "Custom badge gradient" - checked: true - } - CheckBox { - id: thirdpartyServicesCtrl - text: "Enable ThirdParty Services" - checked: true - } - } -} - -// category: Controls -// status: good diff --git a/storybook/pages/StatusSectionLayoutPage.qml b/storybook/pages/StatusSectionLayoutPage.qml index f11325990de..0b3946e150c 100644 --- a/storybook/pages/StatusSectionLayoutPage.qml +++ b/storybook/pages/StatusSectionLayoutPage.qml @@ -137,7 +137,6 @@ Page { centerPanel: centerPanelCheckBox.checked ? centerPanel : null rightPanel: rightPanel showRightPanel: rightPanelCheckBox.checked - navBar: navBarItem footer: footerItem headerContent: headerContent headerBackground: Control { @@ -155,4 +154,4 @@ Page { } } } - } \ No newline at end of file + } diff --git a/test/e2e/gui/objects_map/messaging_names.py b/test/e2e/gui/objects_map/messaging_names.py index 7ed72670a14..8805b52334d 100644 --- a/test/e2e/gui/objects_map/messaging_names.py +++ b/test/e2e/gui/objects_map/messaging_names.py @@ -18,7 +18,6 @@ statusToolBar_Confirm_StatusButton = {"checkable": False, "container": mainWindow_statusToolBar_StatusToolBar, "objectName": "inlineSelectorConfirmButton", "type": "StatusButton", "visible": True} statusToolBar_Cancel_StatusButton = {"checkable": False, "container": mainWindow_statusToolBar_StatusToolBar, "type": "StatusButton", "unnamed": 1, "visible": True} statusToolBar_StatusTagItem = {"container": mainWindow_statusToolBar_StatusToolBar, "type": "StatusTagItem", "visible": True} -statusToolBar_notificationButton_StatusActivityCenterButton = {"container": statusDesktop_mainWindow, "objectName": "activityCenterNotificationsButton", "type": "StatusActivityCenterButton", "visible": True} # Chat View mainWindow_ChatColumnView = {"container": mainWindow_chatView_ChatView, "type": "ChatColumnView", "unnamed": 1, "visible": True} diff --git a/test/e2e/gui/objects_map/names.py b/test/e2e/gui/objects_map/names.py index 01ab7e5abb0..755cbb25a29 100644 --- a/test/e2e/gui/objects_map/names.py +++ b/test/e2e/gui/objects_map/names.py @@ -41,26 +41,26 @@ # First half of left main panel: home button, chat button, wallet button, market button -homeButton = {"checkable": True, "container": mainWindow_LeftPanelNavBar, "objectName": "Home Page-navbar", "type": "StatusNavBarTabButton", "visible": True} +homeButton = {"checkable": True, "container": mainWindow_LeftPanelNavBar, "objectName": "Home Page-navbar", "type": "PrimaryNavSidebarButton", "visible": True} walletChatSwapNavBarList = {"container": mainWindow_LeftPanelNavBar, "objectName": "statusChatNavBarListView", "type": "ListView", "visible": True} mainWalletButton = {"container": walletChatSwapNavBarList, "objectName": "Wallet-navbar", - "type": "StatusNavBarTabButton", "visible": True} -chatButton = {"container": walletChatSwapNavBarList, "objectName": "Messages-navbar", "type": "StatusNavBarTabButton", + "type": "PrimaryNavSidebarButton", "visible": True} +chatButton = {"container": walletChatSwapNavBarList, "objectName": "Messages-navbar", "type": "PrimaryNavSidebarButton", "visible": True} # Second half of left main panel: communities button, settings button communitiesSettingsNavBarList = {"container": statusDesktop_mainWindow, "objectName": "statusMainNavBarListView", "type": "ListView", "visible": True} communitiesPortalButton = {"container": communitiesSettingsNavBarList, "objectName": "Communities Portal-navbar", - "type": "StatusNavBarTabButton", "visible": True} + "type": "PrimaryNavSidebarButton", "visible": True} settingsGearButton = {"container": communitiesSettingsNavBarList, "objectName": "Settings-navbar", - "type": "StatusNavBarTabButton", "visible": True} -activityCenterButton = {"container": communitiesSettingsNavBarList, "objectName": "Activity Center-navbar", "type": "StatusNavBarTabButton", "visible": True} + "type": "PrimaryNavSidebarButton", "visible": True} +activityCenterButton = {"container": communitiesSettingsNavBarList, "objectName": "Activity Center-navbar", "type": "PrimaryNavSidebarButton", "visible": True} # Online identifier onlineIdentifierButton = {"container": mainWindow_LeftPanelNavBar, "objectName": "statusProfileNavBarTabButton", - "type": "StatusNavBarTabButton", "visible": True} + "type": "PrimaryNavSidebarButton", "visible": True} mainWindow_statusCommunityMainNavBarListView_ListView = {"container": statusDesktop_mainWindow, "objectName": "statusCommunityMainNavBarListView", @@ -68,7 +68,7 @@ statusCommunityMainNavBarListView_CommunityNavBarButton = {"checkable": True, "container": mainWindow_statusCommunityMainNavBarListView_ListView, "objectName": "CommunityNavBarButton", - "type": "StatusNavBarTabButton", "visible": True} + "type": "PrimaryNavSidebarButton", "visible": True} scrollView_Add_members_StatusButton = {"container": mainWindow_scrollView_StatusScrollView, "objectName": "CommunityWelcomeBannerPanel_AddMembersButton", "type": "StatusButton", "visible": True} diff --git a/test/ui-test/src/screens/StatusMainScreen.py b/test/ui-test/src/screens/StatusMainScreen.py index ea0697a5097..80f2c6ee83e 100644 --- a/test/ui-test/src/screens/StatusMainScreen.py +++ b/test/ui-test/src/screens/StatusMainScreen.py @@ -26,9 +26,9 @@ class MainScreenComponents(Enum): PROFILE_NAVBAR_BUTTON = 'mainWindow_ProfileNavBarButton' MAIN_WINDOW = "statusDesktop_mainWindow" POPUP_OVERLAY = "statusDesktop_mainWindow_overlay" - CHAT_NAVBAR_ICON = "navBarListView_Chat_navbar_StatusNavBarTabButton" - COMMUNITY_PORTAL_BUTTON = "navBarListView_Communities_Portal_navbar_StatusNavBarTabButton" - SETTINGS_BUTTON = "navBarListView_Settings_navbar_StatusNavBarTabButton" + CHAT_NAVBAR_ICON = "navBarListView_Chat_navbar_PrimaryNavSidebarButton" + COMMUNITY_PORTAL_BUTTON = "navBarListView_Communities_Portal_navbar_PrimaryNavSidebarButton" + SETTINGS_BUTTON = "navBarListView_Settings_navbar_PrimaryNavSidebarButton" WALLET_BUTTON = "wallet_navbar_wallet_icon_StatusIcon" START_CHAT_BTN = "mainWindow_startChat" CHAT_LIST = "chatList" diff --git a/test/ui-test/testSuites/global_shared/scripts/global_names.py b/test/ui-test/testSuites/global_shared/scripts/global_names.py index 9d38ba7feee..4027ee8f01d 100644 --- a/test/ui-test/testSuites/global_shared/scripts/global_names.py +++ b/test/ui-test/testSuites/global_shared/scripts/global_names.py @@ -11,7 +11,7 @@ statusDesktop_mainWindow_AppMain_EmojiPopup_SearchTextInput = {"container": statusDesktop_mainWindow_overlay, "objectName": "StatusEmojiPopup_searchBox", "type": "TextEdit", "visible": True} mainWindow_ScrollView = {"container": statusDesktop_mainWindow, "type": "StatusScrollView", "unnamed": 1, "visible": True} mainWindow_ScrollView_2 = {"container": statusDesktop_mainWindow, "occurrence": 2, "type": "StatusScrollView", "unnamed": 1, "visible": True} -mainWindow_ProfileNavBarButton = {"container": statusDesktop_mainWindow, "objectName": "statusProfileNavBarTabButton", "type": "StatusNavBarTabButton", "visible": True} +mainWindow_ProfileNavBarButton = {"container": statusDesktop_mainWindow, "objectName": "statusProfileNavBarTabButton", "type": "PrimaryNavSidebarButton", "visible": True} mainWindow_ProfileSettingsView = {"container": statusDesktop_mainWindow, "objectName": "myProfileSettingsView", "type": "ColumnLayout", "visible": True} settings_navbar_settings_icon_StatusIcon = {"container": mainWindow_navBarListView_ListView, "objectName": "settings-icon", "type": "StatusIcon", "visible": True} splashScreen = {"container": statusDesktop_mainWindow, "objectName": "splashScreen", "type": "DidYouKnowSplashScreen"} @@ -41,7 +41,7 @@ # Main Window - chat related: mainWindow_statusChatNavBarListView_ListView = {"container": statusDesktop_mainWindow, "objectName": "statusChatNavBarListView", "type": "ListView", "visible": True} -navBarListView_Chat_navbar_StatusNavBarTabButton = {"checkable": True, "container": mainWindow_statusChatNavBarListView_ListView, "objectName": "Messages-navbar", "type": "StatusNavBarTabButton", "visible": True} +navBarListView_Chat_navbar_PrimaryNavSidebarButton = {"checkable": True, "container": mainWindow_statusChatNavBarListView_ListView, "objectName": "Messages-navbar", "type": "PrimaryNavSidebarButton", "visible": True} chatList_ListView = {"container": statusDesktop_mainWindow, "objectName": "chatListItems", "type": "StatusListView", "visible": True} chatList = {"container": statusDesktop_mainWindow, "objectName": "ContactsColumnView_chatList", "type": "StatusChatList"} mainWindow_startChat = {"checkable": True, "container": statusDesktop_mainWindow, "objectName": "startChatButton", "type": "StatusIconTabButton"} diff --git a/test/ui-test/testSuites/global_shared/scripts/settings_names.py b/test/ui-test/testSuites/global_shared/scripts/settings_names.py index 0edc38d64f8..b8a7e06f4e1 100644 --- a/test/ui-test/testSuites/global_shared/scripts/settings_names.py +++ b/test/ui-test/testSuites/global_shared/scripts/settings_names.py @@ -30,7 +30,7 @@ class SettingsSubsection(Enum): BACKUP_SEED: str = "18" + _MAIN_MENU_ITEM_OBJ_NAME # Main: -navBarListView_Settings_navbar_StatusNavBarTabButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Settings-navbar", "type": "StatusNavBarTabButton", "visible": True} +navBarListView_Settings_navbar_PrimaryNavSidebarButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Settings-navbar", "type": "PrimaryNavSidebarButton", "visible": True} settingsSave_StatusButton = {"container": statusDesktop_mainWindow, "objectName": "settingsDirtyToastMessageSaveButton", "type": "StatusButton", "visible": True} settings_Sidebar_ENS_Item = {"container": mainWindow_ScrollView, "objectName": SettingsSubsection.ENS_USERNAMES.value, "type": "StatusNavigationListItem"} settingsContentBase_ScrollView = {"container": statusDesktop_mainWindow, "objectName": "settingsContentBaseScrollView", "type": "StatusScrollView", "visible": True} diff --git a/test/ui-test/testSuites/global_shared/scripts/wallet_names.py b/test/ui-test/testSuites/global_shared/scripts/wallet_names.py index ebcd186790d..e2b4431e7a7 100644 --- a/test/ui-test/testSuites/global_shared/scripts/wallet_names.py +++ b/test/ui-test/testSuites/global_shared/scripts/wallet_names.py @@ -43,8 +43,8 @@ addAccountPopup_GeneratedAddressesListPageIndicatior_StatusPageIndicator = {"container": statusDesktop_mainWindow_overlay_popup2, "objectName": "AddAccountPopup-GeneratedAddressesListPageIndicatior", "type": "StatusPageIndicator", "visible": True} page_StatusBaseButton = {"checkable": False, "container": addAccountPopup_GeneratedAddressesListPageIndicatior_StatusPageIndicator, "objectName": RegularExpression("Page-*"), "type": "StatusBaseButton", "visible": True} -navBarListView_Wallet_navbar_StatusNavBarTabButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Wallet-navbar", "type": "StatusNavBarTabButton", "visible": True} -wallet_navbar_wallet_icon_StatusIcon = {"container": navBarListView_Wallet_navbar_StatusNavBarTabButton, "objectName": "wallet-icon", "type": "StatusIcon", "visible": True} +navBarListView_Wallet_navbar_PrimaryNavSidebarButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Wallet-navbar", "type": "PrimaryNavSidebarButton", "visible": True} +wallet_navbar_wallet_icon_StatusIcon = {"container": navBarListView_Wallet_navbar_PrimaryNavSidebarButton, "objectName": "wallet-icon", "type": "StatusIcon", "visible": True} mainWallet_Address_Panel = {"container": statusDesktop_mainWindow, "objectName": "addressPanel", "type": "StatusAddressPanel", "visible": True} mainWallet_Add_Account_Button = {"container": statusDesktop_mainWindow, "objectName": "addAccountButton", "type": "StatusRoundButton", "visible": True} diff --git a/test/ui-test/testSuites/suite_communities/shared/scripts/community_portal_names.py b/test/ui-test/testSuites/suite_communities/shared/scripts/community_portal_names.py index a6757c229a8..b4b129f580c 100644 --- a/test/ui-test/testSuites/suite_communities/shared/scripts/community_portal_names.py +++ b/test/ui-test/testSuites/suite_communities/shared/scripts/community_portal_names.py @@ -1,10 +1,10 @@ from scripts.global_names import * # Main: -navBarListView_Communities_Portal_navbar_StatusNavBarTabButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Communities Portal-navbar", "type": "StatusNavBarTabButton", "visible": True} +navBarListView_Communities_Portal_navbar_PrimaryNavSidebarButton = {"checkable": True, "container": mainWindow_navBarListView_ListView, "objectName": "Communities Portal-navbar", "type": "PrimaryNavSidebarButton", "visible": True} mainWindow_communitiesPortalLayoutContainer_CommunitiesPortalLayout = {"container": statusDesktop_mainWindow, "objectName": "communitiesPortalLayout", "type": "CommunitiesPortalLayout"} communitiesPortalLayoutContainer_createCommunityButton_StatusButton = {"container": mainWindow_communitiesPortalLayoutContainer_CommunitiesPortalLayout, "objectName": "createCommunityButton", "type": "StatusButton", "visible": True} -navBarListView_All_Community_Buttons = {"checkable": True, "container": mainWindow_communityNavBarListView_ListView, "objectName": "CommunityNavBarButton", "type": "StatusNavBarTabButton"} +navBarListView_All_Community_Buttons = {"checkable": True, "container": mainWindow_communityNavBarListView_ListView, "objectName": "CommunityNavBarButton", "type": "PrimaryNavSidebarButton"} # Create community intermediate popup: createCommunity_banner = {"container": statusDesktop_mainWindow_overlay, "objectName": "createCommunityBanner", "type": "BannerPanel", "visible": True} diff --git a/ui/StatusQ/doc/src/statusqcontrols.qdoc b/ui/StatusQ/doc/src/statusqcontrols.qdoc index 7bc0f524640..e86257c432f 100644 --- a/ui/StatusQ/doc/src/statusqcontrols.qdoc +++ b/ui/StatusQ/doc/src/statusqcontrols.qdoc @@ -16,7 +16,6 @@ \li \l{StatusChatListCategoryItemButton} \li \l{StatusDropdown} \li \l{StatusIconTabButton} - \li \l{StatusNavBarTabButton} \li \l{StatusTabBarIconButton} \li \l{StatusToolTip} \li \l{StatusBaseButton} diff --git a/ui/StatusQ/doc/src/statusqlayout.qdoc b/ui/StatusQ/doc/src/statusqlayout.qdoc index e52097d0b67..4683274f2c6 100644 --- a/ui/StatusQ/doc/src/statusqlayout.qdoc +++ b/ui/StatusQ/doc/src/statusqlayout.qdoc @@ -9,7 +9,6 @@ \list \li \l{StatusAppLayout} - \li \l{StatusAppNavBar} \li \l{StatusAppTwoPanelLayout} \li \l{StatusAppThreePanelLayout} \endlist diff --git a/ui/StatusQ/src/StatusQ/Components/StatusSmartIdenticon.qml b/ui/StatusQ/src/StatusQ/Components/StatusSmartIdenticon.qml index 72908bd3126..7312d0cf489 100644 --- a/ui/StatusQ/src/StatusQ/Components/StatusSmartIdenticon.qml +++ b/ui/StatusQ/src/StatusQ/Components/StatusSmartIdenticon.qml @@ -3,6 +3,7 @@ import QtQuick import StatusQ.Core import StatusQ.Core.Theme import StatusQ.Controls +import StatusQ.Components Loader { id: root diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusActivityCenterButton.qml b/ui/StatusQ/src/StatusQ/Controls/StatusActivityCenterButton.qml deleted file mode 100644 index b59482c74f6..00000000000 --- a/ui/StatusQ/src/StatusQ/Controls/StatusActivityCenterButton.qml +++ /dev/null @@ -1,61 +0,0 @@ -import QtQuick -import StatusQ.Core -import StatusQ.Core.Theme -import StatusQ.Components - -/*! - \qmltype StatusActivityCenterButton - \inherits StatusFlatRoundButton - \inqmlmodule StatusQ.Controls - \since StatusQ.Controls 0.1 - \brief The StatusActivityCenterButton provides the button for Activity Center popup - - Example of how to use it: - - \qml - StatusActivityCenterButton { - unreadNotificationsCount: activityCenter.unreadNotificationsCount - onClicked: activityCenterPopup.open() - } - \endqml - - For a list of components available see StatusQ. -*/ - -StatusFlatRoundButton { - id: root - - /*! - \qmlproperty bool StatusActivityCenterButton::hasUnseenNotifications - This property indicates whether there are unseen notifications - */ - property bool hasUnseenNotifications: false - - /*! - \qmlproperty int StatusActivityCenterButton::unreadNotificationsCount - This property holds the count of notifications. - */ - property alias unreadNotificationsCount: statusBadge.value - - icon.name: "notification" - icon.height: 21 - type: StatusFlatRoundButton.Type.Secondary - objectName: "activityCenterNotificationsButton" - - // initializing the tooltip - tooltip.text: qsTr("Notifications") - tooltip.orientation: StatusToolTip.Orientation.Bottom - tooltip.y: parent.height + 12 - tooltip.offset: -(tooltip.x + tooltip.width/2 - root.width/2) //position arrow center in root center - - StatusBadge { - id: statusBadge - visible: value > 0 - anchors.centerIn: parent - anchors.verticalCenterOffset: -(icon.height / 2.5) - anchors.horizontalCenterOffset: (width / 2.5) - color: root.hasUnseenNotifications ? Theme.palette.primaryColor1 : Theme.palette.baseColor1 - border.width: 2 - border.color: parent.hovered ? Theme.palette.baseColor2 : Theme.palette.statusAppLayout.backgroundColor - } -} diff --git a/ui/StatusQ/src/StatusQ/Controls/StatusNavBarTabButton.qml b/ui/StatusQ/src/StatusQ/Controls/StatusNavBarTabButton.qml deleted file mode 100644 index dace8a6f132..00000000000 --- a/ui/StatusQ/src/StatusQ/Controls/StatusNavBarTabButton.qml +++ /dev/null @@ -1,75 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import StatusQ.Core -import StatusQ.Components -import StatusQ.Controls -import StatusQ.Core.Theme - -StatusIconTabButton { - id: statusNavBarTabButton - - property alias badge: statusBadge - property alias tooltip: statusTooltip - property Component popupMenu - property alias stateIcon: stateIcon - property bool thirdpartyServicesEnabled: true - - identicon.asset.color: (statusNavBarTabButton.hovered || highlighted || statusNavBarTabButton.checked) ? - statusNavBarTabButton.thirdpartyServicesEnabled ? - Theme.palette.primaryColor1 : - Theme.palette.privacyColors.tertiary : - statusNavBarTabButton.thirdpartyServicesEnabled ? - Theme.palette.baseColor1 : - Theme.palette.privacyColors.iconColor - - StatusToolTip { - id: statusTooltip - visible: statusNavBarTabButton.hovered && !!statusTooltip.text - delay: 50 - orientation: StatusToolTip.Orientation.Right - x: statusNavBarTabButton.width + Theme.padding - y: statusNavBarTabButton.height / 2 - height / 2 + 4 - } - - StatusRoundIcon { - id: stateIcon - visible: false - width: 20 - height: width - anchors.top: parent.top - anchors.left: parent.right - - anchors.leftMargin: (width) * -1 - } - - StatusBadge { - id: statusBadge - visible: value > 0 - anchors.top: parent.top - anchors.left: parent.right - anchors.leftMargin: { - if (statusBadge.value > 99) { - return -22 - } - if (statusBadge.value > 9) { - return -21 - } - return -18 - } - anchors.topMargin: 4 - border.color: hovered ? Theme.palette.statusBadge.hoverBorderColor : Theme.palette.statusBadge.borderColor - border.width: 2 - } - - function openContextMenu(pos) { - if (!popupMenu) - return - const menu = popupMenu.createObject(statusNavBarTabButton) - statusTooltip.hide() - menu.popup(pos) - } - - ContextMenu.onRequested: pos => openContextMenu(pos) - onPressAndHold: openContextMenu(Qt.point(statusNavBarTabButton.pressX, statusNavBarTabButton.pressY)) -} diff --git a/ui/StatusQ/src/StatusQ/Controls/qmldir b/ui/StatusQ/src/StatusQ/Controls/qmldir index 632d4ab292c..2b875d216d2 100644 --- a/ui/StatusQ/src/StatusQ/Controls/qmldir +++ b/ui/StatusQ/src/StatusQ/Controls/qmldir @@ -1,6 +1,5 @@ module StatusQ.Controls -StatusActivityCenterButton 0.1 StatusActivityCenterButton.qml StatusAmountInput 0.1 StatusAmountInput.qml StatusAnimatedText 0.1 StatusAnimatedText.qml StatusBackButton 0.1 StatusBackButton.qml @@ -34,7 +33,6 @@ StatusItemDelegate 0.1 StatusItemDelegate.qml StatusItemPicker 0.1 StatusItemPicker.qml StatusLabeledSlider 0.1 StatusLabeledSlider.qml StatusLinkText 0.1 StatusLinkText.qml -StatusNavBarTabButton 0.1 StatusNavBarTabButton.qml StatusNavigationButton 0.1 StatusNavigationButton.qml StatusPasswordInput 0.1 StatusPasswordInput.qml StatusPasswordStrengthIndicator 0.1 StatusPasswordStrengthIndicator.qml diff --git a/ui/StatusQ/src/StatusQ/Layout/StatusAppNavBar.qml b/ui/StatusQ/src/StatusQ/Layout/StatusAppNavBar.qml deleted file mode 100644 index 761bc80f10f..00000000000 --- a/ui/StatusQ/src/StatusQ/Layout/StatusAppNavBar.qml +++ /dev/null @@ -1,138 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Window - -import StatusQ.Core -import StatusQ.Core.Theme -import StatusQ.Controls -import StatusQ.Popups - -Rectangle { - id: root - objectName: "statusAppNavBar" - - required property bool thirdpartyServicesEnabled - - property alias topSectionModel: topSectionListview.model - property alias topSectionDelegate: topSectionListview.delegate - - property alias communityItemsModel: communityItemsListView.model - property alias communityItemDelegate: communityItemsListView.delegate - - property alias regularItemsModel: regularItemsListView.model - property alias regularItemDelegate: regularItemsListView.delegate - - property real delegateHeight - - property alias cameraComponent: cameraItemLoader.sourceComponent - property alias profileComponent: profileItemLoader.sourceComponent - - implicitWidth: 78 - - color: root.thirdpartyServicesEnabled ? Theme.palette.statusAppNavBar.backgroundColor : - Theme.palette.privacyColors.primary - - QtObject { - id: d - - readonly property real spacing: 12 - readonly property real separatorWidth: 30 - - function implicitListViewHeight(listView) { - return listView.count ? listView.count * root.delegateHeight + (listView.count - 1) * listView.spacing : 0 - } - } - - ColumnLayout { - id: layout - anchors { - fill: parent - topMargin: Qt.platform.os === "osx" && Window.visibility !== Window.FullScreen ? 48 : 12 // space reserved for Mac traffic lights (window icons) - bottomMargin: 24 - } - - spacing: d.spacing - - ListView { - id: topSectionListview - - Layout.fillWidth: true - Layout.fillHeight: true - Layout.minimumHeight: root.delegateHeight - Layout.preferredHeight: d.implicitListViewHeight(this) - Layout.maximumHeight: Layout.preferredHeight - - objectName: "statusChatNavBarListView" - - visible: count - clip: true - spacing: d.spacing - boundsBehavior: contentHeight > height ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds - } - - Rectangle { - id: firstSectionSeparator - - implicitHeight: 1 - Layout.preferredWidth: d.separatorWidth - Layout.alignment: Qt.AlignHCenter - color: Theme.palette.directColor7 - - visible: topSectionListview.count && communityItemsListView.contentHeight > communityItemsListView.height - } - - ListView { - id: communityItemsListView - objectName: "statusCommunityMainNavBarListView" - - Layout.fillWidth: true - Layout.fillHeight: true - Layout.minimumHeight: root.delegateHeight - Layout.preferredHeight: d.implicitListViewHeight(this) - Layout.maximumHeight: Layout.preferredHeight - - visible: count - clip: true - spacing: d.spacing - boundsBehavior: contentHeight > height ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds - } - - Item { - Layout.fillWidth: true - Layout.fillHeight: true - } - - Rectangle { - id: secondSectionSeparator - - implicitHeight: 1 - Layout.preferredWidth: d.separatorWidth - Layout.alignment: Qt.AlignHCenter - color: Theme.palette.directColor7 - } - - ListView { - id: regularItemsListView - - Layout.fillWidth: true - Layout.preferredHeight: d.implicitListViewHeight(this) - - objectName: "statusMainNavBarListView" - - visible: count - clip: true - spacing: d.spacing - boundsBehavior: contentHeight > height ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds - } - - Loader { - id: cameraItemLoader - Layout.alignment: Qt.AlignHCenter - } - - Loader { - id: profileItemLoader - Layout.alignment: Qt.AlignHCenter - } - } -} diff --git a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayout.qml b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayout.qml index 8ff5751abc1..aeef149853a 100644 --- a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayout.qml +++ b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayout.qml @@ -69,11 +69,6 @@ LayoutChooser { This property holds the right panel of the component. */ property Item rightPanel - /*! - \qmlproperty Item StatusSectionLayout::navBar - This property holds the navigation bar of the component. Usually displayed next to the leftPanel. - */ - property Item navBar /*! \qmlproperty Item StatusSectionLayout::footer This property holds the footer of the component. @@ -165,7 +160,6 @@ LayoutChooser { leftPanel: root.leftPanel centerPanel: root.centerPanel rightPanel: root.rightPanel - navBar: root.navBar footer: root.footer headerBackground: root.headerBackground showRightPanel: root.showRightPanel @@ -184,7 +178,6 @@ LayoutChooser { leftPanel: root.leftPanel centerPanel: root.centerPanel rightPanel: root.rightPanel - navBar: root.navBar footer: root.footer headerBackground: root.headerBackground showRightPanel: root.showRightPanel diff --git a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutLandscape.qml b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutLandscape.qml index 312c2a0c84b..11720a88b9d 100644 --- a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutLandscape.qml +++ b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutLandscape.qml @@ -63,11 +63,6 @@ SplitView { This property holds the right panel of the component. */ property alias rightPanel: rightPanelProxy.target - /*! - \qmlproperty Item StatusSectionLayout::navBar - This property holds the navigation bar of the component. Usually displayed next to the leftPanel. - */ - property Item navBar /*! \qmlproperty Item StatusSectionLayout::footer This property holds the footer of the component. @@ -126,18 +121,6 @@ SplitView { */ signal backButtonClicked() - Control { - id: navBarControl - SplitView.preferredWidth: (!!navBar) ? navBar.implicitWidth : 0 - SplitView.fillHeight: (!!navBar) - background: Rectangle { - color: Theme.palette.baseColor4 - } - contentItem: LayoutItemProxy { - target: root.navBar - } - } - Control { SplitView.minimumWidth: (!!leftPanel) ? 304 : 0 SplitView.preferredWidth: (!!leftPanel) ? 304 : 0 diff --git a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutPortrait.qml b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutPortrait.qml index 908ed7a83cf..237e9d1939e 100644 --- a/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutPortrait.qml +++ b/ui/StatusQ/src/StatusQ/Layout/StatusSectionLayoutPortrait.qml @@ -46,8 +46,6 @@ SwipeView { implicitWidth: 822 implicitHeight: 600 - // handle: Item { } - property Item navBar: null /*! \qmlproperty Item StatusSectionLayout::leftPanel This property holds the left panel of the component. @@ -168,11 +166,6 @@ SwipeView { } contentItem: RowLayout { spacing: 0 - LayoutItemProxy { - Layout.fillHeight: true - target: root.navBar - visible: baseProxyPanel.index === 0 - } LayoutItemProxy { Layout.fillWidth: true Layout.fillHeight: true diff --git a/ui/StatusQ/src/StatusQ/Layout/qmldir b/ui/StatusQ/src/StatusQ/Layout/qmldir index abdad2bb914..63db9494f5f 100644 --- a/ui/StatusQ/src/StatusQ/Layout/qmldir +++ b/ui/StatusQ/src/StatusQ/Layout/qmldir @@ -1,4 +1,3 @@ module StatusQ.Layout StatusSectionLayout 0.1 StatusSectionLayout.qml -StatusAppNavBar 0.1 StatusAppNavBar.qml diff --git a/ui/StatusQ/src/statusq.qrc b/ui/StatusQ/src/statusq.qrc index dcc251e40ae..a266a37326b 100644 --- a/ui/StatusQ/src/statusq.qrc +++ b/ui/StatusQ/src/statusq.qrc @@ -90,7 +90,6 @@ StatusQ/Components/private/statusMessage/StatusSticker.qml StatusQ/Components/private/statusMessage/StatusTextMessage.qml StatusQ/Components/qmldir - StatusQ/Controls/StatusActivityCenterButton.qml StatusQ/Controls/StatusAmountInput.qml StatusQ/Controls/StatusAnimatedText.qml StatusQ/Controls/StatusBackButton.qml @@ -124,7 +123,6 @@ StatusQ/Controls/StatusItemPicker.qml StatusQ/Controls/StatusLabeledSlider.qml StatusQ/Controls/StatusLinkText.qml - StatusQ/Controls/StatusNavBarTabButton.qml StatusQ/Controls/StatusNavigationButton.qml StatusQ/Controls/StatusPasswordInput.qml StatusQ/Controls/StatusPasswordStrengthIndicator.qml @@ -219,7 +217,6 @@ StatusQ/Core/Utils/qmldir StatusQ/Core/Utils/xss.js StatusQ/Core/qmldir - StatusQ/Layout/StatusAppNavBar.qml StatusQ/Layout/StatusSectionLayout.qml StatusQ/Layout/LayoutChooser.qml StatusQ/Layout/StatusSectionLayoutLandscape.qml diff --git a/ui/StatusQ/src/themepalette.cpp b/ui/StatusQ/src/themepalette.cpp index 571d406afb0..b74165de803 100644 --- a/ui/StatusQ/src/themepalette.cpp +++ b/ui/StatusQ/src/themepalette.cpp @@ -163,7 +163,7 @@ std::unique_ptr createDarkThemePalette(QObject* parent) t->statusAppLayout.rightPanelBackgroundColor = t->baseColor3; // Status app nav bar - t->statusAppNavBar.backgroundColor = t->baseColor5; + t->statusAppNavBar.backgroundColor = StatusColors::darkDesktopBlue10; // TODO temp color // Status toast message t->statusToastMessage.backgroundColor = t->baseColor3; @@ -359,7 +359,7 @@ std::unique_ptr createLightThemePalette(QObject* parent) t->statusAppLayout.rightPanelBackgroundColor = StatusColors::white; // Status app nav bar - t->statusAppNavBar.backgroundColor = t->baseColor2; + t->statusAppNavBar.backgroundColor = StatusColors::lightDesktopBlue10; // TODO temp color // Status toast message t->statusToastMessage.backgroundColor = StatusColors::white; diff --git a/ui/app/AppLayouts/Chat/ChatLayout.qml b/ui/app/AppLayouts/Chat/ChatLayout.qml index 002e9873b2e..c40dc298551 100644 --- a/ui/app/AppLayouts/Chat/ChatLayout.qml +++ b/ui/app/AppLayouts/Chat/ChatLayout.qml @@ -54,7 +54,6 @@ StackLayout { required property SharedStores.NetworksStore networksStore required property ProfileStores.AdvancedStore advancedStore property bool paymentRequestFeatureEnabled - property Item navBar property var mutualContactsModel property var sectionItemModel @@ -156,7 +155,6 @@ StackLayout { JoinCommunityView { id: joinCommunityView readonly property string communityId: sectionItemModel.id - navBar: root.navBar name: sectionItemModel.name introMessage: sectionItemModel.introMessage communityDesc: sectionItemModel.description @@ -201,7 +199,6 @@ StackLayout { readonly property string communityId: root.sectionItemModel.id objectName: "chatViewComponent" - navBar: root.navBar rootStore: root.rootStore createChatPropertiesStore: root.createChatPropertiesStore @@ -370,7 +367,6 @@ StackLayout { sourceComponent: CommunitySettingsView { id: communitySettingsView - navBar: root.navBar rootStore: root.rootStore walletAccountsModel: WalletStore.RootStore.nonWatchAccounts @@ -421,7 +417,6 @@ StackLayout { id: controlNodeOfflineComponent ControlNodeOfflineCommunityView { id: controlNodeOfflineView - navBar: root.navBar name: root.sectionItemModel.name communityDesc: root.sectionItemModel.description color: root.sectionItemModel.color @@ -437,7 +432,6 @@ StackLayout { BannedMemberCommunityView { id: communityBanView readonly property var communityData: sectionItemModel - navBar: root.navBar name: root.sectionItemModel.name communityDesc: root.sectionItemModel.description color: root.sectionItemModel.color diff --git a/ui/app/AppLayouts/HomePage/HomePage.qml b/ui/app/AppLayouts/HomePage/HomePage.qml index 2d76f194c95..4acf2d8c51f 100644 --- a/ui/app/AppLayouts/HomePage/HomePage.qml +++ b/ui/app/AppLayouts/HomePage/HomePage.qml @@ -168,6 +168,7 @@ Control { anchors.topMargin: Theme.defaultSmallPadding spacing: 12 + // TODO remove me, duplicate in PrimaryNavSidebar ProfileButton { objectName: "homeProfileButton" name: root.profileStore.name diff --git a/ui/app/AppLayouts/Wallet/WalletLayout.qml b/ui/app/AppLayouts/Wallet/WalletLayout.qml index 5ee7edb1d99..c90904fb707 100644 --- a/ui/app/AppLayouts/Wallet/WalletLayout.qml +++ b/ui/app/AppLayouts/Wallet/WalletLayout.qml @@ -32,8 +32,6 @@ import "popups/buy" Item { id: root - property Item navBar - property WalletStores.RootStore walletRootStore property SharedStores.RootStore sharedRootStore property AppLayoutsStores.RootStore store @@ -314,7 +312,6 @@ Item { StatusSectionLayout { id: walletSectionLayout - navBar: root.navBar anchors.fill: parent backButtonName: RootStore.backButtonName onBackButtonClicked: { diff --git a/ui/app/mainui/AppMain.qml b/ui/app/mainui/AppMain.qml index 88200d25cd1..de8ab34290e 100644 --- a/ui/app/mainui/AppMain.qml +++ b/ui/app/mainui/AppMain.qml @@ -1210,288 +1210,10 @@ Item { onBuyClicked: popupRequestsHandler.sendModalHandler.buyStickerPack(packId, price) } } - - property Item navBar: StatusAppNavBar { - visible: !homePageLoader.active - width: visible ? implicitWidth : 0 - - thirdpartyServicesEnabled: appMain.rootStore.thirdpartyServicesEnabled - - topSectionModel: SortFilterProxyModel { - sourceModel: appMain.rootStore.sectionsModel - filters: [ - AnyOf { - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.homePage - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.wallet - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.swap - enabled: !appMain.featureFlagsStore.marketEnabled - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.market - enabled: appMain.featureFlagsStore.marketEnabled - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.chat - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.browser - enabled: d.isBrowserEnabled - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.node - enabled: localAccountSensitiveSettings.nodeManagementEnabled - } - }, - ValueFilter { - roleName: "enabled" - value: true - } - ] - } - topSectionDelegate: navbarButton - - communityItemsModel: SortFilterProxyModel { - sourceModel: appMain.rootStore.sectionsModel - filters: [ - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.community - }, - ValueFilter { - roleName: "enabled" - value: true - } - ] - } - communityItemDelegate: StatusNavBarTabButton { - objectName: "CommunityNavBarButton" - anchors.horizontalCenter: parent.horizontalCenter - name: model.icon.length > 0? "" : model.name - icon.name: model.icon - icon.source: model.image - identicon.asset.color: (hovered || identicon.highlighted || checked) ? model.color : icon.color - tooltip.text: model.name - checked: model.active - badge.value: model.notificationsCount - badge.visible: model.hasNotification - - stateIcon.color: Theme.palette.dangerColor1 - stateIcon.border.color: Theme.palette.baseColor2 - stateIcon.border.width: 2 - stateIcon.visible: model.amIBanned - stateIcon.asset.name: "cancel" - stateIcon.asset.color: Theme.palette.baseColor2 - stateIcon.asset.width: 14 - - thirdpartyServicesEnabled: appMain.rootStore.thirdpartyServicesEnabled - - onClicked: { - changeAppSectionBySectionId(model.id) - } - - popupMenu: Component { - StatusMenu { - id: communityContextMenu - property var chatCommunitySectionModule - - readonly property bool isSpectator: model.spectated && !model.joined - - openHandler: function () { - // we cannot return QVariant if we pass another parameter in a function call - // that's why we're using it this way - communityContextMenu.chatCommunitySectionModule = appMain.rootChatStore.getCommunitySectionModule(model.id) - } - - StatusAction { - text: qsTr("Invite People") - icon.name: "share-ios" - objectName: "invitePeople" - onTriggered: { - popups.openInviteFriendsToCommunityPopup(model, - communityContextMenu.chatCommunitySectionModule, - null) - } - } - - StatusAction { - text: qsTr("Community Info") - icon.name: "info" - onTriggered: popups.openCommunityProfilePopup(appMain.rootStore, model, communityContextMenu.chatCommunitySectionModule) - } - - StatusAction { - text: qsTr("Community Rules") - icon.name: "text" - onTriggered: popups.openCommunityRulesPopup(model.name, model.introMessage, model.image, model.color) - } - - StatusMenuSeparator {} - - MuteChatMenuItem { - enabled: !model.muted - title: qsTr("Mute Community") - onMuteTriggered: { - communityContextMenu.chatCommunitySectionModule.setCommunityMuted(interval) - communityContextMenu.close() - } - } - - StatusAction { - enabled: model.muted - text: qsTr("Unmute Community") - icon.name: "notification" - onTriggered: communityContextMenu.chatCommunitySectionModule.setCommunityMuted(Constants.MutingVariations.Unmuted) - } - - StatusAction { - text: qsTr("Mark as read") - icon.name: "check-circle" - onTriggered: communityContextMenu.chatCommunitySectionModule.markAllReadInCommunity() - } - - StatusAction { - text: qsTr("Edit Shared Addresses") - icon.name: "wallet" - enabled: { - if (model.memberRole === Constants.memberRole.owner || communityContextMenu.isSpectator) - return false - return true - } - onTriggered: { - communityContextMenu.close() - Global.openEditSharedAddressesFlow(model.id) - } - } - - StatusMenuSeparator { visible: leaveCommunityMenuItem.enabled } - - StatusAction { - id: leaveCommunityMenuItem - objectName: "leaveCommunityMenuItem" - // allow to leave community for the owner in non-production builds - enabled: model.memberRole !== Constants.memberRole.owner || !production - text: { - if (communityContextMenu.isSpectator) - return qsTr("Close Community") - return qsTr("Leave Community") - } - icon.name: communityContextMenu.isSpectator ? "close-circle" : "arrow-left" - type: StatusAction.Type.Danger - onTriggered: communityContextMenu.isSpectator ? communityContextMenu.chatCommunitySectionModule.leaveCommunity() - : popups.openLeaveCommunityPopup(model.name, model.id, model.outroMessage) - } - } - } - } - - regularItemsModel: SortFilterProxyModel { - sourceModel: appMain.rootStore.sectionsModel - filters: [ - ValueFilter { - roleName: "enabled" - value: true - }, - AnyOf { - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.profile - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.activityCenter - } - ValueFilter { - roleName: "sectionType" - value: Constants.appSection.communitiesPortal - } - } - ] - } - regularItemDelegate: navbarButton - - delegateHeight: 40 - - profileComponent: ProfileButton { - objectName: "statusProfileNavBarTabButton" - - name: appMain.profileStore.name - usesDefaultName: appMain.profileStore.usesDefaultName - pubKey: appMain.profileStore.pubKey - compressedPubKey: appMain.profileStore.compressedPubKey - iconSource: appMain.profileStore.icon - colorId: appMain.profileStore.colorId - currentUserStatus: appMain.profileStore.currentUserStatus - - getEmojiHashFn: appMain.utilsStore.getEmojiHash - getLinkToProfileFn: appMain.contactsStore.getLinkToProfile - onSetCurrentUserStatusRequested: (status) => appMain.rootStore.setCurrentUserStatus(status) - onViewProfileRequested: (pubKey) => Global.openProfilePopup(pubKey) - } - - Component { - id: navbarButton - StatusNavBarTabButton { - id: navbar - objectName: model.name + "-navbar" - anchors.horizontalCenter: parent.horizontalCenter - name: model.icon.length > 0? "" : model.name - icon.name: model.icon - icon.source: model.image - tooltip.text: Utils.translatedSectionName(model.sectionType, model.name, (sectionType) => { - if (sectionType === Constants.appSection.homePage) { - return homePageShortcut.nativeText - } - return "" - }) - checked: model.active - - readonly property bool displayCreateCommunityBadge: model.sectionType === Constants.appSection.communitiesPortal && !appMain.communitiesStore.createCommunityPopupSeen - badge.value: model.notificationsCount - badge.visible: { - if (model.sectionType === Constants.appSection.profile) { - if (contactsModelAdaptor.pendingReceivedRequestContacts.ModelCount.count > 0) // pending contact request - return true - if (!appMain.privacyStore.mnemonicBackedUp && !appMain.profileStore.userDeclinedBackupBanner) // seedphrase not backed up (removed) - return true - if (appMain.devicesStore.devicesModel.count - appMain.devicesStore.devicesModel.pairedCount > 0) // sync entries - return true - return false - } - if (displayCreateCommunityBadge) // create new community badge - return true - return model.hasNotification // Otherwise, use the value coming from the model - } - - StatusNewItemGradient { id: newGradient } - badge.gradient: displayCreateCommunityBadge ? newGradient : undefined // gradient has precedence over a simple color - - thirdpartyServicesEnabled: appMain.rootStore.thirdpartyServicesEnabled - - onClicked: { - if(model.sectionType === Constants.appSection.swap) { - popupRequestsHandler.swapModalHandler.launchSwap() - } else { - changeAppSectionBySectionId(model.id) - } - } - } - } - } ColumnLayout { anchors.fill: parent + anchors.leftMargin: sidebar.alwaysVisible ? sidebar.width : 0 spacing: 0 objectName: "mainRightView" @@ -1919,7 +1641,6 @@ Item { show => appMain.accountSettingsStore.setShowUsersList(show) isChatView: true - navBar: appMain.navBar rootStore: ChatStores.RootStore { contactsStore: appMain.contactsStore currencyStore: appMain.currencyStore @@ -1995,7 +1716,6 @@ Item { sourceComponent: CommunitiesPortalLayout { anchors.fill: parent createCommunityEnabled: !SQUtils.Utils.isMobile - navBar: appMain.navBar communitiesStore: appMain.communitiesStore assetsModel: appMain.rootStore.globalAssetsModel collectiblesModel: appMain.rootStore.globalCollectiblesModel @@ -2011,8 +1731,6 @@ Item { id: walletPrivacyWall WalletPrivacyWall { - navBar: appMain.navBar - onOpenThirdpartyServicesInfoPopupRequested: popupRequestsHandler.thirdpartyServicesPopupHandler.openPopup() onOpenDiscussPageRequested: Global.requestOpenLink(Constants.statusDiscussPageUrl) } @@ -2023,7 +1741,6 @@ Item { WalletLayout { objectName: "walletLayoutReal" - navBar: appMain.navBar walletRootStore: WalletStores.RootStore sharedRootStore: appMain.sharedRootStore store: appMain.rootStore @@ -2073,8 +1790,6 @@ Item { id: browserPrivacyWall BrowserPrivacyWall { - navBar: appMain.navBar - onOpenThirdpartyServicesInfoPopupRequested: popupRequestsHandler.thirdpartyServicesPopupHandler.openPopup() onOpenDiscussPageRequested: Global.openLinkWithConfirmation( Constants.statusDiscussPageUrl, @@ -2088,7 +1803,6 @@ Item { BrowserLayout { userUID: appMain.profileStore.pubKey thirdpartyServicesEnabled: appMain.rootStore.thirdpartyServicesEnabled - navBar: appMain.navBar bookmarksStore: BrowserStores.BookmarksStore {} downloadsStore: BrowserStores.DownloadsStore {} browserRootStore: BrowserStores.BrowserRootStore {} @@ -2122,7 +1836,6 @@ Item { active: appView.currentIndex === Constants.appViewStackIndex.profile sourceComponent: ProfileLayout { - navBar: appMain.navBar isProduction: appMain.rootStore.isProduction sharedRootStore: appMain.sharedRootStore @@ -2213,9 +1926,7 @@ Item { Loader { active: appView.currentIndex === Constants.appViewStackIndex.node - sourceComponent: NodeLayout { - navBar: appMain.navBar - } + sourceComponent: NodeLayout {} } Loader { @@ -2226,8 +1937,6 @@ Item { id: marketPrivacyWall MarketPrivacyWall { - navBar: appMain.navBar - onOpenThirdpartyServicesInfoPopupRequested: popupRequestsHandler.thirdpartyServicesPopupHandler.openPopup() onOpenDiscussPageRequested: Global.requestOpenLink(Constants.statusDiscussPageUrl) } @@ -2238,7 +1947,6 @@ Item { MarketLayout { objectName: "marketLayout" - navBar: appMain.navBar tokensModel: appMain.marketStore.marketLeaderboardModel totalTokensCount: appMain.marketStore.totalLeaderboardCount @@ -2276,7 +1984,6 @@ Item { id: activityCenterPopup objectName: "activityCenterLayout" - navBar: appMain.navBar contactsStore: appMain.contactsStore store: ChatStores.RootStore { @@ -2347,7 +2054,6 @@ Item { show => appMain.accountSettingsStore.setShowUsersList(show) isChatView: false // This will be a community view - navBar: appMain.navBar emojiPopup: statusEmojiPopup.item stickersPopup: statusStickersPopupLoader.item sectionItemModel: model @@ -2454,6 +2160,167 @@ Item { } } // ColumnLayout + PrimaryNavSidebar { + id: sidebar + height: parent.height + + sectionsModel: appMain.rootStore.sectionsModel + + Binding on alwaysVisible { // NB: on browser+mobile, can't overlay the native WebView + when: SQUtils.Utils.isMobile && d.activeSectionType === Constants.appSection.browser + value: true + } + + acVisible: d.activeSectionType === Constants.appSection.activityCenter // FIXME AC should not be a section + acHasUnseenNotifications: appMain.activityCenterStore.hasUnseenNotifications + acUnreadNotificationsCount: appMain.activityCenterStore.unreadNotificationsCount + + profileStore: appMain.profileStore + getEmojiHashFn: appMain.utilsStore.getEmojiHash + getLinkToProfileFn: appMain.contactsStore.getLinkToProfile + + communityPopupMenu: communityContextMenuComponent + + showEnabledSectionsOnly: true + marketEnabled: appMain.featureFlagsStore.marketEnabled + browserEnabled: d.isBrowserEnabled + nodeEnabled: localAccountSensitiveSettings.nodeManagementEnabled + showCreateCommunityBadge: !appMain.communitiesStore.createCommunityPopupSeen + profileSectionHasNotification: { + if (contactsModelAdaptor.pendingReceivedRequestContacts.ModelCount.count > 0) // pending contact request + return true + if (!appMain.privacyStore.mnemonicBackedUp && !appMain.profileStore.userDeclinedBackupBanner) // seedphrase not backed up (removed) + return true + if (appMain.devicesStore.devicesModel.count - appMain.devicesStore.devicesModel.pairedCount > 0) // sync entries + return true + return false + } + thirdpartyServicesEnabled: appMain.rootStore.thirdpartyServicesEnabled + + // FIXME AC should not be a section; remove `prevSectionId` then + property string prevSectionId: appMain.rootStore.activeSectionId + onActivityCenterRequested: function(shouldShow) { + if (shouldShow) { + appMain.rootStore.setActiveSectionBySectionType(Constants.appSection.activityCenter) + } else { + changeAppSectionBySectionId(prevSectionId) + } + } + + onSetCurrentUserStatusRequested: status => appMain.rootStore.setCurrentUserStatus(status) + onViewProfileRequested: pubKey => Global.openProfilePopup(pubKey) + + onItemActivated: function(sectionType, sectionId) { + prevSectionId = sectionId + if (sectionType === Constants.appSection.swap) { + popupRequestsHandler.swapModalHandler.launchSwap() + } else { + changeAppSectionBySectionId(sectionId) + } + } + } + + Component { + id: communityContextMenuComponent + StatusMenu { + id: communityContextMenu + + required property var model + required property int index + + property var chatCommunitySectionModule + + readonly property bool isSpectator: model.spectated && !model.joined + + openHandler: function () { + // we cannot return QVariant if we pass another parameter in a function call + // that's why we're using it this way + communityContextMenu.chatCommunitySectionModule = appMain.rootChatStore.getCommunitySectionModule(model.id) + } + + onClosed: destroy() + + StatusAction { + text: qsTr("Invite People") + icon.name: "share-ios" + objectName: "invitePeople" + onTriggered: { + popups.openInviteFriendsToCommunityPopup(model, + communityContextMenu.chatCommunitySectionModule, + null) + } + } + + StatusAction { + text: qsTr("Community Info") + icon.name: "info" + onTriggered: popups.openCommunityProfilePopup(appMain.rootStore, model, communityContextMenu.chatCommunitySectionModule) + } + + StatusAction { + text: qsTr("Community Rules") + icon.name: "text" + onTriggered: popups.openCommunityRulesPopup(model.name, model.introMessage, model.image, model.color) + } + + StatusMenuSeparator {} + + MuteChatMenuItem { + enabled: !model.muted + title: qsTr("Mute Community") + onMuteTriggered: { + communityContextMenu.chatCommunitySectionModule.setCommunityMuted(interval) + communityContextMenu.close() + } + } + + StatusAction { + enabled: model.muted + text: qsTr("Unmute Community") + icon.name: "notification" + onTriggered: communityContextMenu.chatCommunitySectionModule.setCommunityMuted(Constants.MutingVariations.Unmuted) + } + + StatusAction { + text: qsTr("Mark as read") + icon.name: "check-circle" + onTriggered: communityContextMenu.chatCommunitySectionModule.markAllReadInCommunity() + } + + StatusAction { + text: qsTr("Edit Shared Addresses") + icon.name: "wallet" + enabled: { + if (model.memberRole === Constants.memberRole.owner || communityContextMenu.isSpectator) + return false + return true + } + onTriggered: { + communityContextMenu.close() + Global.openEditSharedAddressesFlow(model.id) + } + } + + StatusMenuSeparator { visible: leaveCommunityMenuItem.enabled } + + StatusAction { + id: leaveCommunityMenuItem + objectName: "leaveCommunityMenuItem" + // allow to leave community for the owner in non-production builds + enabled: model.memberRole !== Constants.memberRole.owner || !production + text: { + if (communityContextMenu.isSpectator) + return qsTr("Close Community") + return qsTr("Leave Community") + } + icon.name: communityContextMenu.isSpectator ? "close-circle" : "arrow-left" + type: StatusAction.Type.Danger + onTriggered: communityContextMenu.isSpectator ? communityContextMenu.chatCommunitySectionModule.leaveCommunity() + : popups.openLeaveCommunityPopup(model.name, model.id, model.outroMessage) + } + } + } + Instantiator { model: 9 delegate: Action { diff --git a/ui/app/mainui/controls/PrimaryNavSidebarButton.qml b/ui/app/mainui/controls/PrimaryNavSidebarButton.qml index 192cf690360..d31534fd5d0 100644 --- a/ui/app/mainui/controls/PrimaryNavSidebarButton.qml +++ b/ui/app/mainui/controls/PrimaryNavSidebarButton.qml @@ -7,6 +7,8 @@ import StatusQ.Components import StatusQ.Components.private // for StatusNewItemGradient import StatusQ.Core.Theme +import utils + ToolButton { id: root @@ -14,7 +16,7 @@ ToolButton { property int sectionType // cf Constants.appSection.* property bool hasNotification property int notificationsCount - property string tooltipText + property string tooltipText: Utils.translatedSectionName(sectionType) property bool showBadgeGradient property Component popupMenu @@ -22,12 +24,14 @@ ToolButton { readonly property bool badgeVisible: identicon.badge.visible padding: Theme.halfPadding - opacity: /*down ? ThemeUtils.pressedOpacity :*/ enabled ? 1 : ThemeUtils.disabledOpacity // TODO pressed state ? + opacity: enabled ? 1 : ThemeUtils.disabledOpacity Behavior on opacity { NumberAnimation { duration: ThemeUtils.AnimationDuration.Fast } } implicitWidth: 40 implicitHeight: 40 + focusPolicy: Utils.isMobile ? Qt.NoFocus : Qt.StrongFocus + icon.color: { if (checked || down || highlighted) return "white" @@ -39,6 +43,9 @@ ToolButton { icon.width: 24 // TODO scalable icon.height: 24 + font.family: Fonts.baseFont.family + font.pixelSize: Theme.additionalTextSize + background: Rectangle { color: { if (root.checked) @@ -67,14 +74,13 @@ ToolButton { asset.useAcronymForLetterIdenticon: false asset.color: root.icon.color - hoverEnabled: false + StatusNewItemGradient { id: newGradient } badge { width: root.notificationsCount ? badge.implicitWidth : Theme.padding - badge.border.width // bigger dot height: root.notificationsCount ? badge.implicitHeight : Theme.padding - badge.border.width border.width: 2 - border.color: Theme.palette.isDark ? StatusColors.darkDesktopBlue10 - : StatusColors.lightDesktopBlue10 // TODO follow container bg color + border.color: Theme.palette.statusAppNavBar.backgroundColor anchors.bottom: undefined // override StatusBadge anchors.bottomMargin: 0 // override StatusBadge anchors.right: identicon.right @@ -88,8 +94,6 @@ ToolButton { } } - StatusNewItemGradient { id: newGradient } - StatusToolTip { id: statusTooltip text: root.tooltipText diff --git a/ui/app/mainui/panels/PrimaryNavSidebar.qml b/ui/app/mainui/panels/PrimaryNavSidebar.qml index 89337528692..788db65384a 100644 --- a/ui/app/mainui/panels/PrimaryNavSidebar.qml +++ b/ui/app/mainui/panels/PrimaryNavSidebar.qml @@ -91,11 +91,8 @@ Drawer { readonly property int windowWidth: root.parent?.Window?.width ?? Screen.width readonly property int windowHeight: root.parent?.Window?.height ?? Screen.height - readonly property color containerBgColor: { - !root.thirdpartyServicesEnabled ? root.Theme.palette.privacyColors.primary : - root.Theme.palette.isDark ? root.StatusColors.darkDesktopBlue10 - : root.StatusColors.lightDesktopBlue10 // FIXME correct container bg color - } + readonly property color containerBgColor: root.thirdpartyServicesEnabled ? root.Theme.palette.statusAppNavBar.backgroundColor + : root.Theme.palette.privacyColors.primary readonly property int containerBgRadius: root.Theme.padding // 16 // models @@ -299,7 +296,6 @@ Drawer { icon.name: model.icon icon.source: model.image text: model.icon.length > 0 ? "" : model.name - tooltipText: Utils.translatedSectionName(sectionType, model.name) // FIXME Utils.translatedSectionName to take model.name as fallback for community name hasNotification: model.hasNotification notificationsCount: model.notificationsCount diff --git a/ui/i18n/qml_base_en.ts b/ui/i18n/qml_base_en.ts index b5124cca84e..861aadc8661 100644 --- a/ui/i18n/qml_base_en.ts +++ b/ui/i18n/qml_base_en.ts @@ -15896,13 +15896,6 @@ to load - - StatusActivityCenterButton - - Notifications - - - StatusAddressOrEnsValidator diff --git a/ui/i18n/qml_base_lokalise_en.ts b/ui/i18n/qml_base_lokalise_en.ts index a7165318228..e524bce3a20 100644 --- a/ui/i18n/qml_base_lokalise_en.ts +++ b/ui/i18n/qml_base_lokalise_en.ts @@ -19353,14 +19353,6 @@ Hang in there! Just a few more seconds! - - StatusActivityCenterButton - - Notifications - StatusActivityCenterButton - Notifications - - StatusAddressOrEnsValidator diff --git a/ui/i18n/qml_cs.ts b/ui/i18n/qml_cs.ts index 504db3a2a1d..e5f68596ff5 100644 --- a/ui/i18n/qml_cs.ts +++ b/ui/i18n/qml_cs.ts @@ -16008,13 +16008,6 @@ selhalo Vydržte! Ještě pár sekund! - - StatusActivityCenterButton - - Notifications - Oznámení - - StatusAddressOrEnsValidator diff --git a/ui/i18n/qml_es.ts b/ui/i18n/qml_es.ts index 4ec9d16d3fd..af6ef39377d 100644 --- a/ui/i18n/qml_es.ts +++ b/ui/i18n/qml_es.ts @@ -15919,13 +15919,6 @@ al cargar ¡Aguanta! ¡Solo unos segundos más! - - StatusActivityCenterButton - - Notifications - Notificaciones - - StatusAddressOrEnsValidator diff --git a/ui/i18n/qml_ko.ts b/ui/i18n/qml_ko.ts index 51771bcf355..a1a5880111c 100644 --- a/ui/i18n/qml_ko.ts +++ b/ui/i18n/qml_ko.ts @@ -15871,13 +15871,6 @@ to load 조금만 더 버티세요! 곧 끝나요! - - StatusActivityCenterButton - - Notifications - 알림 - - StatusAddressOrEnsValidator diff --git a/ui/imports/shared/controls/ProfileButton.qml b/ui/imports/shared/controls/ProfileButton.qml index efa41ab4f0b..d807855bf20 100644 --- a/ui/imports/shared/controls/ProfileButton.qml +++ b/ui/imports/shared/controls/ProfileButton.qml @@ -9,7 +9,7 @@ import shared.popups import utils -StatusNavBarTabButton { +StatusIconTabButton { id: root required property string name @@ -23,8 +23,6 @@ StatusNavBarTabButton { property var getLinkToProfileFn: function(pubKey) { console.error("IMPLEMENT ME"); return "" } property var getEmojiHashFn: function(pubKey) { console.error("IMPLEMENT ME"); return "" } - property bool opened: false - signal viewProfileRequested(string pubKey) signal setCurrentUserStatusRequested(int status) @@ -45,27 +43,18 @@ StatusNavBarTabButton { } return icon.name } - // identicon.asset.width: identicon.asset.isImage ? 28 : (root.usesDefaultName ? Math.floor(width * 0.9) : width) - // identicon.asset.height: identicon.asset.isImage ? 28 : (root.usesDefaultName ? Math.floor(height * 0.9) : height) identicon.asset.bgWidth: root.usesDefaultName ? width : 0 identicon.asset.bgHeight: root.usesDefaultName ? height : 0 identicon.asset.color: root.usesDefaultName ? Theme.palette.indirectColor2 : Utils.colorForPubkey(Theme.palette, root.pubKey) identicon.asset.isLetterIdenticon: root.usesDefaultName ? false : icon.name !== "" && !identicon.asset.isImage identicon.asset.bgColor: root.usesDefaultName ? Utils.colorForPubkey(Theme.palette, root.pubKey) : "transparent" - badge.visible: true - badge.anchors { - left: undefined - top: undefined - right: root.right - bottom: root.bottom - margins: 0 - rightMargin: -badge.border.width - bottomMargin: -badge.border.width - } - badge.implicitHeight: 12 - badge.implicitWidth: 12 - badge.color: { + identicon.badge.visible: true + identicon.badge.border.width: 2 + identicon.badge.border.color: Theme.palette.statusAppNavBar.backgroundColor + identicon.badge.height: 12 + identicon.badge.width: 12 + identicon.badge.color: { switch(root.currentUserStatus) { case Constants.currentUserStatus.automatic: case Constants.currentUserStatus.alwaysOnline: @@ -81,6 +70,8 @@ StatusNavBarTabButton { id: userStatusContextMenu objectName: "userStatusContextMenu" + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent + y: root.y - userStatusContextMenu.height + root.height x: root.x + root.width + 5 diff --git a/ui/imports/utils/Utils.qml b/ui/imports/utils/Utils.qml index 2ed468b006d..39ceb0d4e10 100644 --- a/ui/imports/utils/Utils.qml +++ b/ui/imports/utils/Utils.qml @@ -409,11 +409,7 @@ QtObject { } // handle translations for section names coming from app_sections_config.nim - function translatedSectionName(sectionType, fallback, additionalTextFunction) { - if (additionalTextFunction === undefined) { - additionalTextFunction = function() { return "" } - } - + function translatedSectionName(sectionType, fallback = "") { switch(sectionType) { case Constants.appSection.chat: return qsTr("Messages") @@ -438,7 +434,7 @@ QtObject { case Constants.appSection.dApp: return qsTr("dApp") case Constants.appSection.homePage: - return "%1 (%2)".arg(qsTr("Home Page")).arg(additionalTextFunction(sectionType)) + return qsTr("Home Page") case Constants.appSection.activityCenter: return qsTr("Activity Center") default: