5 #include <QStandardItemModel>
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"
14 QString appName("scorecard");
15 QString topDir("/opt");
16 QString mmcDir("/media/mmc1");
17 QString dataDirName("data");
19 QString imgDir(topDir + "/pixmaps");
20 QString scoreFileName("score.xml");
22 QString clubFileName("club.xml");
24 QString logFile("/tmp/scorecard.log");
26 bool dateLessThan(const Score *s1, const Score *s2)
31 MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
37 QWidget *centralWidget = new QWidget(this);
39 setCentralWidget(centralWidget);
41 loadScoreFile(scoreFile, scoreList);
42 loadClubFile(clubFile, clubList);
44 // Sort the scores based on dates
45 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
47 createTableView(scoreList, clubList);
48 //createTreeView(scoreList, parent);
51 createLayout(centralWidget);
57 void MainWindow::loadSettings(void)
59 bool external = false;
70 dataDir = mmcDir + "/" + appName + "/" + dataDirName;
73 dataDir = topDir + "/" + appName + "/" + dataDirName;
75 scoreFile = dataDir + "/" + scoreFileName;
76 clubFile = dataDir + "/" + clubFileName;
80 if (!dir.mkpath(dataDir)) {
81 qDebug() << "Unable to create: " + dataDir;
84 qDebug() << "Data is at: " + dataDir;
87 void MainWindow::createLayout(QWidget *parent)
89 buttonLayout = new QVBoxLayout;
90 //labelLayout->addStretch();
91 buttonLayout->addWidget(nextButton);
92 buttonLayout->addWidget(prevButton);
93 buttonLayout->addWidget(lastButton);
94 buttonLayout->addWidget(firstButton);
96 tableLayout = new QVBoxLayout;
97 tableLayout->addWidget(table);
99 QHBoxLayout *mainLayout = new QHBoxLayout(parent);
100 mainLayout->addLayout(tableLayout);
101 mainLayout->addLayout(buttonLayout);
102 setLayout(mainLayout);
105 // Setup 'score' tab view
106 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
108 table = new QTableView;
110 nextButton = new QPushButton(tr(">"));
111 prevButton = new QPushButton(tr("<"));
112 firstButton = new QPushButton(tr("<<"));
113 lastButton = new QPushButton(tr(">>"));
115 connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
116 connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
117 connect(firstButton, SIGNAL(clicked()), this, SLOT(firstButtonClicked()));
118 connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
120 scoreTableModel = new ScoreTableModel();
121 scoreTableModel->setScore(scoreList);
122 scoreTableModel->setClub(clubList);
126 table->setModel(scoreTableModel);
128 // Fill out all the space with the tables
129 table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
130 table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
131 table->horizontalHeader()->hide();
134 // When selection down in 'stat' view, this is called.
135 void MainWindow::updateTreeView(const QModelIndex & index)
137 QString scope("Scope");
138 QString count("Rounds");
139 QString scoreAvg("Score (avg.)");
140 QString scoreBest("Score (best)");
141 QString score("Total");
142 QString scoreIn("Total in");
143 QString scoreOut("Total out");
145 QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
146 QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
148 qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
150 tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
151 tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
153 if (type == TreeItem::TypeDate) {
154 tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
155 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
156 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
158 else if (type == TreeItem::TypeScore) {
159 QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
160 tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
161 tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
163 value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
164 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
165 tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
167 value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
168 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
169 tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
173 void MainWindow::createStatusBar()
178 void MainWindow::createActions()
180 newScoreAct = new QAction(tr("New Score"), this);
181 connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
183 newCourseAct = new QAction(tr("New Course"), this);
184 connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
186 editScoreAct = new QAction(tr("Edit Score"), this);
187 connect(editScoreAct, SIGNAL(triggered()), this, SLOT(editScore()));
189 editCourseAct = new QAction(tr("Edit Course"), this);
190 connect(editCourseAct, SIGNAL(triggered()), this, SLOT(editCourse()));
193 viewScoreAct = new QAction(tr("&View Scores"), this);
194 connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
196 viewCourseAct = new QAction(tr("&View Courses"), this);
197 connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
199 viewStatisticAct = new QAction(tr("&View Statistics"), this);
200 connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
204 void MainWindow::createMenus()
206 menu = menuBar()->addMenu(tr("fremantle"));
208 menu->addAction(viewScoreAct);
209 menu->addAction(viewCourseAct);
210 menu->addAction(viewStatisticAct);
212 menu->addAction(newScoreAct);
213 menu->addAction(newCourseAct);
214 menu->addAction(editScoreAct);
215 menu->addAction(editCourseAct);
218 void MainWindow::updateStatusBar()
220 setWindowTitle(scoreTableModel->getInfoText());
223 void MainWindow::firstButtonClicked()
225 scoreTableModel->first();
229 void MainWindow::lastButtonClicked()
231 scoreTableModel->last();
235 void MainWindow::nextButtonClicked()
237 scoreTableModel->next();
241 void MainWindow::prevButtonClicked()
243 scoreTableModel->prev();
247 // FIXME: dup code from table-model.cpp
248 Club *MainWindow::findClub(QString &name)
250 QListIterator<Club *> i(clubList);
253 while (i.hasNext()) {
255 if (c->getName() == name)
261 void MainWindow::newCourse()
263 CourseSelectDialog *selectDialog = new CourseSelectDialog(this);
265 int result = selectDialog->exec();
271 selectDialog->results(clubName, courseName);
273 CourseDialog *courseDialog = new CourseDialog(this);
274 courseDialog->init();
276 QString title = "New Course: " + clubName + "," + courseName;
277 courseDialog->setWindowTitle(title);
279 int result = courseDialog->exec();
281 QVector<QString> par(18);
282 QVector<QString> hcp(18);
283 QVector<QString> len(18);
285 courseDialog->results(par, hcp, len);
288 Club *club = findClub(clubName);
290 course = club->getCourse(courseName);
292 qDebug() << "Error: club/course already in the database";
296 course = new Course(courseName, par, hcp);
297 club->addCourse(course);
301 club = new Club(clubName);
302 course = new Course(courseName, par, hcp);
303 club->addCourse(course);
306 saveClubFile(clubFile, clubList);
308 // TODO: does this really work? No mem leaks?
309 scoreTableModel->setClub(clubList);
315 void MainWindow::editCourse()
317 Course *course = scoreTableModel->getCourse();
319 CourseDialog *courseDialog = new CourseDialog(this);
320 courseDialog->init(course);
322 QString title = "Edit Course: " + course->getName();
323 courseDialog->setWindowTitle(title);
325 int result = courseDialog->exec();
327 QVector<QString> par(18);
328 QVector<QString> hcp(18);
329 QVector<QString> len(18);
331 courseDialog->results(par, hcp, len);
333 course->update(par, hcp, len);
334 saveClubFile(clubFile, clubList);
338 void MainWindow::newScore()
340 SelectDialog *selectDialog = new SelectDialog(this);
342 selectDialog->init(clubList);
344 int result = selectDialog->exec();
350 selectDialog->results(clubName, courseName, date);
352 ScoreDialog *scoreDialog = new ScoreDialog(this);
353 QString title = "New Score: " + courseName + ", " + date;
354 scoreDialog->setWindowTitle(title);
356 Club *club = findClub(clubName);
358 qDebug() << "Error: no such club: " << clubName;
361 Course *course = club->getCourse(courseName);
363 qDebug() << "Error: no such course: " << courseName;
366 scoreDialog->init(course);
367 result = scoreDialog->exec();
369 QVector<QString> scores(18);
371 scoreDialog->results(scores);
372 Score *score = new Score(scores, clubName, courseName, date);
375 // Sort the scores based on dates
376 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
378 saveScoreFile(scoreFile, scoreList);
380 // TODO: does this really work? No mem leaks?
381 scoreTableModel->setScore(scoreList, score);
387 void MainWindow::editScore()
389 Course *course = scoreTableModel->getCourse();
390 Score *score = scoreTableModel->getScore();
391 QString date = score->getDate();
393 ScoreDialog *scoreDialog = new ScoreDialog(this);
395 QString title = "Edit Score: " + course->getName() + ", " + date;
396 scoreDialog->setWindowTitle(title);
398 scoreDialog->init(course, score);
400 int result = scoreDialog->exec();
403 QVector<QString> scores(18);
405 scoreDialog->results(scores);
407 score->update(scores);
409 // Sort the scores based on dates
410 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
412 saveScoreFile(scoreFile, scoreList);
414 // TODO: does this really work? No mem leaks?
415 scoreTableModel->setScore(scoreList, score);
420 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
422 ScoreXmlHandler handler(list);
424 if (handler.parse(fileName))
425 qDebug() << "File loaded: " << fileName << " entries: " << list.size();
428 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
430 ScoreXmlHandler handler(list);
432 if (handler.save(fileName))
434 qDebug() << "File saved: " << fileName << " entries: " << list.size();
436 qDebug() << "Unable to save: " << fileName;
439 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
441 ClubXmlHandler handler(list);
443 if (handler.parse(fileName))
444 qDebug() << "File loaded: " << fileName << " entries: " << list.size();
447 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
449 ClubXmlHandler handler(list);
451 if (handler.save(fileName))
453 qDebug() << "File saved: " << fileName << " entries: " << list.size();
455 qDebug() << "Unable to save: " << fileName;