Skip to content

Commit c3fb557

Browse files
committed
Merge #392: UI Only Custom Datadir
649c2a5 doc: updated the qml/README.md with qml-module-qtquick-dialogs (D33r-Gee) 8131e0f qml: UI only. Added initial custom datadir functionality without wiring (D33r-Gee) ffd5201 qml: UI only. added setcustomdatadir() method into the options_model files (D33r-Gee) 0b59fee qml: statically link QtQuick2Dialog and FolderListModel plugins (johnny9) 893348e qml: fix file location path in Controls plugin for Android (johnny9) Pull request description: This pull request is a focused iteration of #390, intended to isolate and test the UI frontend elements. Backend functionality has been intentionally excluded to streamline the testing, review, and merge process. <details> <summary>Ubuntu Screenshots</summary> ![Screenshot 2024-03-14 124000](https://github.com/bitcoin-core/gui-qml/assets/111142327/a8d8ebbc-c66c-4626-ba7a-630f19c889ae) ![Screenshot 2024-01-29 074759](https://github.com/bitcoin-core/gui-qml/assets/111142327/fea1b72d-2760-436c-aba5-2094b5826fa4) ![Screenshot 2024-01-29 074734](https://github.com/bitcoin-core/gui-qml/assets/111142327/768f93a0-4f9c-46cc-9b31-7d9fcabaaf1e) </details> **Prerequisites** For testing this pull request, ensure you have the following Qt modules installed: * On Ubuntu 22.04: ```bash sudo apt-get install qtdeclarative5-dev sudo apt-get install qtquickcontrols2-5-dev sudo apt-get install qml-module-qtquick-controls2 sudo apt install qml-module-qtquick-dialogs ``` * For Android: * Make sure you delete the prior depends folder (i.e. `depends/aarch64-linux-android`) and rebuild them. **Implementation Details** This introduces `FileDialog` class for a user-friendly selection experience. * **QML Backend** * Updated `options_model` files to account for custom data directory configuration and placeholders for custom `datadir` wiring. * Added @johnny9 depends patches to allow static building * **QML Frontend** * Updated `StorageLocations.qml` to allow for custom data directory selection. Follow up PR will add display of the custom `datadir` in StorageSettings.qml ACKs for top commit: johnny9: ACK 649c2a5 pablomartin4btc: tACK 649c2a5 Tree-SHA512: f480b40aeb28df1515dd191d0fb5e8df94e80cf79c3c468d78b153ebf907b5ad34a97aa0ef6463ac29c6ddebe259b2e3fc1c25c55396c377a9900ce0c68c3edf
2 parents 282d27d + 649c2a5 commit c3fb557

File tree

8 files changed

+99
-1
lines changed

8 files changed

+99
-1
lines changed

build-aux/m4/bitcoin_qt.m4

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
163163
if test -d "$qt_plugin_path/../qml/QtQuick/Controls"; then
164164
QT_LIBS="$QT_LIBS -L$qt_plugin_path/../qml/QtQuick/Controls"
165165
fi
166+
if test -d "$qt_plugin_path/../qml/QtQuick/Dialogs"; then
167+
QT_LIBS="$QT_LIBS -L$qt_plugin_path/../qml/QtQuick/Dialogs -L$qt_plugin_path/../qml/QtQuick/Dialogs/Private"
168+
fi
169+
if test -d "$qt_plugin_path/../qml/Qt/labs/folderlistmodel"; then
170+
QT_LIBS="$QT_LIBS -L$qt_plugin_path/../qml/Qt/labs/folderlistmodel"
171+
fi
166172
if test -d "$qt_plugin_path/../qml/Qt/labs/settings"; then
167173
QT_LIBS="$QT_LIBS -L$qt_plugin_path/../qml/Qt/labs/settings"
168174
fi
@@ -214,6 +220,9 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
214220
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickLayoutsPlugin], [-lqquicklayoutsplugin])
215221
dnl qtquickcontrols module plugins
216222
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickControls1Plugin], [-lqtquickcontrolsplugin])
223+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuick2DialogsPlugin], [-ldialogplugin])
224+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuick2DialogsPrivatePlugin], [-ldialogsprivateplugin])
225+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QmlFolderListModelPlugin], [-lqmlfolderlistmodelplugin])
217226
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QmlSettingsPlugin], [-lqmlsettingsplugin])
218227
dnl qtquickcontrols2 module plugins
219228
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickControls2Plugin], [-lqtquickcontrols2plugin])
@@ -227,6 +236,9 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
227236
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickLayoutsPlugin], [-lqml_QtQuick_Layouts_qquicklayoutsplugin])
228237
dnl qtquickcontrols module plugins
229238
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickControls1Plugin], [-lqml_QtQuick_Controls_qtquickcontrolsplugin])
239+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuick2DialogsPlugin], [-lqml_QtQuick_Dialogs_dialogplugin])
240+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuick2DialogsPrivatePlugin], [-lqml_QtQuick_Dialogs_Private_dialogsprivateplugin])
241+
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QmlFolderListModelPlugin], [-lqml_Qt_labs_folderlistmodel_qmlfolderlistmodelplugin])
230242
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QmlSettingsPlugin], [-lqml_Qt_labs_settings_qmlsettingsplugin])
231243
dnl qtquickcontrols2 module plugins
232244
_BITCOIN_QT_CHECK_STATIC_PLUGIN([QtQuickControls2Plugin], [-lqml_QtQuick_Controls_2_qtquickcontrols2plugin])

depends/packages/qt.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ $(package)_patches += fast_fixed_dtoa_no_optimize.patch
2424
$(package)_patches += guix_cross_lib_path.patch
2525
$(package)_patches += fix_android_plugin_names.patch
2626
$(package)_patches += fix_riscv_atomic.patch
27+
$(package)_patches += fix_android_controls_file_location.patch
2728

2829
$(package)_qtdeclarative_file_name = qtdeclarative-$($(package)_suffix)
2930
$(package)_qtdeclarative_sha256_hash = 5cc169d91efb15a1ee7f484862f872c3eaba592dacf3c0fbcb55c0f3c208254a
@@ -300,6 +301,7 @@ define $(package)_preprocess_cmds
300301
patch -p1 -i $($(package)_patch_dir)/guix_cross_lib_path.patch && \
301302
patch -p1 -i $($(package)_patch_dir)/fix_android_plugin_names.patch && \
302303
patch -p1 -i $($(package)_patch_dir)/fix_riscv_atomic.patch && \
304+
patch -p1 -i $($(package)_patch_dir)/fix_android_controls_file_location.patch && \
303305
mkdir -p qtbase/mkspecs/macx-clang-linux &&\
304306
cp -f qtbase/mkspecs/macx-clang/qplatformdefs.h qtbase/mkspecs/macx-clang-linux/ &&\
305307
cp -f $($(package)_patch_dir)/mac-qmake.conf qtbase/mkspecs/macx-clang-linux/qmake.conf && \
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
diff --git a/qtquickcontrols/src/controls/plugin.cpp b/src/controls/plugin.cpp
2+
index 446357aa..a08957cd 100644
3+
--- a/qtquickcontrols/src/controls/plugin.cpp
4+
+++ b/qtquickcontrols/src/controls/plugin.cpp
5+
@@ -240,7 +240,7 @@ void QtQuickControls1Plugin::initializeEngine(QQmlEngine *engine, const char *ur
6+
QString QtQuickControls1Plugin::fileLocation() const
7+
{
8+
#ifdef Q_OS_ANDROID
9+
- return "qrc:/android_rcc_bundle/qml/QtQuick/Controls";
10+
+ return "qrc:/qt-project.org/imports/QtQuick/Controls";
11+
#else
12+
#ifndef QT_STATIC
13+
if (isLoadedFromResource())

src/qml/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ The following runtime dependencies are also required for dynamic builds;
7070
they are not needed for static builds:
7171

7272
```
73-
sudo apt install qml-module-qtquick2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtquick-window2 qml-module-qt-labs-settings
73+
sudo apt install qml-module-qtquick2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-layouts qml-module-qtquick-window2 qml-module-qt-labs-settings
7474
```
7575
##### Important:
7676

src/qml/bitcoin.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ QT_END_NAMESPACE
5757
#include <QtPlugin>
5858
Q_IMPORT_PLUGIN(QtQmlPlugin)
5959
Q_IMPORT_PLUGIN(QtQmlModelsPlugin)
60+
Q_IMPORT_PLUGIN(QtQuick2DialogsPlugin)
61+
Q_IMPORT_PLUGIN(QtQuick2DialogsPrivatePlugin)
6062
Q_IMPORT_PLUGIN(QtQuick2Plugin)
6163
Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)
6264
Q_IMPORT_PLUGIN(QtQuickControls1Plugin)
65+
Q_IMPORT_PLUGIN(QmlFolderListModelPlugin)
6366
Q_IMPORT_PLUGIN(QmlSettingsPlugin)
6467
Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin)
6568
Q_IMPORT_PLUGIN(QtQuickControls2Plugin)

src/qml/components/StorageLocations.qml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import QtQuick 2.15
66
import QtQuick.Controls 2.15
77
import QtQuick.Layouts 1.15
8+
import QtQuick.Dialogs 1.3
9+
10+
import org.bitcoincore.qt 1.0
11+
812
import "../controls"
913

1014
ColumnLayout {
@@ -25,5 +29,21 @@ ColumnLayout {
2529
ButtonGroup.group: group
2630
text: qsTr("Custom")
2731
description: qsTr("Choose the directory and storage device.")
32+
onClicked: fileDialog.open()
33+
}
34+
FileDialog {
35+
id: fileDialog
36+
selectFolder: true
37+
folder: optionsModel.getDefaultDataDirectory
38+
onAccepted: {
39+
optionsModel.setCustomDataDirString(fileDialog.fileUrls[0].toString())
40+
var customDataDir = fileDialog.fileUrl.toString();
41+
if (customDataDir !== "") {
42+
optionsModel.setCustomDataDirArgs(customDataDir);
43+
}
44+
}
45+
onRejected: {
46+
console.log("Custom datadir selection canceled")
47+
}
2848
}
2949
}

src/qml/models/options_model.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,20 @@
99
#include <common/system.h>
1010
#include <interfaces/node.h>
1111
#include <qt/guiconstants.h>
12+
#include <qt/guiutil.h>
1213
#include <qt/optionsmodel.h>
1314
#include <txdb.h>
1415
#include <univalue.h>
16+
#include <util/fs.h>
17+
#include <util/fs_helpers.h>
1518
#include <validation.h>
1619

1720
#include <cassert>
1821

22+
#include <QDebug>
23+
#include <QDir>
24+
#include <QSettings>
25+
1926
OptionsQmlModel::OptionsQmlModel(interfaces::Node& node)
2027
: m_node{node}
2128
{
@@ -105,3 +112,28 @@ common::SettingsValue OptionsQmlModel::pruneSetting() const
105112
assert(!m_prune || m_prune_size_gb >= 1);
106113
return m_prune ? PruneGBtoMiB(m_prune_size_gb) : 0;
107114
}
115+
116+
QString PathToQString(const fs::path &path)
117+
{
118+
return QString::fromStdString(path.u8string());
119+
}
120+
121+
QString OptionsQmlModel::getDefaultDataDirString()
122+
{
123+
return PathToQString(GetDefaultDataDir());
124+
}
125+
126+
127+
QUrl OptionsQmlModel::getDefaultDataDirectory()
128+
{
129+
QString path = getDefaultDataDirString();
130+
return QUrl::fromLocalFile(path);
131+
}
132+
133+
void OptionsQmlModel::setCustomDataDirArgs(QString path)
134+
{
135+
if (!path.isEmpty()) {
136+
// TODO: add actual custom data wiring
137+
qDebug() << "PlaceHolder: Created data directory: " << path;
138+
}
139+
}

src/qml/models/options_model.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <validation.h>
1212

1313
#include <QObject>
14+
#include <QString>
15+
#include <QUrl>
1416

1517
namespace interfaces {
1618
class Node;
@@ -32,6 +34,8 @@ class OptionsQmlModel : public QObject
3234
Q_PROPERTY(int scriptThreads READ scriptThreads WRITE setScriptThreads NOTIFY scriptThreadsChanged)
3335
Q_PROPERTY(bool server READ server WRITE setServer NOTIFY serverChanged)
3436
Q_PROPERTY(bool upnp READ upnp WRITE setUpnp NOTIFY upnpChanged)
37+
Q_PROPERTY(QString getDefaultDataDirString READ getDefaultDataDirString CONSTANT)
38+
Q_PROPERTY(QUrl getDefaultDataDirectory READ getDefaultDataDirectory CONSTANT)
3539

3640
public:
3741
explicit OptionsQmlModel(interfaces::Node& node);
@@ -56,6 +60,15 @@ class OptionsQmlModel : public QObject
5660
void setServer(bool new_server);
5761
bool upnp() const { return m_upnp; }
5862
void setUpnp(bool new_upnp);
63+
QString getDefaultDataDirString();
64+
QUrl getDefaultDataDirectory();
65+
Q_INVOKABLE void setCustomDataDirArgs(QString path);
66+
67+
public Q_SLOTS:
68+
void setCustomDataDirString(const QString &new_custom_datadir_string) {
69+
m_custom_datadir_string = new_custom_datadir_string;
70+
m_signalReceived = true;
71+
}
5972

6073
Q_SIGNALS:
6174
void dbcacheSizeMiBChanged(int new_dbcache_size_mib);
@@ -66,6 +79,7 @@ class OptionsQmlModel : public QObject
6679
void scriptThreadsChanged(int new_script_threads);
6780
void serverChanged(bool new_server);
6881
void upnpChanged(bool new_upnp);
82+
void customDataDirStringChanged(QString new_custom_datadir_string);
6983

7084
private:
7185
interfaces::Node& m_node;
@@ -83,6 +97,8 @@ class OptionsQmlModel : public QObject
8397
int m_script_threads;
8498
bool m_server;
8599
bool m_upnp;
100+
QString m_custom_datadir_string;
101+
bool m_signalReceived = false;
86102

87103
common::SettingsValue pruneSetting() const;
88104
};

0 commit comments

Comments
 (0)