deck list editing in deck storage tab; mouse hover event for deck view

This commit is contained in:
Max-Wilhelm Bruker 2009-12-19 20:34:33 +01:00
parent d23ece59ea
commit e0c7df1694
20 changed files with 251 additions and 45 deletions

View file

@ -137,6 +137,17 @@ void AbstractCardItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
event->accept();
}
void AbstractCardItem::processHoverEvent()
{
emit hovered(this);
}
void AbstractCardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
processHoverEvent();
QGraphicsItem::hoverEnterEvent(event);
}
QVariant AbstractCardItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
if (change == ItemSelectedHasChanged) {

View file

@ -23,6 +23,8 @@ protected:
bool tapped;
private slots:
void pixmapUpdated();
signals:
void hovered(AbstractCardItem *card);
public:
enum { Type = typeCard };
int type() const { return Type; }
@ -35,8 +37,10 @@ public:
void setName(const QString &_name = QString());
bool getTapped() const { return tapped; }
void setTapped(bool _tapped);
void processHoverEvent();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value);
};

View file

@ -87,7 +87,7 @@ void CardInfoWidget::setCard(const QString &cardName)
setCard(db->getCard(cardName));
}
void CardInfoWidget::setCard(CardItem *card)
void CardInfoWidget::setCard(AbstractCardItem *card)
{
setCard(card->getInfo());
}

View file

@ -5,7 +5,7 @@
class QLabel;
class QTextEdit;
class CardItem;
class AbstractCardItem;
class CardInfo;
class CardInfoWidget : public QFrame {
@ -28,7 +28,7 @@ public:
public slots:
void setCard(CardInfo *card);
void setCard(const QString &cardName);
void setCard(CardItem *card);
void setCard(AbstractCardItem *card);
private slots:
void updatePixmap();
};

View file

@ -170,14 +170,3 @@ void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
table->handleDropEventByGrid(id, zone, gridPoint, false);
}
}
void CardItem::processHoverEvent()
{
emit hovered(this);
}
void CardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
processHoverEvent();
QGraphicsItem::hoverEnterEvent(event);
}

View file

@ -49,14 +49,10 @@ public:
CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown);
void deleteDragItem();
void processHoverEvent();
signals:
void hovered(CardItem *card);
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
};
#endif

View file

@ -156,8 +156,8 @@ void CardZone::moveAllToZone()
// Cards need to be moved in reverse order so that the other
// cards' list index doesn't change
// for (int i = cards.size() - 1; i >= 0; i--)
// player->client->moveCard(cards.at(i)->getId(), getName(), targetZone, targetX);
for (int i = cards.size() - 1; i >= 0; i--)
player->sendGameCommand(new Command_MoveCard(-1, getName(), cards.at(i)->getId(), getName(), targetX));
}
QPointF CardZone::closestGridPoint(const QPointF &point)

View file

@ -316,6 +316,13 @@ void DeckListModel::cleanList()
reset();
}
void DeckListModel::setDeckList(DeckList *_deck)
{
delete deckList;
deckList = _deck;
rebuildTree();
}
void DeckListModel::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node)
{
static const int totalColumns = 3;

View file

@ -44,6 +44,7 @@ public:
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
void cleanList();
DeckList *getDeckList() const { return deckList; }
void setDeckList(DeckList *_deck);
private:
DeckList *deckList;
InnerDecklistNode *root;

View file

@ -119,8 +119,11 @@ void DeckViewScene::rebuildTree()
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k)
container->addCard(new DeckViewCard(currentCard->getName(), container));
for (int k = 0; k < currentCard->getNumber(); ++k) {
DeckViewCard *newCard = new DeckViewCard(currentCard->getName(), container);
container->addCard(newCard);
emit newCardAdded(newCard);
}
}
}
}
@ -155,6 +158,7 @@ DeckView::DeckView(QWidget *parent)
setScene(deckViewScene);
connect(deckViewScene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(updateSceneRect(const QRectF &)));
connect(deckViewScene, SIGNAL(newCardAdded(AbstractCardItem *)), this, SIGNAL(newCardAdded(AbstractCardItem *)));
}
void DeckView::resizeEvent(QResizeEvent *event)

View file

@ -35,6 +35,8 @@ public:
class DeckViewScene : public QGraphicsScene {
Q_OBJECT
signals:
void newCardAdded(AbstractCardItem *card);
private:
DeckList *deck;
QMap<QString, DeckViewCardContainer *> cardContainers;
@ -54,6 +56,8 @@ protected:
void resizeEvent(QResizeEvent *event);
public slots:
void updateSceneRect(const QRectF &rect);
signals:
void newCardAdded(AbstractCardItem *card);
public:
DeckView(QWidget *parent = 0);
void setDeck(DeckList *_deck);

View file

@ -45,7 +45,7 @@ class Player : public QObject, public QGraphicsItem {
signals:
void closeZoneView(ZoneViewZone *zone);
void toggleZoneView(Player *player, QString zoneName, int number);
void newCardAdded(CardItem *card);
void newCardAdded(AbstractCardItem *card);
// Log events
void logDeckSelect(Player *player, int deckId);
void logSay(Player *player, QString message);

View file

@ -4,6 +4,7 @@
#include "client.h"
#include "decklist.h"
#include "protocol_items.h"
#include "window_deckeditor.h"
TabDeckStorage::TabDeckStorage(Client *_client)
: Tab(), client(_client)
@ -59,9 +60,15 @@ TabDeckStorage::TabDeckStorage(Client *_client)
hbox->addWidget(leftGroupBox);
hbox->addWidget(rightGroupBox);
aOpenLocalDeck = new QAction(this);
aOpenLocalDeck->setIcon(QIcon(":/resources/pencil.svg"));
connect(aOpenLocalDeck, SIGNAL(triggered()), this, SLOT(actOpenLocalDeck()));
aUpload = new QAction(this);
aUpload->setIcon(QIcon(":/resources/arrow_right_green.svg"));
connect(aUpload, SIGNAL(triggered()), this, SLOT(actUpload()));
aOpenRemoteDeck = new QAction(this);
aOpenRemoteDeck->setIcon(QIcon(":/resources/pencil.svg"));
connect(aOpenRemoteDeck, SIGNAL(triggered()), this, SLOT(actOpenRemoteDeck()));
aDownload = new QAction(this);
aDownload->setIcon(QIcon(":/resources/arrow_left_green.svg"));
connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload()));
@ -72,7 +79,9 @@ TabDeckStorage::TabDeckStorage(Client *_client)
aDelete->setIcon(QIcon(":/resources/remove_row.svg"));
connect(aDelete, SIGNAL(triggered()), this, SLOT(actDelete()));
leftToolBar->addAction(aOpenLocalDeck);
leftToolBar->addAction(aUpload);
rightToolBar->addAction(aOpenRemoteDeck);
rightToolBar->addAction(aDownload);
rightToolBar->addAction(aNewFolder);
rightToolBar->addAction(aDelete);
@ -86,12 +95,29 @@ void TabDeckStorage::retranslateUi()
leftGroupBox->setTitle(tr("Local file system"));
rightGroupBox->setTitle(tr("Server deck storage"));
aOpenLocalDeck->setText(tr("Open in deck editor"));
aUpload->setText(tr("Upload deck"));
aOpenRemoteDeck->setText(tr("Open in deck editor"));
aDownload->setText(tr("Download deck"));
aNewFolder->setText(tr("New folder"));
aDelete->setText(tr("Delete"));
}
void TabDeckStorage::actOpenLocalDeck()
{
QModelIndex curLeft = sortFilter->mapToSource(localDirView->selectionModel()->currentIndex());
if (localDirModel->isDir(curLeft))
return;
QString filePath = localDirModel->filePath(curLeft);
DeckList *deck = new DeckList;
if (!deck->loadFromFile(filePath, DeckList::CockatriceFormat))
return;
WndDeckEditor *deckEditor = new WndDeckEditor;
deckEditor->setDeck(deck, filePath, DeckList::CockatriceFormat);
deckEditor->show();
}
void TabDeckStorage::actUpload()
{
QModelIndex curLeft = sortFilter->mapToSource(localDirView->selectionModel()->currentIndex());
@ -134,6 +160,28 @@ void TabDeckStorage::uploadFinished(ProtocolResponse *r)
serverDirView->addFileToTree(resp->getFile(), serverDirView->getNodeByPath(cmd->getPath()));
}
void TabDeckStorage::actOpenRemoteDeck()
{
RemoteDeckList_TreeModel::FileNode *curRight = dynamic_cast<RemoteDeckList_TreeModel::FileNode *>(serverDirView->getCurrentItem());
if (!curRight)
return;
Command_DeckDownload *command = new Command_DeckDownload(curRight->getId());
connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(openRemoteDeckFinished(ProtocolResponse *)));
client->sendCommand(command);
}
void TabDeckStorage::openRemoteDeckFinished(ProtocolResponse *r)
{
Response_DeckDownload *resp = qobject_cast<Response_DeckDownload *>(r);
if (!resp)
return;
WndDeckEditor *deckEditor = new WndDeckEditor;
deckEditor->setDeck(new DeckList(resp->getDeck()));
deckEditor->show();
}
void TabDeckStorage::actDownload()
{
QString filePath;

View file

@ -26,11 +26,16 @@ private:
RemoteDeckList_TreeWidget *serverDirView;
QGroupBox *leftGroupBox, *rightGroupBox;
QAction *aUpload, *aDownload, *aNewFolder, *aDelete;
QAction *aOpenLocalDeck, *aUpload, *aOpenRemoteDeck, *aDownload, *aNewFolder, *aDelete;
private slots:
void actOpenLocalDeck();
void actUpload();
void uploadFinished(ProtocolResponse *r);
void actOpenRemoteDeck();
void openRemoteDeckFinished(ProtocolResponse *r);
void actDownload();
void downloadFinished(ProtocolResponse *r);

View file

@ -39,6 +39,7 @@ TabGame::TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectat
buttonHBox->addWidget(readyStartButton);
buttonHBox->addStretch();
deckView = new DeckView;
connect(deckView, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *)));
QVBoxLayout *deckViewLayout = new QVBoxLayout;
deckViewLayout->addLayout(buttonHBox);
deckViewLayout->addWidget(deckView);
@ -213,7 +214,7 @@ Player *TabGame::addPlayer(int playerId, const QString &playerName)
Player *newPlayer = new Player(playerName, playerId, playerId == localPlayerId, client, this);
scene->addPlayer(newPlayer);
connect(newPlayer, SIGNAL(newCardAdded(CardItem *)), this, SLOT(newCardAdded(CardItem *)));
connect(newPlayer, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *)));
connect(newPlayer, SIGNAL(toggleZoneView(Player *, QString, int)), zoneLayout, SLOT(toggleZoneView(Player *, QString, int)));
connect(newPlayer, SIGNAL(closeZoneView(ZoneViewZone *)), zoneLayout, SLOT(removeItem(ZoneViewZone *)));
messageLog->connectToPlayer(newPlayer);
@ -440,7 +441,7 @@ void TabGame::readyStart()
client->sendCommand(new Command_ReadyStart(gameId));
}
void TabGame::newCardAdded(CardItem *card)
void TabGame::newCardAdded(AbstractCardItem *card)
{
connect(card, SIGNAL(hovered(CardItem *)), cardInfo, SLOT(setCard(CardItem *)));
connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *)));
}

View file

@ -32,6 +32,7 @@ class Event_SetActivePhase;
class Event_Ping;
class Player;
class CardZone;
class AbstractCardItem;
class CardItem;
class TabGame : public Tab {
@ -85,7 +86,7 @@ private slots:
void loadRemoteDeck();
void readyStart();
void deckSelectFinished(ProtocolResponse *r);
void newCardAdded(CardItem *card);
void newCardAdded(AbstractCardItem *card);
void actConcede();
void actLeaveGame();

View file

@ -36,9 +36,9 @@ WndDeckEditor::WndDeckEditor(QWidget *parent)
databaseView->setModel(databaseDisplayModel);
databaseView->setUniformRowHeights(true);
databaseView->setAlternatingRowColors(true);
databaseView->header()->setResizeMode(QHeaderView::ResizeToContents);
databaseView->setSortingEnabled(true);
databaseView->sortByColumn(0, Qt::AscendingOrder);
databaseView->resizeColumnToContents(0);
connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &)));
connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard()));
searchEdit->setTreeView(databaseView);
@ -68,6 +68,7 @@ WndDeckEditor::WndDeckEditor(QWidget *parent)
deckView = new QTreeView();
deckView->setModel(deckModel);
deckView->setUniformRowHeights(true);
deckView->header()->setResizeMode(QHeaderView::ResizeToContents);
connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &)));
QLabel *nameLabel = new QLabel(tr("Deck &name:"));
@ -167,7 +168,6 @@ WndDeckEditor::WndDeckEditor(QWidget *parent)
WndDeckEditor::~WndDeckEditor()
{
}
void WndDeckEditor::updateName(const QString &name)
@ -216,9 +216,10 @@ bool WndDeckEditor::confirmClose()
void WndDeckEditor::closeEvent(QCloseEvent *event)
{
if (confirmClose())
if (confirmClose()) {
event->accept();
else
deleteLater();
} else
event->ignore();
}
@ -247,19 +248,11 @@ void WndDeckEditor::actLoadDeck()
QString fileName = dialog.selectedFiles().at(0);
DeckList::FileFormat fmt = DeckList::getFormatFromNameFilter(dialog.selectedNameFilter());
DeckList *l = deckModel->getDeckList();
if (l->loadFromFile(fileName, fmt)) {
lastFileName = fileName;
lastFileFormat = fmt;
nameEdit->setText(l->getName());
commentsEdit->setText(l->getComments());
deckModel->sort(1);
deckView->expandAll();
deckView->resizeColumnToContents(0);
setWindowModified(false);
Deck_PictureCacher::cachePictures(l, this);
}
DeckList *l = new DeckList;
if (l->loadFromFile(fileName, fmt))
setDeck(l, fileName, fmt);
else
delete l;
}
bool WndDeckEditor::actSaveDeck()
@ -377,3 +370,20 @@ void WndDeckEditor::actDecrement()
deckModel->setData(numberIndex, count - 1, Qt::EditRole);
setWindowModified(true);
}
void WndDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckList::FileFormat _lastFileFormat)
{
deckModel->setDeckList(_deck);
lastFileName = _lastFileName;
lastFileFormat = _lastFileFormat;
nameEdit->setText(_deck->getName());
commentsEdit->setText(_deck->getComments());
deckModel->sort(1);
deckView->expandAll();
setWindowModified(false);
Deck_PictureCacher::cachePictures(_deck, this);
deckView->expandAll();
setWindowModified(false);
}

View file

@ -71,6 +71,7 @@ private:
public:
WndDeckEditor(QWidget *parent = 0);
~WndDeckEditor();
void setDeck(DeckList *_deck, const QString &_lastFileName = QString(), DeckList::FileFormat _lastFileFormat = DeckList::CockatriceFormat);
protected:
void closeEvent(QCloseEvent *event);
};