From 19c8cd8bed9b0b637bf86ba8f48f86dc5447e609 Mon Sep 17 00:00:00 2001 From: johnny9 <985648+johnny9@users.noreply.github.com> Date: Sun, 11 Feb 2024 11:25:10 -0500 Subject: [PATCH] qml: Introduce Wallet main pages Adds DesktopWallets.qml and MobileWallets.qml. These pages are the central navigation points for the application when wallets are enabled. A core piece of the page is controlling the navigation flow between the sub pages of the wallet application. For the desktop implementation, a new NavigationBar design is used along with a Stack layout to holde the pages. For mobile, a DirectionalStackView is used to push and pop the wallet sub pages based on the UX designed flow. --- src/Makefile.qt.include | 16 ++- src/qml/appmode.h | 8 +- src/qml/bitcoin.cpp | 33 +++-- src/qml/bitcoin_qml.qrc | 12 ++ src/qml/components/BlockClock.qml | 2 + src/qml/components/NetworkIndicator.qml | 10 +- src/qml/components/WalletBadge.qml | 16 +++ src/qml/components/blockclockdial.cpp | 16 ++- src/qml/components/blockclockdial.h | 6 +- src/qml/controls/DirectionalStackView.qml | 114 ++++++++++++++++ src/qml/controls/NavigationBlockClockTab.qml | 67 +++++++++ src/qml/controls/NavigationTab.qml | 84 ++++++++++++ src/qml/imageprovider.cpp | 25 ++++ src/qml/pages/main.qml | 29 +++- src/qml/pages/node/NodeSettings.qml | 3 + src/qml/pages/wallet/DesktopWallets.qml | 122 +++++++++++++++++ src/qml/pages/wallet/MobileWallets.qml | 56 ++++++++ src/qml/pages/wallet/mobile/Activity.qml | 135 +++++++++++++++++++ src/qml/res/icons/blockclock-icon.png | Bin 0 -> 3796 bytes src/qml/res/icons/gear-outline.png | Bin 0 -> 4438 bytes src/qml/res/icons/singlesig-wallet.png | Bin 0 -> 1919 bytes src/qml/res/icons/triangle-down.png | Bin 0 -> 1953 bytes src/qml/res/icons/triangle-up.png | Bin 0 -> 1925 bytes src/qml/res/src/blockclock-icon.svg | 6 + src/qml/res/src/gear-outline.svg | 3 + src/qml/res/src/singlesig-wallet.svg | 3 + src/qml/res/src/triangle-down.svg | 3 + src/qml/res/src/triangle-up.svg | 3 + 28 files changed, 750 insertions(+), 22 deletions(-) create mode 100644 src/qml/components/WalletBadge.qml create mode 100644 src/qml/controls/DirectionalStackView.qml create mode 100644 src/qml/controls/NavigationBlockClockTab.qml create mode 100644 src/qml/controls/NavigationTab.qml create mode 100644 src/qml/pages/wallet/DesktopWallets.qml create mode 100644 src/qml/pages/wallet/MobileWallets.qml create mode 100644 src/qml/pages/wallet/mobile/Activity.qml create mode 100644 src/qml/res/icons/blockclock-icon.png create mode 100644 src/qml/res/icons/gear-outline.png create mode 100644 src/qml/res/icons/singlesig-wallet.png create mode 100644 src/qml/res/icons/triangle-down.png create mode 100644 src/qml/res/icons/triangle-up.png create mode 100644 src/qml/res/src/blockclock-icon.svg create mode 100644 src/qml/res/src/gear-outline.svg create mode 100644 src/qml/res/src/singlesig-wallet.svg create mode 100644 src/qml/res/src/triangle-down.svg create mode 100644 src/qml/res/src/triangle-up.svg diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index c9bdb051e8..86635acafb 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -319,6 +319,7 @@ QML_RES_ICONS = \ qml/res/icons/arrow-down.png \ qml/res/icons/arrow-up.png \ qml/res/icons/bitcoin-circle.png \ + qml/res/icons/blockclock-icon.png \ qml/res/icons/blockclock-size-compact.png \ qml/res/icons/blockclock-size-showcase.png \ qml/res/icons/blocktime-dark.png \ @@ -329,12 +330,17 @@ QML_RES_ICONS = \ qml/res/icons/cross.png \ qml/res/icons/export.png \ qml/res/icons/gear.png \ + qml/res/icons/gear-outline.png \ qml/res/icons/info.png \ qml/res/icons/network-dark.png \ qml/res/icons/network-light.png \ qml/res/icons/shutdown.png \ + qml/res/icons/singlesig-wallet.png \ qml/res/icons/storage-dark.png \ - qml/res/icons/storage-light.png + qml/res/icons/storage-light.png \ + qml/res/icons/triangle-down.png \ + qml/res/icons/triangle-up.png + QML_QRC_CPP = qml/qrc_bitcoin.cpp QML_QRC = qml/bitcoin_qml.qrc @@ -360,6 +366,7 @@ QML_RES_QML = \ qml/components/TotalBytesIndicator.qml \ qml/controls/ContinueButton.qml \ qml/controls/CoreText.qml \ + qml/controls/DirectionalStackView.qml \ qml/controls/ExternalLink.qml \ qml/controls/FocusBorder.qml \ qml/controls/Header.qml \ @@ -369,6 +376,8 @@ QML_RES_QML = \ qml/controls/PageIndicator.qml \ qml/controls/NavigationBar.qml \ qml/controls/NavigationBar2.qml \ + qml/controls/NavigationBlockClockTab.qml \ + qml/controls/NavigationTab.qml \ qml/controls/OptionButton.qml \ qml/controls/OptionSwitch.qml \ qml/controls/OutlineButton.qml \ @@ -399,7 +408,10 @@ QML_RES_QML = \ qml/pages/settings/SettingsDisplay.qml \ qml/pages/settings/SettingsProxy.qml \ qml/pages/settings/SettingsStorage.qml \ - qml/pages/settings/SettingsTheme.qml + qml/pages/settings/SettingsTheme.qml \ + qml/pages/wallet/DesktopWallets.qml \ + qml/pages/wallet/MobileWallets.qml \ + qml/pages/wallet/mobile/Activity.qml if TARGET_ANDROID BITCOIN_QT_H += qml/androidnotifier.h diff --git a/src/qml/appmode.h b/src/qml/appmode.h index 8265984103..ba15865eda 100644 --- a/src/qml/appmode.h +++ b/src/qml/appmode.h @@ -12,6 +12,7 @@ class AppMode : public QObject Q_OBJECT Q_PROPERTY(bool isDesktop READ isDesktop NOTIFY modeChanged) Q_PROPERTY(bool isMobile READ isMobile NOTIFY modeChanged) + Q_PROPERTY(bool walletEnabled READ walletEnabled NOTIFY walletEnabledChanged) Q_PROPERTY(QString state READ state NOTIFY modeChanged) public: @@ -20,12 +21,15 @@ class AppMode : public QObject MOBILE }; - explicit AppMode(Mode mode) : m_mode(mode) + explicit AppMode(Mode mode, bool wallet_enabled) + : m_mode(mode) + , m_wallet_enabled(wallet_enabled) { } bool isMobile() { return m_mode == MOBILE; } bool isDesktop() { return m_mode == DESKTOP; } + bool walletEnabled() { return m_wallet_enabled; } QString state() { switch (m_mode) { @@ -41,9 +45,11 @@ class AppMode : public QObject Q_SIGNALS: void modeChanged(); + void walletEnabledChanged(); private: const Mode m_mode; + const bool m_wallet_enabled; }; #endif // BITCOIN_QML_APPMODE_H diff --git a/src/qml/bitcoin.cpp b/src/qml/bitcoin.cpp index d87386cbd5..90e713bfd7 100644 --- a/src/qml/bitcoin.cpp +++ b/src/qml/bitcoin.cpp @@ -75,17 +75,33 @@ void SetupUIArgs(ArgsManager& argsman) argsman.AddArg("-splash", strprintf("Show splash screen on startup (default: %u)", DEFAULT_SPLASHSCREEN), ArgsManager::ALLOW_ANY, OptionsCategory::GUI); } +AppMode SetupAppMode() +{ + bool wallet_enabled; + AppMode::Mode mode; + #ifdef __ANDROID__ + mode = AppMode::MOBILE; + #else + mode = AppMode::DESKTOP; + #endif // __ANDROID__ + + #ifdef ENABLE_WALLET + wallet_enabled = true; + #else + wallet_enabled = false; + #endif // ENABLE_WALLET + + return AppMode(mode, wallet_enabled); +} + bool InitErrorMessageBox( const bilingual_str& message, [[maybe_unused]] const std::string& caption, [[maybe_unused]] unsigned int style) { QQmlApplicationEngine engine; -#ifdef __ANDROID__ - AppMode app_mode(AppMode::MOBILE); -#else - AppMode app_mode(AppMode::DESKTOP); -#endif // __ANDROID__ + + AppMode app_mode = SetupAppMode(); qmlRegisterSingletonInstance("org.bitcoincore.qt", 1, 0, "AppMode", &app_mode); engine.rootContext()->setContextProperty("message", QString::fromStdString(message.translated)); @@ -284,11 +300,8 @@ int QmlGuiMain(int argc, char* argv[]) engine.rootContext()->setContextProperty("optionsModel", &options_model); engine.rootContext()->setContextProperty("needOnboarding", need_onboarding); -#ifdef __ANDROID__ - AppMode app_mode(AppMode::MOBILE); -#else - AppMode app_mode(AppMode::DESKTOP); -#endif // __ANDROID__ + + AppMode app_mode = SetupAppMode(); qmlRegisterSingletonInstance("org.bitcoincore.qt", 1, 0, "AppMode", &app_mode); qmlRegisterType("org.bitcoincore.qt", 1, 0, "BlockClockDial"); diff --git a/src/qml/bitcoin_qml.qrc b/src/qml/bitcoin_qml.qrc index ae36776d5a..7280ae23b9 100644 --- a/src/qml/bitcoin_qml.qrc +++ b/src/qml/bitcoin_qml.qrc @@ -21,6 +21,7 @@ components/TotalBytesIndicator.qml controls/ContinueButton.qml controls/CoreText.qml + controls/DirectionalStackView.qml controls/ExternalLink.qml controls/FocusBorder.qml controls/Header.qml @@ -30,6 +31,8 @@ controls/PageIndicator.qml controls/NavigationBar.qml controls/NavigationBar2.qml + controls/NavigationBlockClockTab.qml + controls/NavigationTab.qml controls/OptionButton.qml controls/OptionSwitch.qml controls/OutlineButton.qml @@ -61,11 +64,15 @@ pages/settings/SettingsProxy.qml pages/settings/SettingsStorage.qml pages/settings/SettingsTheme.qml + pages/wallet/DesktopWallets.qml + pages/wallet/MobileWallets.qml + pages/wallet/mobile/Activity.qml res/icons/arrow-down.png res/icons/arrow-up.png res/icons/bitcoin-circle.png + res/icons/blockclock-icon.png res/icons/blockclock-size-compact.png res/icons/blockclock-size-showcase.png res/icons/blocktime-dark.png @@ -77,12 +84,17 @@ res/icons/cross.png res/icons/export.png res/icons/gear.png + res/icons/gear-outline.png res/icons/info.png res/icons/network-dark.png res/icons/network-light.png res/icons/shutdown.png + res/icons/singlesig-wallet.png res/icons/storage-dark.png res/icons/storage-light.png + res/icons/storage-light.png + res/icons/triangle-down.png + res/icons/triangle-up.png res/fonts/Inter-Regular.otf diff --git a/src/qml/components/BlockClock.qml b/src/qml/components/BlockClock.qml index a02abae6a4..6e1c28f0a7 100644 --- a/src/qml/components/BlockClock.qml +++ b/src/qml/components/BlockClock.qml @@ -15,6 +15,7 @@ Item { id: root property real parentWidth: 600 property real parentHeight: 600 + property bool showNetworkIndicator: true width: dial.width height: dial.height + networkIndicator.height + networkIndicator.anchors.topMargin @@ -146,6 +147,7 @@ Item { NetworkIndicator { id: networkIndicator + show: root.showNetworkIndicator anchors.top: dial.bottom anchors.topMargin: networkIndicator.visible ? 30 : 0 anchors.horizontalCenter: root.horizontalCenter diff --git a/src/qml/components/NetworkIndicator.qml b/src/qml/components/NetworkIndicator.qml index 471ccfbbcd..9f3ee8751a 100644 --- a/src/qml/components/NetworkIndicator.qml +++ b/src/qml/components/NetworkIndicator.qml @@ -12,12 +12,14 @@ import org.bitcoincore.qt 1.0 Button { id: root property color bgColor + property bool shorten: false + property bool show: true property int textSize: 15 topPadding: 2 bottomPadding: 2 leftPadding: 7 rightPadding: 7 - state: chainModel.currentNetworkName + state: show ? chainModel.currentNetworkName : "MAIN" contentItem: CoreText { text: root.text font.pixelSize: root.textSize @@ -47,7 +49,7 @@ Button { PropertyChanges { target: root visible: true - text: qsTr("Test Network") + text: shorten ? qsTr("Test Network") : qsTr("Testnet") bgColor: Theme.color.green } }, @@ -56,7 +58,7 @@ Button { PropertyChanges { target: root visible: true - text: qsTr("Signet Network") + text: shorten ? qsTr("Signet Network") : qsTr("Signet") bgColor: Theme.color.amber } }, @@ -65,7 +67,7 @@ Button { PropertyChanges { target: root visible: true - text: qsTr("Regtest Mode") + text: shorten ? qsTr("Regtest Mode") : qsTr("Regtest") bgColor: Theme.color.blue } } diff --git a/src/qml/components/WalletBadge.qml b/src/qml/components/WalletBadge.qml new file mode 100644 index 0000000000..21f4a8c86b --- /dev/null +++ b/src/qml/components/WalletBadge.qml @@ -0,0 +1,16 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import org.bitcoincore.qt 1.0 + +Row { + Column { + + } + Column { + + } +} \ No newline at end of file diff --git a/src/qml/components/blockclockdial.cpp b/src/qml/components/blockclockdial.cpp index a6842702ea..f2a986d4be 100644 --- a/src/qml/components/blockclockdial.cpp +++ b/src/qml/components/blockclockdial.cpp @@ -317,12 +317,18 @@ void BlockClockDial::paint(QPainter * painter) painter->setRenderHint(QPainter::Antialiasing); paintBackground(painter); - paintTimeTicks(painter); + if (!m_is_mini) { + paintTimeTicks(painter); + } if (paused()) return; if (connected() && synced()) { - paintBlocks(painter); + if (m_is_mini) { + paintProgress(painter); + } else { + paintBlocks(painter); + } } else if (connected()) { paintProgress(painter); } else if (m_animation_timer.isActive()) { @@ -330,3 +336,9 @@ void BlockClockDial::paint(QPainter * painter) } m_animating_max_angle = incrementAnimatingMaxAngle(m_animating_max_angle); } + +void BlockClockDial::setMini(bool is_mini) +{ + m_is_mini = is_mini; + update(); +} diff --git a/src/qml/components/blockclockdial.h b/src/qml/components/blockclockdial.h index e7a103f0c0..361b42c7ef 100644 --- a/src/qml/components/blockclockdial.h +++ b/src/qml/components/blockclockdial.h @@ -22,8 +22,9 @@ class BlockClockDial : public QQuickPaintedItem Q_PROPERTY(qreal penWidth READ penWidth WRITE setPenWidth) Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) - Q_PROPERTY(QList confirmationColors READ confirmationColors WRITE setConfirmationColors ) + Q_PROPERTY(QList confirmationColors READ confirmationColors WRITE setConfirmationColors) Q_PROPERTY(QColor timeTickColor READ timeTickColor WRITE setTimeTickColor) + Q_PROPERTY(bool isMini READ isMini WRITE setMini) public: explicit BlockClockDial(QQuickItem * parent = nullptr); @@ -39,6 +40,7 @@ class BlockClockDial : public QQuickPaintedItem QColor backgroundColor() const { return m_background_color; }; QList confirmationColors() const { return m_confirmation_colors; }; QColor timeTickColor() const { return m_time_tick_color; }; + bool isMini() const { return m_is_mini; }; public Q_SLOTS: void setTimeRatioList(QVariantList new_time); @@ -51,6 +53,7 @@ public Q_SLOTS: void setBackgroundColor(QColor color); void setConfirmationColors(QList colorList); void setTimeTickColor(QColor color); + void setMini(bool is_mini); Q_SIGNALS: void scaleChanged(); @@ -84,6 +87,7 @@ public Q_SLOTS: QTimer m_animation_timer{this}; QTimer m_delay_timer; qreal m_animating_max_angle = 0; + bool m_is_mini = false; }; #endif // BITCOIN_QML_COMPONENTS_BLOCKCLOCKDIAL_H diff --git a/src/qml/controls/DirectionalStackView.qml b/src/qml/controls/DirectionalStackView.qml new file mode 100644 index 0000000000..5b76e07526 --- /dev/null +++ b/src/qml/controls/DirectionalStackView.qml @@ -0,0 +1,114 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +StackView { + id: root + + function pushLeft(item) { + root.pushEnter = pushEnterLeft; + root.pushExit = pushExitLeft; + root.push(item); + } + + function pushRight(item) { + root.pushEnter = pushEnterRight; + root.pushExit = pushExitRight; + root.push(item); + } + + function popLeft() { + root.popEnter = popEnterLeft; + root.popExit = pushExitLeft; + root.pop(); + } + + function popRight() { + root.popEnter = popEnterRight; + root.popExit = pushExitRight; + root.pop(); + } + + Transition { + id: popEnterLeft + XAnimator { + from: -1 * root.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: popExitLeft + XAnimator { + from: 0 + to: root.width + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: popEnterRight + XAnimator { + from: root.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: popExitRight + XAnimator { + from: 0 + to: -1 * root.width + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: pushEnterLeft + XAnimator { + from: -1 * root.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: pushExitLeft + XAnimator { + from: 0 + to: root.width + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: pushEnterRight + XAnimator { + from: root.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + } + + Transition { + id: pushExitRight + XAnimator { + from: 0 + to: -1 * root.width + duration: 400 + easing.type: Easing.OutCubic + } + } +} diff --git a/src/qml/controls/NavigationBlockClockTab.qml b/src/qml/controls/NavigationBlockClockTab.qml new file mode 100644 index 0000000000..56620235d3 --- /dev/null +++ b/src/qml/controls/NavigationBlockClockTab.qml @@ -0,0 +1,67 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import org.bitcoincore.qt 1.0 + +Button { + property color bgActiveColor: Theme.color.orange + property color textColor: Theme.color.neutral7 + property color textHoverColor: Theme.color.neutral9 + property color textActiveColor: Theme.color.orange + property color iconColor: "transparent" + property string iconSource: "" + property bool connected: nodeModel.numOutboundPeers > 0 + property bool synced: nodeModel.verificationProgress > 0.999 + property bool paused: false + + id: root + checkable: true + hoverEnabled: AppMode.isDesktop + implicitHeight: 60 + implicitWidth: 80 + bottomPadding: 0 + topPadding: 0 + + contentItem: BlockClockDial { + anchors.fill: parent + isMini: true + penWidth: 1 + timeRatioList: chainModel.timeRatioList + verificationProgress: nodeModel.verificationProgress + paused: root.paused + connected: root.connected + synced: nodeModel.verificationProgress > 0.999 + backgroundColor: Theme.color.neutral2 + timeTickColor: Theme.color.neutral5 + confirmationColors: Theme.color.confirmationColors + } + + background: Item { + Rectangle { + id: bg + height: parent.height - 5 + width: parent.width + radius: 5 + color: Theme.color.neutral3 + visible: root.hovered + + FocusBorder { + visible: root.visualFocus + } + + Behavior on color { + ColorAnimation { duration: 150 } + } + } + Rectangle { + anchors.bottom: parent.bottom + width: parent.width + height: 3 + visible: root.checked + color: root.bgActiveColor + } + } +} diff --git a/src/qml/controls/NavigationTab.qml b/src/qml/controls/NavigationTab.qml new file mode 100644 index 0000000000..219c90a135 --- /dev/null +++ b/src/qml/controls/NavigationTab.qml @@ -0,0 +1,84 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import org.bitcoincore.qt 1.0 + +Button { + property color bgActiveColor: Theme.color.orange + property color textColor: Theme.color.neutral7 + property color textHoverColor: Theme.color.neutral9 + property color textActiveColor: Theme.color.orange + property color iconColor: "transparent" + property string iconSource: "" + + id: root + checkable: true + hoverEnabled: AppMode.isDesktop + implicitHeight: 60 + implicitWidth: 80 + bottomPadding: 0 + topPadding: 0 + + contentItem: Item { + width: parent.width + height: parent.height + CoreText { + id: buttonText + font.pixelSize: 15 + text: root.text + color: root.textColor + bold: true + visible: root.text !== "" + anchors.centerIn: parent + } + Icon { + id: icon + source: root.iconSource + color: iconColor + visible: root.iconSource !== "" + anchors.centerIn: parent + } + } + + background: Item { + Rectangle { + id: bg + height: parent.height - 5 + width: parent.width + radius: 5 + color: Theme.color.neutral3 + visible: root.hovered + + FocusBorder { + visible: root.visualFocus + } + + Behavior on color { + ColorAnimation { duration: 150 } + } + } + Rectangle { + anchors.bottom: parent.bottom + width: parent.width + height: 3 + visible: root.checked + color: root.bgActiveColor + } + } + + states: [ + State { + name: "CHECKED"; when: root.checked + PropertyChanges { target: buttonText; color: root.textActiveColor } + PropertyChanges { target: icon; color: root.textActiveColor } + }, + State { + name: "HOVER"; when: root.hovered + PropertyChanges { target: buttonText; color: root.textHoverColor } + PropertyChanges { target: icon; color: root.textHoverColor } + } + ] +} diff --git a/src/qml/imageprovider.cpp b/src/qml/imageprovider.cpp index 26ffc102ea..4a8837f085 100644 --- a/src/qml/imageprovider.cpp +++ b/src/qml/imageprovider.cpp @@ -37,6 +37,11 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/bitcoin-circle").pixmap(requested_size); } + if (id == "blockclock-icon") { + *size = requested_size; + return QIcon(":/icons/blockclock-icon").pixmap(requested_size); + } + if (id == "blockclock-size-compact") { *size = requested_size; return QIcon(":/icons/blockclock-size-compact").pixmap(requested_size); @@ -92,6 +97,11 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/gear").pixmap(requested_size); } + if (id == "gear-outline") { + *size = requested_size; + return QIcon(":/icons/gear-outline").pixmap(requested_size); + } + if (id == "info") { *size = requested_size; return QIcon(":/icons/info").pixmap(requested_size); @@ -112,6 +122,11 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/shutdown").pixmap(requested_size); } + if (id == "singlesig-wallet") { + *size = requested_size; + return QIcon(":/icons/singlesig-wallet").pixmap(requested_size); + } + if (id == "storage-dark") { *size = requested_size; return QIcon(":/icons/storage-dark").pixmap(requested_size); @@ -122,5 +137,15 @@ QPixmap ImageProvider::requestPixmap(const QString& id, QSize* size, const QSize return QIcon(":/icons/storage-light").pixmap(requested_size); } + if (id == "triangle-down") { + *size = requested_size; + return QIcon(":/icons/triangle-down").pixmap(requested_size); + } + + if (id == "triangle-up") { + *size = requested_size; + return QIcon(":/icons/triangle-up").pixmap(requested_size); + } + return {}; } diff --git a/src/qml/pages/main.qml b/src/qml/pages/main.qml index 581e9b42b4..0f2461b62e 100644 --- a/src/qml/pages/main.qml +++ b/src/qml/pages/main.qml @@ -11,6 +11,7 @@ import "../components" import "../controls" import "./onboarding" import "./node" +import "./wallet" ApplicationWindow { id: appWindow @@ -31,9 +32,23 @@ ApplicationWindow { ColorAnimation { duration: 150 } } - StackView { + DirectionalStackView { id: main - initialItem: needOnboarding ? onboardingWizard : node + initialItem: { + if (needOnboarding) { + onboardingWizard + } else { + if (AppMode.walletEnabled) { + if (AppMode.isDesktop) { + desktopWallets + } else { + mobileWallets + } + } else { + node + } + } + } anchors.fill: parent focus: true Keys.onReleased: { @@ -70,6 +85,16 @@ ApplicationWindow { } } + Component { + id: desktopWallets + DesktopWallets {} + } + + Component { + id: mobileWallets + MobileWallets {} + } + Component { id: shutdown Shutdown {} diff --git a/src/qml/pages/node/NodeSettings.qml b/src/qml/pages/node/NodeSettings.qml index 87a5f5de4b..a2ca4c667b 100644 --- a/src/qml/pages/node/NodeSettings.qml +++ b/src/qml/pages/node/NodeSettings.qml @@ -12,6 +12,8 @@ import "../settings" Item { signal doneClicked + property alias showDoneButton: doneButton.visible + id: root StackView { @@ -33,6 +35,7 @@ Item { header: "Settings" } rightItem: NavButton { + id: doneButton text: qsTr("Done") onClicked: root.doneClicked() } diff --git a/src/qml/pages/wallet/DesktopWallets.qml b/src/qml/pages/wallet/DesktopWallets.qml new file mode 100644 index 0000000000..80aab1cfe4 --- /dev/null +++ b/src/qml/pages/wallet/DesktopWallets.qml @@ -0,0 +1,122 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import org.bitcoincore.qt 1.0 +import "../../controls" +import "../../components" +import "../node" + +Page { + id: root + background: null + + ButtonGroup { id: navigationTabs } + + header: NavigationBar2 { + id: navBar + leftItem: RowLayout { + spacing: 5 + Icon { + source: "image://images/singlesig-wallet" + color: Theme.color.neutral8 + Layout.preferredWidth: 30 + Layout.preferredHeight: 30 + Layout.leftMargin: 10 + } + Column { + spacing: 2 + CoreText { + text: "Singlesig Wallet" + color: Theme.color.neutral7 + bold: true + } + CoreText { + text: " 0.00 167 599" + color: Theme.color.neutral7 + } + } + } + centerItem: RowLayout { + NavigationTab { + id: activityTabButton + checked: true + text: qsTr("Activity") + property int index: 0 + ButtonGroup.group: navigationTabs + } + NavigationTab { + text: qsTr("Send") + property int index: 1 + ButtonGroup.group: navigationTabs + } + NavigationTab { + text: qsTr("Receive") + property int index: 2 + ButtonGroup.group: navigationTabs + } + } + rightItem: RowLayout { + spacing: 5 + NetworkIndicator { + textSize: 11 + Layout.rightMargin: 5 + } + NavigationBlockClockTab { + Layout.preferredWidth: 30 + Layout.rightMargin: 10 + property int index: 3 + ButtonGroup.group: navigationTabs + } + NavigationTab { + iconSource: "image://images/gear-outline" + Layout.preferredWidth: 30 + property int index: 4 + ButtonGroup.group: navigationTabs + } + } + background: Rectangle { + color: Theme.color.neutral4 + anchors.bottom: navBar.bottom + anchors.bottomMargin: 4 + height: 1 + width: parent.width + } + } + + StackLayout { + width: parent.width + height: parent.height + currentIndex: navigationTabs.checkedButton.index + Item { + id: activityTab + CoreText { text: "Activity" } + } + Item { + id: sendTab + CoreText { text: "Send" } + } + Item { + id: receiveTab + CoreText { text: "Receive" } + } + Item { + id: blockClockTab + anchors.fill: parent + BlockClock { + parentWidth: parent.width - 40 + parentHeight: parent.height + anchors.fill: parent + showNetworkIndicator: false + } + } + NodeSettings { + showDoneButton: false + } + } + + Component.onCompleted: nodeModel.startNodeInitializionThread(); +} \ No newline at end of file diff --git a/src/qml/pages/wallet/MobileWallets.qml b/src/qml/pages/wallet/MobileWallets.qml new file mode 100644 index 0000000000..ba6746645e --- /dev/null +++ b/src/qml/pages/wallet/MobileWallets.qml @@ -0,0 +1,56 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import org.bitcoincore.qt 1.0 +import "../../controls" +import "../../components" +import "../node" +import "./mobile" + +Item { + id: root + + Activity { + anchors.fill: parent + onBlockClockClicked: { + root.StackView.view.pushLeft(blockClock) + } + onSettingsClicked: { + root.StackView.view.pushRight(settings) + } + } + + Component { + id: blockClock + Page { + id: root + background: null + clip: true + header: NavigationBar2 { + rightItem: NavButton { + iconSource: "image://images/caret-right" + onClicked: root.StackView.view.popRight() + } + } + + BlockClock { + parentWidth: parent.width - 40 + parentHeight: parent.height + anchors.centerIn: parent + } + } + } + + Component { + id: settings + NodeSettings { + onDoneClicked: root.StackView.view.popLeft() + } + } + + Component.onCompleted: nodeModel.startNodeInitializionThread(); +} \ No newline at end of file diff --git a/src/qml/pages/wallet/mobile/Activity.qml b/src/qml/pages/wallet/mobile/Activity.qml new file mode 100644 index 0000000000..ccf6bde882 --- /dev/null +++ b/src/qml/pages/wallet/mobile/Activity.qml @@ -0,0 +1,135 @@ +// Copyright (c) 2024 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import org.bitcoincore.qt 1.0 +import "../../../controls" +import "../../../components" +import "../../node" + +Page { + id: root + background: null + + signal blockClockClicked() + signal settingsClicked() + + header: Item { + height: 46 + width: parent.width + Button { + anchors.left: parent.left + anchors.leftMargin: 7.5 + icon.source: "image://images/blockclock-icon" + icon.color: "transparent" + icon.width: 30 + icon.height: 30 + background: null + + onClicked: { + blockClockClicked() + } + } + + Button { + anchors.right: parent.right + anchors.rightMargin: 7.5 + icon.source: "image://images/gear-outline" + icon.color: Theme.color.neutral8 + icon.width: 30 + icon.height: 30 + background: null + + onClicked: { + settingsClicked() + } + } + } + + ColumnLayout { + spacing: 17 + width: parent.width + RowLayout { + Layout.alignment: Qt.AlignHCenter + spacing: 0 + Icon { + source: "image://images/singlesig-wallet" + color: Theme.color.neutral8 + Layout.preferredWidth: 30 + Layout.preferredHeight: 30 + } + CoreText { + text: "Savings" + color: Theme.color.neutral7 + bold: true + font.pixelSize: 21 + } + } + CoreText { + Layout.alignment: Qt.AlignHCenter + text: " 0.00 167 930" + color: Theme.color.neutral7 + font.pixelSize: 27 + } + RowLayout { + Layout.alignment: Qt.AlignHCenter + Layout.topMargin: 30 + spacing: 40 + ColumnLayout { + spacing: 7 + Layout.alignment: Qt.AlignHCenter + Rectangle { + Layout.alignment: Qt.AlignHCenter + width: 50 + height: width + radius: 100 + color: "transparent" + border.color: Theme.color.neutral5 + border.width: 1 + Icon { + anchors.centerIn: parent + source: "image://images/triangle-up" + color: Theme.color.neutral8 + width: 30 + height: 30 + } + } + CoreText { + Layout.alignment: Qt.AlignHCenter + text: qsTr("Send") + color: Theme.color.neutral7 + font.pixelSize: 15 + } + } + ColumnLayout { + spacing: 7 + Layout.alignment: Qt.AlignHCenter + Rectangle { + Layout.alignment: Qt.AlignHCenter + width: 50 + height: width + radius: 100 + color: "transparent" + border.color: Theme.color.neutral5 + border.width: 1 + Icon { + anchors.centerIn: parent + source: "image://images/triangle-down" + color: Theme.color.neutral8 + width: 30 + height: 30 + } + } + CoreText { + Layout.alignment: Qt.AlignHCenter + text: qsTr("Receive") + color: Theme.color.neutral7 + font.pixelSize: 15 + } + } + } + } +} \ No newline at end of file diff --git a/src/qml/res/icons/blockclock-icon.png b/src/qml/res/icons/blockclock-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..90d37f1ba6fb95c5d5e66aa05738d5b6260a63b4 GIT binary patch literal 3796 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 I^xg0M4+znAI{*Lx literal 0 HcmV?d00001 diff --git a/src/qml/res/icons/singlesig-wallet.png b/src/qml/res/icons/singlesig-wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..36a82fec8aa318e4c04b7f46377eb4948f9068e2 GIT binary patch literal 1919 zcmZvcdpy&N8^^z!F_#b}a(1F2my;|>xnvF#Um_jk5?Ks3@-~4*-B7=!E%A zvWY(=D^jGCioNa0a^&`{7okB12o)j#-( zH^u(nugwM7+Uk~FNyqI8-#r{QBeRe&kNV}c(Km~4FF{3BbX34ML3Z?;E6JhhgJAJUD)b&JX3eyA22!O-f{QS z(&j05w@(s>>8_h7D`AG>S3hu93cK+3<(jAx^UM!Ac za*Rh_d>*9T&KZMi+c!J20r*|pXHL^gHeXkGC9{lJzkh^~Qvaxzog*g$CAP=}xj15g zogZD%S^YplLcA+fiGx2$n0eDn8vozCObOeO|j^sY}ZrU-Ya~7bC%H&%=REmc!hSTH?{v(9PNe z9bCP~UnZhHFG8_i_NtxxHh)1%OKP2eK`0jyh$$J2)=|`xPqG~OP5-^rVc;TPMcY-7 z%?#nBTQ1?@s1wLnYbsc5;nXET=~n&FKZJ@(SaXtmV|`BS`zVg@4s4A9OhT0>w{Die z8nVgd39!Wr0*_?4Ojm;$#6@z&L!JT3ig|1t{E$P>L3P`&-C8c6xFuEA6nG2tr{uuq zh+e5N;xx0rBxdOm*(YPY4k+utl(v#jJ)!Hm9MaBep6LB<5w>HcKP!a3y&uQlbf&zy z%e&XVvRNJTe2mBDRCkPRlBikR(?x0-3fK%f6mPyqgHl7&@tpi9j9*>1=3nYgXdjdw zX)abRkK?Uu`o^RZ^?VQhjvA1#{TVaUavdi)E;KTO=)Gqh_n3M}-FEYk?zII{>Wj-$ z!A18BO^cVIi*o`Dk5Cxar8f^W8lQ{);15jfuV7~gCnzi3Kpixp_iP-RR^of4>7%GVT=6)NJ}Ri8&E zb=$D*+pHd-TY)+cpjnTdi``JJT=fr3tvU6p?BSNa zCU3fjpN`@7bh$;IoBr~EX|+F_Z$;xRU8$tr)qAeL(l_YVw*5YK<{<8p$##^3n=(m+ zG~^D)e89?S#XXf@Fq?ub>E3`(p1X61Z`*>3K3Wh8U66`Bw-x1c&A1kArl!P5j8S`d zKxH-y-{POe*D?kLKzWrCqd`Htcq`na>?c3^-tYM7V`#LNLr<@@W{#yIrM(_G> zX{;d4gqSD(yd(E_7P)ldtq&$?&Q_=&g9+_}% zb0*1e19{nZS@hcT*hoxRjTc-Kk?4wmmdR92n2Nd)5P1!8h|xQ-uWj4cU4TfoL#{rD zyvJvv>?1cTyY$`iu$a;x1eUv4&JCksf4GhgsaW`D)9paS*AzJX6 zKlp#ZPG>aM#IDz0&ovNLtRjTelx6Rt*!5-q+MBG4T>d}+z(ORpCP6i8tz{!CStjpQ zw2?!Ai6tRWuD+&gTD-k%)p7nl(&sQYxS%`9an$`D{#z#JG}s=sOZ<@PaDW@6-W353 z2)9n&_8tn+!j^DU8p`di7Ov${TOhD^N4No?ha_|^$lB`;7OeSgG-1vT^a`7%#pI$} z3a^w#hEuLSZb~@`(Ri@_NrMj`p{y1Q{w?u-Fwz@Frjvu%$(TZyL^A+7xM3RXuqpoo DageKp literal 0 HcmV?d00001 diff --git a/src/qml/res/icons/triangle-down.png b/src/qml/res/icons/triangle-down.png new file mode 100644 index 0000000000000000000000000000000000000000..60a708fb25270eb4437c12651ea44ad96ef5ffdb GIT binary patch literal 1953 zcmaJ>dpOgJ8~>8VP>oaCYOymFs^hpsW5}48`&lg4*ydVCVUkN&GfZcz)H7o;jjh^D;V-@VZy^utMn6FLJg`^7 zTEL&kT0DSUN+2Au)!d>T--ElwED^c|FOj)lh2vF~@s$XfSSkvQ(rC0w-m#JWjbwyc z=xB;gZ@Nx({9U(CHg#9tmHcw7N3YL?m;4JdP^`*5nXX=)siPX;(Qnt%0k1`pQP0ju zQHf=rtGo=Oy|z~?XnfE3jNP#CnFE|?;d;zOO<8w_)}HQh!6=K#gV&3cnU}p2l;Dd~w4c)*e?A*k778(_dCCStHx>8`xN92kafAne9F*5a@R!UO93I z{t3j7d%O$fM3)uTH09eYt=aEFKp_d%Y#mFiiF9xh`9nzA69Ll@jgIqy*ztJ0>w1S$ zw*WuGsF1irEt0R7?Xkv?BP&4nWN5|PfPYZ%UBC#~JG#Nc-arLwW7DGpEU!rca=N*_ z_%a9BWT-)QmrtyO7Rwj_67S$^Q?x~Qjm&&%2RmSGzNN{XWPYK}3oVac&_l(U0&IA9 zfJrhOYpY!3Fg1~kkh#MAiu3calwl9tcojTf-sM-DX`I76CBs?ajr<@NS}%rZ$|y9j z@?(4N`c_ad>TJm?>)O||@|c#4(T16h5!b{5IV8(^C8XcWz2xmQMU#=4nQ5|Ft4Y;d z?GOru3L@H4%voSbqkhM^!Y1ofIr<=W*<(#v+}0Q5tMb~CzxSkSZvb;-Q1;wOCFUsV zFm}0c!xea;gdjp6rrn6f8dLdv{uU6vL^vOmzCP`30qGmAVgcKsPm`D>B_*Ev^6j?} zVvunPk^N%`{g02nyAA88u0(A)1OD(7BI0(}Gru11D)5WdEjjCQy}clABagQQkAIqI zp0qaxfs{Vdm|+B$YE2@fcGcl3oK6HGA9Z9RlwjoNHG#H6bvT_@bGzTnn(lKRCe`RL zrV48nO^sW%QzWM!g?JM{#FRBy3mV74VD+O4uhTIeNnwUtlGI|UA6lo7zYiLsF2_$# zPeYY5vww;Bb&bSzfs-I-yv3$UEdhTWbKwwb*PQ~kMlGBwoqtIjQv(|qLdmu)%%($A z`1}y(P84d&cy7gL5i=}ZKB09R`AE@J^_4cgZ)X>@9i^_sOk&~P$?*0pv*KVXCZ+m4 zz<;TgD3^L}V(qECzCH#@UYDp!Cqib$2*E(w5}^$vvp`x$K&RUI@`1x4c@r+X-wFib z3N4fnST&=nTeQq|I|OYS^@k`pmpeTNEm0@Uw**j1Gu}Fap3_NVDRNe1Kk~x7#F|p5 zhmv4Y!GSZegX6z0)DUqzUCimh#;~1xjIfv2@Z`gEQKZ@_&&K9rNA=Ba#69RU!L0X( zcQKV&1L%Wv?Wt$JHme*r{Gta0aIAb^2mEZM6~ntGL)|A#in#m4d?gB^BEPKWB71_O z(P_6ar>~l?sg9blE3QF zkD^$iXOz_@^uq$9qoY$X?Nm`@k;Kmc$!5~!WpoRIWTvsQpSq|fEZLwTT(Uk!n$z^W zAR7m$f{^vjqC5C~FtWYcHGbG%@tvaOGVuw@zS(No*YNJeoG(xSkwBkaSWwP2j{Z>x z)Af^=bOD5=vzv@sKaa|4M)3uv>8}=F@Cx RhWL2{I1791Lo;vM{{XE2mKy*7 literal 0 HcmV?d00001 diff --git a/src/qml/res/icons/triangle-up.png b/src/qml/res/icons/triangle-up.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3edc0255e250f78cb018c0c96d7ef32cc7b674 GIT binary patch literal 1925 zcmah}jXM+i7ymLgvGrRwdE5G7R3ZsjVQwLb;aO24?@NU7 z6IWhVnxsOzUP9#M(lsw3F)GY&_aFHE&Uwx`&+|FwIp=xK=RD{3Dc55NWi4d@0D|O1 zAj@Kc%&sdzW&YiVm;V7kE+G()KSjdhb;80g`3Hua2f%>K=Gr;6+N0a(?vF6L6m3ck z{7PNb2t;(9GO-jHbd$Q<*<=%$ZK01fNs9}9`7*ujNqovv{&s$x&Ud+qFXOyv%pR#J zwl-;L{F(ORg5AQXoMYuHi}FzTpI3&R_e}WiZNem;)h*DrOY(K{zh}0eMEagq6|L|+ zN`3N-R4he%2fg>Tx7W|}NetXswew`?5LC>bP}={_aLH<^l%%d7`?+yq2_=r}kQZ^X zX8O>~gwsZ~)jh(B3qh~$zH;;E#nRtIR)mjERAd@fFi%Q_VXpME6V_c0`qkHoPRPQ7 zI7G%dy`$x>$v0K!+u0isJ{@!4k&nQIcNW7DHFL17_^}b%kK0UBEE+aMM~fL6O7rrP zCzCPSHm;irN{1nyQN47&TyH+lGl#aKG(8G6;pb%6z`Pa!`($FsJH9Fp`+2!#U6bvu zHZ4%J_7se2ty{7|PoKv(sHLUCQRNK5)bc`F|EScicX|;PwN#KUFk`K%EXa_yzHmZqxCB4x}h!M;)iRUtk{930|8U)RhGDO zLu6!6_#YC;Ejs*lw@t(+s$r%YiqQz1VSv$@M4qJ-cUzJxsitPgd2M;o)sX;#A828K zhkK7?YcN)^kN!BQm0I~B=%ByOkaHy!g?rr$JGc7##s?ozwIY#(2IveG?<#5JH+c{? za+=Ew(k27SKg^zoVqW-U&9FxIfyRB4s~odiHrCeE%#Od8;RLA=*S6d&0=DLFe-(@| zA7=g?{v$miW|Yzd6)rcY8Y@A-iax3427;^Srdo;Qn$o_1=k!ON*GOC+M6O=im6jAU zI8mKK4q6@+MB8X6t=A`u<&2L1#aH8`r5$cJZe3W@D$!)P%0IJt)MTsP&h)eqlz*fm zd^jxQHXN{jEM`^J=o(R~1{Qm1+K{jl@2>4eG1L?s!V(caJ1QlOa3KJB3 z$=uvxiPg3ZTsE@e(b4TQ@0P{rhKouASLuHkzya<=@a8Wl45W@WZ^G!rf?gw=+767l zXl;}J5jpcbD`r5511*$FNlr+TD$%W$K-hi;eIb-Hvn_5MiNfT1uAq#LMC`%De=_f} z>VgAXZam(52hmNtp3|S_AC)I&!wUBAyA|_#x%p@wD>k46_t9QMcrP?G9EBf(Z%HC_9;wDoY%E^~z~eNBP@`=kc<&R5PKygL%%=oUMJdp_;VsgLH3mt649oIZ79+4_e|WaG4aeR)#->%X}< z-@mIrGrPFBm5R7gt|uWPAi&wDQVKF?BAge? zFeLJ+VQ*qmQRy+lb00P760FC)jIv#|PPZQ?Kkx-bdvWTGF{9(2F+V9o^Tr&d23_>l z2$`FktHKpwXQ@pLKR>_N9rYYo!>Y^K!P`cLUOEK7z4xD&*`y32_wb|L-IE8A#a?SA zqOLZfB8GIw$AsN$4_7xqg4N42TbXXhcN=->2ywQsaf5*^>oI@Uqsab6%0=-{y8FLg zhje_C9zZ1Y|I`C74nRGCMgAPSxquq;h69Wi4^awRuTn`QNkjcpa1mB7ax9a_Kg5I)s= zkpQXiGPY6@4)!UlCNePJN*C8*p;kKOM`br``|tK8GKdG#ph=w#EM{)fGInrnQ#-^O z7i{_frKOdfssC0BKrZCZ9gLN)b|D-Z{u%nCpN literal 0 HcmV?d00001 diff --git a/src/qml/res/src/blockclock-icon.svg b/src/qml/res/src/blockclock-icon.svg new file mode 100644 index 0000000000..ca3f943033 --- /dev/null +++ b/src/qml/res/src/blockclock-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/qml/res/src/gear-outline.svg b/src/qml/res/src/gear-outline.svg new file mode 100644 index 0000000000..8c7e5dd018 --- /dev/null +++ b/src/qml/res/src/gear-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/qml/res/src/singlesig-wallet.svg b/src/qml/res/src/singlesig-wallet.svg new file mode 100644 index 0000000000..76d1ca5019 --- /dev/null +++ b/src/qml/res/src/singlesig-wallet.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/qml/res/src/triangle-down.svg b/src/qml/res/src/triangle-down.svg new file mode 100644 index 0000000000..f4439a96f1 --- /dev/null +++ b/src/qml/res/src/triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/qml/res/src/triangle-up.svg b/src/qml/res/src/triangle-up.svg new file mode 100644 index 0000000000..2f0cabcecf --- /dev/null +++ b/src/qml/res/src/triangle-up.svg @@ -0,0 +1,3 @@ + + +