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 }