Maemo5 date picker button
[scorecard] / src / score-dialog.cpp
1 /*
2  * Copyright (C) 2009 Sakari Poussa
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, version 2.
7  */
8
9 #include <QtGui>
10 #include <QInputContext>
11
12 #include "score-dialog.h"
13 #include "score-common.h"
14
15 SelectDialog::SelectDialog(QWidget *parent) : QDialog(parent)
16 {
17   QWidget *centralWidget = new QWidget(this);
18   createLayout(centralWidget);
19
20   setWindowTitle(tr("ScoreCard: Select Course and Date"));
21 }
22
23 void SelectDialog::createLayout(QWidget *parent)
24 {
25   listClub = new QListWidget(parent);
26   pushButtonNext = new QPushButton(tr("Next"));
27
28   connect(pushButtonNext, SIGNAL(clicked()), this, SLOT(next()));
29
30   leftLayout = new QVBoxLayout;
31   leftLayout->addWidget(listClub);
32
33 #ifdef Q_WS_MAEMO_5
34   dateButton = new QMaemo5ValueButton();
35   dateButton->setValueLayout(QMaemo5ValueButton::ValueUnderText);
36   dateButton->setPickSelector(new QMaemo5DatePickSelector());
37   dateButton->setText(QString::fromUtf8("Date"));
38   leftLayout->addWidget(dateButton);
39 #else
40   QDate today(QDate::currentDate());
41   lineEditDate = new QLineEdit;
42   lineEditDate->setText(today.toString("yyyy-MM-dd"));
43   date = new QDateEdit;
44   leftLayout->addWidget(date);
45   leftLayout->addWidget(lineEditDate);
46 #endif
47
48   rightLayout = new QVBoxLayout;
49   rightLayout->addStretch();
50   rightLayout->addWidget(pushButtonNext);
51
52   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
53   mainLayout->addLayout(leftLayout);
54   mainLayout->addLayout(rightLayout);
55
56   setLayout(mainLayout);
57 }
58
59 void SelectDialog::init(QList<Club *> &list)
60 {
61   clubList = list;
62
63   QListIterator<Club *> i(clubList);
64   int index = 0;
65
66   while (i.hasNext()) {
67     Club *club = i.next();
68
69     QList<Course *> courseList = club->getCourseList();
70
71     QListIterator<Course *> j(courseList);
72     while (j.hasNext()) {
73       Course *course = j.next();
74
75       QListWidgetItem *newItem = new QListWidgetItem;
76
77       QString entry = club->getName() + "," + course->getName();
78
79       newItem->setText(entry);
80       listClub->insertItem(index, newItem);
81
82       index++;
83     }
84   }
85 }
86
87 void SelectDialog::results(QString &club, 
88                            QString &course, 
89                            QString &date)
90 {  
91   QListWidgetItem *current = listClub->currentItem();
92
93   if (current) {
94     QString tmp = current->text();
95
96     QStringList stringList = tmp.split(",");
97     club = stringList[0];
98     course = stringList[1];
99 #ifdef Q_WS_MAEMO_5
100     QMaemo5DatePickSelector *sel = (QMaemo5DatePickSelector *)dateButton->pickSelector();
101     QDate d = sel->currentDate();
102     // TODO: change to QDate
103     date = d.toString(Qt::ISODate);
104 #else
105     date = lineEditDate->text();
106 #endif
107   }
108 }
109
110 bool SelectDialog::validate(void)
111 {
112   return true;
113 }
114
115 void SelectDialog::next(void)
116 {
117   if (validate())
118     done(1);
119   else {
120     qDebug() << "SelectDialog: invalid data, cancel or correct";
121   }
122 }
123
124 void SelectDialog::reject(void)
125 {
126   done(0);
127 }
128
129 ////////////////////////////////////////////////////////////////////////////////
130 ////////////////////////////////////////////////////////////////////////////////
131 ////////////////////////////////////////////////////////////////////////////////
132
133 ScoreDialog::ScoreDialog(QWidget *parent) : QDialog(parent)
134 {
135   resize(800, 400);
136
137   QWidget *centralWidget = new QWidget(this);
138
139   createTable();
140   createButton();
141
142   createLayout(centralWidget);
143 }
144
145 void ScoreDialog::createLayout(QWidget *parent)
146 {
147   leftLayout = new QVBoxLayout;
148   leftLayout->addWidget(table);
149
150   rightLayout = new QVBoxLayout;
151   rightLayout->addWidget(pushButtonUp);
152   rightLayout->addWidget(pushButtonDown);
153   rightLayout->addWidget(pushButtonNext);
154   rightLayout->addStretch();
155   rightLayout->addWidget(pushButtonFinish);
156
157   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
158   mainLayout->addLayout(leftLayout);
159   mainLayout->addLayout(rightLayout);
160   setLayout(mainLayout);
161 }
162
163 void ScoreDialog::createTable(QWidget *parent)
164 {
165   table = new QTableWidget(ROWS, COLS, parent);
166
167   table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
168   table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
169   table->horizontalHeader()->hide();
170
171   table->setStyleSheet(ScoreColor::styleSheet());
172
173   QStringList headers;
174   headers << "" << "Par" << "HCP" << "Score" << "" << "Par" << "HCP" << "Score";
175   table->setVerticalHeaderLabels(headers);
176 }
177
178 void ScoreDialog::createButton(QWidget *parent)
179 {
180   pushButtonUp = new QPushButton(tr("+"));
181   connect(pushButtonUp, SIGNAL(clicked()), this, SLOT(up()));
182
183   pushButtonDown = new QPushButton(tr("-"));
184   connect(pushButtonDown, SIGNAL(clicked()), this, SLOT(down()));
185
186   pushButtonNext = new QPushButton(tr("Next"));
187   connect(pushButtonNext, SIGNAL(clicked()), this, SLOT(next()));
188
189   pushButtonFinish = new QPushButton(tr("Finish"));
190   connect(pushButtonFinish, SIGNAL(clicked()), this, SLOT(finish()));
191 }
192
193 void ScoreDialog::init(Course *course, Score *score)
194 {
195   QTableWidgetItem *par, *hcp, *scoreItem, *holeNum;
196
197   for (int i = 0; i < 18; i++) {
198     par = new QTableWidgetItem(course->getPar(i));
199     hcp = new QTableWidgetItem(course->getHcp(i));
200     if (score)
201       scoreItem = new QTableWidgetItem(score->getScore(i));
202     else
203       scoreItem = new QTableWidgetItem("");
204     holeNum = new QTableWidgetItem(QString::number(i+1));
205
206     holeNum->setBackgroundColor(ScoreColor::holeBg());
207
208     par->setTextAlignment(Qt::AlignCenter);
209     hcp->setTextAlignment(Qt::AlignCenter);
210     scoreItem->setTextAlignment(Qt::AlignCenter);
211     holeNum->setTextAlignment(Qt::AlignCenter);
212
213     if (i < 9) {
214       table->setItem(ROW_HOLE, i, holeNum);
215       table->setItem(ROW_PAR, i, par);
216       table->setItem(ROW_HCP, i, hcp);
217       table->setItem(ROW_SCORE, i, scoreItem);
218     }
219     else {
220       table->setItem(ROW_HOLE_2, i-9, holeNum);
221       table->setItem(ROW_PAR_2, i-9, par);
222       table->setItem(ROW_HCP_2, i-9, hcp);
223       table->setItem(ROW_SCORE_2, i-9, scoreItem);
224     }
225   }
226
227   // Set focus to 1st cell
228   table->setCurrentCell(ROW_SCORE, 0);
229   if (!score)
230     setDefaultScore(table);
231 }
232
233 // Set default score to par if not set
234 void ScoreDialog::setDefaultScore(QTableWidget *table)
235 {
236   int row = table->currentRow();
237   int col = table->currentColumn();
238   
239   if (row == ROW_SCORE)
240     row = ROW_PAR;
241   else if (row == ROW_SCORE_2)
242     row = ROW_PAR_2;
243   else {
244     qDebug() << "ERROR: unknown row in default score";
245     return;
246   }
247   QTableWidgetItem *par = table->item(row, col);
248   QTableWidgetItem *score = table->item(row + 2, col);
249
250   if (par && score && score->text() == "") {
251     QVariant value(par->text());
252     score->setData(Qt::DisplayRole, value);
253   }
254 }
255
256 void ScoreDialog::up(void)
257 {
258   QTableWidgetItem *item = table->currentItem();
259
260   if (!item) {
261     qWarning() << "ERROR: no current item";
262     return;
263   }
264
265   int i = (item->text()).toInt();
266   QVariant value(i+1);
267   item->setData(Qt::DisplayRole, value);
268 }
269
270 void ScoreDialog::down(void)
271 {
272   QTableWidgetItem *item = table->currentItem();
273
274   if (!item)
275     return;
276
277   int i = (item->text()).toInt();
278   QVariant value(i-1);
279   item->setData(Qt::DisplayRole, value);
280 }
281
282 void ScoreDialog::next(void)
283 {
284   if (table) {
285     QTableWidgetItem *item = table->currentItem();
286     moveToNextCell(item);
287     setDefaultScore(table);
288   }
289 }
290
291 void ScoreDialog::moveToNextCell(QTableWidgetItem *item)
292 {
293   if (!item)
294     return;
295
296   QTableWidget *table = item->tableWidget();
297
298   if (!table)
299     return;
300
301   int row = table->currentRow();
302   int col = table->currentColumn();
303
304   if (col < (COLS-1)) {
305     col++;
306   }
307   else if (col == (COLS-1)) {
308     col = 0;
309     row = (row == ROW_SCORE_2) ? ROW_SCORE : ROW_SCORE_2;
310   }
311   table->setCurrentCell(row, col);
312 }
313
314 void ScoreDialog::results(QVector<QString> &scores)
315 {
316   for (int i = 0; i < 9; i++) {
317     QTableWidgetItem *frontItem = table->item(ROW_SCORE, i);
318     QTableWidgetItem *backItem = table->item(ROW_SCORE_2, i);
319
320     if (frontItem)
321       scores[i] = frontItem->text();
322
323     if (backItem)
324       scores[i+9] = backItem->text();
325   }
326 }
327
328 bool ScoreDialog::validate(void)
329 {
330   for (int i=0; i<9; i++) {
331     QTableWidgetItem *frontItem = table->item(ROW_SCORE, i);
332     QTableWidgetItem *backItem = table->item(ROW_SCORE_2, i);
333     
334     if (!frontItem || !backItem)
335       return false;
336     
337     QString str1 = frontItem->text();
338     QString str2 = backItem->text();
339     
340     if (str1.isEmpty() || str2.isEmpty())
341       return false;
342   }
343   return true;
344 }
345
346 void ScoreDialog::finish(void)
347 {
348   if (validate())
349     done(1);
350   else {
351     qDebug() << "ScoreDialog: invalid data, cancel or correct";
352   }
353 }
354
355 void ScoreDialog::reject(void)
356 {
357   done(0);
358 }