+/*
+ * 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 <QColor>
#include <QBrush>
#include <QFont>
#include "table-model.h"
+#include "score-common.h"
QString empty("");
-QColor colorHoleBg(Qt::darkGray);
-QColor colorHoleFg(Qt::yellow);
-QColor colorBirdie(102, 102, 255);
-QColor colorPar(Qt::green);
-QColor colorBogey(Qt::darkGreen);
-QColor colorDoubleBogey(Qt::red);
-QColor colorBad(Qt::red);
-QColor colorSubTotal(Qt::black);
-QColor colorTotal(Qt::black);
-
-Qt::ItemFlags ScoreTableModel::flags (const QModelIndex & index)
-{
- return 0;
-}
-
-void ScoreTableModel::setMode(int m)
-{
- currentMode = m;
-}
-
-int ScoreTableModel::mode(void)
-{
- return currentMode;
-}
-
-// Assign the 'sList' to internal 'scoreList'. Set the current score
-// to 'currentScore', or to 's'.
-void ScoreTableModel::setScore(QList<Score *> &sList, Score *s)
-{
- scoreList = sList;
- if (scoreList.size() > 0) {
- if (s) {
- currentScore = scoreList.indexOf(s);
- if (currentScore == -1)
- currentScore = 0;
- }
- score = scoreList.at(currentScore); // NOTE: assumes non-empty list
- }
-}
-
-void ScoreTableModel::setClub(QList<Club *> &cList)
-{
- clubList = cList;
-
- if (clubList.size() > 0)
- club = clubList.at(0);
-
- if (club)
- course = club->getCourse(0);
-}
-
-QString ScoreTableModel::getInfoText()
-{
- QString str("");
-
- if (score)
- str = QString("%1, %2 / [%3/%4]").arg(score->getCourseName()).arg(score->getDate()).arg(currentScore+1).arg(scoreList.count());
-
- return str;
-}
-
-QString ScoreTableModel::getCountText()
-{
- QString str = QString("%1/%2").arg(currentScore+1, 2).arg(scoreList.count(), 2);
- return str;
-}
-
-QString& ScoreTableModel::clubName(void)
+ScoreTableModel::ScoreTableModel(QObject *parent)
+ : QAbstractTableModel(parent)
{
- if (club)
- return club->getName();
-
- return empty;
+ score = 0;
+ course = 0;
}
-QString& ScoreTableModel::courseName(void)
+void ScoreTableModel::set(Score * s, Course * c)
{
- if (course)
- return course->getName();
-
- return empty;
-}
-
-Course *ScoreTableModel::findCourse(const QString &clubName,
- const QString &courseName)
-{
- QListIterator<Club *> i(clubList);
- Club *c;
-
- while (i.hasNext()) {
- c = i.next();
- if (c->getName() == clubName) {
- return c->getCourse(courseName);
- }
- }
- return 0;
-}
-
-Club *ScoreTableModel::getClub(void)
-{
- return club;
-}
-
-Course *ScoreTableModel::getCourse(void)
-{
- return course;
-}
-
-Score *ScoreTableModel::getScore(void)
-{
- return score;
-}
-
-void ScoreTableModel::first()
-{
- if (score && course) {
- currentScore = 0;
- score = scoreList.at(currentScore);
- course = findCourse(score->getClubName(), score->getCourseName());
- emit dataChanged(createIndex(0, 0), createIndex(ROW_COUNT-1, COL_COUNT-1));
- }
-}
-
-void ScoreTableModel::last()
-{
- if (score && course) {
- currentScore = scoreList.size() - 1;
- score = scoreList.at(currentScore);
- course = findCourse(score->getClubName(), score->getCourseName());
- emit dataChanged(createIndex(0, 0), createIndex(ROW_COUNT-1, COL_COUNT-1));
- }
-}
-
-void ScoreTableModel::next()
-{
- if (score && course) {
- if (currentScore < (scoreList.size() - 1)) {
- currentScore++;
- score = scoreList.at(currentScore);
- course = findCourse(score->getClubName(), score->getCourseName());
- emit dataChanged(createIndex(0, 0), createIndex(ROW_COUNT-1, COL_COUNT-1));
- }
- }
-}
-
-void ScoreTableModel::prev()
-{
- if (score && course) {
- if (currentScore > 0) {
- currentScore--;
- score = scoreList.at(currentScore);
- course = findCourse(score->getClubName(), score->getCourseName());
- emit dataChanged(createIndex(0, 0), createIndex(ROW_COUNT-1, COL_COUNT-1));
- }
- }
+ score = s;
+ course = c;
}
-int ScoreTableModel::rowCount(const QModelIndex & parent) const
+int ScoreTableModel::rowCount(const QModelIndex &) const
{
- return 8;
+ return ROWS;
}
-int ScoreTableModel::columnCount(const QModelIndex & parent) const
+int ScoreTableModel::columnCount(const QModelIndex &) const
{
- return 9 + 2; // 2 for in/out and tot columns
-}
-
-QModelIndex ScoreTableModel::index(int row, int column, const QModelIndex &parent) const
-{
- if (hasIndex(row, column, parent)) {
- int flag = (parent.column() > 0) ? parent.column() : 0;
- return createIndex(row, column, flag);
- }
- else {
- return QModelIndex();
- }
+ return COLS + 2; // 2 for in/out and tot columns
}
QVariant ScoreTableModel::data(const QModelIndex &index, int role) const
{
- // TODO: move away from the stack
-
if (!index.isValid())
return QVariant();
//
// COLORS
//
- if (role == Qt::BackgroundRole) {
+ if (role == Qt::ForegroundRole) {
// Hole numbers 1-18. All hole nums, in, out and tot cell but not
// the empty cell.
if ((row == ROW_HOLE && col != 10) || row == ROW_HOLE_2) {
- QBrush brush(colorHoleBg);
- return brush;
+ QBrush brush(ScoreColor::holeBg());
+ return brush;
}
if (score && course && (row == ROW_SCORE || row == ROW_SCORE_2)) {
int par;
shots = score->getScore(col + 9).toInt();
}
- if (col == 10 && row == ROW_SCORE_2) {
+ if (col == (COLS+1) && row == ROW_SCORE_2) {
// Total score
- QBrush brush(colorTotal);
+ QBrush brush(ScoreColor::total());
return brush;
}
- if (col == 9) {
+ if (col == COLS) {
// In and Out scores
- QBrush brush(colorSubTotal);
+ QBrush brush(ScoreColor::subTotal());
return brush;
}
- if (col < 9) {
+ if (col < COLS) {
if (shots == par) {
// Par
- QBrush brush(colorPar);
+ QBrush brush(ScoreColor::par());
return brush;
}
if (shots == (par-1)) {
// Birdie
- QBrush brush(colorBirdie);
+ QBrush brush(ScoreColor::birdie());
return brush;
}
if (shots == (par+1)) {
// Bogey
- QBrush brush(colorBogey);
+ QBrush brush(ScoreColor::bogey());
return brush;
}
if (shots == (par+2)) {
// Double Bogey
- QBrush brush(colorDoubleBogey);
+ QBrush brush(ScoreColor::doubleBogey());
return brush;
}
if (shots > (par+2)) {
// Very bad
- QBrush brush(colorBad);
+ QBrush brush(ScoreColor::bad());
return brush;
}
}
// FONT
//
if (role == Qt::FontRole) {
- if (row == ROW_SCORE_2 && col == 10) {
- QFont font;
- font.setBold(true);
- return font;
- }
+ if (row == ROW_HOLE || row == ROW_HOLE_2) {
+ QFont font;
+ font.setBold(true);
+ return font;
+ }
+ if (row == ROW_SCORE || row == ROW_SCORE_2) {
+ QFont font;
+ font.setBold(true);
+ return font;
+ }
}
//
- // DATA
+ // NUMBERS
//
if (role == Qt::DisplayRole) {
- if (col == 9) {
+ if (col == COLS) {
// In/out label
if (row == ROW_HOLE)
return QString("Out");
return score->getTotal(TotalIn);
}
- else if (col == 10) {
+ else if (col == (COLS+1)) {
// Total label
if (row == ROW_HOLE_2)
return QString("Tot");
return QVariant();
}
-int ScoreTableModel::setItem(int row, int col, int data)
-{
- emit dataChanged(createIndex(row, col), createIndex(row, col));
- return 1;
-}
-
QVariant ScoreTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
// Only vertical header -- horizontal is hidden
if (orientation == Qt::Horizontal)
return QVariant();
-#if 1
- if (role == Qt::BackgroundRole) {
- QColor colorHoleBg(Qt::darkGray);
- QBrush brush(colorHoleBg);
- return brush;
- }
-#endif
if (role == Qt::DisplayRole) {
switch(section) {
+ case ROW_HOLE:
+ case ROW_HOLE_2:
+ return QString("Hole");
case ROW_PAR:
case ROW_PAR_2:
return QString("Par");
return QVariant();
}
+//
+// CourseTableModel
+//
+CourseTableModel::CourseTableModel(QObject *parent)
+ : QAbstractTableModel(parent)
+{
+ course = 0;
+}
+
+void CourseTableModel::set(Course *c)
+{
+ course = c;
+}
+
+int CourseTableModel::rowCount(const QModelIndex &) const
+{
+ return ROWS;
+}
+
+int CourseTableModel::columnCount(const QModelIndex &) const
+{
+ return COLS + 2;
+}
+
+QVariant CourseTableModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ int row = index.row();
+ int col = index.column();
+
+ //
+ // ALIGNMENT
+ //
+ if (role == Qt::TextAlignmentRole ) {
+ return Qt::AlignCenter;
+ }
+
+ //
+ // FONT
+ //
+ if (role == Qt::FontRole) {
+ if (row == ROW_HOLE || row == ROW_HOLE_2) {
+ QFont font;
+ font.setBold(true);
+ return font;
+ }
+ }
+ //
+ // COLORS
+ //
+ if (role == Qt::ForegroundRole) {
+ // Hole numbers 1-18. All hole nums, in, out and tot cell but not
+ // the empty cell.
+ if ((row == ROW_HOLE && col != 10) || row == ROW_HOLE_2) {
+ QBrush brush(ScoreColor::holeBg());
+ return brush;
+ }
+ return QVariant();
+ }
+ //
+ // NUMBERS
+ //
+ if (role == Qt::DisplayRole) {
+
+ if (col == COLS) {
+ // In/out label
+ if (row == ROW_HOLE)
+ return QString("Out");
+ if (row == ROW_HOLE_2)
+ return QString("In");
+
+ // In/Out for par
+ if (course && row == ROW_PAR)
+ return course->getTotal(TotalOut);
+ if (course && row == ROW_PAR_2)
+ return course->getTotal(TotalIn);
+ }
+ else if (col == (COLS+1)) {
+ // Total label
+ if (row == ROW_HOLE_2)
+ return QString("Tot");
+ // Total score
+ if (course && row == ROW_PAR_2)
+ return course->getTotal(Total);
+ }
+ else {
+ // data cells
+ switch(row) {
+ case ROW_HOLE:
+ return col + 1;
+ case ROW_HOLE_2:
+ return col + 10;
+ case ROW_PAR:
+ if (course)
+ return course->getPar(col);
+ case ROW_PAR_2:
+ if (course)
+ return course->getPar(col + 9);
+ case ROW_HCP:
+ if (course)
+ return course->getHcp(col);
+ case ROW_HCP_2:
+ if (course)
+ return course->getHcp(col + 9);
+ }
+ }
+ }
+ return QVariant();
+}
+
+QVariant CourseTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ // Only vertical header -- horizontal is hidden
+ if (orientation == Qt::Horizontal)
+ return QVariant();
+
+ if (role == Qt::DisplayRole) {
+ switch(section) {
+ case ROW_HOLE:
+ case ROW_HOLE_2:
+ return QString("Hole");
+ case ROW_PAR:
+ case ROW_PAR_2:
+ return QString("Par");
+ case ROW_HCP:
+ case ROW_HCP_2:
+ return QString("HCP");
+ case ROW_LEN:
+ case ROW_LEN_2:
+ return QString("Len");
+ }
+ return QVariant();
+ }
+
+ return QVariant();
+}