libkdegames Library API Documentation

kscoredialog.cpp

00001 /**************************************************************** 00002 Copyright (c) 1998 Sandro Sigala <ssigala@globalnet.it>. 00003 Copyright (c) 2001 Waldo Bastian <bastian@kde.org> 00004 All rights reserved. 00005 00006 Permission to use, copy, modify, and distribute this software 00007 and its documentation for any purpose and without fee is hereby 00008 granted, provided that the above copyright notice appear in all 00009 copies and that both that the copyright notice and this 00010 permission notice and warranty disclaimer appear in supporting 00011 documentation, and that the name of the author not be used in 00012 advertising or publicity pertaining to distribution of the 00013 software without specific, written prior permission. 00014 00015 The author disclaim all warranties with regard to this 00016 software, including all implied warranties of merchantability 00017 and fitness. In no event shall the author be liable for any 00018 special, indirect or consequential damages or any damages 00019 whatsoever resulting from loss of use, data or profits, whether 00020 in an action of contract, negligence or other tortious action, 00021 arising out of or in connection with the use or performance of 00022 this software. 00023 ****************************************************************/ 00024 00025 #include "config.h" 00026 00027 #include <qlabel.h> 00028 #include <qlayout.h> 00029 #include <qlineedit.h> 00030 #include <qwidgetstack.h> 00031 #include <qtimer.h> 00032 #include <qevent.h> 00033 #include <qptrvector.h> 00034 00035 #include <kapplication.h> 00036 #include <kconfig.h> 00037 #include <klocale.h> 00038 #include <kseparator.h> 00039 00040 #include "kscoredialog.h" 00041 00042 class KScoreDialog::KScoreDialogPrivate 00043 { 00044 public: 00045 QPtrList<FieldInfo> scores; 00046 QWidget *page; 00047 QGridLayout *layout; 00048 QLineEdit *edit; 00049 QPtrVector<QWidgetStack> stack; 00050 QPtrVector<QLabel> labels; 00051 QLabel *commentLabel; 00052 QString comment; 00053 int fields; 00054 int newName; 00055 int latest; 00056 int nrCols; 00057 bool loaded; 00058 QString configGroup; 00059 00060 QMap<int, int> col; 00061 QMap<int, QString> header; 00062 QMap<int, QString> key; 00063 QString player; 00064 }; 00065 00066 00067 KScoreDialog::KScoreDialog(int fields, QWidget *parent, const char *oname) 00068 : KDialogBase(parent, oname, true, i18n("High Scores"), Ok, Ok, true) 00069 { 00070 d = new KScoreDialogPrivate(); 00071 d->edit = 0; 00072 d->fields = fields; 00073 d->newName = -1; 00074 d->latest = -1; 00075 d->loaded = false; 00076 d->nrCols = 0; 00077 d->configGroup = "High Score"; 00078 00079 d->scores.setAutoDelete(true); 00080 d->header[Name] = i18n("Name"); 00081 d->key[Name] = "Name"; 00082 00083 d->header[Level] = i18n("Level"); 00084 d->key[Level] = "Level"; 00085 00086 d->header[Score] = i18n("Score"); 00087 d->key[Score] = "Score"; 00088 d->page = makeMainWidget(); 00089 00090 connect(this, SIGNAL(okClicked()), SLOT(slotGotName())); 00091 } 00092 00093 KScoreDialog::~KScoreDialog() 00094 { 00095 delete d; 00096 } 00097 00098 void KScoreDialog::setConfigGroup(const QString &group) 00099 { 00100 d->configGroup = group; 00101 d->loaded = false; 00102 } 00103 00104 void KScoreDialog::setComment(const QString &comment) 00105 { 00106 d->comment = comment; 00107 } 00108 00109 void KScoreDialog::addField(int field, const QString &header, const QString &key) 00110 { 00111 d->fields |= field; 00112 d->header[field] = header; 00113 d->key[field] = key; 00114 } 00115 00116 void KScoreDialog::setupDialog() 00117 { 00118 d->nrCols = 1; 00119 00120 for(int field = 1; field < d->fields; field = field * 2) 00121 { 00122 if (d->fields & field) 00123 d->col[field] = d->nrCols++; 00124 } 00125 00126 d->layout = new QGridLayout(d->page, 15, d->nrCols, marginHint() + 20, spacingHint()); 00127 d->layout->addRowSpacing(4, 15); 00128 00129 d->commentLabel = new QLabel(d->page); 00130 d->commentLabel->setAlignment(AlignVCenter | AlignHCenter); 00131 d->layout->addMultiCellWidget(d->commentLabel, 1, 1, 0, d->nrCols-1); 00132 00133 QFont bold = font(); 00134 bold.setBold(true); 00135 00136 QLabel *label; 00137 d->layout->addColSpacing(0, 50); 00138 label = new QLabel(i18n("Rank"), d->page); 00139 d->layout->addWidget(label, 3, 0); 00140 label->setFont(bold); 00141 00142 for(int field = 1; field < d->fields; field = field * 2) 00143 { 00144 if (d->fields & field) 00145 { 00146 d->layout->addColSpacing(d->col[field], 50); 00147 00148 label = new QLabel(d->header[field], d->page); 00149 d->layout->addWidget(label, 3, d->col[field], field <= Name ? AlignLeft : AlignRight); 00150 label->setFont(bold); 00151 } 00152 } 00153 00154 KSeparator *sep = new KSeparator(Horizontal, d->page); 00155 d->layout->addMultiCellWidget(sep, 4, 4, 0, d->nrCols-1); 00156 00157 d->labels.resize(d->nrCols * 10); 00158 d->stack.resize(10); 00159 00160 QString num; 00161 for (int i = 1; i <= 10; ++i) { 00162 QLabel *label; 00163 num.setNum(i); 00164 label = new QLabel("#"+num, d->page); 00165 d->labels.insert((i-1)*d->nrCols + 0, label); 00166 d->layout->addWidget(label, i+4, 0); 00167 if (d->fields & Name) 00168 { 00169 QWidgetStack *stack = new QWidgetStack(d->page); 00170 d->stack.insert(i-1, stack); 00171 d->layout->addWidget(stack, i+4, d->col[Name]); 00172 label = new QLabel(d->page); 00173 d->labels.insert((i-1)*d->nrCols + d->col[Name], label); 00174 stack->addWidget(label); 00175 stack->raiseWidget(label); 00176 } 00177 for(int field = Name * 2; field < d->fields; field = field * 2) 00178 { 00179 if (d->fields & field) 00180 { 00181 label = new QLabel(d->page); 00182 d->labels.insert((i-1)*d->nrCols + d->col[field], label); 00183 d->layout->addWidget(label, i+4, d->col[field], AlignRight); 00184 } 00185 } 00186 } 00187 } 00188 00189 void KScoreDialog::aboutToShow() 00190 { 00191 if (!d->loaded) 00192 loadScores(); 00193 00194 if (!d->nrCols) 00195 setupDialog(); 00196 00197 d->commentLabel->setText(d->comment); 00198 if (d->comment.isEmpty()) 00199 { 00200 d->commentLabel->setMinimumSize(QSize(1,1)); 00201 d->commentLabel->hide(); 00202 d->layout->addRowSpacing(0, -15); 00203 d->layout->addRowSpacing(2, -15); 00204 } 00205 else 00206 { 00207 d->commentLabel->setMinimumSize(d->commentLabel->sizeHint()); 00208 d->commentLabel->show(); 00209 d->layout->addRowSpacing(0, -10); 00210 d->layout->addRowSpacing(2, 10); 00211 } 00212 d->comment = QString::null; 00213 00214 QFont normal = font(); 00215 QFont bold = normal; 00216 bold.setBold(true); 00217 00218 QString num; 00219 for (int i = 1; i <= 10; ++i) { 00220 QLabel *label; 00221 num.setNum(i); 00222 FieldInfo *score = d->scores.at(i-1); 00223 label = d->labels[(i-1)*d->nrCols + 0]; 00224 if (i == d->latest) 00225 label->setFont(bold); 00226 else 00227 label->setFont(normal); 00228 00229 if (d->fields & Name) 00230 { 00231 if (d->newName == i) 00232 { 00233 QWidgetStack *stack = d->stack[i-1]; 00234 d->edit = new QLineEdit(d->player, stack); 00235 d->edit->setMinimumWidth(40); 00236 stack->addWidget(d->edit); 00237 stack->raiseWidget(d->edit); 00238 d->edit->setFocus(); 00239 connect(d->edit, SIGNAL(returnPressed()), 00240 this, SLOT(slotGotReturn())); 00241 } 00242 else 00243 { 00244 label = d->labels[(i-1)*d->nrCols + d->col[Name]]; 00245 if (i == d->latest) 00246 label->setFont(bold); 00247 else 00248 label->setFont(normal); 00249 label->setText((*score)[Name]); 00250 } 00251 00252 } 00253 for(int field = Name * 2; field < d->fields; field = field * 2) 00254 { 00255 if (d->fields & field) 00256 { 00257 label = d->labels[(i-1)*d->nrCols + d->col[field]]; 00258 if (i == d->latest) 00259 label->setFont(bold); 00260 else 00261 label->setFont(normal); 00262 label->setText((*score)[field]); 00263 } 00264 } 00265 } 00266 d->latest = -1; 00267 setFixedSize(minimumSizeHint()); 00268 } 00269 00270 void KScoreDialog::loadScores() 00271 { 00272 QString key, value; 00273 d->loaded = true; 00274 d->scores.clear(); 00275 KConfigGroup config(kapp->config(), d->configGroup.utf8()); 00276 00277 d->player = config.readEntry("LastPlayer"); 00278 00279 QString num; 00280 for (int i = 1; i <= 10; ++i) { 00281 num.setNum(i); 00282 FieldInfo *score = new FieldInfo(); 00283 for(int field = 1; field < d->fields; field = field * 2) 00284 { 00285 if (d->fields & field) 00286 { 00287 key = "Pos" + num + d->key[field]; 00288 (*score)[field] = config.readEntry(key, "-"); 00289 } 00290 } 00291 d->scores.append(score); 00292 } 00293 } 00294 00295 void KScoreDialog::saveScores() 00296 { 00297 QString key, value; 00298 KConfigGroup config(kapp->config(), d->configGroup.utf8()); 00299 00300 config.writeEntry("LastPlayer", d->player); 00301 00302 QString num; 00303 for (int i = 1; i <= 10; ++i) { 00304 num.setNum(i); 00305 FieldInfo *score = d->scores.at(i-1); 00306 for(int field = 1; field < d->fields; field = field * 2) 00307 { 00308 if (d->fields & field) 00309 { 00310 key = "Pos" + num + d->key[field]; 00311 config.writeEntry(key, (*score)[field]); 00312 } 00313 } 00314 } 00315 kapp->config()->sync(); 00316 } 00317 00318 int KScoreDialog::addScore(int newScore, const FieldInfo &newInfo, bool askName) 00319 { 00320 return addScore(newScore, newInfo, askName, false); 00321 } 00322 00323 int KScoreDialog::addScore(int newScore, const FieldInfo &newInfo, bool askName, bool lessIsMore) 00324 { 00325 if (!d->loaded) 00326 loadScores(); 00327 FieldInfo *score = d->scores.first(); 00328 int i = 1; 00329 for(; score; score = d->scores.next(), i++) 00330 { 00331 bool ok; 00332 int num_score = (*score)[Score].toLong(&ok); 00333 if (lessIsMore && !ok) 00334 num_score = 1 << 30; 00335 if (((newScore > num_score) && !lessIsMore) || 00336 ((newScore < num_score) && lessIsMore)) 00337 { 00338 score = new FieldInfo(newInfo); 00339 (*score)[Score].setNum(newScore); 00340 d->scores.insert(i-1, score); 00341 d->scores.remove(10); 00342 d->latest = i; 00343 if (askName) 00344 d->newName = i; 00345 else 00346 saveScores(); 00347 if (i == 1) 00348 d->comment = i18n("Excellent!\nYou have a new high score!"); 00349 else 00350 d->comment = i18n("Well done!\nYou made it to the high score list!"); 00351 return i; 00352 } 00353 } 00354 return 0; 00355 } 00356 00357 void KScoreDialog::show() 00358 { 00359 aboutToShow(); 00360 KDialogBase::show(); 00361 } 00362 00363 void KScoreDialog::slotGotReturn() 00364 { 00365 QTimer::singleShot(0, this, SLOT(slotGotName())); 00366 } 00367 00368 void KScoreDialog::slotGotName() 00369 { 00370 if (d->newName == -1) return; 00371 00372 d->player = d->edit->text(); 00373 00374 (*d->scores.at(d->newName-1))[Name] = d->player; 00375 saveScores(); 00376 00377 QFont bold = font(); 00378 bold.setBold(true); 00379 00380 QLabel *label = d->labels[(d->newName-1)*d->nrCols + d->col[Name]]; 00381 label->setFont(bold); 00382 label->setText(d->player); 00383 d->stack[(d->newName-1)]->raiseWidget(label); 00384 delete d->edit; 00385 d->edit = 0; 00386 d->newName = -1; 00387 } 00388 00389 int KScoreDialog::highScore() 00390 { 00391 if (!d->loaded) 00392 loadScores(); 00393 00394 return (*d->scores.first())[Score].toInt(); 00395 } 00396 00397 void KScoreDialog::keyPressEvent( QKeyEvent *ev) 00398 { 00399 if ((d->newName != -1) && (ev->key() == Key_Return)) 00400 { 00401 ev->ignore(); 00402 return; 00403 } 00404 KDialogBase::keyPressEvent(ev); 00405 } 00406 00407 00408 #include "kscoredialog.moc"
KDE Logo
This file is part of the documentation for libkdegames Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Sep 21 12:08:03 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003