servatrice/cockatrice/src/window_main.cpp
2009-05-24 16:07:55 +02:00

284 lines
8.6 KiB
C++

/***************************************************************************
* Copyright (C) 2008 by Max-Wilhelm Bruker *
* brukie@gmx.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <QtGui>
//#include <QtOpenGL>
#include "window_main.h"
#include "dlg_connect.h"
#include "dlg_games.h"
#include "window_deckeditor.h"
#include "cardinfowidget.h"
#include "messagelogwidget.h"
#include "gameview.h"
#include "player.h"
#include "game.h"
#include "carddatabase.h"
#include "zoneviewzone.h"
#include "zoneviewwidget.h"
#include "zoneviewlayout.h"
void MainWindow::hoverCard(QString name)
{
cardInfo->setCard(name);
}
void MainWindow::playerAdded(Player *player)
{
menuBar()->addMenu(player->getPlayerMenu());
connect(player, SIGNAL(addZoneView(Player *, QString, int)), zoneLayout, SLOT(addItem(Player *, QString, int)));
}
void MainWindow::playerRemoved(Player *player)
{
menuBar()->removeAction(player->getPlayerMenu()->menuAction());
}
void MainWindow::statusChanged(ProtocolStatus _status)
{
switch (_status) {
case StatusConnecting:
emit logConnecting(client->peerName());
break;
case StatusDisconnected:
if (game) {
delete game;
game = 0;
}
aDisconnect->setEnabled(false);
aGames->setEnabled(false);
aRestartGame->setEnabled(false);
aLeaveGame->setEnabled(false);
emit logDisconnected();
break;
case StatusConnected:
aDisconnect->setEnabled(true);
aGames->setEnabled(true);
default:
break;
}
}
// Actions
void MainWindow::actConnect()
{
DlgConnect dlg(this);
if (dlg.exec())
client->connectToServer(dlg.getHost(), dlg.getPort(), dlg.getPlayerName(), dlg.getPassword());
}
void MainWindow::actDisconnect()
{
client->disconnectFromServer();
}
void MainWindow::actGames()
{
DlgGames dlg(client, this);
dlg.exec();
}
void MainWindow::actRestartGame()
{
zoneLayout->clear();
game->restartGameDialog();
}
void MainWindow::actLeaveGame()
{
zoneLayout->clear();
client->leaveGame();
delete game;
game = 0;
aRestartGame->setEnabled(false);
aLeaveGame->setEnabled(false);
aGames->setEnabled(true);
}
void MainWindow::actDeckEditor()
{
WndDeckEditor *deckEditor = new WndDeckEditor(db, this);
deckEditor->show();
}
void MainWindow::actExit()
{
close();
}
void MainWindow::updateSceneSize()
{
QRectF sr = scene->sceneRect();
QSizeF zoneSize = zoneLayout->size();
qDebug(QString("updateSceneSize: width=%1").arg(952 + zoneSize.width()).toLatin1());
scene->setSceneRect(sr.x(), sr.y(), 952 + zoneSize.width(), sr.height());
view->scaleToScene();
}
void MainWindow::textChanged(const QString &text)
{
sayButton->setEnabled(!text.isEmpty());
}
// Knöpfe
void MainWindow::buttonSay()
{
client->say(sayEdit->text());
sayEdit->clear();
}
void MainWindow::playerIdReceived(int id, QString name)
{
game = new Game(db, client, scene, actionsMenu, cardMenu, id, name);
connect(game, SIGNAL(hoverCard(QString)), this, SLOT(hoverCard(QString)));
connect(game, SIGNAL(playerAdded(Player *)), this, SLOT(playerAdded(Player *)));
connect(game, SIGNAL(playerRemoved(Player *)), this, SLOT(playerRemoved(Player *)));
playerAdded(game->getLocalPlayer());
messageLog->connectToGame(game);
aGames->setEnabled(false);
aRestartGame->setEnabled(true);
aLeaveGame->setEnabled(true);
client->listPlayers();
}
void MainWindow::serverTimeout()
{
QMessageBox::critical(this, tr("Error"), tr("Server timeout"));
}
void MainWindow::createActions()
{
aConnect = new QAction(tr("&Connect..."), this);
connect(aConnect, SIGNAL(triggered()), this, SLOT(actConnect()));
aDisconnect = new QAction(tr("&Disconnect"), this);
aDisconnect->setEnabled(false);
connect(aDisconnect, SIGNAL(triggered()), this, SLOT(actDisconnect()));
aGames = new QAction(tr("&Games..."), this);
aGames->setEnabled(false);
connect(aGames, SIGNAL(triggered()), this, SLOT(actGames()));
aRestartGame = new QAction(tr("&Restart game..."), this);
aRestartGame->setShortcut(tr("F2"));
aRestartGame->setEnabled(false);
connect(aRestartGame, SIGNAL(triggered()), this, SLOT(actRestartGame()));
aLeaveGame = new QAction(tr("&Leave game"), this);
aLeaveGame->setEnabled(false);
connect(aLeaveGame, SIGNAL(triggered()), this, SLOT(actLeaveGame()));
aDeckEditor = new QAction(tr("&Deck editor"), this);
connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor()));
aExit = new QAction(tr("&Exit"), this);
connect(aExit, SIGNAL(triggered()), this, SLOT(actExit()));
aCloseMostRecentZoneView = new QAction(tr("Close most recent zone view"), this);
aCloseMostRecentZoneView->setShortcut(tr("Esc"));
connect(aCloseMostRecentZoneView, SIGNAL(triggered()), zoneLayout, SLOT(closeMostRecentZoneView()));
addAction(aCloseMostRecentZoneView);
}
void MainWindow::createMenus()
{
gameMenu = menuBar()->addMenu(tr("&Game"));
gameMenu->addAction(aConnect);
gameMenu->addAction(aDisconnect);
gameMenu->addSeparator();
gameMenu->addAction(aGames);
gameMenu->addAction(aRestartGame);
gameMenu->addAction(aLeaveGame);
gameMenu->addSeparator();
gameMenu->addAction(aDeckEditor);
gameMenu->addSeparator();
gameMenu->addAction(aExit);
actionsMenu = menuBar()->addMenu(tr("&Actions"));
cardMenu = menuBar()->addMenu(tr("&Card"));
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), game(NULL)
{
// setWindowState(windowState() | Qt::WindowFullScreen);
QPixmapCache::setCacheLimit(200000);
db = new CardDatabase;
int cardCount = db->loadFromFile("../cards.dat");
qDebug(QString("%1 cards loaded").arg(cardCount).toLatin1());
scene = new QGraphicsScene(0, 0, 952, 1024, this);
view = new GameView(scene);
// view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
zoneLayout = new ZoneViewLayout(db);
zoneLayout->setPos(952, 0);
scene->addItem(zoneLayout);
connect(zoneLayout, SIGNAL(sizeChanged()), this, SLOT(updateSceneSize()));
cardInfo = new CardInfoWidget(db);
messageLog = new MessageLogWidget;
sayEdit = new QLineEdit;
sayButton = new QPushButton(tr("&Say"));
sayButton->setEnabled(false);
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(sayEdit);
hLayout->addWidget(sayButton);
QVBoxLayout *verticalLayout = new QVBoxLayout;
verticalLayout->addWidget(cardInfo);
verticalLayout->addWidget(messageLog);
verticalLayout->addLayout(hLayout);
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(view);
mainLayout->setStretchFactor(view, 10);
mainLayout->addLayout(verticalLayout);
QWidget *centralWidget = new QWidget;
centralWidget->setLayout(mainLayout);
setCentralWidget(centralWidget);
connect(sayEdit, SIGNAL(returnPressed()), sayButton, SLOT(click()));
connect(sayEdit, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &)));
connect(sayButton, SIGNAL(clicked()), this, SLOT(buttonSay()));
client = new Client(this);
connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout()));
connect(client, SIGNAL(statusChanged(ProtocolStatus)), this, SLOT(statusChanged(ProtocolStatus)));
connect(client, SIGNAL(playerIdReceived(int, QString)), this, SLOT(playerIdReceived(int, QString)));
connect(this, SIGNAL(logConnecting(QString)), messageLog, SLOT(logConnecting(QString)));
connect(client, SIGNAL(welcomeMsgReceived(const QStringList)), messageLog, SLOT(logConnected(const QStringList)));
connect(this, SIGNAL(logDisconnected()), messageLog, SLOT(logDisconnected()));
connect(client, SIGNAL(logSocketError(const QString &)), messageLog, SLOT(logSocketError(const QString &)));
createActions();
createMenus();
}
void MainWindow::closeEvent(QCloseEvent */*event*/)
{
delete game;
delete db;
}