1 // Copyright (c) 2011-2019 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_QT_INTRO_H
6 #define BITCOIN_QT_INTRO_H
7 
8 #include <QDialog>
9 #include <QMutex>
10 #include <QThread>
11 
12 static const bool DEFAULT_CHOOSE_DATADIR = false;
13 
14 class FreespaceChecker;
15 
16 namespace interfaces {
17     class Node;
18 }
19 
20 namespace Ui {
21     class Intro;
22 }
23 
24 /** Introduction screen (pre-GUI startup).
25   Allows the user to choose a data directory,
26   in which the wallet and block chain will be stored.
27  */
28 class Intro : public QDialog
29 {
30     Q_OBJECT
31 
32 public:
33     explicit Intro(QWidget *parent = nullptr,
34                    int64_t blockchain_size_gb = 0, int64_t chain_state_size_gb = 0);
35     ~Intro();
36 
37     QString getDataDirectory();
38     void setDataDirectory(const QString &dataDir);
39     int64_t getPruneMiB() const;
40 
41     /**
42      * Determine data directory. Let the user choose if the current one doesn't exist.
43      * Let the user configure additional preferences such as pruning.
44      *
45      * @returns true if a data directory was selected, false if the user cancelled the selection
46      * dialog.
47      *
48      * @note do NOT call global gArgs.GetDataDirNet() before calling this function, this
49      * will cause the wrong path to be cached.
50      */
51     static bool showIfNeeded(bool& did_show_intro, int64_t& prune_MiB);
52 
53 Q_SIGNALS:
54     void requestCheck();
55 
56 public Q_SLOTS:
57     void setStatus(int status, const QString &message, quint64 bytesAvailable);
58 
59 private Q_SLOTS:
60     void on_dataDirectory_textChanged(const QString &arg1);
61     void on_ellipsisButton_clicked();
62     void on_dataDirDefault_clicked();
63     void on_dataDirCustom_clicked();
64 
65 private:
66     Ui::Intro *ui;
67     QThread *thread;
68     QMutex mutex;
69     bool signalled;
70     QString pathToCheck;
71     const int64_t m_blockchain_size_gb;
72     const int64_t m_chain_state_size_gb;
73     //! Total required space (in GB) depending on user choice (prune or not prune).
74     int64_t m_required_space_gb{0};
75     uint64_t m_bytes_available{0};
76     int64_t m_prune_target_gb;
77 
78     void startThread();
79     void checkPath(const QString &dataDir);
80     QString getPathToCheck();
81     void UpdatePruneLabels(bool prune_checked);
82     void UpdateFreeSpaceLabel();
83 
84     friend class FreespaceChecker;
85 };
86 
87 #endif // BITCOIN_QT_INTRO_H
88