20#include "kexthighscore_gui.h"
21#include "kexthighscore_gui.moc"
24#include <tqtextstream.h>
27#include <tqvgroupbox.h>
29#include <tdeapplication.h>
30#include <tdemessagebox.h>
34#include <tdefiledialog.h>
35#include <tdetempfile.h>
36#include <tdeio/netaccess.h>
37#include <kiconloader.h>
39#include "kexthighscore_internal.h"
40#include "kexthighscore.h"
41#include "kexthighscore_tab.h"
44namespace KExtHighscore
48ShowItem::ShowItem(TQListView *list,
bool highlight)
49 : TDEListViewItem(list), _highlight(highlight)
52void ShowItem::paintCell(TQPainter *p,
const TQColorGroup &cg,
53 int column,
int width,
int align)
55 TQColorGroup cgrp(cg);
56 if (_highlight) cgrp.setColor(TQColorGroup::Text, red);
57 TDEListViewItem::paintCell(p, cgrp, column, width, align);
61ScoresList::ScoresList(TQWidget *parent)
64 setSelectionMode(TQListView::NoSelection);
66 setAllColumnsShowFocus(
true);
68 header()->setClickEnabled(
false);
69 header()->setMovingEnabled(
false);
72void ScoresList::addHeader(
const ItemArray &items)
74 addLineItem(items, 0, 0);
77TQListViewItem *ScoresList::addLine(
const ItemArray &items,
78 uint index,
bool highlight)
80 TQListViewItem *item =
new ShowItem(
this, highlight);
81 addLineItem(items, index, item);
85void ScoresList::addLineItem(
const ItemArray &items,
86 uint index, TQListViewItem *line)
89 for (uint i=0; i<items.size(); i++) {
90 const ItemContainer &container = *items[i];
91 if ( !container.item()->isVisible() )
continue;
92 if (line) line->setText(k, itemText(container, index));
94 addColumn( container.item()->label() );
95 setColumnAlignment(k, container.item()->alignment());
102HighscoresList::HighscoresList(TQWidget *parent)
106TQString HighscoresList::itemText(
const ItemContainer &item, uint row)
const
108 return item.pretty(row);
111void HighscoresList::load(
const ItemArray &items,
int highlight)
114 TQListViewItem *line = 0;
115 for (
int j=items.nbEntries()-1; j>=0; j--) {
116 TQListViewItem *item = addLine(items, j, j==highlight);
117 if ( j==highlight ) line = item;
119 if (line) ensureItemVisible(line);
123HighscoresWidget::HighscoresWidget(TQWidget *parent)
124 : TQWidget(parent,
"show_highscores_widget"),
125 _statsTab(0), _histoTab(0)
127 const ScoreInfos &s = internal->scoreInfos();
128 const PlayerInfos &p = internal->playerInfos();
130 TQVBoxLayout *vbox =
new TQVBoxLayout(
this, KDialogBase::spacingHint());
132 _tw =
new TQTabWidget(
this);
133 connect(_tw, TQ_SIGNAL(currentChanged(TQWidget *)), TQ_SLOT(tabChanged()));
134 vbox->addWidget(_tw);
137 _scoresList =
new HighscoresList(_tw);
138 _scoresList->addHeader(s);
139 _tw->addTab(_scoresList, i18n(
"Best &Scores"));
142 _playersList =
new HighscoresList(_tw);
143 _playersList->addHeader(p);
144 _tw->addTab(_playersList, i18n(
"&Players"));
147 if ( internal->showStatistics ) {
148 _statsTab =
new StatisticsTab(_tw);
149 _tw->addTab(_statsTab, i18n(
"Statistics"));
153 if ( p.histogram().size()!=0 ) {
154 _histoTab =
new HistogramTab(_tw);
155 _tw->addTab(_histoTab, i18n(
"Histogram"));
159void HighscoresWidget::changeTab(
int i)
161 if ( i!=_tw->currentPageIndex() )
162 _tw->setCurrentPage(i);
165void HighscoresWidget::load(
int rank)
167 _scoresList->load(internal->scoreInfos(), rank);
168 _playersList->load(internal->playerInfos(), internal->playerInfos().id());
169 if (_statsTab) _statsTab->load();
170 if (_histoTab) _histoTab->load();
174HighscoresDialog::HighscoresDialog(
int rank, TQWidget *parent)
175 : KDialogBase(internal->nbGameTypes()>1 ? TreeList : Plain,
176 i18n(
"Highscores"), Close|User1|User2, Close,
177 parent,
"show_highscores", true, true,
178 KGuiItem(i18n(
"Configure..."),
"configure"),
179 KGuiItem(i18n(
"Export..."))), _rank(rank), _tab(0)
181 _widgets.resize(internal->nbGameTypes(), 0);
183 if ( internal->nbGameTypes()>1 ) {
184 for (uint i=0; i<internal->nbGameTypes(); i++) {
185 TQString title = internal->manager.gameTypeLabel(i, Manager::I18N);
186 TQString icon = internal->manager.gameTypeLabel(i, Manager::Icon);
187 TQWidget *w = addVBoxPage(title, TQString(),
188 BarIcon(icon, TDEIcon::SizeLarge));
189 if ( i==internal->gameType() ) createPage(w);
192 connect(
this, TQ_SIGNAL(aboutToShowPage(TQWidget *)),
193 TQ_SLOT(createPage(TQWidget *)));
194 showPage(internal->gameType());
196 TQVBoxLayout *vbox =
new TQVBoxLayout(plainPage());
197 createPage(plainPage());
198 vbox->addWidget(_widgets[0]);
199 setMainWidget(_widgets[0]);
203void HighscoresDialog::createPage(TQWidget *page)
207 bool several = ( internal->nbGameTypes()>1 );
208 int i = (several ? pageIndex(page) : 0);
209 if ( _widgets[i]==0 ) {
210 _widgets[i] =
new HighscoresWidget(page);
211 connect(_widgets[i], TQ_SIGNAL(tabChanged(
int)), TQ_SLOT(tabChanged(
int)));
213 uint type = internal->gameType();
214 if (several) internal->setGameType(i);
215 _widgets[i]->load(uint(i)==type ? _rank : -1);
216 if (several) setGameType(type);
217 _widgets[i]->changeTab(_tab);
220void HighscoresDialog::slotUser1()
222 if ( KExtHighscore::configure(
this) )
223 createPage(_current);
226void HighscoresDialog::slotUser2()
228 KURL url = KFileDialog::getSaveURL(TQString(), TQString(),
this);
229 if ( url.isEmpty() )
return;
230 if ( TDEIO::NetAccess::exists(url,
true,
this) ) {
231 KGuiItem gi = KStdGuiItem::save();
232 gi.setText(i18n(
"Overwrite"));
233 int res = KMessageBox::warningContinueCancel(
this,
234 i18n(
"The file already exists. Overwrite?"),
236 if ( res==KMessageBox::Cancel )
return;
239 internal->exportHighscores(*tmp.textStream());
241 TDEIO::NetAccess::upload(tmp.name(), url,
this);
246LastMultipleScoresList::LastMultipleScoresList(
247 const TQValueVector<Score> &scores, TQWidget *parent)
248 : ScoresList(parent), _scores(scores)
250 const ScoreInfos &s = internal->scoreInfos();
252 for (uint i=0; i<scores.size(); i++) addLine(s, i,
false);
255void LastMultipleScoresList::addLineItem(
const ItemArray &si,
256 uint index, TQListViewItem *line)
259 for (uint i=0; i<si.size()-2; i++) {
261 const ItemContainer *container = si[k];
263 if (line) line->setText(i, itemText(*container, index));
265 addColumn( container->item()->label() );
266 setColumnAlignment(i, container->item()->alignment());
271TQString LastMultipleScoresList::itemText(
const ItemContainer &item,
274 TQString name = item.name();
276 return (_scores[row].type()==Won ? i18n(
"Winner") : TQString());
277 TQVariant v = _scores[row].data(name);
278 if ( name==
"name" )
return v.toString();
279 return item.item()->pretty(row, v);
283TotalMultipleScoresList::TotalMultipleScoresList(
284 const TQValueVector<Score> &scores, TQWidget *parent)
285 : ScoresList(parent), _scores(scores)
287 const ScoreInfos &s = internal->scoreInfos();
289 for (uint i=0; i<scores.size(); i++) addLine(s, i,
false);
292void TotalMultipleScoresList::addLineItem(
const ItemArray &si,
293 uint index, TQListViewItem *line)
295 const PlayerInfos &pi = internal->playerInfos();
297 for (uint i=0; i<4; i++) {
298 const ItemContainer *container;
299 if ( i==2 ) container = pi.item(
"nb games");
300 else if ( i==3 ) container = pi.item(
"mean score");
305 if (line) line->setText(i, itemText(*container, index));
308 (i==2 ? i18n(
"Won Games") : container->item()->label());
310 setColumnAlignment(i, container->item()->alignment());
315TQString TotalMultipleScoresList::itemText(
const ItemContainer &item,
318 TQString name = item.name();
319 if ( name==
"rank" )
return TQString::number(_scores.size()-row);
320 if ( name==
"nb games" )
321 return TQString::number( _scores[row].data(
"nb won games").toUInt() );
322 TQVariant v = _scores[row].data(name);
323 if ( name==
"name" )
return v.toString();
324 return item.item()->pretty(row, v);
329ConfigDialog::ConfigDialog(TQWidget *parent)
330 : KDialogBase(Swallow, i18n(
"Configure Highscores"),
331 Ok|Apply|Cancel, Cancel,
332 parent,
"configure_highscores", true, true),
335 TQWidget *page =
new TQWidget(
this);
338 TQGridLayout *pageTop =
339 new TQGridLayout(page, 2, 2, spacingHint(), spacingHint());
341 TQLabel *label =
new TQLabel(i18n(
"Nickname:"), page);
342 pageTop->addWidget(label, 0, 0);
343 _nickname =
new TQLineEdit(page);
344 connect(_nickname, TQ_SIGNAL(textChanged(
const TQString &)),
345 TQ_SLOT(modifiedSlot()));
346 connect(_nickname, TQ_SIGNAL(textChanged(
const TQString &)),
347 TQ_SLOT(nickNameChanged(
const TQString &)));
349 _nickname->setMaxLength(16);
350 pageTop->addWidget(_nickname, 0, 1);
352 label =
new TQLabel(i18n(
"Comment:"), page);
353 pageTop->addWidget(label, 1, 0);
354 _comment =
new TQLineEdit(page);
355 connect(_comment, TQ_SIGNAL(textChanged(
const TQString &)),
356 TQ_SLOT(modifiedSlot()));
357 _comment->setMaxLength(50);
358 pageTop->addWidget(_comment, 1, 1);
361 enableButtonOK( !_nickname->text().isEmpty() );
362 enableButtonApply(
false);
365void ConfigDialog::nickNameChanged(
const TQString &text)
367 enableButtonOK( !text.isEmpty() );
371void ConfigDialog::modifiedSlot()
373 enableButtonApply(
true && !_nickname->text().isEmpty() );
376void ConfigDialog::accept()
379 KDialogBase::accept();
380 tdeApp->config()->sync();
384void ConfigDialog::load()
387 const PlayerInfos &infos = internal->playerInfos();
388 _nickname->setText(infos.isAnonymous() ? TQString() : infos.name());
389 _comment->setText(infos.comment());
392bool ConfigDialog::save()
396 TQString newName = _nickname->text();
397 if ( newName.isEmpty() && !internal->playerInfos().isAnonymous() )
400 if ( newName.isEmpty() ) {
401 KMessageBox::sorry(
this, i18n(
"Please choose a non empty nickname."));
404 if ( internal->playerInfos().isNameUsed(newName) ) {
405 KMessageBox::sorry(
this, i18n(
"Nickname already in use. Please "
406 "choose another one"));
410 int res = internal->modifySettings(newName, _comment->text(),
this);
413 enableButtonApply(
false);
420AskNameDialog::AskNameDialog(TQWidget *parent)
421 : KDialogBase(Plain, i18n(
"Enter Your Nickname"), Ok | Cancel, Ok,
422 parent,
"ask_name_dialog")
424 internal->hsConfig().readCurrentConfig();
427 new TQVBoxLayout(plainPage(), marginHint(), spacingHint());
429 new TQLabel(i18n(
"Congratulations, you have won!"), plainPage());
430 top->addWidget(label);
432 TQHBoxLayout *hbox =
new TQHBoxLayout(top);
433 label =
new TQLabel(i18n(
"Enter your nickname:"), plainPage());
434 hbox->addWidget(label);
435 _edit =
new TQLineEdit(plainPage());
437 connect(_edit, TQ_SIGNAL(textChanged(
const TQString &)), TQ_SLOT(nameChanged()));
438 hbox->addWidget(_edit);
440 top->addSpacing(spacingHint());
441 _checkbox =
new TQCheckBox(i18n(
"Do not ask again."), plainPage());
442 top->addWidget(_checkbox);
447void AskNameDialog::nameChanged()
449 enableButtonOK( !name().isEmpty()
450 && !internal->playerInfos().isNameUsed(name()) );