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

@ -16,6 +16,7 @@
<file>resources/icon_phase_main2.svg</file>
<file>resources/icon_phase_cleanup.svg</file>
<file>resources/icon_nextturn.svg</file>
<file>resources/pencil.svg</file>
<file>resources/hr.jpg</file>
<file>translations/cockatrice_de.qm</file>
<file>translations/cockatrice_en.qm</file>

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="64"
height="64"
id="svg2"
inkscape:version="0.47 r22583"
sodipodi:docname="pencil.svg">
<metadata
id="metadata18">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="752"
id="namedview16"
showgrid="false"
inkscape:zoom="7.84375"
inkscape:cx="32"
inkscape:cy="31.124883"
inkscape:window-x="-4"
inkscape:window-y="-3"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective20" />
</defs>
<path
style="fill:#f2f2f2;stroke:black;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4310"
d="M 14.147411,6.62251 L 14.147411,54.43507 L 44.866161,54.43507 L 49.209911,50.09127 L 49.209911,6.62251 L 14.147411,6.62251 z" />
<path
style="opacity:0.43930634;fill:black;stroke:none"
id="rect4314-9-2"
d="M 44.512517,49.84357 L 49.329349,49.84357 L 44.512517,54.57907 L 44.512517,49.84357 z" />
<path
style="fill:#f2f2f2;stroke:black;stroke-width:0.28564885;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4314-9-5"
d="M 44.916303,50.21837 L 49.043604,50.21837 L 44.916303,54.34577 L 44.916303,50.21837 z" />
<path
style="opacity:0.43930634;fill:black;stroke:none"
id="rect4120-3"
d="M 9.8460881,48.28234 L 9.8738241,48.31601 L 6.6088088,50.899738 L 7.2796951,51.719454 L 8.3419311,53.01728 L 8.9849081,53.802907 L 12.249922,51.219179 L 37.119612,31.538824 L 37.147347,31.572494 L 39.245137,27.492709 L 34.715431,28.601144 L 9.8457411,48.281638 z" />
<rect
style="fill:#fc0;stroke:black;stroke-width:0.28297317;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4120"
transform="matrix(0.78188456,-0.62342324,0.63622425,0.77150419,0,0)"
y="42.451607"
x="-23.630877"
height="3.7814219"
width="31.701616" />
<rect
style="fill:#4d4d4d;stroke:black;stroke-width:0.28297317;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4122"
transform="matrix(0.78188456,-0.62342324,0.63622425,0.77150419,0,0)"
y="42.465313"
x="-27.800512"
height="3.7620518"
width="4.171114" />
<path
style="fill:#ffe680;stroke:black;stroke-width:0.28295398;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4124"
d="M 33.311356,27.702864 L 37.827686,26.555289 L 35.752692,30.663272 L 33.311356,27.702864 z" />
<path
style="fill:black;stroke:black;stroke-width:0.28295398;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4127"
d="M 36.490872,26.906857 L 37.818176,26.572264 L 37.211194,27.780304 L 36.490872,26.906857 z" />
<rect
style="fill:#333;stroke:black;stroke-width:0.28297317;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4122-4"
transform="matrix(0.78188456,-0.62342324,0.63622425,0.77150419,0,0)"
y="43.521946"
x="-27.795927"
height="1.698899"
width="4.171114" />
<rect
style="fill:#4d4d4d;stroke:black;stroke-width:0.28297317;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4122-8"
transform="matrix(0.78188456,-0.62342324,0.63622425,0.77150419,0,0)"
y="45.227886"
x="-27.795927"
height="1.0045688"
width="4.171114" />
<rect
style="fill:#a80;stroke:black;stroke-width:0.28297317;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4122-4-7"
transform="matrix(0.78188456,-0.62342324,0.63622425,0.77150419,0,0)"
y="43.521858"
x="-23.635288"
height="1.698899"
width="31.643009" />
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

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);
};