Make lsn_reset ("detach databases") optional and off by default.
[novacoin.git] / src / qt / optionsmodel.cpp
1 #include "optionsmodel.h"
2 #include "bitcoinunits.h"
3 #include <QSettings>
4
5 #include "init.h"
6 #include "walletdb.h"
7
8 OptionsModel::OptionsModel(QObject *parent) :
9     QAbstractListModel(parent)
10 {
11     Init();
12 }
13
14 void OptionsModel::Init()
15 {
16     QSettings settings;
17
18     // These are QT-only settings:
19     nDisplayUnit = settings.value("nDisplayUnit", BitcoinUnits::BTC).toInt();
20     bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool();
21     fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool();
22     fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool();
23     nTransactionFee = settings.value("nTransactionFee").toLongLong();
24
25     // These are shared with core bitcoin; we want
26     // command-line options to override the GUI settings:
27     if (settings.contains("fUseUPnP"))
28         SoftSetBoolArg("-upnp", settings.value("fUseUPnP").toBool());
29     if (settings.contains("addrProxy") && settings.value("fUseProxy").toBool())
30         SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
31     if (settings.contains("detachDB"))
32         SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
33 }
34
35 bool OptionsModel::Upgrade()
36 {
37     QSettings settings;
38
39     if (settings.contains("bImportFinished"))
40         return false; // Already upgraded
41
42     settings.setValue("bImportFinished", true);
43
44     // Move settings from old wallet.dat (if any):
45     CWalletDB walletdb("wallet.dat");
46
47     QList<QString> intOptions;
48     intOptions << "nDisplayUnit" << "nTransactionFee";
49     foreach(QString key, intOptions)
50     {
51         int value = 0;
52         if (walletdb.ReadSetting(key.toStdString(), value))
53         {
54             settings.setValue(key, value);
55             walletdb.EraseSetting(key.toStdString());
56         }
57     }
58     QList<QString> boolOptions;
59     boolOptions << "bDisplayAddresses" << "fMinimizeToTray" << "fMinimizeOnClose" << "fUseProxy" << "fUseUPnP";
60     foreach(QString key, boolOptions)
61     {
62         bool value = false;
63         if (walletdb.ReadSetting(key.toStdString(), value))
64         {
65             settings.setValue(key, value);
66             walletdb.EraseSetting(key.toStdString());
67         }
68     }
69     try
70     {
71         CAddress addrProxyAddress;
72         if (walletdb.ReadSetting("addrProxy", addrProxyAddress))
73         {
74             addrProxy = addrProxyAddress;
75             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
76             walletdb.EraseSetting("addrProxy");
77         }
78     }
79     catch (std::ios_base::failure &e)
80     {
81         // 0.6.0rc1 saved this as a CService, which causes failure when parsing as a CAddress
82         if (walletdb.ReadSetting("addrProxy", addrProxy))
83         {
84             settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
85             walletdb.EraseSetting("addrProxy");
86         }
87     }
88     Init();
89
90     return true;
91 }
92
93
94 int OptionsModel::rowCount(const QModelIndex & parent) const
95 {
96     return OptionIDRowCount;
97 }
98
99 QVariant OptionsModel::data(const QModelIndex & index, int role) const
100 {
101     if(role == Qt::EditRole)
102     {
103         QSettings settings;
104         switch(index.row())
105         {
106         case StartAtStartup:
107             return QVariant(GetStartOnSystemStartup());
108         case MinimizeToTray:
109             return QVariant(fMinimizeToTray);
110         case MapPortUPnP:
111             return settings.value("fUseUPnP", GetBoolArg("-upnp", true));
112         case MinimizeOnClose:
113             return QVariant(fMinimizeOnClose);
114         case ConnectSOCKS4:
115             return settings.value("fUseProxy", false);
116         case ProxyIP:
117             return QVariant(QString::fromStdString(addrProxy.ToStringIP()));
118         case ProxyPort:
119             return QVariant(addrProxy.GetPort());
120         case Fee:
121             return QVariant(nTransactionFee);
122         case DisplayUnit:
123             return QVariant(nDisplayUnit);
124         case DisplayAddresses:
125             return QVariant(bDisplayAddresses);
126         case DetachDatabases:
127             return QVariant(fDetachDB);
128         default:
129             return QVariant();
130         }
131     }
132     return QVariant();
133 }
134
135 bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
136 {
137     bool successful = true; /* set to false on parse error */
138     if(role == Qt::EditRole)
139     {
140         QSettings settings;
141         switch(index.row())
142         {
143         case StartAtStartup:
144             successful = SetStartOnSystemStartup(value.toBool());
145             break;
146         case MinimizeToTray:
147             fMinimizeToTray = value.toBool();
148             settings.setValue("fMinimizeToTray", fMinimizeToTray);
149             break;
150         case MapPortUPnP:
151             {
152                 bool bUseUPnP = value.toBool();
153                 settings.setValue("fUseUPnP", bUseUPnP);
154                 MapPort(bUseUPnP);
155             }
156             break;
157         case MinimizeOnClose:
158             fMinimizeOnClose = value.toBool();
159             settings.setValue("fMinimizeOnClose", fMinimizeOnClose);
160             break;
161         case ConnectSOCKS4:
162             fUseProxy = value.toBool();
163             settings.setValue("fUseProxy", fUseProxy);
164             break;
165         case ProxyIP:
166             {
167                 // Use CAddress to parse and check IP
168                 CNetAddr addr(value.toString().toStdString());
169                 if (addr.IsValid())
170                 {
171                     addrProxy.SetIP(addr);
172                     settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
173                 }
174                 else
175                 {
176                     successful = false;
177                 }
178             }
179             break;
180         case ProxyPort:
181             {
182                 int nPort = atoi(value.toString().toAscii().data());
183                 if (nPort > 0 && nPort < std::numeric_limits<unsigned short>::max())
184                 {
185                     addrProxy.SetPort(nPort);
186                     settings.setValue("addrProxy", addrProxy.ToStringIPPort().c_str());
187                 }
188                 else
189                 {
190                     successful = false;
191                 }
192             }
193             break;
194         case Fee: {
195             nTransactionFee = value.toLongLong();
196             settings.setValue("nTransactionFee", nTransactionFee);
197             }
198             break;
199         case DisplayUnit: {
200             int unit = value.toInt();
201             nDisplayUnit = unit;
202             settings.setValue("nDisplayUnit", nDisplayUnit);
203             emit displayUnitChanged(unit);
204             }
205             break;
206         case DisplayAddresses: {
207             bDisplayAddresses = value.toBool();
208             settings.setValue("bDisplayAddresses", bDisplayAddresses);
209             }
210             break;
211         case DetachDatabases: {
212             fDetachDB = value.toBool();
213             settings.setValue("detachDB", fDetachDB);
214             }
215             break;
216         default:
217             break;
218         }
219     }
220     emit dataChanged(index, index);
221
222     return successful;
223 }
224
225 qint64 OptionsModel::getTransactionFee()
226 {
227     return nTransactionFee;
228 }
229
230 bool OptionsModel::getMinimizeToTray()
231 {
232     return fMinimizeToTray;
233 }
234
235 bool OptionsModel::getMinimizeOnClose()
236 {
237     return fMinimizeOnClose;
238 }
239
240 int OptionsModel::getDisplayUnit()
241 {
242     return nDisplayUnit;
243 }
244
245 bool OptionsModel::getDisplayAddresses()
246 {
247     return bDisplayAddresses;
248 }