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