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