5 #include <bitcoin-build-config.h> 22 #include <validation.h> 26 #include <QLatin1Char> 28 #include <QStringList> 55 default:
throw std::logic_error(
strprintf(
"GUI option %i has no corresponding node setting.", option));
83 assert(!prune_enabled || prune_size_gb >= 1);
91 return SettingTo<int64_t>(prune_setting, 0) > 1;
98 int value = SettingTo<int64_t>(prune_setting, 0);
107 return std::max(1, prune_size.toInt());
116 static std::string
ProxyString(
bool is_set, QString
ip, QString port);
124 if (std::holds_alternative<FontChoiceAbstract>(f)) {
175 if (!settings.contains(
"fHideTrayIcon")) {
176 settings.setValue(
"fHideTrayIcon",
false);
181 if (!settings.contains(
"fMinimizeToTray"))
182 settings.setValue(
"fMinimizeToTray",
false);
185 if (!settings.contains(
"fMinimizeOnClose"))
186 settings.setValue(
"fMinimizeOnClose",
false);
190 if (!settings.contains(
"DisplayBitcoinUnit")) {
191 settings.setValue(
"DisplayBitcoinUnit", QVariant::fromValue(
BitcoinUnit::BTC));
193 QVariant unit = settings.value(
"DisplayBitcoinUnit");
201 if (!settings.contains(
"strThirdPartyTxUrls"))
202 settings.setValue(
"strThirdPartyTxUrls",
"");
205 if (!settings.contains(
"fCoinControlFeatures"))
206 settings.setValue(
"fCoinControlFeatures",
false);
209 if (!settings.contains(
"enable_psbt_controls")) {
210 settings.setValue(
"enable_psbt_controls",
false);
222 }
catch (
const std::exception& e) {
225 error.
original =
strprintf(
"Could not read setting \"%s\", %s.", setting, e.what());
226 error.
translated = tr(
"Could not read setting \"%1\", %2.").arg(QString::fromStdString(setting), e.what()).toStdString();
234 if (!settings.contains(
"strDataDir"))
239 if (!settings.contains(
"SubFeeFromAmount")) {
240 settings.setValue(
"SubFeeFromAmount",
false);
246 if (settings.contains(
"FontForMoney")) {
248 }
else if (settings.contains(
"UseEmbeddedMonospacedFont")) {
249 if (settings.value(
"UseEmbeddedMonospacedFont").toBool()) {
257 m_mask_values = settings.value(
"mask_values",
false).toBool();
267 for (
const QString& key : src.allKeys()) {
268 dst.setValue(key, src.value(key));
293 dataDir = settings.value(
"strDataDir", dataDir).toString();
299 settings.setValue(
"strDataDir", dataDir);
302 settings.setValue(
"fReset",
true);
318 if (proxy.isEmpty()) {
322 std::string hostname;
323 if (
SplitHostPort(proxy.toStdString(), port, hostname) && port != 0) {
326 if (hostname.find(
':') != std::string::npos) {
327 hostname =
"[" + hostname +
"]";
329 return {
true, QString::fromStdString(hostname), QString::number(port)};
342 return is_set ? QString(
ip +
":" + port).toStdString() :
"";
379 if(role == Qt::EditRole)
389 bool successful =
true;
390 if(role == Qt::EditRole)
395 Q_EMIT dataChanged(index, index);
427 }
else if (suffix.empty()) {
438 }
else if (suffix.empty()) {
464 return settings.value(
"enable_psbt_controls");
469 suffix.empty() ?
getOption(option,
"-prev") :
489 if (std::holds_alternative<FontChoiceAbstract>(fc)) {
491 f.setWeight(QFont::Bold);
493 f = std::get<QFont>(fc);
506 auto changed = [&] {
return value.isValid() && value !=
getOption(option, suffix); };
509 bool successful =
true;
527 update(value.toBool());
539 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
569 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
599 update(value.toBool());
605 update(value.toString().toStdString());
626 update(value.toString().toStdString());
632 const auto& new_font = value.value<
FontChoice>();
650 if (suffix.empty() && !value.toBool())
setOption(option,
true,
"-prev");
668 update(static_cast<int64_t>(value.toLongLong()));
674 update(static_cast<int64_t>(value.toLongLong()));
681 update(value.toBool());
708 return settings.setValue(
"fRestartRequired", fRequired);
714 return settings.value(
"fRestartRequired",
false).toBool();
727 static const char strSettingsVersionKey[] =
"nSettingsVersion";
728 int settingsVersion = settings.contains(strSettingsVersionKey) ? settings.value(strSettingsVersionKey).toInt() : 0;
734 if (settingsVersion < 130000 && settings.contains(
"nDatabaseCache") && settings.value(
"nDatabaseCache").toLongLong() == 100)
742 if (settings.contains(
"addrProxy") && settings.value(
"addrProxy").toString().endsWith(
"%2")) {
748 if (settings.contains(
"addrSeparateProxyTor") && settings.value(
"addrSeparateProxyTor").toString().endsWith(
"%2")) {
753 auto migrate_setting = [&](
OptionID option,
const QString& qt_name) {
754 if (!settings.contains(qt_name))
return;
755 QVariant value = settings.value(qt_name);
769 settings.remove(qt_name);
779 migrate_setting(
Listen,
"fListen");
780 migrate_setting(
Server,
"server");
781 migrate_setting(
PruneSize,
"nPruneSize");
782 migrate_setting(
Prune,
"bPrune");
783 migrate_setting(
ProxyIP,
"addrProxy");
784 migrate_setting(
ProxyUse,
"fUseProxy");
785 migrate_setting(
ProxyIPTor,
"addrSeparateProxyTor");
786 migrate_setting(
ProxyUseTor,
"fUseSeparateProxyTor");
787 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 SplitHostPort(std::string_view in, uint16_t &portOut, std::string &hostOut)
Splits socket address string into host string and port value.
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
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)
virtual void mapPort(bool enable)=0
Map port.
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 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.
static QFont getFontForChoice(const FontChoice &fc)
static constexpr bool DEFAULT_NATPMP
size_t GetDefaultDBCache()
void setRestartRequired(bool fRequired)
static constexpr size_t DEFAULT_DB_CACHE
-dbcache default (bytes)
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)
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
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)