21 #include <validation.h> 25 #include <QLatin1Char> 27 #include <QStringList> 57 default:
throw std::logic_error(
strprintf(
"GUI option %i has no corresponding node setting.", option));
85 assert(!prune_enabled || prune_size_gb >= 1);
109 return std::max(1, prune_size.toInt());
118 static std::string
ProxyString(
bool is_set, QString
ip, QString port);
126 if (std::holds_alternative<FontChoiceAbstract>(f)) {
177 if (!settings.contains(
"fHideTrayIcon")) {
178 settings.setValue(
"fHideTrayIcon",
false);
183 if (!settings.contains(
"fMinimizeToTray"))
184 settings.setValue(
"fMinimizeToTray",
false);
187 if (!settings.contains(
"fMinimizeOnClose"))
188 settings.setValue(
"fMinimizeOnClose",
false);
192 if (!settings.contains(
"DisplayBitcoinUnit")) {
193 settings.setValue(
"DisplayBitcoinUnit", QVariant::fromValue(
BitcoinUnit::BTC));
195 QVariant unit = settings.value(
"DisplayBitcoinUnit");
203 if (!settings.contains(
"strThirdPartyTxUrls"))
204 settings.setValue(
"strThirdPartyTxUrls",
"");
207 if (!settings.contains(
"fCoinControlFeatures"))
208 settings.setValue(
"fCoinControlFeatures",
false);
211 if (!settings.contains(
"enable_psbt_controls")) {
212 settings.setValue(
"enable_psbt_controls",
false);
224 }
catch (
const std::exception& e) {
227 error.
original =
strprintf(
"Could not read setting \"%s\", %s.", setting, e.what());
228 error.
translated = tr(
"Could not read setting \"%1\", %2.").arg(QString::fromStdString(setting), e.what()).toStdString();
236 if (!settings.contains(
"strDataDir"))
241 if (!settings.contains(
"SubFeeFromAmount")) {
242 settings.setValue(
"SubFeeFromAmount",
false);
248 if (settings.contains(
"FontForMoney")) {
250 }
else if (settings.contains(
"UseEmbeddedMonospacedFont")) {
251 if (settings.value(
"UseEmbeddedMonospacedFont").toBool()) {
259 m_mask_values = settings.value(
"mask_values",
false).toBool();
269 for (
const QString& key : src.allKeys()) {
270 dst.setValue(key, src.value(key));
295 dataDir = settings.value(
"strDataDir", dataDir).toString();
301 settings.setValue(
"strDataDir", dataDir);
304 settings.setValue(
"fReset",
true);
320 if (proxy.isEmpty()) {
325 if (ip_port.size() == 2) {
326 return {
true, ip_port.at(0), ip_port.at(1)};
339 return is_set ? QString(
ip +
":" + port).toStdString() :
"";
376 if(role == Qt::EditRole)
386 bool successful =
true;
387 if(role == Qt::EditRole)
392 Q_EMIT dataChanged(index, index);
434 }
else if (suffix.empty()) {
445 }
else if (suffix.empty()) {
471 return settings.value(
"enable_psbt_controls");
476 suffix.empty() ?
getOption(option,
"-prev") :
496 if (std::holds_alternative<FontChoiceAbstract>(fc)) {
498 f.setWeight(QFont::Bold);
500 f = std::get<QFont>(fc);
513 auto changed = [&] {
return value.isValid() && value !=
getOption(option, suffix); };
516 bool successful =
true;
534 update(value.toBool());
540 update(value.toBool());
552 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
582 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
612 update(value.toBool());
618 update(value.toString().toStdString());
639 update(value.toString().toStdString());
645 const auto& new_font = value.value<
FontChoice>();
663 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
681 update(static_cast<int64_t>(value.toLongLong()));
687 update(static_cast<int64_t>(value.toLongLong()));
694 update(value.toBool());
721 return settings.setValue(
"fRestartRequired", fRequired);
727 return settings.value(
"fRestartRequired",
false).toBool();
740 static const char strSettingsVersionKey[] =
"nSettingsVersion";
741 int settingsVersion = settings.contains(strSettingsVersionKey) ? settings.value(strSettingsVersionKey).toInt() : 0;
747 if (settingsVersion < 130000 && settings.contains(
"nDatabaseCache") && settings.value(
"nDatabaseCache").toLongLong() == 100)
755 if (settings.contains(
"addrProxy") && settings.value(
"addrProxy").toString().endsWith(
"%2")) {
761 if (settings.contains(
"addrSeparateProxyTor") && settings.value(
"addrSeparateProxyTor").toString().endsWith(
"%2")) {
766 auto migrate_setting = [&](
OptionID option,
const QString& qt_name) {
767 if (!settings.contains(qt_name))
return;
768 QVariant value = settings.value(qt_name);
782 settings.remove(qt_name);
793 migrate_setting(
Listen,
"fListen");
794 migrate_setting(
Server,
"server");
795 migrate_setting(
PruneSize,
"nPruneSize");
796 migrate_setting(
Prune,
"bPrune");
797 migrate_setting(
ProxyIP,
"addrProxy");
798 migrate_setting(
ProxyUse,
"fUseProxy");
799 migrate_setting(
ProxyIPTor,
"addrSeparateProxyTor");
800 migrate_setting(
ProxyUseTor,
"fUseSeparateProxyTor");
801 migrate_setting(
Language,
"language");
virtual common::SettingsValue getPersistentSetting(const std::string &name)=0
Return setting value from <datadir>/settings.json or bitcoin.conf.
static std::string ProxyString(bool is_set, QString ip, QString port)
static void UpdateRwSetting(interfaces::Node &node, OptionsModel::OptionID option, const std::string &suffix, const common::SettingsValue &value)
Call node.updateRwSetting() with Bitcoin 22.x workaround.
static const char * SettingName(OptionsModel::OptionID option)
Map GUI option ID to node setting name.
virtual void resetSettings()=0
Clear all settings in <datadir>/settings.json and store a backup of previous settings in <datadir>/se...
static constexpr int DEFAULT_PRUNE_TARGET_GB
static void BackupSettings(const fs::path &filename, const QSettings &src)
Back up a QSettings to an ini-formatted file.
void addOverriddenOption(const std::string &option)
bool hasSigner()
Whether -signer was set or not.
static common::SettingsValue PruneSetting(bool prune_enabled, int prune_size_gb)
Convert enabled/size values to bitcoin -prune setting.
static int ParsePruneSizeGB(const QVariant &prune_size)
Parse pruning size value provided by user in GUI or loaded from QSettings (windows registry key or qt...
static void CopySettings(QSettings &dst, const QSettings &src)
Helper function to copy contents from one QSettings to another.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
static const bool DEFAULT_LISTEN
-listen default
void SetPruneTargetGB(int prune_target_gb)
static const FontChoice UseBestSystemFont
BitcoinUnit m_display_bitcoin_unit
bool GetStartOnSystemStartup()
void coinControlFeaturesChanged(bool)
QFont fixedPitchFont(bool use_embedded_font)
static int64_t PruneGBtoMiB(int gb)
Convert displayed prune target GB to configured MiB.
const std::string & getValStr() const
std::variant< FontChoiceAbstract, QFont > FontChoice
static QString FontChoiceToString(const OptionsModel::FontChoice &)
static int PruneSizeGB(const common::SettingsValue &prune_setting)
Get pruning size value to show in GUI from bitcoin -prune setting.
bool Init(bilingual_str &error)
bool isRestartRequired() const
static const bool DEFAULT_SPEND_ZEROCONF_CHANGE
Default for -spendzeroconfchange.
interfaces::Node & node() const
static constexpr bool DEFAULT_UPNP
bool setOption(OptionID option, const QVariant &value, const std::string &suffix="")
static FontChoice FontChoiceFromString(const QString &)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void displayUnitChanged(BitcoinUnit unit)
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
std::optional< std::string > SettingToString(const common::SettingsValue &value)
static constexpr int DEFAULT_SCRIPTCHECK_THREADS
-par default (number of script-checking threads, 0 = auto)
QVariant getOption(OptionID option, const std::string &suffix="") const
std::optional< bool > SettingToBool(const common::SettingsValue &value)
static bool PruneEnabled(const common::SettingsValue &prune_setting)
Get pruning enabled value to show in GUI from bitcoin -prune setting.
const char * DEFAULT_GUI_PROXY_HOST
static const int64_t nDefaultDbCache
-dbcache default (MiB)
static CService ip(uint32_t i)
static int PruneMiBtoGB(int64_t mib)
Convert configured prune target MiB to displayed GB.
static const QLatin1String fontchoice_str_best_system
bool fCoinControlFeatures
bool m_enable_psbt_controls
static const QString fontchoice_str_custom_prefix
static constexpr uint16_t DEFAULT_GUI_PROXY_PORT
virtual void initParameterInteraction()=0
Init parameter interaction.
QStringList SplitSkipEmptyParts(const QString &string, const SeparatorType &separator)
Splits the string into substrings wherever separator occurs, and returns the list of those strings...
static QFont getFontForChoice(const FontChoice &fc)
static constexpr bool DEFAULT_NATPMP
void setRestartRequired(bool fRequired)
QString strThirdPartyTxUrls
QFont getFontForMoney() const
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
static ProxySetting ParseProxyString(const std::string &proxy)
static const QLatin1String fontchoice_str_embedded
bool m_sub_fee_from_amount
bool SetStartOnSystemStartup(bool fAutoStart)
std::optional< int64_t > SettingToInt(const common::SettingsValue &value)
OptionsModel(interfaces::Node &node, QObject *parent=nullptr)
void fontForMoneyChanged(const QFont &)
virtual void forceSetting(const std::string &name, const common::SettingsValue &value)=0
Force a setting value to be applied, overriding any other configuration source, but not being persist...
static QString GetDefaultProxyAddress()
QString getDefaultDataDirectory()
Determine default data directory for operating system.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
static const int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
virtual void mapPort(bool use_upnp, bool use_natpmp)=0
Map port.
Top-level interface for a bitcoin node (bitcoind process).
void setDisplayUnit(const QVariant &new_unit)
Updates current unit in memory, settings and emits displayUnitChanged(new_unit) signal.
QString PathToQString(const fs::path &path)
Convert OS specific boost path to QString through UTF-8.
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QString strOverriddenByCommandLine
void showTrayIconChanged(bool)