• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegames API Reference
  • KDE Home
  • Contact Us
 

libkdegames/highscore

  • sources
  • kde-4.14
  • kdegames
  • libkdegames
  • highscore
kexthighscore_tab.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the KDE games library
3  Copyright (C) 2002 Nicolas Hadacek (hadacek@kde.org)
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License version 2 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "kexthighscore_tab.h"
21 #include "kexthighscore_tab.moc"
22 
23 #include <QLayout>
24 #include <QLabel>
25 #include <QPixmap>
26 #include <QVector>
27 #include <QGroupBox>
28 #include <QTreeWidget>
29 #include <QHeaderView>
30 
31 #include <kdialog.h>
32 #include <kdebug.h>
33 #include <kglobal.h>
34 
35 #include "kexthighscore.h"
36 #include "kexthighscore_internal.h"
37 
38 
39 namespace KExtHighscore
40 {
41 
42 //-----------------------------------------------------------------------------
43 PlayersCombo::PlayersCombo(QWidget *parent)
44  : QComboBox(parent)
45 {
46  const PlayerInfos &p = internal->playerInfos();
47  for (uint i = 0; i<p.nbEntries(); i++)
48  addItem(p.prettyName(i));
49  addItem(QLatin1String("<") + i18n("all") + QLatin1Char( '>' ));
50  connect(this, SIGNAL(activated(int)), SLOT(activatedSlot(int)));
51 }
52 
53 void PlayersCombo::activatedSlot(int i)
54 {
55  const PlayerInfos &p = internal->playerInfos();
56  if ( i==(int)p.nbEntries() ) emit allSelected();
57  else if ( i==(int)p.nbEntries()+1 ) emit noneSelected();
58  else emit playerSelected(i);
59 }
60 
61 void PlayersCombo::load()
62 {
63  const PlayerInfos &p = internal->playerInfos();
64  for (uint i = 0; i<p.nbEntries(); i++)
65  setItemText(i, p.prettyName(i));
66 }
67 
68 //-----------------------------------------------------------------------------
69 AdditionalTab::AdditionalTab(QWidget *parent)
70  : QWidget(parent)
71 {
72  QVBoxLayout *top = new QVBoxLayout(this);
73  top->setMargin( KDialog::marginHint() );
74  top->setSpacing( KDialog::spacingHint() );
75 
76  QHBoxLayout *hbox = new QHBoxLayout;
77  top->addLayout(hbox);
78  QLabel *label = new QLabel(i18n("Select player:"), this);
79  hbox->addWidget(label);
80  _combo = new PlayersCombo(this);
81  connect(_combo, SIGNAL(playerSelected(uint)),
82  SLOT(playerSelected(uint)));
83  connect(_combo, SIGNAL(allSelected()), SLOT(allSelected()));
84  hbox->addWidget(_combo);
85  hbox->addStretch(1);
86 }
87 
88 void AdditionalTab::init()
89 {
90  uint id = internal->playerInfos().id();
91  _combo->setCurrentIndex(id);
92  playerSelected(id);
93 }
94 
95 void AdditionalTab::allSelected()
96 {
97  display(internal->playerInfos().nbEntries());
98 }
99 
100 QString AdditionalTab::percent(uint n, uint total, bool withBraces)
101 {
102  if ( n==0 || total==0 ) return QString();
103  QString s = QString::fromLatin1( "%1%").arg(100.0 * n / total, 0, 'f', 1);
104  return (withBraces ? QLatin1Char('(') + s + QLatin1Char( ')' ) : s);
105 }
106 
107 void AdditionalTab::load()
108 {
109  _combo->load();
110 }
111 
112 
113 //-----------------------------------------------------------------------------
114 const char *StatisticsTab::COUNT_LABELS[Nb_Counts] = {
115  I18N_NOOP("Total:"), I18N_NOOP("Won:"), I18N_NOOP("Lost:"),
116  I18N_NOOP("Draw:")
117 };
118 const char *StatisticsTab::TREND_LABELS[Nb_Trends] = {
119  I18N_NOOP("Current:"), I18N_NOOP("Max won:"), I18N_NOOP("Max lost:")
120 };
121 
122 StatisticsTab::StatisticsTab(QWidget *parent)
123  : AdditionalTab(parent)
124 {
125  setObjectName( QLatin1String("statistics_tab" ));
126  // construct GUI
127  QVBoxLayout *top = static_cast<QVBoxLayout *>(layout());
128 
129  QHBoxLayout *hbox = new QHBoxLayout;
130  QVBoxLayout *vbox = new QVBoxLayout;
131  hbox->addLayout(vbox);
132  top->addLayout(hbox);
133 
134  QGroupBox *group = new QGroupBox(i18n("Game Counts"), this);
135  vbox->addWidget(group);
136  QGridLayout *gridLay = new QGridLayout(group);
137  gridLay->setSpacing(KDialog::spacingHint());
138  for (uint k=0; k<Nb_Counts; k++) {
139  if ( Count(k)==Draw && !internal->showDrawGames ) continue;
140  gridLay->addWidget(new QLabel(i18n(COUNT_LABELS[k]), group), k, 0);
141  _nbs[k] = new QLabel(group);
142  gridLay->addWidget(_nbs[k], k, 1);
143  _percents[k] = new QLabel(group);
144  gridLay->addWidget(_percents[k], k, 2);
145  }
146 
147  group = new QGroupBox(i18n("Trends"), this);
148  vbox->addWidget(group);
149  gridLay = new QGridLayout(group);
150  gridLay->setSpacing(KDialog::spacingHint());
151  for (uint k=0; k<Nb_Trends; k++) {
152  gridLay->addWidget(new QLabel(i18n(TREND_LABELS[k]), group), k, 0);
153  _trends[k] = new QLabel(group);
154  gridLay->addWidget(_trends[k], k, 1);
155  }
156 
157  hbox->addStretch(1);
158  top->addStretch(1);
159 }
160 
161 void StatisticsTab::load()
162 {
163  AdditionalTab::load();
164  const PlayerInfos &pi = internal->playerInfos();
165  uint nb = pi.nbEntries();
166  _data.resize(nb+1);
167  for (int i=0; i<_data.size()-1; i++) {
168  _data[i].count[Total] = pi.item(QLatin1String( "nb games" ))->read(i).toUInt();
169  _data[i].count[Lost] = pi.item(QLatin1String( "nb lost games" ))->read(i).toUInt()
170  + pi.item(QLatin1String( "nb black marks" ))->read(i).toUInt(); // legacy
171  _data[i].count[Draw] = pi.item(QLatin1String( "nb draw games" ))->read(i).toUInt();
172  _data[i].count[Won] = _data[i].count[Total] - _data[i].count[Lost]
173  - _data[i].count[Draw];
174  _data[i].trend[CurrentTrend] =
175  pi.item(QLatin1String( "current trend" ))->read(i).toInt();
176  _data[i].trend[WonTrend] = pi.item(QLatin1String( "max won trend" ))->read(i).toUInt();
177  _data[i].trend[LostTrend] =
178  -(int)pi.item(QLatin1String( "max lost trend" ))->read(i).toUInt();
179  }
180 
181  for (int k=0; k<Nb_Counts; k++) _data[nb].count[k] = 0;
182  for (int k=0; k<Nb_Trends; k++) _data[nb].trend[k] = 0;
183  for (int i=0; i<_data.size()-1; i++) {
184  for (uint k=0; k<Nb_Counts; k++)
185  _data[nb].count[k] += _data[i].count[k];
186  for (uint k=0; k<Nb_Trends; k++)
187  _data[nb].trend[k] += _data[i].trend[k];
188  }
189  for (uint k=0; k<Nb_Trends; k++)
190  _data[nb].trend[k] /= (_data.size()-1);
191 
192  init();
193 }
194 
195 QString StatisticsTab::percent(const Data &d, Count count) const
196 {
197  if ( count==Total ) return QString();
198  return AdditionalTab::percent(d.count[count], d.count[Total], true);
199 }
200 
201 void StatisticsTab::display(uint i)
202 {
203  const Data &d = _data[i];
204  for (uint k=0; k<Nb_Counts; k++) {
205  if ( Count(k) && !internal->showDrawGames ) continue;
206  _nbs[k]->setText(QString::number(d.count[k]));
207  _percents[k]->setText(percent(d, Count(k)));
208  }
209  for (uint k=0; k<Nb_Trends; k++) {
210  QString s;
211  if ( d.trend[k]>0 ) s = QLatin1Char( '+' );
212  int prec = (i==internal->playerInfos().nbEntries() ? 1 : 0);
213  _trends[k]->setText(s + QString::number(d.trend[k], 'f', prec));
214  }
215 }
216 
217 //-----------------------------------------------------------------------------
218 HistogramTab::HistogramTab(QWidget *parent)
219  : AdditionalTab(parent)
220 {
221  setObjectName( QLatin1String("histogram_tab" ));
222  // construct GUI
223  QVBoxLayout *top = static_cast<QVBoxLayout *>(layout());
224 
225  _list = new QTreeWidget(this);
226  _list->setSelectionMode(QAbstractItemView::NoSelection);
228 // _list->setItemMargin(3);
229  _list->setAllColumnsShowFocus(true);
230  _list->setSortingEnabled(false);
231  _list->header()->setClickable(false);
232  _list->header()->setMovable(false);
233  top->addWidget(_list);
234 
235  _list->headerItem()->setText(0,i18n("From"));
236  _list->headerItem()->setText(1,i18n("To"));
237  _list->headerItem()->setText(2,i18n("Count"));
238  _list->headerItem()->setText(3,i18n("Percent"));
239  for (int i=0; i<4; i++) _list->headerItem()->setTextAlignment(i, Qt::AlignRight);
240  _list->headerItem()->setText(4,QString());
241 
242  const Item *sitem = internal->scoreInfos().item(QLatin1String( "score" ))->item();
243  const PlayerInfos &pi = internal->playerInfos();
244  const QVector<uint> &sh = pi.histogram();
245  for (int k=1; k<( int )pi.histoSize(); k++) {
246  QString s1 = sitem->pretty(0, sh[k-1]);
247  QString s2;
248  if ( k==sh.size() ) s2 = QLatin1String( "..." );
249  else if ( sh[k]!=sh[k-1]+1 ) s2 = sitem->pretty(0, sh[k]);
250  QStringList items; items << s1 << s2;
251  (void)new QTreeWidgetItem(_list, items);
252  }
253 }
254 
255 void HistogramTab::load()
256 {
257  AdditionalTab::load();
258  const PlayerInfos &pi = internal->playerInfos();
259  uint n = pi.nbEntries();
260  uint s = pi.histoSize() - 1;
261  _counts.resize((n+1) * s);
262  _data.fill(0, n+1);
263  for (uint k=0; k<s; k++) {
264  _counts[n*s + k] = 0;
265  for (uint i=0; i<n; i++) {
266  uint nb = pi.item(pi.histoName(k+1))->read(i).toUInt();
267  _counts[i*s + k] = nb;
268  _counts[n*s + k] += nb;
269  _data[i] += nb;
270  _data[n] += nb;
271  }
272  }
273 
274  init();
275 }
276 
277 void HistogramTab::display(uint i)
278 {
279  const PlayerInfos &pi = internal->playerInfos();
280  uint itemNum = 0;
281  QTreeWidgetItem *item = _list->topLevelItem(itemNum);
282  uint s = pi.histoSize() - 1;
283  for (int k=s-1; k>=0; k--) {
284  uint nb = _counts[i*s + k];
285  item->setText(2, QString::number(nb));
286  item->setText(3, percent(nb, _data[i]));
287  uint width = (_data[i]==0 ? 0 : qRound(150.0 * nb / _data[i]));
288  QPixmap pixmap(width, 10);
289  pixmap.fill(Qt::blue);
290  item->setData(4, Qt::DecorationRole, pixmap);
291  itemNum++;
292  item = _list->topLevelItem(itemNum);
293  }
294 }
295 
296 } // namespace
QWidget::layout
QLayout * layout() const
KExtHighscore::PlayerInfos
Definition: kexthighscore_internal.h:188
KExtHighscore::PlayerInfos::prettyName
QString prettyName() const
Definition: kexthighscore_internal.h:198
QWidget
KExtHighscore::ItemContainer::read
QVariant read(uint i) const
Definition: kexthighscore_internal.cpp:75
QHeaderView::setMovable
void setMovable(bool movable)
KExtHighscore::AdditionalTab::init
void init()
Definition: kexthighscore_tab.cpp:88
KExtHighscore::HistogramTab::HistogramTab
HistogramTab(QWidget *parent)
Definition: kexthighscore_tab.cpp:218
KExtHighscore::StatisticsTab::StatisticsTab
StatisticsTab(QWidget *parent)
Definition: kexthighscore_tab.cpp:122
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
KExtHighscore::PlayersCombo::PlayersCombo
PlayersCombo(QWidget *parent=0)
Definition: kexthighscore_tab.cpp:43
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
KExtHighscore::ManagerPrivate::showDrawGames
bool showDrawGames
Definition: kexthighscore_internal.h:257
KExtHighscore::PlayersCombo::load
void load()
Definition: kexthighscore_tab.cpp:61
QVector::fill
QVector< T > & fill(const T &value, int size)
KExtHighscore::PlayersCombo
Definition: kexthighscore_tab.h:34
KExtHighscore::PlayersCombo::playerSelected
void playerSelected(uint i)
QHBoxLayout
KExtHighscore::PlayerInfos::histoSize
int histoSize() const
Definition: kexthighscore_internal.cpp:394
QTreeWidgetItem::setData
virtual void setData(int column, int role, const QVariant &value)
QGridLayout
KExtHighscore::AdditionalTab::load
virtual void load()
Definition: kexthighscore_tab.cpp:107
KExtHighscore::AdditionalTab::percent
static QString percent(uint n, uint total, bool withBraces=false)
Definition: kexthighscore_tab.cpp:100
QComboBox::setItemText
void setItemText(int index, const QString &text)
QGridLayout::setSpacing
void setSpacing(int spacing)
QComboBox::addItem
void addItem(const QString &text, const QVariant &userData)
QWidget::width
int width() const
QTreeWidget
KExtHighscore::internal
ManagerPrivate * internal
Definition: kexthighscore.cpp:36
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QString::number
QString number(int n, int base)
kexthighscore_tab.h
QVariant::toUInt
uint toUInt(bool *ok) const
QVector::resize
void resize(int size)
KExtHighscore::Item
This class defines how to convert and how to display a highscore element (such as the score...
Definition: kexthighscore_item.h:39
QGroupBox
QVariant::toInt
int toInt(bool *ok) const
KExtHighscore::PlayerInfos::histoName
QString histoName(int i) const
Definition: kexthighscore_internal.cpp:385
KExtHighscore::StatisticsTab::load
void load()
Definition: kexthighscore_tab.cpp:161
KExtHighscore::PlayerInfos::histogram
const QVector< uint > & histogram() const
Definition: kexthighscore_internal.h:210
QObject::setObjectName
void setObjectName(const QString &name)
kexthighscore_internal.h
QComboBox::activated
void activated(int index)
QVBoxLayout
KExtHighscore::PlayersCombo::allSelected
void allSelected()
KExtHighscore::HistogramTab::load
void load()
Definition: kexthighscore_tab.cpp:255
QLabel::setText
void setText(const QString &)
KExtHighscore::ManagerPrivate::playerInfos
PlayerInfos & playerInfos()
Definition: kexthighscore_internal.h:247
QTreeView::setAllColumnsShowFocus
void setAllColumnsShowFocus(bool enable)
QString
QLayout::setMargin
void setMargin(int margin)
QStringList
QPixmap
KExtHighscore::AdditionalTab::AdditionalTab
AdditionalTab(QWidget *parent)
Definition: kexthighscore_tab.cpp:69
QLatin1Char
QTreeWidget::headerItem
QTreeWidgetItem * headerItem() const
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
QVector< uint >
KExtHighscore::AdditionalTab
Definition: kexthighscore_tab.h:52
QTreeWidgetItem
QLatin1String
QBoxLayout::addStretch
void addStretch(int stretch)
KExtHighscore::AdditionalTab::display
virtual void display(uint i)=0
QHeaderView::setClickable
void setClickable(bool clickable)
QVector::count
int count(const T &value) const
QTreeWidgetItem::setText
void setText(int column, const QString &text)
QComboBox::setCurrentIndex
void setCurrentIndex(int index)
KExtHighscore::Item::pretty
virtual QString pretty(uint i, const QVariant &value) const
Definition: kexthighscore_item.cpp:110
QString::fromLatin1
QString fromLatin1(const char *str, int size)
KExtHighscore::PlayerInfos::nbEntries
uint nbEntries() const
Definition: kexthighscore_internal.cpp:366
QTreeWidgetItem::setTextAlignment
void setTextAlignment(int column, int alignment)
QTreeView::header
QHeaderView * header() const
QTreeWidget::topLevelItem
QTreeWidgetItem * topLevelItem(int index) const
kexthighscore.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KExtHighscore::ItemArray::item
const ItemContainer * item(const QString &name) const
Definition: kexthighscore_internal.cpp:125
QLabel
QVector::size
int size() const
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QBoxLayout::setSpacing
void setSpacing(int spacing)
KExtHighscore::PlayersCombo::noneSelected
void noneSelected()
QBoxLayout::addLayout
void addLayout(QLayout *layout, int stretch)
QComboBox
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:46 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkdegames/highscore

Skip menu "libkdegames/highscore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegames API Reference

Skip menu "kdegames API Reference"
  • granatier
  • kapman
  • kblackbox
  • kgoldrunner
  • kigo
  • kmahjongg
  • KShisen
  • ksquares
  • libkdegames
  •   highscore
  •   libkdegamesprivate
  •     kgame
  • libkmahjongg
  • palapeli
  •   libpala

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal