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 tableViewFront = new QTableView(centralWidget);
41 tableViewBack = new QTableView(centralWidget);
43 setCentralWidget(centralWidget);
45 loadScoreFile(scoreFile, scoreList);
46 loadClubFile(clubFile, clubList);
48 // Sort the scores based on dates
49 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
51 createTableView(scoreList, clubList);
52 //createTreeView(scoreList, parent);
55 createLayout(centralWidget);
61 void MainWindow::loadSettings(void)
63 bool external = false;
74 dataDir = mmcDir + dataDirName;
77 dataDir = topDir + dataDirName;
79 scoreFile = dataDir + scoreFileName;
80 clubFile = dataDir + clubFileName;
84 if (!dir.mkdir(dataDir)) {
85 // TODO: mkdir does not work...
86 qDebug() << "Unable to create: " + dataDir;
89 qDebug() << "Data is at: " + dataDir;
92 void MainWindow::createLayout(QWidget *parent)
94 buttonLayout = new QVBoxLayout;
95 //labelLayout->addStretch();
96 buttonLayout->addWidget(nextButton);
97 buttonLayout->addWidget(prevButton);
98 buttonLayout->addWidget(lastButton);
99 buttonLayout->addWidget(firstButton);
101 tableLayout = new QVBoxLayout;
102 tableLayout->addWidget(tableViewFront);
103 tableLayout->addWidget(tableViewBack);
105 QHBoxLayout *mainLayout = new QHBoxLayout(parent);
106 mainLayout->addLayout(tableLayout);
107 mainLayout->addLayout(buttonLayout);
108 setLayout(mainLayout);
111 // Setup 'score' tab view
112 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
114 nextButton = new QPushButton(tr(">"));
115 prevButton = new QPushButton(tr("<"));
116 firstButton = new QPushButton(tr("<<"));
117 lastButton = new QPushButton(tr(">>"));
119 connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
120 connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
121 connect(firstButton, SIGNAL(clicked()), this, SLOT(firstButtonClicked()));
122 connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
124 scoreTableModel = new ScoreTableModel();
125 scoreTableModel->setScore(scoreList);
126 scoreTableModel->setClub(clubList);
128 tableViewFront->showGrid();
129 tableViewBack->showGrid();
131 tableViewFront->setModel(scoreTableModel);
132 tableViewBack->setModel(scoreTableModel);
134 // Flag model items which one belongs to front and back nines
135 tableViewFront->setRootIndex(scoreTableModel->index(0, 0));
136 tableViewBack->setRootIndex(scoreTableModel->index(0, 1));
138 // Fill out all the space with the tables
139 tableViewFront->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
140 tableViewFront->verticalHeader()->setResizeMode(QHeaderView::Stretch);
141 tableViewBack->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
142 tableViewBack->verticalHeader()->setResizeMode(QHeaderView::Stretch);
145 // When selection down in 'stat' view, this is called.
146 void MainWindow::updateTreeView(const QModelIndex & index)
148 QString scope("Scope");
149 QString count("Rounds");
150 QString scoreAvg("Score (avg.)");
151 QString scoreBest("Score (best)");
152 QString score("Total");
153 QString scoreIn("Total in");
154 QString scoreOut("Total out");
156 QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
157 QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
159 qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
161 tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
162 tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
164 if (type == TreeItem::TypeDate) {
165 tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
166 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
167 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
169 else if (type == TreeItem::TypeScore) {
170 QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
171 tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
172 tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
174 value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
175 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
176 tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
178 value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
179 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
180 tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
184 void MainWindow::createStatusBar()
189 void MainWindow::createActions()
191 newScoreAct = new QAction(tr("&New Score"), this);
192 connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
194 newCourseAct = new QAction(tr("&New Course"), this);
195 connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
198 viewScoreAct = new QAction(tr("&View Scores"), this);
199 connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
201 viewCourseAct = new QAction(tr("&View Courses"), this);
202 connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
204 viewStatisticAct = new QAction(tr("&View Statistics"), this);
205 connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
209 void MainWindow::createMenus()
211 menu = menuBar()->addMenu(tr("fremantle"));
213 menu->addAction(viewScoreAct);
214 menu->addAction(viewCourseAct);
215 menu->addAction(viewStatisticAct);
217 menu->addAction(newScoreAct);
218 menu->addAction(newCourseAct);
221 void MainWindow::updateStatusBar()
223 setWindowTitle(scoreTableModel->getInfoText());
226 void MainWindow::firstButtonClicked()
228 scoreTableModel->first();
232 void MainWindow::lastButtonClicked()
234 scoreTableModel->last();
238 void MainWindow::nextButtonClicked()
240 scoreTableModel->next();
244 void MainWindow::prevButtonClicked()
246 scoreTableModel->prev();
250 // FIXME: dup code from table-model.cpp
251 Club *MainWindow::findClub(QString &name)
253 QListIterator<Club *> i(clubList);
256 while (i.hasNext()) {
258 if (c->getName() == name)
264 void MainWindow::newCourse()
266 CourseSelectDialog *selectDialog = new CourseSelectDialog(this);
268 int result = selectDialog->exec();
274 selectDialog->results(clubName, courseName);
276 CourseDialog *courseDialog = new CourseDialog(this);
278 QString title = "New Course : " + clubName + "," + courseName;
279 courseDialog->setWindowTitle(title);
281 int result = courseDialog->exec();
283 QVector<QString> par(18);
284 QVector<QString> hcp(18);
285 QVector<QString> len(18);
287 courseDialog->results(par, hcp, len);
290 Club *club = findClub(clubName);
292 course = club->getCourse(courseName);
294 qDebug() << "Error: club/course already in the database";
298 course = new Course(courseName, par, hcp);
299 club->addCourse(course);
303 club = new Club(clubName);
304 course = new Course(courseName, par, hcp);
305 club->addCourse(course);
308 saveClubFile(clubFile, clubList);
310 // TODO: does this really work? No mem leaks?
311 scoreTableModel->setClub(clubList);
317 void MainWindow::newScore()
319 SelectDialog *selectDialog = new SelectDialog(this);
321 selectDialog->init(clubList);
323 int result = selectDialog->exec();
329 selectDialog->results(clubName, courseName, date);
331 ScoreDialog *scoreDialog = new ScoreDialog(this);
332 QString title = "New Score : " + courseName + ", " + date;
333 scoreDialog->setWindowTitle(title);
335 Club *club = findClub(clubName);
337 qDebug() << "Error: no such club: " << clubName;
340 Course *course = club->getCourse(courseName);
342 qDebug() << "Error: no such course: " << courseName;
346 scoreDialog->init(course);
348 result = scoreDialog->exec();
351 QVector<QString> scores(18);
353 scoreDialog->results(scores);
354 Score *score = new Score(scores, clubName, courseName, date);
357 // Sort the scores based on dates
358 qSort(scoreList.begin(), scoreList.end(), dateLessThan);
360 saveScoreFile(scoreFile, scoreList);
362 // TODO: does this really work? No mem leaks?
363 scoreTableModel->setScore(scoreList, score);
369 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
371 ScoreXmlHandler handler(list);
373 if (handler.parse(fileName))
374 qDebug() << "File loaded: " << fileName << " entries : " << list.size();
377 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
379 ScoreXmlHandler handler(list);
381 if (handler.save(fileName))
383 qDebug() << "File saved : " << fileName << " entries : " << list.size();
385 qDebug() << "Unable to save : " << fileName;
388 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
390 ClubXmlHandler handler(list);
392 if (handler.parse(fileName))
393 qDebug() << "File loaded: " << fileName << " entries : " << list.size();
396 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
398 ClubXmlHandler handler(list);
400 if (handler.save(fileName))
402 qDebug() << "File saved : " << fileName << " entries : " << list.size();
404 qDebug() << "Unable to save : " << fileName;