diff -r 7056284fd97c -r 0907b0fd5714 QTfrontend/pages.cpp --- a/QTfrontend/pages.cpp Sun Aug 29 16:55:58 2010 +0200 +++ b/QTfrontend/pages.cpp Mon Aug 30 15:24:49 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)