+/*
+ * 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 appName("scorecard");
-QString topDir("/opt/scorecard");
-QString mmcDir("/media/mmc1/scorecard");
-QString dataDirName("/data/");
+QString topDir("/opt");
+QString mmcDir("/media/mmc1");
+QString dataDirName("data");
QString dataDir;
QString imgDir(topDir + "/pixmaps");
QString scoreFileName("score.xml");
return (*s1) < (*s2);
}
-MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent)
+MainWindow::MainWindow(QMainWindow *parent): QMainWindow(parent)
{
resize(800, 480);
loadSettings();
- QWidget *centralWidget = new QWidget(this);
-
- // TODO: move to proper function
- tableViewFront = new QTableView(centralWidget);
- tableViewBack = new QTableView(centralWidget);
+ centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
// 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;
-#ifndef Q_WS_HILDON
- topDir = ".";
-#endif
-
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 + dataDirName;
+ dataDir = mmcDir + "/" + appName + "/" + dataDirName;
}
else {
- dataDir = topDir + dataDirName;
+ dataDir = topDir + "/" + appName + "/" + dataDirName;
}
- scoreFile = dataDir + scoreFileName;
- clubFile = dataDir + clubFileName;
+#endif
+ scoreFile = dataDir + "/" + scoreFileName;
+ clubFile = dataDir + "/" + clubFileName;
QDir dir(dataDir);
if (!dir.exists())
- if (!dir.mkdir(dataDir)) {
- // TODO: mkdir does not work...
- qDebug() << "Unable to create: " + dataDir;
+ if (!dir.mkpath(dataDir)) {
+ qWarning() << "Unable to create: " + dataDir;
return;
}
- qDebug() << "Data is at: " + dataDir;
+ qDebug() << "Data is at:" + dataDir;
}
void MainWindow::createLayout(QWidget *parent)
{
+
buttonLayout = new QVBoxLayout;
//labelLayout->addStretch();
buttonLayout->addWidget(nextButton);
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()));
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
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();
}
}
else {
+ // New club and course
club = new Club(clubName);
course = new Course(courseName, par, hcp);
club->addCourse(course);
// 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);
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);
// TODO: does this really work? No mem leaks?
scoreTableModel->setScore(scoreList, score);
- updateStatusBar();
+ 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() << "File loaded: " << fileName << " entries : " << list.size();
+ qDebug() << "File loaded:" << fileName << " entries:" << list.size();
}
void MainWindow::saveScoreFile(QString &fileName, QList<Score *> &list)
if (handler.save(fileName))
// TODO: banner
- qDebug() << "File saved : " << fileName << " entries : " << list.size();
+ qDebug() << "File saved:" << fileName << " entries:" << list.size();
else
- qDebug() << "Unable to save : " << fileName;
+ qWarning() << "Unable to save:" << fileName;
}
void MainWindow::loadClubFile(QString &fileName, QList<Club *> &list)
ClubXmlHandler handler(list);
if (handler.parse(fileName))
- qDebug() << "File loaded: " << fileName << " entries : " << list.size();
+ qDebug() << "File loaded:" << fileName << " entries:" << list.size();
}
void MainWindow::saveClubFile(QString &fileName, QList<Club *> &list)
if (handler.save(fileName))
// TODO: banner
- qDebug() << "File saved : " << fileName << " entries : " << list.size();
+ qDebug() << "File saved:" << fileName << " entries:" << list.size();
else
- qDebug() << "Unable to save : " << fileName;
+ qWarning() << "Unable to save:" << fileName;
}