# HG changeset patch # User burp # Date 1283198741 -7200 # Node ID 46e6fa2cdbc62b72a92414d30cf6f0e34455d832 # Parent dd9345e74b66831c5d617c84f112011fdd719b92# Parent 9aa8a832e29684fffaaa9e2b33522c4f9ac8544a o0 merge diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/hedgewars.qrc --- a/QTfrontend/hedgewars.qrc Mon Aug 30 06:33:56 2010 +0200 +++ b/QTfrontend/hedgewars.qrc Mon Aug 30 22:05:41 2010 +0200 @@ -96,5 +96,18 @@ res/follow.png res/info.png res/kick.png + res/StatsMedal1.png + res/StatsMedal2.png + res/StatsMedal3.png + res/StatsMedal4.png + res/StatsR.png + res/StatsH.png + res/StatsD.png + res/StatsBestKiller.png + res/StatsBestShot.png + res/StatsHedgehogsKilled.png + res/StatsMostSelfDamage.png + res/StatsSelfKilled.png + res/StatsSkipped.png diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/pages.cpp --- a/QTfrontend/pages.cpp Mon Aug 30 06:33:56 2010 +0200 +++ b/QTfrontend/pages.cpp Mon Aug 30 22:05:41 2010 +0200 @@ -1063,22 +1063,81 @@ roomsList->setAlternatingRowColors(true); pageLayout->addWidget(roomsList, 1, 0, 3, 1); pageLayout->setRowStretch(2, 100); + + QHBoxLayout * filterLayout = new QHBoxLayout(); + + QLabel * stateLabel = new QLabel(this); + stateLabel->setText(tr("State:")); + CBState = new QComboBox(this); + CBState->addItem(QComboBox::tr("Any")); + CBState->addItem(QComboBox::tr("In lobby")); + CBState->addItem(QComboBox::tr("In progress")); + filterLayout->addWidget(stateLabel); + filterLayout->addWidget(CBState); + filterLayout->addSpacing(30); + + QLabel * ruleLabel = new QLabel(this); + ruleLabel->setText(tr("Rules:")); + CBRules = new QComboBox(this); + CBRules->addItem(QComboBox::tr("Any")); + CBRules->addItem(QComboBox::tr("Default")); + CBRules->addItem(QComboBox::tr("Pro mode")); + CBRules->addItem(QComboBox::tr("Shoppa")); + CBRules->addItem(QComboBox::tr("Basketball")); + CBRules->addItem(QComboBox::tr("Minefield")); + CBRules->addItem(QComboBox::tr("Barrel mayhem")); + CBRules->addItem(QComboBox::tr("Tunnel hogs")); + filterLayout->addWidget(ruleLabel); + filterLayout->addWidget(CBRules); + filterLayout->addSpacing(30); + + QLabel * weaponLabel = new QLabel(this); + weaponLabel->setText(tr("Weapons:")); + CBWeapons = new QComboBox(this); + CBWeapons->addItem(QComboBox::tr("Any")); + CBWeapons->addItem(QComboBox::tr("Basketball")); + CBWeapons->addItem(QComboBox::tr("Crazy")); + CBWeapons->addItem(QComboBox::tr("Default")); + CBWeapons->addItem(QComboBox::tr("Minefield")); + CBWeapons->addItem(QComboBox::tr("Pro mode")); + CBWeapons->addItem(QComboBox::tr("Shoppa")); + filterLayout->addWidget(weaponLabel); + filterLayout->addWidget(CBWeapons); + filterLayout->addSpacing(30); + + QLabel * searchLabel = new QLabel(this); + searchLabel->setText(tr("Search:")); + searchText = new QLineEdit(this); + searchText->setMaxLength(60); + filterLayout->addWidget(searchLabel); + filterLayout->addWidget(searchText); + + pageLayout->addLayout(filterLayout, 4, 0); chatWidget = new HWChatWidget(this, gameSettings, sdli, false); - pageLayout->addWidget(chatWidget, 4, 0, 1, 2); - pageLayout->setRowStretch(4, 350); + pageLayout->addWidget(chatWidget, 5, 0, 1, 2); + pageLayout->setRowStretch(5, 350); BtnCreate = addButton(tr("Create"), pageLayout, 0, 1); BtnJoin = addButton(tr("Join"), pageLayout, 1, 1); BtnRefresh = addButton(tr("Refresh"), pageLayout, 3, 1); + BtnClear = addButton(tr("Clear"), pageLayout, 4, 1); - BtnBack = addButton(":/res/Exit.png", pageLayout, 5, 0, true); - BtnAdmin = addButton(tr("Admin features"), pageLayout, 5, 1); + BtnBack = addButton(":/res/Exit.png", pageLayout, 6, 0, true); + BtnAdmin = addButton(tr("Admin features"), pageLayout, 6, 1); connect(BtnCreate, SIGNAL(clicked()), this, SLOT(onCreateClick())); connect(BtnJoin, SIGNAL(clicked()), this, SLOT(onJoinClick())); connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick())); + connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick())); connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick())); + connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick())); + connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection); + + gameInLobby = false; } void PageRoomsList::setAdmin(bool flag) @@ -1088,6 +1147,8 @@ void PageRoomsList::setRoomsList(const QStringList & list) { + listFromServer = list; + roomsList->clear(); roomsList->setColumnCount(7); roomsList->setHorizontalHeaderLabels( @@ -1113,12 +1174,45 @@ // set resize modes // roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive); + bool gameCanBeJoined = true; + if (list.size() % 8) return; roomsList->setRowCount(list.size() / 8); for(int i = 0, r = 0; i < list.size(); i += 8, r++) { + // if we are joining a game + if (gameInLobby) { + if (gameInLobbyName == list[i + 1]) { + gameCanBeJoined = list[i].compare("True"); + } + } + + // check filter settings + #define NO_FILTER_MATCH roomsList->setRowCount(roomsList->rowCount() - 1); --r; continue + + if (list[i].compare("True") && CBState->currentIndex() == 2) { NO_FILTER_MATCH; } + if (list[i].compare("False") && CBState->currentIndex() == 1) { NO_FILTER_MATCH; } + if (CBRules->currentIndex() != 0 && list[i + 6].compare(CBRules->currentText())) { NO_FILTER_MATCH; } + if (CBWeapons->currentIndex() != 0 && list[i + 7].compare(CBWeapons->currentText())) { NO_FILTER_MATCH; } + bool found = list[i + 1].contains(searchText->text(), Qt::CaseInsensitive); + if (!found) { + for (int a = 4; a <= 7; ++a) { + QString compString = list[i + a]; + if (a == 5 && compString == "+rnd+") { + compString = "Random Map"; + } else if (a == 5 && compString == "+maze+") { + compString = "Random Maze"; + } + if (compString.contains(searchText->text(), Qt::CaseInsensitive)) { + found = true; + break; + } + } + } + if (!searchText->text().isEmpty() && !found) { NO_FILTER_MATCH; } + QTableWidgetItem * item; item = new QTableWidgetItem(list[i + 1]); // room name item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); @@ -1191,6 +1285,15 @@ roomsList->horizontalHeader()->setResizeMode(5, QHeaderView::ResizeToContents); roomsList->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents); + if (gameInLobby) { + gameInLobby = false; + if (gameCanBeJoined) { + emit askForJoinRoom(gameInLobbyName); + } else { + emit askJoinConfirmation(gameInLobbyName); + } + } + // roomsList->resizeColumnsToContents(); } @@ -1214,9 +1317,22 @@ tr("Error"), tr("Please select room from the list"), tr("OK")); - return ; + return; } - emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString()); + + for (int i = 0; i < listFromServer.size(); i += 8) { + if (listFromServer[i + 1] == curritem->data(Qt::DisplayRole).toString()) { + gameInLobby = listFromServer[i].compare("True"); + break; + } + } + + if (gameInLobby) { + gameInLobbyName = curritem->data(Qt::DisplayRole).toString(); + emit askForRoomList(); + } else { + emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString()); + } } void PageRoomsList::onRefreshClick() @@ -1224,6 +1340,24 @@ emit askForRoomList(); } +void PageRoomsList::onClearClick() +{ + CBState->setCurrentIndex(0); + CBRules->setCurrentIndex(0); + CBWeapons->setCurrentIndex(0); + searchText->clear(); +} + +void PageRoomsList::onJoinConfirmation(const QString & room) +{ + if (QMessageBox::warning(this, + tr("Warning"), + tr("The game you are trying to join has started.\nDo you still want to join the room?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) + { + emit askForJoinRoom(room); + } +} PageConnecting::PageConnecting(QWidget* parent) : AbstractPage(parent) diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/pages.h --- a/QTfrontend/pages.h Mon Aug 30 06:33:56 2010 +0200 +++ b/QTfrontend/pages.h Mon Aug 30 22:05:41 2010 +0200 @@ -397,14 +397,24 @@ PageRoomsList(QWidget* parent, QSettings * config, SDLInteraction * sdli); QLineEdit * roomName; + QLineEdit * searchText; QTableWidget * roomsList; QPushButton * BtnBack; QPushButton * BtnCreate; QPushButton * BtnJoin; QPushButton * BtnRefresh; QPushButton * BtnAdmin; + QPushButton * BtnClear; + QComboBox * CBState; + QComboBox * CBRules; + QComboBox * CBWeapons; HWChatWidget * chatWidget; +private: + bool gameInLobby; + QString gameInLobbyName; + QStringList listFromServer; + public slots: void setRoomsList(const QStringList & list); void setAdmin(bool); @@ -413,11 +423,14 @@ void onCreateClick(); void onJoinClick(); void onRefreshClick(); + void onClearClick(); + void onJoinConfirmation(const QString &); signals: void askForCreateRoom(const QString &); void askForJoinRoom(const QString &); void askForRoomList(); + void askJoinConfirmation(const QString &); }; class PageConnecting : public AbstractPage diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsBestKiller.png Binary file QTfrontend/res/StatsBestKiller.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsBestShot.png Binary file QTfrontend/res/StatsBestShot.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsD.png Binary file QTfrontend/res/StatsD.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsH.png Binary file QTfrontend/res/StatsH.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsHedgehogsKilled.png Binary file QTfrontend/res/StatsHedgehogsKilled.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsMedal1.png Binary file QTfrontend/res/StatsMedal1.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsMedal2.png Binary file QTfrontend/res/StatsMedal2.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsMedal3.png Binary file QTfrontend/res/StatsMedal3.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsMedal4.png Binary file QTfrontend/res/StatsMedal4.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsMostSelfDamage.png Binary file QTfrontend/res/StatsMostSelfDamage.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsR.png Binary file QTfrontend/res/StatsR.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsSelfKilled.png Binary file QTfrontend/res/StatsSelfKilled.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/res/StatsSkipped.png Binary file QTfrontend/res/StatsSkipped.png has changed diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/statsPage.cpp --- a/QTfrontend/statsPage.cpp Mon Aug 30 06:33:56 2010 +0200 +++ b/QTfrontend/statsPage.cpp Mon Aug 30 22:05:41 2010 +0200 @@ -19,7 +19,8 @@ #include #include #include - +#include +#include #include "statsPage.h" #include "team.h" @@ -36,20 +37,59 @@ PageGameStats::PageGameStats(QWidget* parent) : AbstractPage(parent) { QGridLayout * pageLayout = new QGridLayout(this); + pageLayout->setSpacing(20); pageLayout->setColumnStretch(0, 1); pageLayout->setColumnStretch(1, 1); - pageLayout->setColumnStretch(2, 1); + + BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true); + BtnBack->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true); + QGroupBox * gb = new QGroupBox(this); + QVBoxLayout * gbl = new QVBoxLayout; + // details labelGameStats = new QLabel(this); + QLabel * l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText(PageGameStats::tr("

Details

")); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); labelGameStats->setTextFormat(Qt::RichText); - pageLayout->addWidget(labelGameStats, 0, 0, 1, 3); - - graphic = new FitGraphicsView(this); + labelGameStats->setAlignment(Qt::AlignTop); + gbl->addWidget(l); + gbl->addWidget(labelGameStats); + gb->setLayout(gbl); + pageLayout->addWidget(gb, 1, 1); + + // graph + graphic = new FitGraphicsView(gb); + l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText(PageGameStats::tr("

Health graph

")); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + gbl->addWidget(l); + gbl->addWidget(graphic); graphic->scale(1.0, -1.0); graphic->setBackgroundBrush(QBrush(Qt::black)); - pageLayout->addWidget(graphic, 1, 0, 1, 3); + + labelGameWin = new QLabel(this); + labelGameWin->setTextFormat(Qt::RichText); + pageLayout->addWidget(labelGameWin, 0, 0, 1, 2); + + // ranking box + gb = new QGroupBox(this); + gbl = new QVBoxLayout; + labelGameRank = new QLabel(gb); + l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText(PageGameStats::tr("

Ranking

")); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + gbl->addWidget(l); + gbl->addWidget(labelGameRank); + gb->setLayout(gbl); + + labelGameRank->setTextFormat(Qt::RichText); + labelGameRank->setAlignment(Qt::AlignTop); + pageLayout->addWidget(gb, 1, 0); } void PageGameStats::AddStatText(const QString & msg) @@ -61,6 +101,9 @@ { labelGameStats->setText(""); healthPoints.clear(); + labelGameRank->setText(""); + playerPosition = 0; + lastColor = 0; } void PageGameStats::renderStats() @@ -93,12 +136,12 @@ { switch(type) { case 'r' : { - AddStatText(QString("

%1

").arg(info)); + labelGameWin->setText(QString("

%1

").arg(info)); break; } case 'D' : { int i = info.indexOf(' '); - QString message = PageGameStats::tr("

The best shot award was won by %1 with %2 pts.

") + QString message = PageGameStats::tr("

The best shot award was won by %1 with %2 pts.

") .arg(info.mid(i + 1), info.left(i)); AddStatText(message); break; @@ -106,14 +149,14 @@ case 'k' : { int i = info.indexOf(' '); int num = info.left(i).toInt(); - QString message = PageGameStats::tr("

The best killer is %1 with %2 kills in a turn.

", "", num) + QString message = PageGameStats::tr("

The best killer is %1 with %2 kills in a turn.

", "", num) .arg(info.mid(i + 1), info.left(i)); AddStatText(message); break; } case 'K' : { int num = info.toInt(); - QString message = PageGameStats::tr("

A total of %1 hedgehog(s) were killed during this round.

", "", num).arg(num); + QString message = PageGameStats::tr("

A total of %1 hedgehog(s) were killed during this round.

", "", num).arg(num); AddStatText(message); break; } @@ -136,6 +179,74 @@ team.Wins++; // should draws count as wins? //team.SaveToFile(); // don't save yet } + break; } + + case 'P' : { + int i = info.indexOf(' '); + playerPosition++; + QString color = info.left(i); + quint32 c = color.toInt(); + QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255)); + + QString playerinfo = info.mid(i + 1); + + i = playerinfo.indexOf(' '); + + QString kills = playerinfo.left(i); + QString playername = playerinfo.mid(i + 1); + QString image; + + if (lastColor == c && playerPosition <= 2) playerPosition = 1; + lastColor = c; + + switch (playerPosition) + { + case 1: + image = ""; + break; + case 2: + image = ""; + break; + case 3: + image = ""; + break; + default: + image = ""; + break; + } + + QString message; + if (kills.toInt() == 1) + { + message = PageGameStats::tr("

%1 %2. %3 (%4 kill).

").arg(image, QString::number(playerPosition), playername, kills, clanColor.name()); + } else { + message = PageGameStats::tr("

%1 %2. %3 (%4 kills).

").arg(image, QString::number(playerPosition), playername, kills, clanColor.name()); + } + labelGameRank->setText(labelGameRank->text() + message); + break; + } + case 's' : { + int i = info.indexOf(' '); + QString message = PageGameStats::tr("

%1 thought it's good to shoot his own hedgehogs with %2 pts.

") + .arg(info.mid(i + 1), info.left(i)); + AddStatText(message); + break; + } + case 'S' : { + int i = info.indexOf(' '); + QString message = PageGameStats::tr("

%1 killed %2 of his own hedgehogs.

") + .arg(info.mid(i + 1), info.left(i)); + AddStatText(message); + break; + } + case 'B' : { + int i = info.indexOf(' '); + QString message = PageGameStats::tr("

%1 was scared and skipped turn %2 times.

") + .arg(info.mid(i + 1), info.left(i)); + AddStatText(message); + break; + } + } } diff -r dd9345e74b66 -r 46e6fa2cdbc6 QTfrontend/statsPage.h --- a/QTfrontend/statsPage.h Mon Aug 30 06:33:56 2010 +0200 +++ b/QTfrontend/statsPage.h Mon Aug 30 22:05:41 2010 +0200 @@ -44,6 +44,8 @@ QPushButton *BtnBack; QLabel *labelGameStats; + QLabel *labelGameWin; + QLabel *labelGameRank; FitGraphicsView * graphic; public slots: @@ -55,6 +57,8 @@ void AddStatText(const QString & msg); QMap > healthPoints; + unsigned int playerPosition; + quint32 lastColor; }; #endif // STATSPAGE_H