Update screenshot of main view
[weightgraph] / weightgraph / editwindow.cpp
1 #include "editwindow.h"
2 #include <QHBoxLayout>
3 #include <QVBoxLayout>
4 #include <QMessageBox>
5 #include <QLabel>
6 #ifdef Q_WS_MAEMO_5
7 #include <QMaemo5DatePickSelector>
8 #endif
9 extern WeightDataModel *wdm;
10
11 EditWindow::EditWindow(QWidget *parent) :
12     QMainWindow(parent), shown(false)
13 {
14 #ifdef Q_WS_MAEMO_5
15   setAttribute(Qt::WA_Maemo5StackedWindow);
16 #endif
17
18   setWindowTitle("WeightGraph");
19
20   QWidget *centralContainer = new QWidget(parent);
21   QHBoxLayout *horiz = new QHBoxLayout(centralContainer);
22
23   weightView.setModel(wdm);
24   weightView.setMinimumWidth(540);
25   horiz->addWidget(&weightView);
26
27   QWidget *rightContainer = new QWidget(centralContainer);
28   QVBoxLayout *right = new QVBoxLayout(rightContainer);
29
30   addButton.setText("Add");
31   addButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
32   connect(&addButton, SIGNAL(clicked()), this, SLOT(addWeight()));
33   right->addWidget(&addButton);
34
35   removeButton.setText("Remove");
36   removeButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
37   connect(&removeButton, SIGNAL(clicked()), this, SLOT(removeSelected()));
38   right->addWidget(&removeButton);
39
40   editButton.setText("Edit");
41   editButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
42   connect(&editButton, SIGNAL(clicked()), this, SLOT(editSelected()));
43   right->addWidget(&editButton);
44
45   horiz->addWidget(rightContainer);
46
47   setCentralWidget(centralContainer);
48
49   connect(weightView.selectionModel(),
50           SIGNAL(selectionChanged(const QItemSelection &,const QItemSelection &)),
51           this, SLOT(updateButtons()));
52   updateButtons();
53 }
54
55 AddWeightDialog::AddWeightDialog(QWidget *parent)
56     : QDialog(parent)
57 {
58   setModal(true);
59   QGridLayout *layout = new QGridLayout(this);
60
61   QLabel *dateLabel = new QLabel("Date:", this);
62   layout->addWidget(dateLabel, 0, 0);
63
64 #ifdef Q_WS_MAEMO_5
65   date = new QMaemo5ValueButton(this);
66   QMaemo5DatePickSelector *picker = new QMaemo5DatePickSelector(this);
67   picker->setCurrentDate(QDate::currentDate());
68   date->setPickSelector(picker);
69 #else
70   date = new QDateEdit(this);
71   date->setDate(QDate::currentDate());
72   date->setDisplayFormat("yyyy-MM-dd");
73 #endif
74   layout->addWidget(date, 1, 0);
75
76   QLabel *weightLabel = new QLabel("Weight:", this);
77   layout->addWidget(weightLabel, 0, 1);
78
79   weight = new WeightSpinBox(this);
80   layout->addWidget(weight, 1, 1);
81
82   QPushButton *cancelButton = new QPushButton("Cancel", this);
83   connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
84   layout->addWidget(cancelButton, 2, 0);
85
86   QPushButton *addButton = new QPushButton("Add", this);
87   connect(addButton, SIGNAL(clicked()), this, SLOT(accept()));
88   layout->addWidget(addButton, 2, 1);
89 }
90 WeightDataModel::DateWeight AddWeightDialog::getDateWeight()
91 {
92   WeightDataModel::DateWeight ret;
93 #ifdef Q_WS_MAEMO_5
94   ret.date = dynamic_cast<QMaemo5DatePickSelector*>(date->pickSelector())->currentDate();
95 #else
96   ret.date = date->date();
97 #endif
98   ret.weight = weight->value();
99   return ret;
100 }
101
102 void EditWindow::updateButtons()
103 {
104   if (weightView.selectionModel()->selection().indexes().size() == 1) {
105     removeButton.setEnabled(true);
106     editButton.setEnabled(true);
107   }
108   else {
109     removeButton.setEnabled(false);
110     editButton.setEnabled(false);
111   }
112 }
113
114 extern WeightDataModel *wdm;
115 void EditWindow::addWeight()
116 {
117   AddWeightDialog d;
118   int code = d.exec();
119   if (code == QDialog::Accepted) {
120     WeightDataModel::DateWeight dw = d.getDateWeight();
121     if (wdm->dateExists(dw.date)) {
122       QMessageBox::warning(this, "Duplicate", "A weight for this date already exists.\n"
123                                               "Only one weight per date allowed.");
124       return;
125     }
126     wdm->setWeightForDate(dw);
127     weightView.scrollTo(wdm->indexOfDate(dw.date), QAbstractItemView::PositionAtCenter);
128   }
129 }
130
131 void EditWindow::removeSelected()
132 {
133   int answer =
134       QMessageBox::question(this, "Remove?", "Really remove selected entry?",
135                             QMessageBox::No, QMessageBox::Yes);
136   if (answer == QMessageBox::Yes) {
137     QModelIndexList indexes = weightView.selectionModel()->selection().indexes();
138     foreach(QModelIndex i, indexes)
139       wdm->removeRows(i.row(), 1);
140   }
141 }
142
143 void EditWindow::editSelected()
144 {
145   QModelIndexList indexes = weightView.selectionModel()->selection().indexes();
146   if (indexes.size() == 1)
147     weightView.edit(wdm->index(indexes.first().row(), 1));
148 }
149
150 void EditWindow::show()
151 {
152   QMainWindow::show();
153   // scrollToBottom must be here: it will not scroll all the way
154   // to the bottom when called in the constructor because it'll
155   // receive the wrong window geometry while hidden.
156   if (!shown) {
157     weightView.scrollToBottom();
158     shown = true;
159   }
160 }