File indexing completed on 2024-12-08 12:27:34
0001 // Copyright (c) 2002-2003 Rob Kaper <cap@capsi.com> 0002 // 0003 // This program is free software; you can redistribute it and/or 0004 // modify it under the terms of the GNU General Public License 0005 // version 2 as published by the Free Software Foundation. 0006 // 0007 // This program is distributed in the hope that it will be useful, 0008 // but WITHOUT ANY WARRANTY; without even the implied warranty of 0009 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0010 // General Public License for more details. 0011 // 0012 // You should have received a copy of the GNU General Public License 0013 // along with this program; see the file COPYING. If not, write to 0014 // the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0015 // Boston, MA 02110-1301, USA. 0016 0017 #include <QGroupBox> 0018 #include <QVBoxLayout> 0019 #include <QHBoxLayout> 0020 #include <QTreeWidget> 0021 #include <QHeaderView> 0022 #include <QPushButton> 0023 0024 #include <klocalizedstring.h> 0025 #include <kiconloader.h> 0026 #include <knotification.h> 0027 #include <kguiitem.h> 0028 #include <kstandardguiitem.h> 0029 0030 #include <atlantic_core.h> 0031 #include <game.h> 0032 #include <player.h> 0033 0034 #include "selectgame_widget.h" 0035 0036 enum { GameTypeRole = Qt::UserRole + 1 }; 0037 0038 SelectGame::SelectGame(AtlanticCore *atlanticCore, QWidget *parent) 0039 : QWidget(parent) 0040 , m_atlanticCore(atlanticCore) 0041 { 0042 connect(m_atlanticCore, SIGNAL(createGUI(Game *)), this, SLOT(addGame(Game *))); 0043 connect(m_atlanticCore, SIGNAL(removeGUI(Game *)), this, SLOT(delGame(Game *))); 0044 0045 setupUi(this); 0046 layout()->setContentsMargins(0, 0, 0, 0); 0047 0048 const QPair<KGuiItem, KGuiItem> icons = KStandardGuiItem::backAndForward(); 0049 0050 // List of games 0051 m_gameList->header()->setSectionsClickable(false); 0052 0053 connect(m_gameList, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(validateConnectButton())); 0054 connect(m_gameList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(connectClicked())); 0055 connect(m_gameList, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(validateConnectButton())); 0056 0057 backButton->setIcon(icons.first.icon()); 0058 0059 connect(backButton, SIGNAL(clicked()), this, SIGNAL(leaveServer())); 0060 0061 m_connectButton->setIcon(icons.second.icon()); 0062 m_connectButton->setEnabled(false); 0063 0064 connect(m_connectButton, SIGNAL(clicked()), this, SLOT(connectClicked())); 0065 0066 } 0067 0068 void SelectGame::addGame(Game *game) 0069 { 0070 connect(game, SIGNAL(changed(Game *)), this, SLOT(updateGame(Game *))); 0071 0072 if (game->id() == -1) 0073 { 0074 QTreeWidgetItem *item = new QTreeWidgetItem(); 0075 item->setText(0, i18n("Create a new %1 Game", game->name())); 0076 item->setText(1, game->description()); 0077 item->setData(0, GameTypeRole, game->type()); 0078 item->setIcon(0, KDE::icon(QStringLiteral("document-new"))); 0079 m_gameList->addTopLevelItem(item); 0080 } 0081 else 0082 { 0083 Player *master = game->master(); 0084 QTreeWidgetItem *item = new QTreeWidgetItem(); 0085 if (!game->canBeJoined() && game->canBeWatched()) 0086 item->setText(0, i18n("Watch %1's %2 Game", (master ? master->name() : QString()), game->name())); 0087 else 0088 item->setText(0, i18n("Join %1's %2 Game", (master ? master->name() : QString()), game->name())); 0089 item->setText(1, game->description()); 0090 item->setText(2, QString::number(game->id())); 0091 item->setText(3, QString::number(game->players())); 0092 item->setData(0, GameTypeRole, game->type()); 0093 item->setIcon(0, KDE::icon(QStringLiteral("atlantik"))); 0094 item->setDisabled(!game->canBeJoined() && !game->canBeWatched()); 0095 m_gameList->addTopLevelItem(item); 0096 0097 KNotification::event(QStringLiteral("newgame"), i18n("New game available.")); 0098 0099 if (master) 0100 connect(master, SIGNAL(changed(Player *)), this, SLOT(playerChanged(Player *))); 0101 } 0102 m_gameList->resizeColumnToContents(0); 0103 m_gameList->resizeColumnToContents(1); 0104 m_gameList->resizeColumnToContents(2); 0105 m_gameList->resizeColumnToContents(3); 0106 0107 // validateConnectButton(); 0108 } 0109 0110 void SelectGame::delGame(Game *game) 0111 { 0112 QTreeWidgetItem *item = findItem(game); 0113 if (!item) 0114 return; 0115 0116 delete item; 0117 0118 validateConnectButton(); 0119 } 0120 0121 void SelectGame::updateGame(Game *game) 0122 { 0123 QTreeWidgetItem *item = findItem(game); 0124 if (!item) 0125 return; 0126 0127 item->setText( 1, game->description() ); 0128 0129 if (game->id() == -1) 0130 item->setText(0, i18n("Create a new %1 Game", game->name())); 0131 else 0132 { 0133 Player *master = game->master(); 0134 if (!game->canBeJoined() && game->canBeWatched()) 0135 item->setText(0, i18n("Watch %1's %2 Game", (master ? master->name() : QString()), game->name())); 0136 else 0137 item->setText(0, i18n("Join %1's %2 Game", (master ? master->name() : QString()), game->name())); 0138 item->setText( 3, QString::number( game->players() ) ); 0139 item->setDisabled(!game->canBeJoined() && !game->canBeWatched()); 0140 0141 connect(master, SIGNAL(changed(Player *)), this, SLOT(playerChanged(Player *))); 0142 } 0143 0144 validateConnectButton(); 0145 } 0146 0147 void SelectGame::playerChanged(Player *player) 0148 { 0149 const int count = m_gameList->topLevelItemCount(); 0150 Game *game = nullptr; 0151 0152 for (int i = 0; i < count; ++i) 0153 { 0154 QTreeWidgetItem *item = m_gameList->topLevelItem(i); 0155 game = m_atlanticCore->findGame( item->text(2).toInt() ); 0156 if ( game && game->master() == player ) 0157 { 0158 if (!game->canBeJoined() && game->canBeWatched()) 0159 item->setText( 0, i18n("Watch %1's %2 Game", player->name(), game->name() ) ); 0160 else 0161 item->setText( 0, i18n("Join %1's %2 Game", player->name(), game->name() ) ); 0162 return; 0163 } 0164 } 0165 } 0166 0167 QTreeWidgetItem *SelectGame::findItem(Game *game) 0168 { 0169 const int count = m_gameList->topLevelItemCount(); 0170 for (int i = 0; i < count; ++i) 0171 { 0172 QTreeWidgetItem *item = m_gameList->topLevelItem(i); 0173 if ( (game->id() == -1 || item->text(2) == QString::number(game->id())) && item->data(0, GameTypeRole).toString() == game->type() ) 0174 return item; 0175 } 0176 return nullptr; 0177 } 0178 0179 void SelectGame::validateConnectButton() 0180 { 0181 const QList<QTreeWidgetItem *> items = m_gameList->selectedItems(); 0182 if (!items.isEmpty()) 0183 { 0184 const QTreeWidgetItem *item = items.first(); 0185 if (item->text(2).toInt() > 0) 0186 { 0187 Game *game = m_atlanticCore->findGame(item->text(2).toInt()); 0188 if (!game->canBeJoined() && game->canBeWatched()) 0189 m_connectButton->setText(i18n("Watch Game")); 0190 else 0191 m_connectButton->setText(i18n("Join Game")); 0192 } 0193 else 0194 m_connectButton->setText(i18n("Create Game")); 0195 0196 m_connectButton->setEnabled(true); 0197 } 0198 else 0199 m_connectButton->setEnabled(false); 0200 } 0201 0202 void SelectGame::connectClicked() 0203 { 0204 const QList<QTreeWidgetItem *> items = m_gameList->selectedItems(); 0205 if (!items.isEmpty()) 0206 { 0207 const QTreeWidgetItem *item = items.first(); 0208 if (int gameId = item->text(2).toInt()) 0209 { 0210 Game *game = m_atlanticCore->findGame(item->text(2).toInt()); 0211 if (!game->canBeJoined() && game->canBeWatched()) 0212 Q_EMIT watchGame(gameId); 0213 else 0214 Q_EMIT joinGame(gameId); 0215 } 0216 else 0217 Q_EMIT newGame(item->data(0, GameTypeRole).toString()); 0218 } 0219 } 0220 0221 #include "moc_selectgame_widget.cpp"