From 9ed217609b52fe6c401256a5d3ca1846e9a31fd0 Mon Sep 17 00:00:00 2001 From: lotodore Date: Tue, 4 Sep 2007 12:44:11 +0000 Subject: [PATCH] Internet game lobby dialog shows now overview of games and whether they are private. Now showing connection progress before the internet game lobby. --- src/gui/generic/serverguiwrapper.cpp | 4 +- src/gui/generic/serverguiwrapper.h | 4 +- .../connecttoserverdialogimpl.cpp | 8 ++++ .../connecttoserverdialogimpl.h | 1 + .../gamelobbydialog/gamelobbydialogimpl.cpp | 45 ++++++++++++++++--- .../qt/gamelobbydialog/gamelobbydialogimpl.h | 5 ++- src/gui/qt/guiwrapper.cpp | 4 +- src/gui/qt/guiwrapper.h | 4 +- src/gui/qt/mainwindow/mainwindowimpl.cpp | 28 +++++++----- src/gui/qt/mainwindow/mainwindowimpl.h | 4 +- src/net/clientcallback.h | 4 +- src/net/common/clientthread.cpp | 4 +- src/net/common/servergamethread.cpp | 13 ++++-- src/net/common/serverlobbythread.cpp | 10 ++++- src/net/servergamethread.h | 7 +-- 15 files changed, 105 insertions(+), 40 deletions(-) diff --git a/src/gui/generic/serverguiwrapper.cpp b/src/gui/generic/serverguiwrapper.cpp index f0ec8f33..1c200e6d 100644 --- a/src/gui/generic/serverguiwrapper.cpp +++ b/src/gui/generic/serverguiwrapper.cpp @@ -112,8 +112,8 @@ void ServerGuiWrapper::SignalNetClientSelfJoined(unsigned playerId, const std::s void ServerGuiWrapper::SignalNetClientPlayerJoined(unsigned playerId, const std::string &playerName, PlayerRights rights) { if (myClientcb) myClientcb->SignalNetClientPlayerJoined(playerId, playerName, rights); } void ServerGuiWrapper::SignalNetClientPlayerChanged(unsigned playerId, const std::string &newPlayerName) { if (myClientcb) myClientcb->SignalNetClientPlayerChanged(playerId, newPlayerName); } void ServerGuiWrapper::SignalNetClientPlayerLeft(unsigned playerId, const std::string &playerName) { if (myClientcb) myClientcb->SignalNetClientPlayerLeft(playerId, playerName); } -void ServerGuiWrapper::SignalNetClientGameListNew(unsigned gameId, const string &gameName) { if (myClientcb) myClientcb->SignalNetClientGameListNew(gameId, gameName); } -void ServerGuiWrapper::SignalNetClientGameListRemove(unsigned gameId, const string &gameName) { if (myClientcb) myClientcb->SignalNetClientGameListRemove(gameId, gameName); } +void ServerGuiWrapper::SignalNetClientGameListNew(unsigned gameId) { if (myClientcb) myClientcb->SignalNetClientGameListNew(gameId); } +void ServerGuiWrapper::SignalNetClientGameListRemove(unsigned gameId) { if (myClientcb) myClientcb->SignalNetClientGameListRemove(gameId); } void ServerGuiWrapper::SignalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId) { if (myClientcb) myClientcb->SignalNetClientGameListPlayerJoined(gameId, playerId); } void ServerGuiWrapper::SignalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId) { if (myClientcb) myClientcb->SignalNetClientGameListPlayerLeft(gameId, playerId); } void ServerGuiWrapper::SignalNetClientGameStart(boost::shared_ptr game) { if (myClientcb) myClientcb->SignalNetClientGameStart(game); } diff --git a/src/gui/generic/serverguiwrapper.h b/src/gui/generic/serverguiwrapper.h index 29d1d26b..327a0699 100644 --- a/src/gui/generic/serverguiwrapper.h +++ b/src/gui/generic/serverguiwrapper.h @@ -99,8 +99,8 @@ public: void SignalNetClientChatMsg(const std::string &playerName, const std::string &msg); void SignalNetClientWaitDialog(); - void SignalNetClientGameListNew(unsigned gameId, const std::string &gameName); - void SignalNetClientGameListRemove(unsigned gameId, const std::string &gameName); + void SignalNetClientGameListNew(unsigned gameId); + void SignalNetClientGameListRemove(unsigned gameId); void SignalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId); void SignalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId); void SignalNetClientGameStart(boost::shared_ptr game); diff --git a/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.cpp b/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.cpp index 21a51801..6fe2b168 100644 --- a/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.cpp +++ b/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.cpp @@ -28,6 +28,14 @@ connectToServerDialogImpl::connectToServerDialogImpl(QWidget *parent) setupUi(this); } +void connectToServerDialogImpl::exec() +{ + label_actionMessage->setText(""); + progressBar->setValue(0); + + QDialog::exec(); +} + void connectToServerDialogImpl::refresh(int actionID) { switch (actionID) { diff --git a/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.h b/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.h index 4f2e4f97..7c4d47ae 100644 --- a/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.h +++ b/src/gui/qt/connecttoserverdialog/connecttoserverdialogimpl.h @@ -31,6 +31,7 @@ Q_OBJECT public: connectToServerDialogImpl(QWidget *parent = 0); + void exec(); public slots: diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp index c013db87..b9068bd5 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp @@ -59,7 +59,7 @@ void gameLobbyDialogImpl::createGame() gameData.guiSpeed = myCreateInternetGameDialog->spinBox_gameSpeed->value(); gameData.playerActionTimeoutSec = myCreateInternetGameDialog->spinBox_netTimeOutPlayerAction->value(); - mySession->clientCreateGame(gameData, myConfig->readConfigString("MyName") + "'s game", ""); + mySession->clientCreateGame(gameData, myConfig->readConfigString("MyName") + "'s game", myCreateInternetGameDialog->lineEdit_Password->text().toUtf8().constData()); currentGameName = QString::fromUtf8(myConfig->readConfigString("MyName").c_str()) + QString("'s game"); @@ -112,15 +112,30 @@ void gameLobbyDialogImpl::gameSelected(QTreeWidgetItem* item, QTreeWidgetItem*) } } -void gameLobbyDialogImpl::addGame(unsigned gameId, QString gameName) +void gameLobbyDialogImpl::updateGameItem(QTreeWidgetItem *item, unsigned gameId) { + assert(mySession); + GameInfo info(mySession->getClientGameInfo(gameId)); - QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget_GameList, 0); item->setData(0, Qt::UserRole, gameId); - item->setData(0, Qt::DisplayRole, gameName); + item->setData(0, Qt::DisplayRole, QString::fromUtf8(info.name.c_str())); + + QString playerStr; + playerStr.sprintf("%u/%u", info.players.size(), info.data.maxNumberOfPlayers); + item->setData(1, Qt::DisplayRole, playerStr); + + if (info.isPasswordProtected) + item->setData(2, Qt::DisplayRole, "X"); } -void gameLobbyDialogImpl::removeGame(unsigned gameId, QString) +void gameLobbyDialogImpl::addGame(unsigned gameId) +{ + QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget_GameList, 0); + + updateGameItem(item, gameId); +} + +void gameLobbyDialogImpl::removeGame(unsigned gameId) { QTreeWidgetItemIterator it(treeWidget_GameList); while (*it) { @@ -142,6 +157,16 @@ void gameLobbyDialogImpl::gameAddPlayer(unsigned gameId, unsigned playerId) PlayerInfo info(mySession->getClientPlayerInfo(playerId)); addConnectedPlayer(playerId, QString::fromUtf8(info.playerName.c_str()), PLAYER_RIGHTS_NORMAL); } + + QTreeWidgetItemIterator it(treeWidget_GameList); + while (*it) { + if ((*it)->data(0, Qt::UserRole) == gameId) + { + updateGameItem(*it, gameId); + break; + } + ++it; + } } void gameLobbyDialogImpl::gameRemovePlayer(unsigned gameId, unsigned playerId) @@ -153,6 +178,16 @@ void gameLobbyDialogImpl::gameRemovePlayer(unsigned gameId, unsigned playerId) PlayerInfo info(mySession->getClientPlayerInfo(playerId)); removePlayer(playerId, QString::fromUtf8(info.playerName.c_str())); } + + QTreeWidgetItemIterator it(treeWidget_GameList); + while (*it) { + if ((*it)->data(0, Qt::UserRole) == gameId) + { + updateGameItem(*it, gameId); + break; + } + ++it; + } } void gameLobbyDialogImpl::clearDialog() diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h index 64ed17cd..d7625dfa 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h @@ -46,9 +46,10 @@ public slots: void joinGame(); void gameSelected(QTreeWidgetItem*, QTreeWidgetItem*); + void updateGameItem(QTreeWidgetItem *item, unsigned gameId); - void addGame(unsigned gameId, QString gameName); - void removeGame(unsigned gameId, QString gameName); + void addGame(unsigned gameId); + void removeGame(unsigned gameId); void gameAddPlayer(unsigned gameId, unsigned playerId); void gameRemovePlayer(unsigned gameId, unsigned playerId); diff --git a/src/gui/qt/guiwrapper.cpp b/src/gui/qt/guiwrapper.cpp index 6a2eee5c..6003f113 100644 --- a/src/gui/qt/guiwrapper.cpp +++ b/src/gui/qt/guiwrapper.cpp @@ -125,8 +125,8 @@ void GuiWrapper::SignalNetClientPlayerLeft(unsigned playerId, const string &play myLog->signalLogPlayerLeftMsg(tmpName); } -void GuiWrapper::SignalNetClientGameListNew(unsigned gameId, const string &gameName) { myW->signalNetClientGameListNew(gameId, QString::fromUtf8(gameName.c_str())); } -void GuiWrapper::SignalNetClientGameListRemove(unsigned gameId, const string &gameName) { myW->signalNetClientGameListRemove(gameId, QString::fromUtf8(gameName.c_str())); } +void GuiWrapper::SignalNetClientGameListNew(unsigned gameId) { myW->signalNetClientGameListNew(gameId); } +void GuiWrapper::SignalNetClientGameListRemove(unsigned gameId) { myW->signalNetClientGameListRemove(gameId); } void GuiWrapper::SignalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId) { myW->signalNetClientGameListPlayerJoined(gameId, playerId); } void GuiWrapper::SignalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId) { myW->signalNetClientGameListPlayerLeft(gameId, playerId); } diff --git a/src/gui/qt/guiwrapper.h b/src/gui/qt/guiwrapper.h index 08bf8a95..e858c015 100644 --- a/src/gui/qt/guiwrapper.h +++ b/src/gui/qt/guiwrapper.h @@ -106,8 +106,8 @@ public: void SignalNetClientChatMsg(const std::string &playerName, const std::string &msg); void SignalNetClientWaitDialog(); - void SignalNetClientGameListNew(unsigned gameId, const std::string &gameName); - void SignalNetClientGameListRemove(unsigned gameId, const std::string &gameName); + void SignalNetClientGameListNew(unsigned gameId); + void SignalNetClientGameListRemove(unsigned gameId); void SignalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId); void SignalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId); diff --git a/src/gui/qt/mainwindow/mainwindowimpl.cpp b/src/gui/qt/mainwindow/mainwindowimpl.cpp index 7d920e2c..09a82683 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.cpp +++ b/src/gui/qt/mainwindow/mainwindowimpl.cpp @@ -658,8 +658,8 @@ mainWindowImpl::mainWindowImpl(ConfigFile *c, QMainWindow *parent) connect(this, SIGNAL(signalNetClientPlayerChanged(unsigned, QString)), myGameLobbyDialog, SLOT(updatePlayer(unsigned, QString))); connect(this, SIGNAL(signalNetClientPlayerLeft(unsigned, QString)), myGameLobbyDialog, SLOT(removePlayer(unsigned, QString))); - connect(this, SIGNAL(signalNetClientGameListNew(unsigned, QString)), myGameLobbyDialog, SLOT(addGame(unsigned, QString))); - connect(this, SIGNAL(signalNetClientGameListRemove(unsigned, QString)), myGameLobbyDialog, SLOT(removeGame(unsigned, QString))); + connect(this, SIGNAL(signalNetClientGameListNew(unsigned)), myGameLobbyDialog, SLOT(addGame(unsigned))); + connect(this, SIGNAL(signalNetClientGameListRemove(unsigned)), myGameLobbyDialog, SLOT(removeGame(unsigned))); connect(this, SIGNAL(signalNetClientGameListPlayerJoined(unsigned, unsigned)), myGameLobbyDialog, SLOT(gameAddPlayer(unsigned, unsigned))); connect(this, SIGNAL(signalNetClientGameListPlayerLeft(unsigned, unsigned)), myGameLobbyDialog, SLOT(gameRemovePlayer(unsigned, unsigned))); @@ -833,18 +833,26 @@ void mainWindowImpl::callGameLobbyDialog() { // Start client for dedicated server. mySession->startInternetClient(); - myGameLobbyDialog->exec(); + //Dialog mit Statusbalken + myConnectToServerDialog->exec(); - if (myGameLobbyDialog->result() == QDialog::Accepted) - { - if(myGameLobbyDialog->getCurrentGameName() != "") { - myStartNetworkGameDialog->setWindowTitle(myGameLobbyDialog->getCurrentGameName()); - } - showNetworkStartDialog(); + if (myConnectToServerDialog->result() == QDialog::Rejected ) { + mySession->terminateNetworkClient(); } else { - mySession->terminateNetworkClient(); + myGameLobbyDialog->exec(); + + if (myGameLobbyDialog->result() == QDialog::Accepted) + { + if(myGameLobbyDialog->getCurrentGameName() != "") + myStartNetworkGameDialog->setWindowTitle(myGameLobbyDialog->getCurrentGameName()); + showNetworkStartDialog(); + } + else + { + mySession->terminateNetworkClient(); + } } } diff --git a/src/gui/qt/mainwindow/mainwindowimpl.h b/src/gui/qt/mainwindow/mainwindowimpl.h index b5eea8af..1071019a 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.h +++ b/src/gui/qt/mainwindow/mainwindowimpl.h @@ -131,8 +131,8 @@ signals: void signalNetClientPlayerJoined(unsigned playerId, QString playerName, int rights); void signalNetClientPlayerChanged(unsigned playerId, QString newPlayerName); void signalNetClientPlayerLeft(unsigned playerId, QString playerName); - void signalNetClientGameListNew(unsigned gameId, QString gameName); - void signalNetClientGameListRemove(unsigned gameId, QString gameName); + void signalNetClientGameListNew(unsigned gameId); + void signalNetClientGameListRemove(unsigned gameId); void signalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId); void signalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId); void signalNetClientGameStart(boost::shared_ptr game); diff --git a/src/net/clientcallback.h b/src/net/clientcallback.h index b13c0da4..a0387d76 100644 --- a/src/net/clientcallback.h +++ b/src/net/clientcallback.h @@ -36,8 +36,8 @@ public: virtual void SignalNetClientGameInfo(int actionID) = 0; virtual void SignalNetClientError(int errorID, int osErrorID) = 0; - virtual void SignalNetClientGameListNew(unsigned gameId, const std::string &gameName) = 0; - virtual void SignalNetClientGameListRemove(unsigned gameId, const std::string &gameName) = 0; + virtual void SignalNetClientGameListNew(unsigned gameId) = 0; + virtual void SignalNetClientGameListRemove(unsigned gameId) = 0; virtual void SignalNetClientGameListPlayerJoined(unsigned gameId, unsigned playerId) = 0; virtual void SignalNetClientGameListPlayerLeft(unsigned gameId, unsigned playerId) = 0; diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 1447a982..b905f970 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -635,7 +635,7 @@ ClientThread::AddGameInfo(unsigned gameId, const GameInfo &info) boost::mutex::scoped_lock lock(m_gameInfoMapMutex); m_gameInfoMap.insert(GameInfoMap::value_type(gameId, info)); } - GetCallback().SignalNetClientGameListNew(gameId, info.name); + GetCallback().SignalNetClientGameListNew(gameId); } void @@ -652,7 +652,7 @@ ClientThread::RemoveGameInfo(unsigned gameId) } } if (!name.empty()) - GetCallback().SignalNetClientGameListRemove(gameId, name); + GetCallback().SignalNetClientGameListRemove(gameId); } void diff --git a/src/net/common/servergamethread.cpp b/src/net/common/servergamethread.cpp index b0c75427..58859f91 100644 --- a/src/net/common/servergamethread.cpp +++ b/src/net/common/servergamethread.cpp @@ -50,8 +50,8 @@ private: }; -ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const string &name, GuiInterface &gui, ConfigFile *playerConfig) -: m_lobbyThread(lobbyThread), m_gui(gui), m_id(id), m_name(name), m_playerConfig(playerConfig), m_curState(NULL), m_gameNum(1) +ServerGameThread::ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const string &name, const string &pwd, GuiInterface &gui, ConfigFile *playerConfig) +: m_lobbyThread(lobbyThread), m_gui(gui), m_id(id), m_name(name), m_password(pwd), m_playerConfig(playerConfig), m_curState(NULL), m_gameNum(1) { m_senderCallback.reset(new ServerSenderCallback(*this)); m_sender.reset(new SenderThread(GetSenderCallback())); @@ -63,9 +63,8 @@ ServerGameThread::~ServerGameThread() } void -ServerGameThread::Init(const string &pwd, const GameData &gameData) +ServerGameThread::Init(const GameData &gameData) { - m_password = pwd; m_gameData = gameData; } @@ -434,6 +433,12 @@ ServerGameThread::SetStartData(const StartData &startData) m_startData = startData; } +bool +ServerGameThread::IsPasswordProtected() const +{ + return !m_password.empty(); +} + bool ServerGameThread::CheckPassword(const string &password) const { diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 68aed0d5..726abd61 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -337,8 +337,13 @@ ServerLobbyThread::HandleNetPacketCreateGame(SessionWrapper session, const NetPa tmpPacket.GetData(createGameData); boost::shared_ptr game( - new ServerGameThread(*this, GetNextGameId(), createGameData.gameName, GetGui(), m_playerConfig)); - game->Init(createGameData.password, createGameData.gameData); + new ServerGameThread( + *this, GetNextGameId(), + createGameData.gameName, + createGameData.password, + GetGui(), + m_playerConfig)); + game->Init(createGameData.gameData); // Remove session from the lobby. m_sessionManager.RemoveSession(session.sessionData->GetSocket()); @@ -582,6 +587,7 @@ ServerLobbyThread::CreateNetPacketGameListNew(const ServerGameThread &game) packetData.gameInfo.name = game.GetName(); packetData.gameInfo.data = game.GetGameData(); packetData.gameInfo.players = game.GetPlayerIdList(); + packetData.gameInfo.isPasswordProtected = game.IsPasswordProtected(); static_cast(packet.get())->SetData(packetData); return packet; } diff --git a/src/net/servergamethread.h b/src/net/servergamethread.h index e885a8b5..812157bf 100644 --- a/src/net/servergamethread.h +++ b/src/net/servergamethread.h @@ -42,10 +42,10 @@ class Game; class ServerGameThread : public Thread { public: - ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const std::string &name, GuiInterface &gui, ConfigFile *playerConfig); + ServerGameThread(ServerLobbyThread &lobbyThread, u_int32_t id, const std::string &name, const std::string &pwd, GuiInterface &gui, ConfigFile *playerConfig); virtual ~ServerGameThread(); - void Init(const std::string &pwd, const GameData &gameData); + void Init(const GameData &gameData); u_int32_t GetId() const; const std::string &GetName() const; @@ -57,6 +57,7 @@ public: void SendToAllPlayers(boost::shared_ptr packet, SessionData::State state); + bool IsPasswordProtected() const; bool CheckPassword(const std::string &password) const; const GameData &GetGameData() const; @@ -130,7 +131,7 @@ private: std::auto_ptr m_game; const u_int32_t m_id; const std::string m_name; - std::string m_password; + const std::string m_password; ConfigFile *m_playerConfig; ServerGameState *m_curState; unsigned m_gameNum;