00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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 }