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::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 }