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 topDir("/opt/scorecard");
15 QString mmcDir("/media/mmc1/scorecard");
16 QString dataDirName("/data/");
18 QString imgDir(topDir + "/pixmaps");
19 QString scoreFileName("score.xml");
21 QString clubFileName("club.xml");
23 QString logFile("/tmp/scorecard.log");
25 MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
31 QWidget *centralWidget = new QWidget(this);
33 // TODO: move to proper function
34 tableViewFront = new QTableView(centralWidget);
35 tableViewBack = new QTableView(centralWidget);
37 setCentralWidget(centralWidget);
39 loadScoreFile(scoreFile, scoreList);
40 loadClubFile(clubFile, clubList);
43 saveScoreFile(scoreFileWr, scoreList);
44 saveClubFile(clubFileWr, clubList);
47 createTableView(scoreList, clubList);
48 //createTreeView(scoreList, parent);
51 createLayout(centralWidget);
57 void MainWindow::loadSettings(void)
59 bool external = false;
70 dataDir = mmcDir + dataDirName;
73 dataDir = topDir + dataDirName;
75 scoreFile = dataDir + scoreFileName;
76 clubFile = dataDir + clubFileName;
80 if (!dir.mkdir(dataDir)) {
81 // TODO: mkdir does not work...
82 qDebug() << "Unable to create: " + dataDir;
85 qDebug() << "Data is at: " + dataDir;
88 void MainWindow::createLayout(QWidget *parent)
90 buttonLayout = new QVBoxLayout;
91 //labelLayout->addStretch();
92 buttonLayout->addWidget(nextButton);
93 buttonLayout->addWidget(prevButton);
94 buttonLayout->addWidget(lastButton);
95 buttonLayout->addWidget(firstButton);
97 tableLayout = new QVBoxLayout;
98 tableLayout->addWidget(tableViewFront);
99 tableLayout->addWidget(tableViewBack);
101 QHBoxLayout *mainLayout = new QHBoxLayout(parent);
102 mainLayout->addLayout(tableLayout);
103 mainLayout->addLayout(buttonLayout);
104 setLayout(mainLayout);
107 // Setup 'score' tab view
108 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
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);
124 tableViewFront->showGrid();
125 tableViewBack->showGrid();
127 tableViewFront->setModel(scoreTableModel);
128 tableViewBack->setModel(scoreTableModel);
130 // Flag model items which one belongs to front and back nines
131 tableViewFront->setRootIndex(scoreTableModel->index(0, 0));
132 tableViewBack->setRootIndex(scoreTableModel->index(0, 1));
134 // Fill out all the space with the tables
135 tableViewFront->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
136 tableViewFront->verticalHeader()->setResizeMode(QHeaderView::Stretch);
137 tableViewBack->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
138 tableViewBack->verticalHeader()->setResizeMode(QHeaderView::Stretch);
141 // When selection down in 'stat' view, this is called.
142 void MainWindow::updateTreeView(const QModelIndex & index)
144 QString scope("Scope");
145 QString count("Rounds");
146 QString scoreAvg("Score (avg.)");
147 QString scoreBest("Score (best)");
148 QString score("Total");
149 QString scoreIn("Total in");
150 QString scoreOut("Total out");
152 QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
153 QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
155 qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
157 tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
158 tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
160 if (type == TreeItem::TypeDate) {
161 tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
162 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
163 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
165 else if (type == TreeItem::TypeScore) {
166 QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
167 tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
168 tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
170 value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
171 tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
172 tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
174 value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
175 tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
176 tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
180 void MainWindow::createStatusBar()
185 void MainWindow::createActions()
187 newScoreAct = new QAction(tr("&New Score"), this);
188 connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
190 newCourseAct = new QAction(tr("&New Course"), this);
191 connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
194 viewScoreAct = new QAction(tr("&View Scores"), this);
195 connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
197 viewCourseAct = new QAction(tr("&View Courses"), this);
198 connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
200 viewStatisticAct = new QAction(tr("&View Statistics"), this);
201 connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
205 void MainWindow::createMenus()
207 menu = menuBar()->addMenu(tr("fremantle"));
209 menu->addAction(viewScoreAct);
210 menu->addAction(viewCourseAct);
211 menu->addAction(viewStatisticAct);
213 menu->addAction(newScoreAct);
214 menu->addAction(newCourseAct);
217 void MainWindow::updateStatusBar()
219 setWindowTitle(scoreTableModel->getInfoText());
222 void MainWindow::firstButtonClicked()
224 scoreTableModel->first();
228 void MainWindow::lastButtonClicked()
230 scoreTableModel->last();
234 void MainWindow::nextButtonClicked()
236 scoreTableModel->next();
240 void MainWindow::prevButtonClicked()
242 scoreTableModel->prev();
246 // FIXME: dup code from table-model.cpp
247 Club *MainWindow::findClub(QString &name)
249 QListIterator<Club *> i(clubList);
252 while (i.hasNext()) {
254 if (c->getName() == name)
260 void MainWindow::newCourse()
262 CourseSelectDialog *selectDialog = new CourseSelectDialog(this);
264 int result = selectDialog->exec();
270 selectDialog->results(clubName, courseName);
272 CourseDialog *courseDialog = new CourseDialog(this);
274 QString title = "New Course : " + clubName + "," + courseName;
275 courseDialog->setWindowTitle(title);
277 int result = courseDialog->exec();
279 QVector<QString> par(18);
280 QVector<QString> hcp(18);
281 QVector<QString> len(18);
283 courseDialog->results(par, hcp, len);
286 Club *club = findClub(clubName);
288 course = club->getCourse(courseName);
290 qDebug() << "Error: club/course already in the database";
294 course = new Course(courseName, par, hcp);
295 club->addCourse(course);
299 club = new Club(clubName);
300 course = new Course(courseName, par, hcp);
301 club->addCourse(course);
304 saveClubFile(clubFile, clubList);
306 // TODO: does this really work? No mem leaks?
307 scoreTableModel->setClub(clubList);
313 void MainWindow::newScore()
315 SelectDialog *selectDialog = new SelectDialog(this);
317 selectDialog->init(clubList);
319 int result = selectDialog->exec();
325 selectDialog->results(clubName, courseName, date);
327 ScoreDialog *scoreDialog = new ScoreDialog(this);
328 QString title = "New Score : " + courseName + ", " + date;
329 scoreDialog->setWindowTitle(title);
331 Club *club = findClub(clubName);
333 qDebug() << "Error: no such club: " << clubName;
336 Course *course = club->getCourse(courseName);
338 qDebug() << "Error: no such course: " << courseName;
342 scoreDialog->init(course);
344 result = scoreDialog->exec();
347 QVector<QString> scores(18);
349 scoreDialog->results(scores);
350 Score *score = new Score(scores, clubName, courseName, date);
353 saveScoreFile(scoreFile, scoreList);
355 // TODO: does this really work? No mem leaks?
356 scoreTableModel->setScore(scoreList);
362 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
364 ScoreXmlHandler handler(list);
366 if (handler.parse(fileName))
367 qDebug() << "File loaded: " + fileName +" entries : " + list.size();
370 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
372 ScoreXmlHandler handler(list);
374 if (handler.save(fileName))
376 qDebug() << "File saved : " << fileName << " entries : " << list.size();
378 qDebug() << "Unable to save : " << fileName;
381 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
383 ClubXmlHandler handler(list);
385 if (handler.parse(fileName))
386 qDebug() << "File loaded: " + fileName +" entries : " + list.size();
389 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
391 ClubXmlHandler handler(list);
393 if (handler.save(fileName))
395 qDebug() << "File saved : " << fileName << " entries : " << list.size();
397 qDebug() << "Unable to save : " << fileName;