@@ -97,7 +97,7 @@ static bool RequiresNumWorkaround(OptionsModel::OptionID option)
9797}
9898
9999/* * Call node.updateRwSetting() with Bitcoin 22.x workaround. */ 
100- static  void  UpdateRwSetting (interfaces::Node& node, OptionsModel::OptionID option, const  util::SettingsValue& value)
100+ static  void  UpdateRwSetting (interfaces::Node& node, OptionsModel::OptionID option, const  std::string& suffix,  const   util::SettingsValue& value)
101101{
102102    if  (value.isNum () && RequiresNumWorkaround (option)) {
103103        //  Write certain old settings as strings, even though they are numbers,
@@ -107,9 +107,9 @@ static void UpdateRwSetting(interfaces::Node& node, OptionsModel::OptionID optio
107107        //  in later releases by https://github.com/bitcoin/bitcoin/pull/24498.
108108        //  If new numeric settings are added, they can be written as numbers
109109        //  instead of strings, because bitcoin 22.x will not try to read these.
110-         node.updateRwSetting (SettingName (option), value.getValStr ());
110+         node.updateRwSetting (SettingName (option) + suffix , value.getValStr ());
111111    } else  {
112-         node.updateRwSetting (SettingName (option), value);
112+         node.updateRwSetting (SettingName (option) + suffix , value);
113113    }
114114}
115115
@@ -188,13 +188,6 @@ void OptionsModel::addOverriddenOption(const std::string &option)
188188bool  OptionsModel::Init (bilingual_str& error)
189189{
190190    //  Initialize display settings from stored settings.
191-     m_prune_size_gb = PruneSizeGB (node ().getPersistentSetting (" prune"  ));
192-     ProxySetting proxy = ParseProxyString (SettingToString (node ().getPersistentSetting (" proxy"  ), GetDefaultProxyAddress ().toStdString ()));
193-     m_proxy_ip = proxy.ip ;
194-     m_proxy_port = proxy.port ;
195-     ProxySetting onion = ParseProxyString (SettingToString (node ().getPersistentSetting (" onion"  ), GetDefaultProxyAddress ().toStdString ()));
196-     m_onion_ip = onion.ip ;
197-     m_onion_port = onion.port ;
198191    language = QString::fromStdString (SettingToString (node ().getPersistentSetting (" lang"  ), " "  ));
199192
200193    checkAndMigrate ();
@@ -437,8 +430,6 @@ void OptionsModel::SetPruneTargetGB(int prune_target_gb)
437430    const  util::SettingsValue cur_value = node ().getPersistentSetting (" prune"  );
438431    const  util::SettingsValue new_value = PruneSetting (prune_target_gb > 0 , prune_target_gb);
439432
440-     m_prune_size_gb = prune_target_gb;
441- 
442433    //  Force setting to take effect. It is still safe to change the value at
443434    //  this point because this function is only called after the intro screen is
444435    //  shown, before the node starts.
@@ -457,7 +448,12 @@ void OptionsModel::SetPruneTargetGB(int prune_target_gb)
457448        PruneSizeGB (cur_value) != PruneSizeGB (new_value)) {
458449        //  Call UpdateRwSetting() instead of setOption() to avoid setting
459450        //  RestartRequired flag
460-         UpdateRwSetting (node (), Prune, new_value);
451+         UpdateRwSetting (node (), Prune, " "  , new_value);
452+     }
453+ 
454+     //  Keep previous pruning size, if pruning was disabled.
455+     if  (PruneEnabled (cur_value)) {
456+         UpdateRwSetting (node (), Prune, " -prev"  , PruneEnabled (new_value) ? util::SettingsValue{} : cur_value);
461457    }
462458}
463459
@@ -485,9 +481,9 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
485481    return  successful;
486482}
487483
488- QVariant OptionsModel::getOption (OptionID option) const 
484+ QVariant OptionsModel::getOption (OptionID option,  const  std::string& suffix ) const 
489485{
490-     auto  setting = [&]{ return  node ().getPersistentSetting (SettingName (option)); };
486+     auto  setting = [&]{ return  node ().getPersistentSetting (SettingName (option) + suffix ); };
491487
492488    QSettings settings;
493489    switch  (option) {
@@ -514,19 +510,30 @@ QVariant OptionsModel::getOption(OptionID option) const
514510
515511    //  default proxy
516512    case  ProxyUse:
513+     case  ProxyUseTor:
517514        return  ParseProxyString (SettingToString (setting (), " "  )).is_set ;
518515    case  ProxyIP:
519-         return  m_proxy_ip;
516+     case  ProxyIPTor: {
517+         ProxySetting proxy = ParseProxyString (SettingToString (setting (), " "  ));
518+         if  (proxy.is_set ) {
519+             return  proxy.ip ;
520+         } else  if  (suffix.empty ()) {
521+             return  getOption (option, " -prev"  );
522+         } else  {
523+             return  ParseProxyString (GetDefaultProxyAddress ().toStdString ()).ip ;
524+         }
525+     }
520526    case  ProxyPort:
521-         return  m_proxy_port;
522- 
523-     //  separate Tor proxy
524-     case  ProxyUseTor:
525-         return  ParseProxyString (SettingToString (setting (), " "  )).is_set ;
526-     case  ProxyIPTor:
527-         return  m_onion_ip;
528-     case  ProxyPortTor:
529-         return  m_onion_port;
527+     case  ProxyPortTor: {
528+         ProxySetting proxy = ParseProxyString (SettingToString (setting (), " "  ));
529+         if  (proxy.is_set ) {
530+             return  proxy.port ;
531+         } else  if  (suffix.empty ()) {
532+             return  getOption (option, " -prev"  );
533+         } else  {
534+             return  ParseProxyString (GetDefaultProxyAddress ().toStdString ()).port ;
535+         }
536+     }
530537
531538#ifdef  ENABLE_WALLET
532539    case  SpendZeroConfChange:
@@ -589,7 +596,9 @@ QVariant OptionsModel::getOption(OptionID option) const
589596    case  Prune:
590597        return  PruneEnabled (setting ());
591598    case  PruneSize:
592-         return  m_prune_size_gb;
599+         return  PruneEnabled (setting ()) ? PruneSizeGB (setting ()) :
600+                suffix.empty ()          ? getOption (option, " -prev"  ) :
601+                                          DEFAULT_PRUNE_TARGET_GB;
593602    case  DatabaseCache:
594603        return  qlonglong (SettingToInt (setting (), nDefaultDbCache));
595604    case  ThreadsScriptVerif:
@@ -605,10 +614,10 @@ QVariant OptionsModel::getOption(OptionID option) const
605614    }
606615}
607616
608- bool  OptionsModel::setOption (OptionID option, const  QVariant& value)
617+ bool  OptionsModel::setOption (OptionID option, const  QVariant& value,  const  std::string& suffix )
609618{
610-     auto  changed = [&] { return  value.isValid () && value != getOption (option); };
611-     auto  update = [&](const  util::SettingsValue& value) { return  UpdateRwSetting (node (), option, value); };
619+     auto  changed = [&] { return  value.isValid () && value != getOption (option, suffix ); };
620+     auto  update = [&](const  util::SettingsValue& value) { return  UpdateRwSetting (node (), option, suffix,  value); };
612621
613622    bool  successful = true ; /*  set to false on parse error */ 
614623    QSettings settings;
@@ -646,52 +655,60 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
646655    //  default proxy
647656    case  ProxyUse:
648657        if  (changed ()) {
649-             update (ProxyString (value.toBool (), m_proxy_ip, m_proxy_port));
650-             setRestartRequired (true );
658+             if  (suffix.empty () && !value.toBool ()) setOption (option, true , " -prev"  );
659+             update (ProxyString (value.toBool (), getOption (ProxyIP).toString (), getOption (ProxyPort).toString ()));
660+             if  (suffix.empty () && value.toBool ()) UpdateRwSetting (node (), option, " -prev"  , {});
661+             if  (suffix.empty ()) setRestartRequired (true );
651662        }
652663        break ;
653664    case  ProxyIP:
654665        if  (changed ()) {
655-             m_proxy_ip = value. toString (); 
656-             if  ( getOption (ProxyUse). toBool ()) { 
657-                  update ( ProxyString ( true , m_proxy_ip, m_proxy_port)); 
658-                 setRestartRequired ( true );
666+             if  (suffix. empty () && ! getOption (ProxyUse). toBool ()) { 
667+                  setOption (option, value,  " -prev " ); 
668+             }  else  { 
669+                 update ( ProxyString ( true , value. toString (),  getOption (ProxyPort). toString ()) );
659670            }
671+             if  (suffix.empty () && getOption (ProxyUse).toBool ()) setRestartRequired (true );
660672        }
661673        break ;
662674    case  ProxyPort:
663675        if  (changed ()) {
664-             m_proxy_port = value. toString (); 
665-             if  ( getOption (ProxyUse). toBool ()) { 
666-                  update ( ProxyString ( true , m_proxy_ip, m_proxy_port)); 
667-                 setRestartRequired ( true );
676+             if  (suffix. empty () && ! getOption (ProxyUse). toBool ()) { 
677+                  setOption (option, value,  " -prev " ); 
678+             }  else  { 
679+                 update ( ProxyString ( true ,  getOption (ProxyIP). toString (), value. toString ()) );
668680            }
681+             if  (suffix.empty () && getOption (ProxyUse).toBool ()) setRestartRequired (true );
669682        }
670683        break ;
671684
672685    //  separate Tor proxy
673686    case  ProxyUseTor:
674687        if  (changed ()) {
675-             update (ProxyString (value.toBool (), m_onion_ip, m_onion_port));
676-             setRestartRequired (true );
688+             if  (suffix.empty () && !value.toBool ()) setOption (option, true , " -prev"  );
689+             update (ProxyString (value.toBool (), getOption (ProxyIPTor).toString (), getOption (ProxyPortTor).toString ()));
690+             if  (suffix.empty () && value.toBool ()) UpdateRwSetting (node (), option, " -prev"  , {});
691+             if  (suffix.empty ()) setRestartRequired (true );
677692        }
678693        break ;
679694    case  ProxyIPTor:
680695        if  (changed ()) {
681-             m_onion_ip = value. toString (); 
682-             if  ( getOption (ProxyUseTor). toBool ()) { 
683-                  update ( ProxyString ( true , m_onion_ip, m_onion_port)); 
684-                 setRestartRequired ( true );
696+             if  (suffix. empty () && ! getOption (ProxyUseTor). toBool ()) { 
697+                  setOption (option, value,  " -prev " ); 
698+             }  else  { 
699+                 update ( ProxyString ( true , value. toString (),  getOption (ProxyPortTor). toString ()) );
685700            }
701+             if  (suffix.empty () && getOption (ProxyUseTor).toBool ()) setRestartRequired (true );
686702        }
687703        break ;
688704    case  ProxyPortTor:
689705        if  (changed ()) {
690-             m_onion_port = value. toString (); 
691-             if  ( getOption (ProxyUseTor). toBool ()) { 
692-                  update ( ProxyString ( true , m_onion_ip, m_onion_port)); 
693-                 setRestartRequired ( true );
706+             if  (suffix. empty () && ! getOption (ProxyUseTor). toBool ()) { 
707+                  setOption (option, value,  " -prev " ); 
708+             }  else  { 
709+                 update ( ProxyString ( true ,  getOption (ProxyIPTor). toString (), value. toString ()) );
694710            }
711+             if  (suffix.empty () && getOption (ProxyUseTor).toBool ()) setRestartRequired (true );
695712        }
696713        break ;
697714
@@ -846,17 +863,20 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value)
846863#endif  //  ENABLE_WALLET
847864    case  Prune:
848865        if  (changed ()) {
849-             update (PruneSetting (value.toBool (), m_prune_size_gb));
850-             setRestartRequired (true );
866+             if  (suffix.empty () && !value.toBool ()) setOption (option, true , " -prev"  );
867+             update (PruneSetting (value.toBool (), getOption (PruneSize).toInt ()));
868+             if  (suffix.empty () && value.toBool ()) UpdateRwSetting (node (), option, " -prev"  , {});
869+             if  (suffix.empty ()) setRestartRequired (true );
851870        }
852871        break ;
853872    case  PruneSize:
854873        if  (changed ()) {
855-             m_prune_size_gb =  ParsePruneSizeGB (value); 
856-             if  ( getOption (Prune). toBool ()) { 
857-                  update ( PruneSetting ( true , m_prune_size_gb)); 
858-                 setRestartRequired ( true );
874+             if  (suffix. empty () && ! getOption (Prune). toBool ()) { 
875+                  setOption (option, value,  " -prev " ); 
876+             }  else  { 
877+                 update ( PruneSetting ( true ,  ParsePruneSizeGB (value)) );
859878            }
879+             if  (suffix.empty () && getOption (Prune).toBool ()) setRestartRequired (true );
860880        }
861881        break ;
862882    case  DatabaseCache:
0 commit comments