Scaled icon's master image down.
[weightgraph] / weightgraph / settingswindow.cpp
1 #include "settingswindow.h"
2 #include <QHBoxLayout>
3 #include <QVBoxLayout>
4 #include <QGridLayout>
5 #include <QLabel>
6 #include <QStringListModel>
7 #include <QPushButton>
8
9 //for debugging
10 #include <iostream>
11 #include <QDebug>
12
13 static QStringList timeIntervalStrings() {
14   QStringList timeIntervals;
15   timeIntervals.append("1 week");
16   timeIntervals.append("1 month");
17   timeIntervals.append("3 months");
18   timeIntervals.append("6 months");
19   timeIntervals.append("1 year");
20   timeIntervals.append("all");
21   return timeIntervals;
22 }
23 static int timeIntervalToIndex(int days) {
24   switch(days) {
25   case 0: return 5;
26   case 7: return 0;
27   case 30: return 1;
28   case 90: return 2;
29   case 180: return 3;
30   case 365: return 4;
31   default: Q_ASSERT(0 && "unknown time interval");
32   }
33   return 0; //unreachable
34 }
35 static int indexToTimeInterval(int index) {
36   switch(index) {
37   case 5: return 0;
38   case 0: return 7;
39   case 1: return 30;
40   case 2: return 90;
41   case 3: return 180;
42   case 4: return 365;
43   default: Q_ASSERT(0 && "unknown time interval index");
44   }
45   return 0; //unreachable
46 }
47
48 SettingsWindow::SettingsWindow(QWidget *parent) :
49     QMainWindow(parent)
50 {
51 #ifdef Q_WS_MAEMO_5
52   setAttribute(Qt::WA_Maemo5StackedWindow);
53 #endif
54
55   setWindowTitle("WeightGraph");
56
57   QWidget *rootContainer = new QWidget(this);
58   QVBoxLayout *rootLayout = new QVBoxLayout(rootContainer);
59
60   QWidget *topContainer = new QWidget(rootContainer);
61   QGridLayout *topLayout = new QGridLayout(topContainer);
62
63   QStringList units; units.append("kg"); units.append("lb");
64   QStringListModel *weightUnitModel = new QStringListModel(units, topContainer);
65 #ifdef Q_WS_MAEMO_5
66   weightUnit = new QMaemo5ValueButton("Unit", topContainer);
67   weightUnit->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered);
68   QMaemo5ListPickSelector *weightUnitSelector = new QMaemo5ListPickSelector(topContainer);
69   weightUnitSelector->setModel(weightUnitModel);
70   weightUnitSelector->setCurrentIndex(Settings::weightUnit() == "kg" ? 0 : 1);
71   weightUnit->setPickSelector(weightUnitSelector);
72   connect(weightUnit->pickSelector(), SIGNAL(selected(QString)),
73           Settings::self(), SLOT(setWeightUnitAndSync(QString)));
74 #else
75   weightUnit = new QComboBox(topContainer);
76   weightUnit->setModel(weightUnitModel);
77 #endif
78
79   topLayout->addWidget(weightUnit, 0, 0);
80
81 //  QWidget *spacer = new QWidget(topContainer);
82 //  spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
83 //  topLayout->addWidget(spacer);
84
85   QFrame *goalFrame = new QFrame(topContainer);
86   goalFrame->setFrameShadow(QFrame::Sunken);
87   goalFrame->setFrameStyle(QFrame::StyledPanel);
88   goalFrame->setLineWidth(2);
89   goalFrame->setMidLineWidth(2);
90   QHBoxLayout *goalLayout = new QHBoxLayout(goalFrame);
91
92   goalLayout->addWidget(new QLabel("Goal weight:", topContainer));
93
94   goalMin = new WeightSpinBox(topContainer);
95   goalMin->setValue(Settings::goalWeightMin());
96   goalLayout->addWidget(goalMin);
97
98   goalLayout->addWidget(new QLabel("-", topContainer));
99
100   goalMax = new WeightSpinBox(topContainer);
101   goalMax->setValue(Settings::goalWeightMax());
102   goalLayout->addWidget(goalMax);
103   topLayout->addWidget(goalFrame, 0, 1);
104
105   grabZoomKeys = new QPushButton("Use zoom/volume keys to zoom", rootContainer);
106   grabZoomKeys->setCheckable(true);
107   grabZoomKeys->setChecked(Settings::grabZoomKeys());
108   topLayout->addWidget(grabZoomKeys, 1, 0, 1, 2);
109
110   rootLayout->addWidget(topContainer);
111
112   QTabWidget *tabWidget = new QTabWidget(rootContainer);
113
114   graphSettingsList = new QList<GraphSettingsWidget*>();
115
116   QStringList graphIds; graphIds.append("Small"); graphIds.append("Big");
117   foreach(QString id, graphIds) {
118     GraphSettingsWidget *gsw = new GraphSettingsWidget(id, tabWidget);
119     graphSettingsList->append(gsw);
120     tabWidget->addTab(gsw, id+" graph");
121   }
122
123   rootLayout->addWidget(tabWidget);
124
125   setCentralWidget(rootContainer);
126 }
127
128 void SettingsWindow::closeEvent(QCloseEvent *event)
129 {
130   //Note: Weight unit not saved as it is saved on change.
131   Settings::setGoalWeightMin(goalMin->value());
132   Settings::setGoalWeightMax(goalMax->value());
133   Settings::setGrabZoomKeys(grabZoomKeys->isChecked());
134   foreach(GraphSettingsWidget *gsw, *graphSettingsList) {
135     GraphSettings gs;
136     gs.goalWeightEnabled = gsw->goalWeightEnabled;
137 #ifdef Q_WS_MAEMO_5
138     QMaemo5ListPickSelector *picker =
139         dynamic_cast<QMaemo5ListPickSelector*>(gsw->weightIntervalMode->pickSelector());
140     gs.weightIntervalMode = (GraphSettings::WeightIntervalMode)picker->currentIndex();
141 #else
142     gs.weightIntervalMode =
143         (GraphSettings::WeightIntervalMode)gsw->weightIntervalMode->currentIndex();
144 #endif
145     gs.weightIntervalMin = gsw->weightIntervalMin->value();
146     gs.weightIntervalMax = gsw->weightIntervalMax->value();
147 #ifdef Q_WS_MAEMO_5
148     QMaemo5ListPickSelector *picker2 =
149         dynamic_cast<QMaemo5ListPickSelector*>(gsw->defaultTimeInterval->pickSelector());
150     gs.defaultTimeInterval = indexToTimeInterval(picker2->currentIndex());
151 #else
152     gs.defaultTimeInterval
153         = indexToTimeInterval(gsw->defaultTimeInterval->currentIndex());
154 #endif
155     Settings::setGraphSettingsAndSync(gsw->graphId, gs);
156   }
157   QMainWindow::closeEvent(event);
158 }
159
160 GraphSettingsWidget::GraphSettingsWidget(QString graphId, QWidget *parent) :
161     QWidget(parent), graphId(graphId) {
162   QWidget *rootContainer = new QWidget(this);
163   QGridLayout *rootLayout = new QGridLayout(rootContainer);
164
165   QWidget *topSpacer = new QWidget(rootContainer);
166   topSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
167   rootLayout->addWidget(topSpacer, 0, 0);
168
169   GraphSettings gs = Settings::graphSettings(graphId);
170
171   goalWeightEnabled = new QPushButton("Show goal weight", rootContainer);
172   goalWeightEnabled->setCheckable(true);
173   goalWeightEnabled->setChecked(gs.goalWeightEnabled);
174   rootLayout->addWidget(goalWeightEnabled, 1, 0);
175
176   QStringListModel *timeIntervalModel =
177       new QStringListModel(timeIntervalStrings(), rootContainer);
178 #ifdef Q_WS_MAEMO_5
179   defaultTimeInterval= new QMaemo5ValueButton("Time interval", rootContainer);
180   defaultTimeInterval->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered);
181   QMaemo5ListPickSelector *timeIntervalSelector =
182       new QMaemo5ListPickSelector(rootContainer);
183   timeIntervalSelector->setModel(timeIntervalModel);
184   timeIntervalSelector->setCurrentIndex(timeIntervalToIndex(gs.defaultTimeInterval));
185   defaultTimeInterval->setPickSelector(timeIntervalSelector);
186 #else
187   defaultTimeInterval = new QComboBox(rootContainer);
188   defaultTimeInterval->setModel(timeIntervalModel);
189   defaultTimeInterval->setCurrentIndex(timeIntervalToIndex(gs.defaultTimeInterval));
190 #endif
191   rootLayout->addWidget(defaultTimeInterval, 2, 0);
192
193 //  QWidget *spacer = new QWidget(rootContainer);
194 //  spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
195 //  rootLayout->addWidget(spacer, 0, 1, 2, 1);
196
197   QFrame *weightFrame = new QFrame(rootContainer);
198   weightFrame->setFrameShadow(QFrame::Sunken);
199   weightFrame->setFrameStyle(QFrame::StyledPanel);
200   weightFrame->setLineWidth(2);
201   weightFrame->setMidLineWidth(2);
202   QGridLayout *weightLayout = new QGridLayout(weightFrame);
203
204   QStringList weightIntervalModes;
205   weightIntervalModes.append("Auto with goal weight");
206   weightIntervalModes.append("Auto without goal weight");
207   weightIntervalModes.append("Manual");
208   QStringListModel *weightIntervalModeModel =
209       new QStringListModel(weightIntervalModes, rootContainer);
210 #ifdef Q_WS_MAEMO_5
211   weightIntervalMode = new QMaemo5ValueButton("Weight interval mode", rootContainer);
212   weightIntervalMode->setValueLayout(QMaemo5ValueButton::ValueUnderTextCentered);
213   QMaemo5ListPickSelector *weightIntervalModeSelector =
214       new QMaemo5ListPickSelector(rootContainer);
215   weightIntervalModeSelector->setModel(weightIntervalModeModel);
216   weightIntervalModeSelector->setCurrentIndex((int)gs.weightIntervalMode);
217   weightIntervalMode->setPickSelector(weightIntervalModeSelector);
218   connect(weightIntervalMode->pickSelector(), SIGNAL(selected(QString)),
219           this, SLOT(weightIntervalModeChanged(QString)));
220 #else
221   weightIntervalMode = new QComboBox(rootContainer);
222   weightIntervalMode->setModel(weightIntervalModeModel);
223 #endif
224   weightLayout->addWidget(weightIntervalMode, 0, 0, 1, 3);
225
226
227   weightIntervalMin = new WeightSpinBox(rootContainer);
228   weightIntervalMin->setEnabled(gs.weightIntervalMode == GraphSettings::Manual);
229   weightIntervalMin->setValue(gs.weightIntervalMin);
230   weightLayout->addWidget(weightIntervalMin, 1, 0);
231
232   weightLayout->addWidget(new QLabel("-", rootContainer), 1, 1);
233
234   weightIntervalMax = new WeightSpinBox(rootContainer);
235   weightIntervalMax->setEnabled(gs.weightIntervalMode == GraphSettings::Manual);
236   weightIntervalMax->setValue(gs.weightIntervalMax);
237   weightLayout->addWidget(weightIntervalMax, 1, 2);
238
239   rootLayout->addWidget(weightFrame, 1, 1, 2, 1);
240
241   QWidget *bottomSpacer = new QWidget(rootContainer);
242   bottomSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
243   rootLayout->addWidget(bottomSpacer, 4, 0);
244
245 }
246 void GraphSettingsWidget::weightIntervalModeChanged(QString mode) {
247   bool isManual = mode == "Manual";
248   weightIntervalMin->setEnabled(isManual);
249   weightIntervalMax->setEnabled(isManual);
250 }
251