summaryrefslogtreecommitdiffstats
path: root/blinken/src/highscoredialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'blinken/src/highscoredialog.cpp')
-rw-r--r--blinken/src/highscoredialog.cpp198
1 files changed, 198 insertions, 0 deletions
diff --git a/blinken/src/highscoredialog.cpp b/blinken/src/highscoredialog.cpp
new file mode 100644
index 00000000..a162ab33
--- /dev/null
+++ b/blinken/src/highscoredialog.cpp
@@ -0,0 +1,198 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Albert Astals Cid <tsdgeos@terra.es> *
+ * *
+ * 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; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qtabbar.h>
+#include <qtabwidget.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <klocale.h>
+
+#include "highscoredialog.h"
+#include "counter.h"
+#include "fontutils.h"
+#include "settings.h"
+
+static const int margin = 15;
+static const int smallMargin = 5;
+static const int namesFontSize = 25;
+
+/* scoresWidget */
+
+class scoresWidget : public QWidget
+{
+ public:
+ scoresWidget(QWidget *parent, const QValueList< QPair<int, QString> > &scores);
+ QSize calcSize();
+
+ protected:
+ void paintEvent(QPaintEvent *);
+
+ private:
+ const QValueList< QPair<int, QString> > &m_scores;
+};
+
+scoresWidget::scoresWidget(QWidget *parent, const QValueList< QPair<int, QString> > &scores) : QWidget(parent, 0, WStaticContents | WNoAutoErase), m_scores(scores)
+{
+}
+
+void scoresWidget::paintEvent(QPaintEvent *)
+{
+ int w = width();
+ int h = height();
+ QFont f;
+ QPixmap buf(w, h);
+ QPainter p(&buf);
+ QRect r;
+ QColor bg = paletteBackgroundColor();
+
+ // bg color
+ p.fillRect(0, 0, w, h, bg);
+
+ p.setPen(black);
+
+ if (blinkenSettings::customFont()) f = QFont("Steve");
+ p.setFont(f);
+ f.setPointSize(fontUtils::fontSize(p, "A", 1000, namesFontSize));
+ p.setFont(f);
+
+ p.translate(margin, margin);
+
+ QValueList< QPair<int, QString> >::const_iterator it;
+ for (it = m_scores.begin(); it != m_scores.end(); ++it)
+ {
+ counter::paint(p, !(*it).second.isEmpty(), (*it).first, false, QColor(), QColor(), QColor());
+ p.setPen(black);
+ p.drawText(counter::width(false) + 2 * smallMargin, 30, (*it).second);
+ p.translate(0, counter::height() + smallMargin);
+ }
+
+ bitBlt(this, 0, 0, &buf);
+}
+
+QSize scoresWidget::calcSize()
+{
+ int mw, mh, lt;
+ QRect r;
+ QPainter p(this);
+ QFont f;
+
+ if (blinkenSettings::customFont()) f = QFont("Steve");
+ p.setFont(f);
+ f.setPointSize(fontUtils::fontSize(p, "A", 1000, namesFontSize));
+ p.setFont(f);
+ for (int i = 0; i < 3; i++)
+ {
+ lt = 0;
+ QValueList< QPair<int, QString> >::const_iterator it;
+ for (it = m_scores.begin(); it != m_scores.end(); ++it)
+ {
+ r = p.boundingRect(QRect(), Qt::AlignAuto, (*it).second);
+ lt = QMAX(lt, r.width());
+ }
+ }
+
+ mw = margin + counter::width(false) + 2 * smallMargin + lt + margin;
+ mh = margin * 2 + counter::height() * 5 + smallMargin * 4;
+
+ QSize size(mw, mh);
+ setMinimumSize(size);
+ resize(size);
+
+ return size;
+}
+
+/* myTabWidget */
+
+class myTabWidget : public QTabWidget
+{
+ public:
+ myTabWidget(QWidget *parent) : QTabWidget(parent) {}
+
+ QSize tabBarSizeHint() const
+ {
+ return tabBar() -> sizeHint();
+ }
+};
+
+/* highScoreDialog */
+
+highScoreDialog::highScoreDialog(QWidget *parent) : KDialogBase(parent, 0, true, i18n("Highscores"), KDialogBase::Close)
+{
+ m_tw = new myTabWidget(this);
+ setMainWidget(m_tw);
+
+ KConfig *cfg = kapp -> config();
+ for (int i = 1; i <= 3; i++)
+ {
+ cfg -> setGroup(QString("Level%1").arg(i));
+ for (int j = 1; j <= 5; j++)
+ {
+ m_scores[i-1].append(qMakePair(cfg->readNumEntry(QString("Score%1").arg(j)), cfg->readEntry(QString("Name%1").arg(j))));
+ }
+ }
+
+ m_tw -> addTab(new scoresWidget(m_tw, m_scores[0]), i18n("Level 1"));
+ m_tw -> addTab(new scoresWidget(m_tw, m_scores[1]), i18n("Level 2"));
+ m_tw -> addTab(new scoresWidget(m_tw, m_scores[2]), i18n("Level ?"));
+}
+
+bool highScoreDialog::scoreGoodEnough(int level, int score)
+{
+ level--;
+ QValueList< QPair<int, QString> >::iterator it, itEnd;
+ it = m_scores[level].begin();
+ itEnd = m_scores[level].end();
+ while (it != itEnd && (*it).first >= score) it++;
+
+ return (it != itEnd);
+}
+
+void highScoreDialog::addScore(int level, int score, const QString &name)
+{
+ level--;
+ QValueList< QPair<int, QString> >::iterator it, itEnd;
+ it = m_scores[level].begin();
+ itEnd = m_scores[level].end();
+ while (it != itEnd && (*it).first >= score) it++;
+
+ if (it != itEnd)
+ {
+ m_scores[level].insert(it, qMakePair(score, name));
+ m_scores[level].remove(--m_scores[level].end());
+
+ KConfig *cfg = kapp -> config();
+ cfg -> setGroup(QString("Level%1").arg(level + 1));
+ int j;
+ for (it = m_scores[level].begin(), j = 1; it != m_scores[level].end(); ++it, j++)
+ {
+ cfg->writeEntry(QString("Score%1").arg(j), (*it).first);
+ cfg->writeEntry(QString("Name%1").arg(j), (*it).second);
+ }
+ cfg -> sync();
+ }
+}
+
+void highScoreDialog::showLevel(int level)
+{
+ QSize max, aux;
+ m_tw -> setCurrentPage(level -1);
+
+ for (int i = 0; i < 3; i++)
+ {
+ aux = static_cast<scoresWidget*>(m_tw -> page(i)) -> calcSize();
+ max = max.expandedTo(aux);
+ }
+ if (max.width() < m_tw -> tabBarSizeHint().width() + 5) m_tw -> setMinimumSize(m_tw -> tabBarSizeHint().width() + 5, max.height() + m_tw -> tabBarSizeHint().height() + 5);
+
+ exec();
+ delete this;
+}