GPLv2 license
[scorecard] / src / course-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 <QLayout>
11 #include <QLineEdit>
12 #include <QInputContext>
13 #include <QtGui/QTableWidget>
14
15 #include "course-dialog.h"
16 #include "cell-delegate.h"
17
18
19 CourseSelectDialog::CourseSelectDialog(QWidget *parent) : QDialog(parent)
20 {
21   QWidget *centralWidget = new QWidget(this);
22   createLayout(centralWidget);
23
24   setWindowTitle(tr("ScoreCard: New Club and Course"));
25 }
26
27 void CourseSelectDialog::createLayout(QWidget *parent)
28 {
29   labelClub = new QLabel(tr("Club"));
30   labelCourse = new QLabel(tr("Course"));
31   lineEditClub = new QLineEdit;
32   lineEditCourse = new QLineEdit;
33   pushButtonNext = new QPushButton(tr("Next"));
34
35   connect(pushButtonNext, SIGNAL(clicked()), this, SLOT(next()));
36
37   leftLayout = new QVBoxLayout;
38   leftLayout->addWidget(lineEditClub);
39   leftLayout->addWidget(lineEditCourse);
40
41   rightLayout = new QVBoxLayout;
42   rightLayout->addStretch();
43   rightLayout->addWidget(pushButtonNext);
44
45   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
46   mainLayout->addLayout(leftLayout);
47   mainLayout->addLayout(rightLayout);
48
49   setLayout(mainLayout);
50 }
51
52 void CourseSelectDialog::results(QString &club, 
53                                  QString &course)
54 {  
55   club = lineEditClub->text();
56   course = lineEditCourse->text();
57 }
58
59 bool CourseSelectDialog::validate(void)
60 {
61   QString str1 = lineEditClub->text();
62   QString str2 = lineEditCourse->text();
63
64   if (str1.isEmpty() || str2.isEmpty())
65     return false;
66   
67   return true;
68 }
69
70 void CourseSelectDialog::next(void)
71 {
72   if (validate())
73     done(1);
74   else {
75     qDebug() << "CourseDialog: invalid data, cancel or correct";
76   }
77 }
78
79 ////////////////////////////////////////////////////////////////////////////////
80 ////////////////////////////////////////////////////////////////////////////////
81 ////////////////////////////////////////////////////////////////////////////////
82
83 CourseDialog::CourseDialog(QWidget *parent) : QDialog(parent)
84 {
85   resize(800, 400);
86
87   QWidget *centralWidget = new QWidget(this);
88
89   createTable();
90   createButton();
91
92   createLayout(centralWidget);
93 }
94
95 void CourseDialog::createLayout(QWidget *parent)
96 {
97   leftLayout = new QVBoxLayout;
98   leftLayout->addWidget(table);
99
100   rightLayout = new QVBoxLayout;
101   rightLayout->addWidget(pushButtonUp);
102   rightLayout->addWidget(pushButtonDown);
103   rightLayout->addWidget(pushButtonNext);
104   rightLayout->addStretch();
105   rightLayout->addWidget(pushButtonFinish);
106
107   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
108   mainLayout->addLayout(leftLayout);
109   mainLayout->addLayout(rightLayout);
110   setLayout(mainLayout);
111 }
112
113 void CourseDialog::createButton(QWidget *parent)
114 {
115   pushButtonUp = new QPushButton(tr("+"));
116   connect(pushButtonUp, SIGNAL(clicked()), this, SLOT(up()));
117
118   pushButtonDown = new QPushButton(tr("-"));
119   connect(pushButtonDown, SIGNAL(clicked()), this, SLOT(down()));
120
121   pushButtonNext = new QPushButton(tr("Next"));
122   connect(pushButtonNext, SIGNAL(clicked()), this, SLOT(next()));
123
124   pushButtonFinish = new QPushButton(tr("Finish"));
125   connect(pushButtonFinish, SIGNAL(clicked()), this, SLOT(finish()));
126 }
127
128 void CourseDialog::createTable(QWidget *parent)
129 {
130   table = new QTableWidget(ROWS, COLS, parent);
131
132   QStringList headers;
133   headers << "" << "Par" << "HCP" << "Len" << "" << "Par" << "HCP" << "Len";
134   table->setVerticalHeaderLabels(headers);
135   table->horizontalHeader()->hide();
136   table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
137   table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
138 }
139
140 void CourseDialog::init(Course *course)
141 {
142   QTableWidgetItem *par, *hcp;
143   QColor fgColor(Qt::white);
144   QColor bgColor(Qt::darkGray);
145
146   for (int i=0; i<18; i++) {
147     if (course) {
148       par = new QTableWidgetItem(course->getPar(i));
149       hcp = new QTableWidgetItem(course->getHcp(i));
150     }
151     else {
152       par = new QTableWidgetItem("4");
153       hcp = new QTableWidgetItem("9");
154     }
155     QTableWidgetItem *len = new QTableWidgetItem("");
156
157     QTableWidgetItem *holeNum = new QTableWidgetItem(QString::number(i+1));
158     holeNum->setTextColor(fgColor);
159     holeNum->setBackgroundColor(bgColor);
160
161     holeNum->setTextAlignment(Qt::AlignCenter);
162     par->setTextAlignment(Qt::AlignCenter);
163     hcp->setTextAlignment(Qt::AlignCenter);
164     len->setTextAlignment(Qt::AlignCenter);
165     
166     if (i < 9) {
167       table->setItem(0, i, holeNum);
168       table->setItem(1, i, par);
169       table->setItem(2, i, hcp);
170       table->setItem(3, i, len);
171     }
172     else {
173       table->setItem(4, i-9, holeNum);
174       table->setItem(5, i-9, par);
175       table->setItem(6, i-9, hcp);
176       table->setItem(7, i-9, len);
177     }
178   }
179 }
180
181 void CourseDialog::up(void)
182 {
183   QTableWidgetItem *item = table->currentItem();
184
185   if (!item)
186     return;
187
188   int i = (item->text()).toInt();
189   QVariant value(i+1);
190   item->setData(Qt::DisplayRole, value);
191 }
192
193 void CourseDialog::down(void)
194 {
195   QTableWidgetItem *item = table->currentItem();
196
197   if (!item)
198     return;
199
200   int i = (item->text()).toInt();
201   QVariant value(i-1);
202   item->setData(Qt::DisplayRole, value);
203 }
204
205 void CourseDialog::next(void)
206 {
207   if (table) {
208     QTableWidgetItem *item = table->currentItem();
209     moveToNextCell(item);
210     //setDefaultScore(table);
211   }
212 }
213
214 void CourseDialog::moveToNextCell(QTableWidgetItem *item)
215 {
216   if (!item)
217     return;
218
219   QTableWidget *table = item->tableWidget();
220
221   if (!table)
222     return;
223
224   int row = table->currentRow();
225   int col = table->currentColumn();
226
227   if (col < (COLS-1)) {
228     col++;
229   }
230   else if (col == (COLS-1)) {
231     col = 0;
232     row = (row == ROW_PAR_2) ? ROW_PAR : ROW_PAR_2;
233   }
234   //qDebug() << "new cell: " << row << "/" << col;
235   table->setCurrentCell(row, col);
236 }
237
238 void CourseDialog::results(QVector<QString> &par,
239                           QVector<QString> &hcp,
240                           QVector<QString> &len)
241 {
242   for (int i = 0; i < 9; i++) {
243     QTableWidgetItem *frontPar = table->item(ROW_PAR, i);
244     QTableWidgetItem *backPar = table->item(ROW_PAR_2, i);
245     QTableWidgetItem *frontHcp = table->item(ROW_HCP, i);
246     QTableWidgetItem *backHcp = table->item(ROW_HCP_2, i);
247     QTableWidgetItem *frontLen = table->item(ROW_LEN, i);
248     QTableWidgetItem *backLen = table->item(ROW_LEN_2, i);
249
250     if (frontPar)
251       par[i] = frontPar->text();
252     if (backPar)
253       par[i+9] = backPar->text();
254     if (frontHcp)
255       hcp[i] = frontHcp->text();
256     if (backHcp)
257       hcp[i+9] = backHcp->text();
258     if (frontLen)
259       len[i] = frontLen->text();
260     if (backLen)
261       len[i+9] = backLen->text();
262   }
263 }
264
265 // Only par is mandatory
266 bool CourseDialog::validate(void)
267 {
268   for (int i = 0; i < 9; i++) {
269     QTableWidgetItem *frontItem = table->item(ROW_PAR, i);
270     QTableWidgetItem *backItem = table->item(ROW_PAR_2, i);
271     
272     if (!frontItem || !backItem)
273       return false;
274     
275     QString str1 = frontItem->text();
276     QString str2 = backItem->text();
277     
278     if (str1.isEmpty() || str2.isEmpty())
279       return false;
280   }
281   return true;
282 }
283
284 void CourseDialog::finish(void)
285 {
286   if (validate())
287     done(1);
288   else {
289     qDebug() << "CourseDialog: invalid data, cancel or correct";
290   }
291 }
292
293