libkdegames Library API Documentation

kexthighscore.cpp

00001 /*
00002     This file is part of the KDE games library
00003     Copyright (C) 2001-02 Nicolas Hadacek (hadacek@kde.org)
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License version 2 as published by the Free Software Foundation.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public License
00015     along with this library; see the file COPYING.LIB.  If not, write to
00016     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017     Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include "kexthighscore.h"
00021 
00022 #include <qlayout.h>
00023 
00024 #include <kdebug.h>
00025 
00026 #include "kexthighscore_internal.h"
00027 #include "kexthighscore_gui.h"
00028 
00029 
00030 namespace KExtHighscore
00031 {
00032 
00033 //-----------------------------------------------------------------------------
00034 ManagerPrivate *internal = 0;
00035 
00036 uint gameType()
00037 {
00038     internal->checkFirst();
00039     return internal->gameType();
00040 }
00041 
00042 void setGameType(uint type)
00043 {
00044     internal->setGameType(type);
00045 }
00046 
00047 bool configure(QWidget *parent)
00048 {
00049     internal->checkFirst();
00050     ConfigDialog *cd = new ConfigDialog(parent);
00051     cd->exec();
00052     bool saved = cd->hasBeenSaved();
00053     delete cd;
00054     return saved;
00055 }
00056 
00057 void show(QWidget *parent, int rank)
00058 {
00059     HighscoresDialog *hd = new HighscoresDialog(rank, parent);
00060     hd->exec();
00061     delete hd;
00062 }
00063 
00064 void submitScore(const Score &score, QWidget *widget)
00065 {
00066     int rank = internal->submitScore(score, widget,
00067                                      internal->showMode!=Manager::NeverShow);
00068 
00069     switch (internal->showMode) {
00070     case Manager::AlwaysShow:
00071         show(widget, -1);
00072         break;
00073     case Manager::ShowForHigherScore:
00074         if ( rank!=-1) show(widget, rank);
00075         break;
00076     case Manager::ShowForHighestScore:
00077         if ( rank==0 ) show(widget, rank);
00078         break;
00079     case Manager::NeverShow:
00080         break;
00081     }
00082 }
00083 
00084 void show(QWidget *widget)
00085 {
00086     internal->checkFirst();
00087     show(widget, -1);
00088 }
00089 
00090 Score lastScore()
00091 {
00092     internal->checkFirst();
00093     internal->hsConfig().readCurrentConfig();
00094     uint nb = internal->scoreInfos().maxNbEntries();
00095     return internal->readScore(nb-1);
00096 }
00097 
00098 Score firstScore()
00099 {
00100     internal->checkFirst();
00101     internal->hsConfig().readCurrentConfig();
00102     return internal->readScore(0);
00103 }
00104 
00105 
00106 //-----------------------------------------------------------------------------
00107 Manager::Manager(uint nbGameTypes, uint maxNbEntries)
00108 {
00109     Q_ASSERT(nbGameTypes);
00110     Q_ASSERT(maxNbEntries);
00111     if (internal)
00112         kdFatal(11002) << "A highscore object already exists" << endl;
00113     internal = new ManagerPrivate(nbGameTypes, *this);
00114     internal->init(maxNbEntries);
00115 }
00116 
00117 Manager::~Manager()
00118 {
00119     delete internal;
00120     internal = 0;
00121 }
00122 
00123 void Manager::setTrackLostGames(bool track)
00124 {
00125     internal->trackLostGames = track;
00126 }
00127 
00128 void Manager::showStatistics(bool show)
00129 {
00130     internal->showStatistics = show;
00131 }
00132 
00133 void Manager::setWWHighscores(const KURL &url, const QString &version)
00134 {
00135     Q_ASSERT( url.isValid() );
00136     internal->serverURL = url;
00137     const char *HS_WW_URL = "ww hs url";
00138     ConfigGroup cg;
00139     if ( cg.config()->hasKey(HS_WW_URL) )
00140         internal->serverURL = cg.config()->readEntry(HS_WW_URL);
00141     else cg.config()->writeEntry(HS_WW_URL, url.url());
00142     internal->version = version;
00143 }
00144 
00145 void Manager::setScoreHistogram(const QMemArray<uint> &scores,
00146                                 ScoreTypeBound type)
00147 {
00148     Q_ASSERT( scores.size()>=2 );
00149     for (uint i=0; i<scores.size()-1; i++)
00150         Q_ASSERT( scores[i]<scores[i+1] );
00151     internal->playerInfos().createHistoItems(scores, type==ScoreBound);
00152 }
00153 
00154 void Manager::setShowMode(ShowMode mode)
00155 {
00156     internal->showMode = mode;
00157 }
00158 
00159 void Manager::setScoreType(ScoreType type)
00160 {
00161     switch (type) {
00162     case Normal:
00163         return;
00164     case MinuteTime: {
00165         Item *item = createItem(ScoreDefault);
00166         item->setPrettyFormat(Item::MinuteTime);
00167         setScoreItem(0, item);
00168 
00169         item = createItem(MeanScoreDefault);
00170         item->setPrettyFormat(Item::MinuteTime);
00171         setPlayerItem(MeanScore, item);
00172 
00173         item = createItem(BestScoreDefault);
00174         item->setPrettyFormat(Item::MinuteTime);
00175         setPlayerItem(BestScore, item);
00176         return;
00177     }
00178     }
00179 }
00180 
00181 void Manager::submitLegacyScore(const Score &score) const
00182 {
00183     internal->submitLocal(score);
00184 }
00185 
00186 bool Manager::isStrictlyLess(const Score &s1, const Score &s2) const
00187 {
00188     return s1.score()<s2.score();
00189 }
00190 
00191 Item *Manager::createItem(ItemType type)
00192 {
00193     Item *item = 0;
00194     switch (type) {
00195     case ScoreDefault:
00196         item = new Item((uint)0, i18n("Score"), Qt::AlignRight);
00197         break;
00198     case MeanScoreDefault:
00199         item = new Item((double)0, i18n("Mean Score"), Qt::AlignRight);
00200         item->setPrettyFormat(Item::OneDecimal);
00201         item->setPrettySpecial(Item::DefaultNotDefined);
00202         break;
00203     case BestScoreDefault:
00204         item = new Item((uint)0, i18n("Best Score"), Qt::AlignRight);
00205         item->setPrettySpecial(Item::DefaultNotDefined);
00206         break;
00207     case ElapsedTime:
00208         item = new Item((uint)0, i18n("Elapsed Time"), Qt::AlignRight);
00209         item->setPrettyFormat(Item::MinuteTime);
00210         item->setPrettySpecial(Item::ZeroNotDefined);
00211         break;
00212     }
00213     return item;
00214 }
00215 
00216 void Manager::setScoreItem(uint worstScore, Item *item)
00217 {
00218     item->setDefaultValue(worstScore);
00219     internal->scoreInfos().setItem("score", item);
00220     internal->playerInfos().item("mean score")
00221         ->item()->setDefaultValue(double(worstScore));
00222     internal->playerInfos().item("best score")
00223         ->item()->setDefaultValue(worstScore);
00224 }
00225 
00226 void Manager::addScoreItem(const QString &name, Item *item)
00227 {
00228     internal->scoreInfos().addItem(name, item, true);
00229 }
00230 
00231 void Manager::setPlayerItem(PlayerItemType type, Item *item)
00232 {
00233     const Item *scoreItem = internal->scoreInfos().item("score")->item();
00234     uint def = scoreItem->defaultValue().toUInt();
00235     QString name;
00236     switch (type) {
00237     case MeanScore:
00238         name = "mean score";
00239         item->setDefaultValue(double(def));
00240         break;
00241     case BestScore:
00242         name = "best score";
00243         item->setDefaultValue(def);
00244         break;
00245     }
00246     internal->playerInfos().setItem(name, item);
00247 }
00248 
00249 QString Manager::gameTypeLabel(uint gameType, LabelType type) const
00250 {
00251     if ( gameType!=0 )
00252         kdFatal(11002) << "You need to reimplement KExtHighscore::Manager for "
00253                        << "multiple game types" << endl;
00254     switch (type) {
00255     case Icon:
00256     case Standard:
00257     case I18N:     break;
00258     case WW:       return "normal";
00259     }
00260     return QString::null;
00261 }
00262 
00263 void Manager::addToQueryURL(KURL &url, const QString &item,
00264                                const QString &content)
00265 {
00266     Q_ASSERT( !item.isEmpty() && url.queryItem(item).isNull() );
00267 
00268     QString query = url.query();
00269     if ( !query.isEmpty() ) query += '&';
00270     query += item + '=' + KURL::encode_string(content);
00271     url.setQuery(query);
00272 }
00273 
00274 } // namescape
KDE Logo
This file is part of the documentation for libkdegames Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 10:06:36 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003