And some more colors. Seems to be hard to change HeaderView background
[scorecard] / src / main-window.cpp
index a1e3488..2296b9e 100644 (file)
@@ -1,53 +1,96 @@
+/*
+ * Copyright (C) 2009 Sakari Poussa
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ */
+
 #include <QtGui>
-#include <QDirModel>
-#include <QTreeView>
-#include <QListView>
-#include <QStandardItemModel>
 
 #include "main-window.h"
 #include "score-dialog.h"
 #include "course-dialog.h"
-#include "tree-widget.h"
-#include "xml-parser.h"
+#include "stat-model.h"
 #include "xml-dom-parser.h"
 
-QString scoreFile("data/score.xml");
-QString scoreFileWr("data/score-save.xml");
-QString clubFile("data/club.xml");
-QString clubFileWr("data/club-save.xml");
+QString appName("scorecard");
+QString topDir("/opt");
+QString mmcDir("/media/mmc1");
+QString dataDirName("data");
+QString dataDir;
+QString imgDir(topDir + "/pixmaps");
+QString scoreFileName("score.xml");
+QString scoreFile;
+QString clubFileName("club.xml");
+QString clubFile;
+QString logFile("/tmp/scorecard.log");
+
+bool dateLessThan(const Score *s1, const Score *s2)
+{
+  return (*s1) < (*s2);
+}
 
-MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
+MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
 {
   resize(800, 480);
 
-  QWidget *centralWidget = new QWidget(this);
+  loadSettings();
 
-  // TODO: move to proper function
-  tableViewFront = new QTableView(centralWidget);
-  tableViewBack = new QTableView(centralWidget);
+  centralWidget = new QWidget(this);
 
   setCentralWidget(centralWidget);
 
   loadScoreFile(scoreFile, scoreList);
   loadClubFile(clubFile, clubList);
 
-#ifdef TEST
-  saveScoreFile(scoreFileWr, scoreList);
-  saveClubFile(clubFileWr, clubList);
-#endif
+  // Sort the scores based on dates
+  qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
+  createActions();
+  createMenus();
 
   createTableView(scoreList, clubList);
-  //createTreeView(scoreList, parent);
-  createStatusBar();
+  updateTitleBar();
 
   createLayout(centralWidget);
+}
 
-  createActions();
-  createMenus();
+void MainWindow::loadSettings(void)
+{
+  bool external = false;
+
+  QDir mmc(mmcDir);
+  if (mmc.exists())
+    external = true;
+
+  // TODO: make via user option, automatic will never work
+  external = false;
+
+#ifndef Q_WS_HILDON
+  dataDir = "./" + dataDirName;
+#else
+  if (external) {
+    dataDir = mmcDir + "/" + appName + "/" + dataDirName;
+  }
+  else {
+    dataDir = topDir + "/" + appName + "/" + dataDirName;
+  }
+#endif
+  scoreFile = dataDir + "/" + scoreFileName;
+  clubFile = dataDir + "/" + clubFileName;
+
+  QDir dir(dataDir);
+  if (!dir.exists())
+    if (!dir.mkpath(dataDir)) {
+      qWarning() << "Unable to create: " + dataDir;
+      return;
+    }
+  qDebug() << "Data is at:" + dataDir;
 }
 
 void MainWindow::createLayout(QWidget *parent)
 {
+
   buttonLayout = new QVBoxLayout;
   //labelLayout->addStretch();
   buttonLayout->addWidget(nextButton);
@@ -56,22 +99,23 @@ void MainWindow::createLayout(QWidget *parent)
   buttonLayout->addWidget(firstButton);
 
   tableLayout = new QVBoxLayout;
-  tableLayout->addWidget(tableViewFront);
-  tableLayout->addWidget(tableViewBack);
+  tableLayout->addWidget(table);
 
   QHBoxLayout *mainLayout = new QHBoxLayout(parent);
   mainLayout->addLayout(tableLayout);
   mainLayout->addLayout(buttonLayout);
-  setLayout(mainLayout);
+  parent->setLayout(mainLayout);
 }
 
 // Setup 'score' tab view
 void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &clubList)
 {
-  nextButton = new QPushButton(tr(">"));
-  prevButton = new QPushButton(tr("<"));
-  firstButton = new QPushButton(tr("<<"));
-  lastButton = new QPushButton(tr(">>"));
+  table = new QTableView;
+
+  nextButton = new QPushButton(tr("Next"));
+  prevButton = new QPushButton(tr("Prev"));
+  firstButton = new QPushButton(tr("First"));
+  lastButton = new QPushButton(tr("Last"));
 
   connect(nextButton, SIGNAL(clicked()), this, SLOT(nextButtonClicked()));
   connect(prevButton, SIGNAL(clicked()), this, SLOT(prevButtonClicked()));
@@ -79,129 +123,98 @@ void MainWindow::createTableView(QList<Score *> &scoreList, QList <Club *> &club
   connect(lastButton, SIGNAL(clicked()), this, SLOT(lastButtonClicked()));
 
   scoreTableModel = new ScoreTableModel();
-  scoreTableModel->setScore(scoreList);
-  scoreTableModel->setClub(clubList);
 
-  tableViewFront->showGrid();
-  tableViewBack->showGrid();
+  table->showGrid();
 
-  tableViewFront->setModel(scoreTableModel);
-  tableViewBack->setModel(scoreTableModel);
+  table->setModel(scoreTableModel);
+  table->setSelectionMode(QAbstractItemView::NoSelection);
 
-  // Flag model items which one belongs to front and back nines
-  tableViewFront->setRootIndex(scoreTableModel->index(0, 0));
-  tableViewBack->setRootIndex(scoreTableModel->index(0, 1));
+  scoreTableModel->setScore(scoreList);
+  scoreTableModel->setClub(clubList);
 
   // Fill out all the space with the tables
-  tableViewFront->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
-  tableViewFront->verticalHeader()->setResizeMode(QHeaderView::Stretch);
-  tableViewBack->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
-  tableViewBack->verticalHeader()->setResizeMode(QHeaderView::Stretch);
-}
-
-// When selection down in 'stat' view, this is called.
-void MainWindow::updateTreeView(const QModelIndex & index)
-{
-  QString scope("Scope");
-  QString count("Rounds");
-  QString scoreAvg("Score (avg.)");
-  QString scoreBest("Score (best)");
-  QString score("Total");
-  QString scoreIn("Total in");
-  QString scoreOut("Total out");
-
-  QVariant str = scoreTreeModel->data(index, Qt::DisplayRole);
-  QVariant type = scoreTreeModel->data(index, ScoreTreeModel::Type);
-
-  qDebug() << "update(" << index.row() << "/" << index.column() << "):" << str << type;
-
-  tableModel->setData(tableModel->index(0, 0, QModelIndex()), scope);
-  tableModel->setData(tableModel->index(0, 1, QModelIndex()), str);
-
-  if (type == TreeItem::TypeDate) {
-    tableModel->setData(tableModel->index(1, 0, QModelIndex()), count);
-    tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreAvg);
-    tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreBest);
-  }    
-  else if (type == TreeItem::TypeScore) {
-    QVariant value = scoreTreeModel->data(index, ScoreTreeModel::Total);
-    tableModel->setData(tableModel->index(1, 0, QModelIndex()), score);
-    tableModel->setData(tableModel->index(1, 1, QModelIndex()), value);
-
-    value = scoreTreeModel->data(index, ScoreTreeModel::TotalOut);
-    tableModel->setData(tableModel->index(2, 0, QModelIndex()), scoreOut);
-    tableModel->setData(tableModel->index(2, 1, QModelIndex()), value);
-
-    value = scoreTreeModel->data(index, ScoreTreeModel::TotalIn);
-    tableModel->setData(tableModel->index(3, 0, QModelIndex()), scoreIn);
-    tableModel->setData(tableModel->index(3, 1, QModelIndex()), value);
-  }
-}
-
-void MainWindow::createStatusBar()
-{
-  updateStatusBar();
+  table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
+  table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
+  table->horizontalHeader()->hide();
+  table->verticalHeader()->setStyleSheet("background-color: yellow; color : gray }");
 }
 
 void MainWindow::createActions()
 {
-  newScoreAct = new QAction(tr("&New Score"), this);
+  newScoreAct = new QAction(tr("New Score"), this);
   connect(newScoreAct, SIGNAL(triggered()), this, SLOT(newScore()));
 
-  newCourseAct = new QAction(tr("&New Course"), this);
+  newCourseAct = new QAction(tr("New Course"), this);
   connect(newCourseAct, SIGNAL(triggered()), this, SLOT(newCourse()));
 
-#if 0
-  viewScoreAct = new QAction(tr("&View Scores"), this);
-  connect(viewScoreAct, SIGNAL(triggered()), this, SLOT(viewScore()));
+  editScoreAct = new QAction(tr("Edit Score"), this);
+  connect(editScoreAct, SIGNAL(triggered()), this, SLOT(editScore()));
 
-  viewCourseAct = new QAction(tr("&View Courses"), this);
-  connect(viewCourseAct, SIGNAL(triggered()), this, SLOT(viewCourse()));
+  editCourseAct = new QAction(tr("Edit Course"), this);
+  connect(editCourseAct, SIGNAL(triggered()), this, SLOT(editCourse()));
 
-  viewStatisticAct = new QAction(tr("&View Statistics"), this);
-  connect(viewStatisticAct, SIGNAL(triggered()), this, SLOT(viewStatistic()));
-#endif
+  statAct = new QAction(tr("Statistics"), this);
+  connect(statAct, SIGNAL(triggered()), this, SLOT(viewStatistics()));
+
+  nextAct = new QAction(tr( "   Next   "), this);
+  connect(nextAct, SIGNAL(triggered()), this, SLOT(nextButtonClicked()));
+
+  prevAct = new QAction("   Prev   ", this);
+  connect(prevAct, SIGNAL(triggered()), this, SLOT(prevButtonClicked()));
+
+  firstAct = new QAction(tr("   First  "), this);
+  connect(firstAct, SIGNAL(triggered()), this, SLOT(firstButtonClicked()));
+
+  lastAct = new QAction(tr( "   Last   "), this);
+  connect(lastAct, SIGNAL(triggered()), this, SLOT(lastButtonClicked()));
 }
 
 void MainWindow::createMenus()
 {
-  menu = menuBar()->addMenu(tr("fremantle"));
-#if 0
-  menu->addAction(viewScoreAct);
-  menu->addAction(viewCourseAct);
-  menu->addAction(viewStatisticAct);
+#ifdef Q_WS_HILDON
+  menu = menuBar()->addMenu("");
+#else
+  menu = menuBar()->addMenu("Menu");
 #endif
+
   menu->addAction(newScoreAct);
   menu->addAction(newCourseAct);
+  menu->addAction(editScoreAct);
+  menu->addAction(editCourseAct);
+  menu->addAction(statAct);
 }
 
-void MainWindow::updateStatusBar()
+void MainWindow::updateTitleBar()
 {
-  setWindowTitle(scoreTableModel->getInfoText());
+  QString title = scoreTableModel->getInfoText();
+  if (title.isEmpty())
+    title = "ScoreCard - No Scores";
+
+  setWindowTitle(title);
 }
 
 void MainWindow::firstButtonClicked()
 {
   scoreTableModel->first();
-  updateStatusBar();
+  updateTitleBar();
 }
 
 void MainWindow::lastButtonClicked()
 {
   scoreTableModel->last();
-  updateStatusBar();
+  updateTitleBar();
 }
 
 void MainWindow::nextButtonClicked()
 {
   scoreTableModel->next();
-  updateStatusBar();
+  updateTitleBar();
 }
 
 void MainWindow::prevButtonClicked()
 {
   scoreTableModel->prev();
-  updateStatusBar();
+  updateTitleBar();
 }
 
 // FIXME: dup code from table-model.cpp
@@ -231,8 +244,9 @@ void MainWindow::newCourse()
     selectDialog->results(clubName, courseName);
 
     CourseDialog *courseDialog = new CourseDialog(this);
+    courseDialog->init();
 
-    QString title = "New Course : " + clubName + "," + courseName;
+    QString title = "New Course: " + clubName + "," + courseName;
     courseDialog->setWindowTitle(title);
 
     int result = courseDialog->exec();
@@ -257,6 +271,7 @@ void MainWindow::newCourse()
        }
       }
       else {
+       // New club and course
        club = new Club(clubName);
        course = new Course(courseName, par, hcp);
        club->addCourse(course);
@@ -266,11 +281,38 @@ void MainWindow::newCourse()
 
       // TODO: does this really work? No mem leaks?
       scoreTableModel->setClub(clubList);
-
     }
   }
 }
 
+void MainWindow::editCourse()
+{
+  Course *course = scoreTableModel->getCourse();
+
+  if (!course) {
+    qWarning() << "No course on edit";
+    return;
+  }
+
+  CourseDialog *courseDialog = new CourseDialog(this);
+  courseDialog->init(course);
+
+  QString title = "Edit Course: " + course->getName();
+  courseDialog->setWindowTitle(title);
+  
+  int result = courseDialog->exec();
+  if (result) {
+    QVector<QString> par(18);
+    QVector<QString> hcp(18);
+    QVector<QString> len(18);
+    
+    courseDialog->results(par, hcp, len);
+    
+    course->update(par, hcp, len);
+    saveClubFile(clubFile, clubList);
+  }
+}
+
 void MainWindow::newScore()
 {
   SelectDialog *selectDialog = new SelectDialog(this);
@@ -286,24 +328,21 @@ void MainWindow::newScore()
     selectDialog->results(clubName, courseName, date);
 
     ScoreDialog *scoreDialog = new ScoreDialog(this);
-    QString title = "New Score : " + courseName + ", " + date;
+    QString title = "New Score: " + courseName + ", " + date;
     scoreDialog->setWindowTitle(title);
 
     Club *club = findClub(clubName);
     if (!club) {
-      qDebug() << "Error: no such club: " << clubName;
+      qWarning() << "Error: no such club:" << clubName;
       return;
     }
     Course *course = club->getCourse(courseName);
     if (!course) {
-      qDebug() << "Error: no such course: " << courseName;
+      qWarning() << "Error: no such course:" << courseName;
       return;
     }
-
     scoreDialog->init(course);
-
     result = scoreDialog->exec();
-
     if (result) {
       QVector<QString> scores(18);
 
@@ -311,22 +350,104 @@ void MainWindow::newScore()
       Score *score = new Score(scores, clubName, courseName, date);
       scoreList << score;
 
+      // Sort the scores based on dates
+      qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
+      // Save it
       saveScoreFile(scoreFile, scoreList);
 
       // TODO: does this really work? No mem leaks?
-      scoreTableModel->setScore(scoreList);
-      lastButtonClicked();
+      scoreTableModel->setScore(scoreList, score);
+      updateTitleBar();
     }
   }
 }
 
+void MainWindow::editScore()
+{
+  Course *course = scoreTableModel->getCourse();
+  Score *score = scoreTableModel->getScore();
+
+  if (!course || !score) {
+    qDebug() << "No score/course to edit";
+    return;
+  }
+
+  QString date = score->getDate();
+
+  ScoreDialog *scoreDialog = new ScoreDialog(this);
+  
+  QString title = "Edit Score: " + course->getName() + ", " + date;
+  scoreDialog->setWindowTitle(title);
+
+  scoreDialog->init(course, score);
+
+  int result = scoreDialog->exec();
+
+  if (result) {
+    QVector<QString> scores(18);
+
+    scoreDialog->results(scores);
+    
+    score->update(scores);
+
+    // Sort the scores based on dates
+    qSort(scoreList.begin(), scoreList.end(), dateLessThan); 
+    // Save it
+    saveScoreFile(scoreFile, scoreList);
+
+    // TODO: does this really work? No mem leaks?
+    scoreTableModel->setScore(scoreList, score);
+    updateTitleBar();
+  }
+}
+
+void MainWindow::viewStatistics()
+{
+  QMainWindow *win = new QMainWindow(this);
+  QString title = "Statistics";
+  win->setWindowTitle(title);
+
+  StatModel *statModel = new StatModel(clubList, scoreList);
+
+  QTableView *table = new QTableView;
+  table->showGrid();
+  table->setSelectionMode(QAbstractItemView::NoSelection);
+  table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
+  table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
+  table->verticalHeader()->setAutoFillBackground(true);
+  table->setModel(statModel);
+
+  QWidget *central = new QWidget(win);
+  win->setCentralWidget(central);
+
+  QPushButton *b1 = new QPushButton("Graphs");
+
+  QVBoxLayout *buttonLayout = new QVBoxLayout;
+  buttonLayout->addWidget(b1);
+
+  QTextEdit *textEdit = new QTextEdit;
+  //getStat(textEdit);
+
+  textEdit->setReadOnly(true);
+
+  QVBoxLayout *infoLayout = new QVBoxLayout;
+  infoLayout->addWidget(table);
+
+  QHBoxLayout *mainLayout = new QHBoxLayout(central);
+  mainLayout->addLayout(infoLayout);
+  //mainLayout->addLayout(buttonLayout);
+
+  central->setLayout(mainLayout);
+
+  win->show();
+}
+
 void MainWindow::loadScoreFile(QString &fileName, QList<Score *> &list)
 {
   ScoreXmlHandler handler(list);
 
   if (handler.parse(fileName))
-    qDebug() << "Score loaded : " << fileName;
-  qDebug() << "Score entries : " << list.size();
+    qDebug() << "File loaded:" << fileName << " entries:" << list.size();
 }
 
 void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
@@ -334,8 +455,10 @@ void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
   ScoreXmlHandler handler(list);
 
   if (handler.save(fileName))
-    qDebug() << "Score saved : " << fileName << 
-      " entries : " << list.size();
+    // TODO: banner
+    qDebug() << "File saved:" << fileName << " entries:" << list.size();
+  else
+    qWarning() << "Unable to save:" << fileName;
 }
 
 void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
@@ -343,8 +466,7 @@ void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
   ClubXmlHandler handler(list);
 
   if (handler.parse(fileName))
-    qDebug() << "Club loaded: " << fileName;
-  qDebug() << "Club entries : " << list.size();
+    qDebug() << "File loaded:" << fileName << " entries:" << list.size();
 }
 
 void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
@@ -352,6 +474,9 @@ void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
   ClubXmlHandler handler(list);
 
   if (handler.save(fileName))
-    qDebug() << "Club saved : " << fileName << 
-      " entries : " << list.size();
+    // TODO: banner
+    qDebug() << "File saved:" << fileName << " entries:" << list.size();
+  else
+    qWarning() << "Unable to save:" << fileName;
+
 }