Deleted extra files, removed unused .cpp files for build
[scorecard] / src / main-window.cpp
1 #include <QtGui>
2 #include <QDirModel>
3 #include <QListView>
4 #include <QStandardItemModel>
5
6 #include "main-window.h"
7 #include "score-dialog.h"
8 #include "course-dialog.h"
9 #include "xml-parser.h"
10 #include "xml-dom-parser.h"
11
12 QString appName("scorecard");
13 QString topDir("/opt");
14 QString mmcDir("/media/mmc1");
15 QString dataDirName("data");
16 QString dataDir;
17 QString imgDir(topDir + "/pixmaps");
18 QString scoreFileName("score.xml");
19 QString scoreFile;
20 QString clubFileName("club.xml");
21 QString clubFile;
22 QString logFile("/tmp/scorecard.log");
23
24 bool dateLessThan(const Score *s1, const Score *s2)
25 {
26   return (*s1) < (*s2);
27 }
28
29 MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
30 {
31   resize(800, 480);
32
33   loadSettings();
34
35   QWidget *centralWidget = new QWidget(this);
36
37   setCentralWidget(centralWidget);
38
39   loadScoreFile(scoreFile, scoreList);
40   loadClubFile(clubFile, clubList);
41
42   // Sort the scores based on dates
43   qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
44
45   createActions();
46   createMenus();
47
48   createTableView(scoreList, clubList);
49   createStatusBar();
50
51   createLayout(centralWidget);
52 }
53
54 void MainWindow::loadSettings(void)
55 {
56   bool external = false;
57
58   QDir mmc(mmcDir);
59   if (mmc.exists())
60     external = true;
61
62   // TODO: make via user option, automatic will never work
63   external = false;
64
65 #ifndef Q_WS_HILDON
66   dataDir = "./" + dataDirName;
67 #else
68   if (external) {
69     dataDir = mmcDir + "/" + appName + "/" + dataDirName;
70   }
71   else {
72     dataDir = topDir + "/" + appName + "/" + dataDirName;
73   }
74 #endif
75   scoreFile = dataDir + "/" + scoreFileName;
76   clubFile = dataDir + "/" + clubFileName;
77
78   QDir dir(dataDir);
79   if (!dir.exists())
80     if (!dir.mkpath(dataDir)) {
81       qWarning() << "Unable to create: " + dataDir;
82       return;
83     }
84   qDebug() << "Data is at:" + dataDir;
85 }
86
87 void MainWindow::createLayout(QWidget *parent)
88 {
89
90   buttonLayout = new QVBoxLayout;
91   //labelLayout->addStretch();
92   buttonLayout->addWidget(nextButton);
93   buttonLayout->addWidget(prevButton);
94   buttonLayout->addWidget(lastButton);
95   buttonLayout->addWidget(firstButton);
96
97   tableLayout = new QVBoxLayout;
98   tableLayout->addWidget(table);
99
100   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
101   mainLayout->addLayout(tableLayout);
102   mainLayout->addLayout(buttonLayout);
103   parent->setLayout(mainLayout);
104 }
105
106 // Setup 'score' tab view
107 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
108 {
109   table = new QTableView;
110
111   nextButton = new QPushButton(tr("Next"));
112   prevButton = new QPushButton(tr("Prev"));
113   firstButton = new QPushButton(tr("First"));
114   lastButton = new QPushButton(tr("Last"));
115
116   connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
117   connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
118   connect(firstButton, SIGNAL(clicked()), this, SLOT(firstButtonClicked()));
119   connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
120
121   scoreTableModel = new ScoreTableModel();
122
123   table->showGrid();
124
125   table->setModel(scoreTableModel);
126   QItemSelectionModel selectionModel();
127   table->setSelectionMode(QAbstractItemView::NoSelection);
128
129   scoreTableModel->setScore(scoreList);
130   scoreTableModel->setClub(clubList);
131
132   // Fill out all the space with the tables
133   table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
134   table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
135   table->verticalHeader()->setAutoFillBackground(true);
136   table->horizontalHeader()->hide();
137 }
138
139 void MainWindow::createStatusBar()
140 {
141 #if 0
142   // TODO: use toolbar or buttons. Toolbar seems not to be ready and
143   // requires more work.
144   toolbar = addToolBar(tr("foo"));
145   toolbar->addAction(firstAct);
146   toolbar->addAction(lastAct);
147   toolbar->addAction(prevAct);
148   toolbar->addAction(nextAct);
149 #endif
150   updateStatusBar();
151 }
152
153 void MainWindow::createActions()
154 {
155   newScoreAct = new QAction(tr("New Score"), this);
156   connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
157
158   newCourseAct = new QAction(tr("New Course"), this);
159   connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
160
161   editScoreAct = new QAction(tr("Edit Score"), this);
162   connect(editScoreAct, SIGNAL(triggered()), this, SLOT(editScore()));
163
164   editCourseAct = new QAction(tr("Edit Course"), this);
165   connect(editCourseAct, SIGNAL(triggered()), this, SLOT(editCourse()));
166
167 #if 0
168   viewScoreAct = new QAction(tr("&View Scores"), this);
169   connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
170
171   viewCourseAct = new QAction(tr("&View Courses"), this);
172   connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
173
174   viewStatisticAct = new QAction(tr("&View Statistics"), this);
175   connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
176 #endif
177
178   nextAct = new QAction(tr( "   Next   "), this);
179   connect(nextAct, SIGNAL(triggered()), this, SLOT(nextButtonClicked()));
180
181   prevAct = new QAction("   Prev   ", this);
182   connect(prevAct, SIGNAL(triggered()), this, SLOT(prevButtonClicked()));
183
184   firstAct = new QAction(tr("   First  "), this);
185   connect(firstAct, SIGNAL(triggered()), this, SLOT(firstButtonClicked()));
186
187   lastAct = new QAction(tr( "   Last   "), this);
188   connect(lastAct, SIGNAL(triggered()), this, SLOT(lastButtonClicked()));
189 }
190
191 void MainWindow::createMenus()
192 {
193   menu = menuBar()->addMenu("");
194 #if 0
195   menu->addAction(viewScoreAct);
196   menu->addAction(viewCourseAct);
197   menu->addAction(viewStatisticAct);
198 #endif
199   menu->addAction(newScoreAct);
200   menu->addAction(newCourseAct);
201   menu->addAction(editScoreAct);
202   menu->addAction(editCourseAct);
203 }
204
205 void MainWindow::updateStatusBar()
206 {
207   QString title = scoreTableModel->getInfoText();
208   if (title.isEmpty())
209     title = "ScoreCard - No Scores";
210
211   setWindowTitle(title);
212 }
213
214 void MainWindow::firstButtonClicked()
215 {
216   scoreTableModel->first();
217   updateStatusBar();
218 }
219
220 void MainWindow::lastButtonClicked()
221 {
222   scoreTableModel->last();
223   updateStatusBar();
224 }
225
226 void MainWindow::nextButtonClicked()
227 {
228   scoreTableModel->next();
229   updateStatusBar();
230 }
231
232 void MainWindow::prevButtonClicked()
233 {
234   scoreTableModel->prev();
235   updateStatusBar();
236 }
237
238 // FIXME: dup code from table-model.cpp
239 Club *MainWindow::findClub(QString &name)
240 {
241   QListIterator<Club *> i(clubList);
242   Club *c;
243
244   while (i.hasNext()) {
245     c = i.next();
246     if (c->getName() == name)
247       return c;
248   }
249   return 0;
250 }
251
252 void MainWindow::newCourse()
253 {
254   CourseSelectDialog *selectDialog = new CourseSelectDialog(this);
255
256   int result = selectDialog->exec();
257   if (result) {
258     QString clubName;
259     QString courseName;
260     QString date;
261
262     selectDialog->results(clubName, courseName);
263
264     CourseDialog *courseDialog = new CourseDialog(this);
265     courseDialog->init();
266
267     QString title = "New Course: " + clubName + "," + courseName;
268     courseDialog->setWindowTitle(title);
269
270     int result = courseDialog->exec();
271     if (result) {
272       QVector<QString> par(18);
273       QVector<QString> hcp(18);
274       QVector<QString> len(18);
275
276       courseDialog->results(par, hcp, len);
277
278       Course *course = 0;
279       Club *club = findClub(clubName);
280       if (club) {
281         course = club->getCourse(courseName);
282         if (course) {
283           qDebug() << "Error: club/course already in the database";
284           return;
285         }
286         else {
287           course = new Course(courseName, par, hcp);
288           club->addCourse(course);
289         }
290       }
291       else {
292         // New club and course
293         club = new Club(clubName);
294         course = new Course(courseName, par, hcp);
295         club->addCourse(course);
296         clubList << club;
297       }
298       saveClubFile(clubFile, clubList);
299
300       // TODO: does this really work? No mem leaks?
301       scoreTableModel->setClub(clubList);
302     }
303   }
304 }
305
306 void MainWindow::editCourse()
307 {
308   Course *course = scoreTableModel->getCourse();
309
310   if (!course) {
311     qWarning() << "No course on edit";
312     return;
313   }
314
315   CourseDialog *courseDialog = new CourseDialog(this);
316   courseDialog->init(course);
317
318   QString title = "Edit Course: " + course->getName();
319   courseDialog->setWindowTitle(title);
320   
321   int result = courseDialog->exec();
322   if (result) {
323     QVector<QString> par(18);
324     QVector<QString> hcp(18);
325     QVector<QString> len(18);
326     
327     courseDialog->results(par, hcp, len);
328     
329     course->update(par, hcp, len);
330     saveClubFile(clubFile, clubList);
331   }
332 }
333
334 void MainWindow::newScore()
335 {
336   SelectDialog *selectDialog = new SelectDialog(this);
337
338   selectDialog->init(clubList);
339
340   int result = selectDialog->exec();
341   if (result) {
342     QString clubName;
343     QString courseName;
344     QString date;
345
346     selectDialog->results(clubName, courseName, date);
347
348     ScoreDialog *scoreDialog = new ScoreDialog(this);
349     QString title = "New Score: " + courseName + ", " + date;
350     scoreDialog->setWindowTitle(title);
351
352     Club *club = findClub(clubName);
353     if (!club) {
354       qWarning() << "Error: no such club:" << clubName;
355       return;
356     }
357     Course *course = club->getCourse(courseName);
358     if (!course) {
359       qWarning() << "Error: no such course:" << courseName;
360       return;
361     }
362     scoreDialog->init(course);
363     result = scoreDialog->exec();
364     if (result) {
365       QVector<QString> scores(18);
366
367       scoreDialog->results(scores);
368       Score *score = new Score(scores, clubName, courseName, date);
369       scoreList << score;
370
371       // Sort the scores based on dates
372       qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
373       // Save it
374       saveScoreFile(scoreFile, scoreList);
375
376       // TODO: does this really work? No mem leaks?
377       scoreTableModel->setScore(scoreList, score);
378       updateStatusBar();
379     }
380   }
381 }
382
383 void MainWindow::editScore()
384 {
385   Course *course = scoreTableModel->getCourse();
386   Score *score = scoreTableModel->getScore();
387   QString date = score->getDate();
388
389   ScoreDialog *scoreDialog = new ScoreDialog(this);
390   
391   QString title = "Edit Score: " + course->getName() + ", " + date;
392   scoreDialog->setWindowTitle(title);
393
394   scoreDialog->init(course, score);
395
396   int result = scoreDialog->exec();
397
398   if (result) {
399     QVector<QString> scores(18);
400
401     scoreDialog->results(scores);
402     
403     score->update(scores);
404
405     // Sort the scores based on dates
406     qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
407     // Save it
408     saveScoreFile(scoreFile, scoreList);
409
410     // TODO: does this really work? No mem leaks?
411     scoreTableModel->setScore(scoreList, score);
412     updateStatusBar();
413   }
414 }
415
416 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
417 {
418   ScoreXmlHandler handler(list);
419
420   if (handler.parse(fileName))
421     qDebug() << "File loaded:" << fileName << " entries:" << list.size();
422 }
423
424 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
425 {
426   ScoreXmlHandler handler(list);
427
428   if (handler.save(fileName))
429     // TODO: banner
430     qDebug() << "File saved:" << fileName << " entries:" << list.size();
431   else
432     qWarning() << "Unable to save:" << fileName;
433 }
434
435 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
436 {
437   ClubXmlHandler handler(list);
438
439   if (handler.parse(fileName))
440     qDebug() << "File loaded:" << fileName << " entries:" << list.size();
441 }
442
443 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
444 {
445   ClubXmlHandler handler(list);
446
447   if (handler.save(fileName))
448     // TODO: banner
449     qDebug() << "File saved:" << fileName << " entries:" << list.size();
450   else
451     qWarning() << "Unable to save:" << fileName;
452
453 }