d19bf8b6943dfed7d46e77738795253956df2095
[scorecard] / src / main-window.cpp
1 #include <QtGui>
2 #include <QDirModel>
3 #include <QTreeView>
4 #include <QListView>
5 #include <QStandardItemModel>
6
7 #include "main-window.h"
8 #include "score-dialog.h"
9 #include "course-dialog.h"
10 #include "tree-widget.h"
11 #include "xml-parser.h"
12 #include "xml-dom-parser.h"
13
14 QString scoreFile("data/score.xml");
15 QString scoreFileWr("data/score-save.xml");
16 QString clubFile("data/club.xml");
17 QString clubFileWr("data/club-save.xml");
18
19 MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
20 {
21   resize(800, 480);
22
23   QWidget *centralWidget = new QWidget(this);
24
25   // TODO: move to proper function
26   tableViewFront = new QTableView(centralWidget);
27   tableViewBack = new QTableView(centralWidget);
28
29   setCentralWidget(centralWidget);
30
31   loadScoreFile(scoreFile, scoreList);
32   loadClubFile(clubFile, clubList);
33
34 #ifdef TEST
35   saveScoreFile(scoreFileWr, scoreList);
36   saveClubFile(clubFileWr, clubList);
37 #endif
38
39   createTableView(scoreList, clubList);
40   //createTreeView(scoreList, parent);
41   createStatusBar();
42
43   createLayout(centralWidget);
44
45   createActions();
46   createMenus();
47 }
48
49 void MainWindow::createLayout(QWidget *parent)
50 {
51   buttonLayout = new QVBoxLayout;
52   //labelLayout->addStretch();
53   buttonLayout->addWidget(nextButton);
54   buttonLayout->addWidget(prevButton);
55   buttonLayout->addWidget(lastButton);
56   buttonLayout->addWidget(firstButton);
57
58   tableLayout = new QVBoxLayout;
59   tableLayout->addWidget(tableViewFront);
60   tableLayout->addWidget(tableViewBack);
61
62   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
63   mainLayout->addLayout(tableLayout);
64   mainLayout->addLayout(buttonLayout);
65   setLayout(mainLayout);
66 }
67
68 // Setup 'score' tab view
69 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
70 {
71   nextButton = new QPushButton(tr(">"));
72   prevButton = new QPushButton(tr("<"));
73   firstButton = new QPushButton(tr("<<"));
74   lastButton = new QPushButton(tr(">>"));
75
76   connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
77   connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
78   connect(firstButton, SIGNAL(clicked()), this, SLOT(firstButtonClicked()));
79   connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
80
81   scoreTableModel = new ScoreTableModel();
82   scoreTableModel->setScore(scoreList);
83   scoreTableModel->setClub(clubList);
84
85   tableViewFront->showGrid();
86   tableViewBack->showGrid();
87
88   tableViewFront->setModel(scoreTableModel);
89   tableViewBack->setModel(scoreTableModel);
90
91   // Flag model items which one belongs to front and back nines
92   tableViewFront->setRootIndex(scoreTableModel->index(0, 0));
93   tableViewBack->setRootIndex(scoreTableModel->index(0, 1));
94
95   // Fill out all the space with the tables
96   tableViewFront->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
97   tableViewFront->verticalHeader()->setResizeMode(QHeaderView::Stretch);
98   tableViewBack->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
99   tableViewBack->verticalHeader()->setResizeMode(QHeaderView::Stretch);
100 }
101
102 // When selection down in 'stat' view, this is called.
103 void MainWindow::updateTreeView(const QModelIndex & index)
104 {
105   QString scope("Scope");
106   QString count("Rounds");
107   QString scoreAvg("Score (avg.)");
108   QString scoreBest("Score (best)");
109   QString score("Total");
110   QString scoreIn("Total in");
111   QString scoreOut("Total out");
112
113   QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
114   QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
115
116   qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
117
118   tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
119   tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
120
121   if (type == TreeItem::TypeDate) {
122     tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
123     tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
124     tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
125   }    
126   else if (type == TreeItem::TypeScore) {
127     QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
128     tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
129     tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
130
131     value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
132     tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
133     tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
134
135     value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
136     tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
137     tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
138   }
139 }
140
141 void MainWindow::createStatusBar()
142 {
143   updateStatusBar();
144 }
145
146 void MainWindow::createActions()
147 {
148   newScoreAct = new QAction(tr("&New Score"), this);
149   connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
150
151   newCourseAct = new QAction(tr("&New Course"), this);
152   connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
153
154 #if 0
155   viewScoreAct = new QAction(tr("&View Scores"), this);
156   connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
157
158   viewCourseAct = new QAction(tr("&View Courses"), this);
159   connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
160
161   viewStatisticAct = new QAction(tr("&View Statistics"), this);
162   connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
163 #endif
164 }
165
166 void MainWindow::createMenus()
167 {
168   menu = menuBar()->addMenu(tr("fremantle"));
169 #if 0
170   menu->addAction(viewScoreAct);
171   menu->addAction(viewCourseAct);
172   menu->addAction(viewStatisticAct);
173 #endif
174   menu->addAction(newScoreAct);
175   menu->addAction(newCourseAct);
176 }
177
178 void MainWindow::updateStatusBar()
179 {
180   setWindowTitle(scoreTableModel->getInfoText());
181 }
182
183 void MainWindow::firstButtonClicked()
184 {
185   scoreTableModel->first();
186   updateStatusBar();
187 }
188
189 void MainWindow::lastButtonClicked()
190 {
191   scoreTableModel->last();
192   updateStatusBar();
193 }
194
195 void MainWindow::nextButtonClicked()
196 {
197   scoreTableModel->next();
198   updateStatusBar();
199 }
200
201 void MainWindow::prevButtonClicked()
202 {
203   scoreTableModel->prev();
204   updateStatusBar();
205 }
206
207 void MainWindow::newCourse()
208 {
209   CourseDialog *dlg = new CourseDialog(this);
210
211   int result = dlg->exec();
212 }
213
214 void MainWindow::newScore()
215 {
216   SelectDialog *selectDialog = new SelectDialog(this);
217
218   selectDialog->init(clubList);
219
220   int result = selectDialog->exec();
221   if (result) {
222     QString clubName;
223     QString courseName;
224     QString date;
225
226     selectDialog->results(clubName, courseName, date);
227     qDebug() << "club=" << clubName;
228     qDebug() << "course=" << courseName;
229     qDebug() << "date=" << date;
230
231     ScoreDialog *scoreDialog = new ScoreDialog(this);
232
233     // FIXME
234     Club *club = clubList[0];
235     Course *course = club->getCourse(courseName);
236
237     scoreDialog->init(course);
238
239     result = scoreDialog->exec();
240
241     if (result) {
242       QVector<QString> scores(18);
243
244       scoreDialog->results(scores);
245       for (int i=0; i<scores.size(); i++)
246         qDebug() << i << ": " << scores[i];
247
248       Score *score = new Score(scores, clubName, courseName, date);
249       scoreList << score;
250
251       saveScoreFile(scoreFile, scoreList);
252
253       // TODO: does this really work? No mem leaks?
254       scoreTableModel->setScore(scoreList);
255       lastButtonClicked();
256     }
257   }
258 }
259
260 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
261 {
262   ScoreXmlHandler handler(list);
263
264   if (handler.parse(fileName))
265     qDebug() << "Score loaded : " << fileName << 
266       " entries : " << list.size();
267 }
268
269 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
270 {
271   ScoreXmlHandler handler(list);
272
273   if (handler.save(fileName))
274     qDebug() << "Score saved : " << fileName << 
275       " entries : " << list.size();
276 }
277
278 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
279 {
280   ClubXmlHandler handler(list);
281
282   if (handler.parse(fileName))
283     qDebug() << "Club loaded: " << fileName << 
284       " entries : " << list.size();
285 }
286
287 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
288 {
289   ClubXmlHandler handler(list);
290
291   if (handler.save(fileName))
292     qDebug() << "Club saved : " << fileName << 
293       " entries : " << list.size();
294 }