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/scorecard");
16 QString mmcDir("/media/mmc1/scorecard");
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 // TODO: move to proper function
40 table = new QTableView(centralWidget);
42 setCentralWidget(centralWidget);
44 loadScoreFile(scoreFile, scoreList);
45 loadClubFile(clubFile, clubList);
47 // Sort the scores based on dates
48 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
50 createTableView(scoreList, clubList);
51 //createTreeView(scoreList, parent);
54 createLayout(centralWidget);
60 void MainWindow::loadSettings(void)
62 bool external = false;
73 dataDir = mmcDir + dataDirName;
76 dataDir = topDir + dataDirName;
78 scoreFile = dataDir + scoreFileName;
79 clubFile = dataDir + clubFileName;
83 if (!dir.mkdir(dataDir)) {
84 // TODO: mkdir does not work...
85 qDebug() << "Unable to create: " + dataDir;
88 qDebug() << "Data is at: " + dataDir;
91 void MainWindow::createLayout(QWidget *parent)
93 buttonLayout = new QVBoxLayout;
94 //labelLayout->addStretch();
95 buttonLayout->addWidget(nextButton);
96 buttonLayout->addWidget(prevButton);
97 buttonLayout->addWidget(lastButton);
98 buttonLayout->addWidget(firstButton);
100 tableLayout = new QVBoxLayout;
101 tableLayout->addWidget(table);
103 QHBoxLayout *mainLayout = new QHBoxLayout(parent);
104 mainLayout->addLayout(tableLayout);
105 mainLayout->addLayout(buttonLayout);
106 setLayout(mainLayout);
109 // Setup 'score' tab view
110 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
112 nextButton = new QPushButton(tr(">"));
113 prevButton = new QPushButton(tr("<"));
114 firstButton = new QPushButton(tr("<<"));
115 lastButton = new QPushButton(tr(">>"));
117 connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
118 connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
119 connect(firstButton, SIGNAL(clicked()), this, SLOT(firstButtonClicked()));
120 connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
122 scoreTableModel = new ScoreTableModel();
123 scoreTableModel->setScore(scoreList);
124 scoreTableModel->setClub(clubList);
128 table->setModel(scoreTableModel);
130 // Flag model items which one belongs to front and back nines
131 table->setRootIndex(scoreTableModel->index(0, 1));
133 // Fill out all the space with the tables
134 table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
135 table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
136 table->horizontalHeader()->hide();
139 // When selection down in 'stat' view, this is called.
140 void MainWindow::updateTreeView(const QModelIndex & index)
142 QString scope("Scope");
143 QString count("Rounds");
144 QString scoreAvg("Score (avg.)");
145 QString scoreBest("Score (best)");
146 QString score("Total");
147 QString scoreIn("Total in");
148 QString scoreOut("Total out");
150 QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
151 QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
153 qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
155 tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
156 tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
158 if (type == TreeItem::TypeDate) {
159 tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
160 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
161 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
163 else if (type == TreeItem::TypeScore) {
164 QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
165 tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
166 tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
168 value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
169 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
170 tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
172 value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
173 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
174 tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
178 void MainWindow::createStatusBar()
183 void MainWindow::createActions()
185 newScoreAct = new QAction(tr("&New Score"), this);
186 connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
188 newCourseAct = new QAction(tr("&New Course"), this);
189 connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
192 viewScoreAct = new QAction(tr("&View Scores"), this);
193 connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
195 viewCourseAct = new QAction(tr("&View Courses"), this);
196 connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
198 viewStatisticAct = new QAction(tr("&View Statistics"), this);
199 connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
203 void MainWindow::createMenus()
205 menu = menuBar()->addMenu(tr("fremantle"));
207 menu->addAction(viewScoreAct);
208 menu->addAction(viewCourseAct);
209 menu->addAction(viewStatisticAct);
211 menu->addAction(newScoreAct);
212 menu->addAction(newCourseAct);
215 void MainWindow::updateStatusBar()
217 setWindowTitle(scoreTableModel->getInfoText());
220 void MainWindow::firstButtonClicked()
222 scoreTableModel->first();
226 void MainWindow::lastButtonClicked()
228 scoreTableModel->last();
232 void MainWindow::nextButtonClicked()
234 scoreTableModel->next();
238 void MainWindow::prevButtonClicked()
240 scoreTableModel->prev();
244 // FIXME: dup code from table-model.cpp
245 Club *MainWindow::findClub(QString &name)
247 QListIterator<Club *> i(clubList);
250 while (i.hasNext()) {
252 if (c->getName() == name)
258 void MainWindow::newCourse()
260 CourseSelectDialog *selectDialog = new CourseSelectDialog(this);
262 int result = selectDialog->exec();
268 selectDialog->results(clubName, courseName);
270 CourseDialog *courseDialog = new CourseDialog(this);
272 QString title = "New Course : " + clubName + "," + courseName;
273 courseDialog->setWindowTitle(title);
275 int result = courseDialog->exec();
277 QVector<QString> par(18);
278 QVector<QString> hcp(18);
279 QVector<QString> len(18);
281 courseDialog->results(par, hcp, len);
284 Club *club = findClub(clubName);
286 course = club->getCourse(courseName);
288 qDebug() << "Error: club/course already in the database";
292 course = new Course(courseName, par, hcp);
293 club->addCourse(course);
297 club = new Club(clubName);
298 course = new Course(courseName, par, hcp);
299 club->addCourse(course);
302 saveClubFile(clubFile, clubList);
304 // TODO: does this really work? No mem leaks?
305 scoreTableModel->setClub(clubList);
311 void MainWindow::newScore()
313 SelectDialog *selectDialog = new SelectDialog(this);
315 selectDialog->init(clubList);
317 int result = selectDialog->exec();
323 selectDialog->results(clubName, courseName, date);
325 ScoreDialog *scoreDialog = new ScoreDialog(this);
326 QString title = "New Score : " + courseName + ", " + date;
327 scoreDialog->setWindowTitle(title);
329 Club *club = findClub(clubName);
331 qDebug() << "Error: no such club: " << clubName;
334 Course *course = club->getCourse(courseName);
336 qDebug() << "Error: no such course: " << courseName;
340 scoreDialog->init(course);
342 result = scoreDialog->exec();
345 QVector<QString> scores(18);
347 scoreDialog->results(scores);
348 Score *score = new Score(scores, clubName, courseName, date);
351 // Sort the scores based on dates
352 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
354 saveScoreFile(scoreFile, scoreList);
356 // TODO: does this really work? No mem leaks?
357 scoreTableModel->setScore(scoreList, score);
363 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
365 ScoreXmlHandler handler(list);
367 if (handler.parse(fileName))
368 qDebug() << "File loaded: " << fileName << " entries : " << list.size();
371 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
373 ScoreXmlHandler handler(list);
375 if (handler.save(fileName))
377 qDebug() << "File saved : " << fileName << " entries : " << list.size();
379 qDebug() << "Unable to save : " << fileName;
382 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
384 ClubXmlHandler handler(list);
386 if (handler.parse(fileName))
387 qDebug() << "File loaded: " << fileName << " entries : " << list.size();
390 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
392 ClubXmlHandler handler(list);
394 if (handler.save(fileName))
396 qDebug() << "File saved : " << fileName << " entries : " << list.size();
398 qDebug() << "Unable to save : " << fileName;