kexthighscore.cpp

00001 /*
00002     This file is part of the KDE games library
00003     Copyright (C) 2001-2004 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., 51 Franklin Street, Fifth Floor,
00017     Boston, MA 02110-1301, 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::setTrackDrawGames(bool track)
00129 {
00130     internal->trackDrawGames = track;
00131 }
00132 
00133 void Manager::setShowStatistics(bool show)
00134 {
00135     internal->showStatistics = show;
00136 }
00137 
00138 void Manager::showStatistics(bool show)
00139 {
00140     internal->showStatistics = show;
00141 }
00142 
00143 void Manager::setShowDrawGamesStatistic(bool show)
00144 {
00145     internal->showDrawGames = show;
00146 }
00147 
00148 void Manager::setWWHighscores(const KURL &url, const QString &version)
00149 {
00150     Q_ASSERT( url.isValid() );
00151     internal->serverURL = url;
00152     const char *HS_WW_URL = "ww hs url";
00153     ConfigGroup cg;
00154     if ( cg.config()->hasKey(HS_WW_URL) )
00155         internal->serverURL = cg.config()->readEntry(HS_WW_URL);
00156     else cg.config()->writeEntry(HS_WW_URL, url.url());
00157     internal->version = version;
00158 }
00159 
00160 void Manager::setScoreHistogram(const QMemArray<uint> &scores,
00161                                 ScoreTypeBound type)
00162 {
00163     Q_ASSERT( scores.size()>=2 );
00164     for (uint i=0; i<scores.size()-1; i++)
00165         Q_ASSERT( scores[i]<scores[i+1] );
00166     internal->playerInfos().createHistoItems(scores, type==ScoreBound);
00167 }
00168 
00169 void Manager::setShowMode(ShowMode mode)
00170 {
00171     internal->showMode = mode;
00172 }
00173 
00174 void Manager::setScoreType(ScoreType type)
00175 {
00176     switch (type) {
00177     case Normal:
00178         return;
00179     case MinuteTime: {
00180         Item *item = createItem(ScoreDefault);
00181         item->setPrettyFormat(Item::MinuteTime);
00182         setScoreItem(0, item);
00183 
00184         item = createItem(MeanScoreDefault);
00185         item->setPrettyFormat(Item::MinuteTime);
00186         setPlayerItem(MeanScore, item);
00187 
00188         item = createItem(BestScoreDefault);
00189         item->setPrettyFormat(Item::MinuteTime);
00190         setPlayerItem(BestScore, item);
00191         return;
00192     }
00193     }
00194 }
00195 
00196 void Manager::submitLegacyScore(const Score &score) const
00197 {
00198     internal->submitLocal(score);
00199 }
00200 
00201 bool Manager::isStrictlyLess(const Score &s1, const Score &s2) const
00202 {
00203     return s1.score()<s2.score();
00204 }
00205 
00206 Item *Manager::createItem(ItemType type)
00207 {
00208     Item *item = 0;
00209     switch (type) {
00210     case ScoreDefault:
00211         item = new Item((uint)0, i18n("Score"), Qt::AlignRight);
00212         break;
00213     case MeanScoreDefault:
00214         item = new Item((double)0, i18n("Mean Score"), Qt::AlignRight);
00215         item->setPrettyFormat(Item::OneDecimal);
00216         item->setPrettySpecial(Item::DefaultNotDefined);
00217         break;
00218     case BestScoreDefault:
00219         item = new Item((uint)0, i18n("Best Score"), Qt::AlignRight);
00220         item->setPrettySpecial(Item::DefaultNotDefined);
00221         break;
00222     case ElapsedTime:
00223         item = new Item((uint)0, i18n("Elapsed Time"), Qt::AlignRight);
00224         item->setPrettyFormat(Item::MinuteTime);
00225         item->setPrettySpecial(Item::ZeroNotDefined);
00226         break;
00227     }
00228     return item;
00229 }
00230 
00231 void Manager::setScoreItem(uint worstScore, Item *item)
00232 {
00233     item->setDefaultValue(worstScore);
00234     internal->scoreInfos().setItem("score", item);
00235     internal->playerInfos().item("mean score")
00236         ->item()->setDefaultValue(double(worstScore));
00237     internal->playerInfos().item("best score")
00238         ->item()->setDefaultValue(worstScore);
00239 }
00240 
00241 void Manager::addScoreItem(const QString &name, Item *item)
00242 {
00243     internal->scoreInfos().addItem(name, item, true);
00244 }
00245 
00246 void Manager::setPlayerItem(PlayerItemType type, Item *item)
00247 {
00248     const Item *scoreItem = internal->scoreInfos().item("score")->item();
00249     uint def = scoreItem->defaultValue().toUInt();
00250     QString name;
00251     switch (type) {
00252     case MeanScore:
00253         name = "mean score";
00254         item->setDefaultValue(double(def));
00255         break;
00256     case BestScore:
00257         name = "best score";
00258         item->setDefaultValue(def);
00259         break;
00260     }
00261     internal->playerInfos().setItem(name, item);
00262 }
00263 
00264 QString Manager::gameTypeLabel(uint gameType, LabelType type) const
00265 {
00266     if ( gameType!=0 )
00267         kdFatal(11002) << "You need to reimplement KExtHighscore::Manager for "
00268                        << "multiple game types" << endl;
00269     switch (type) {
00270     case Icon:
00271     case Standard:
00272     case I18N:     break;
00273     case WW:       return "normal";
00274     }
00275     return QString::null;
00276 }
00277 
00278 void Manager::addToQueryURL(KURL &url, const QString &item,
00279                                const QString &content)
00280 {
00281     Q_ASSERT( !item.isEmpty() && url.queryItem(item).isNull() );
00282 
00283     QString query = url.query();
00284     if ( !query.isEmpty() ) query += '&';
00285     query += item + '=' + KURL::encode_string(content);
00286     url.setQuery(query);
00287 }
00288 
00289 } // namescape
KDE Home | KDE Accessibility Home | Description of Access Keys