Turn the tab into a widget.

This commit is contained in:
Lukas Brübach 2024-12-23 19:25:54 +01:00
parent f8db3017ff
commit 29943d9127
7 changed files with 120 additions and 73 deletions

View file

@ -161,6 +161,7 @@ set(cockatrice_SOURCES
src/game/zones/view_zone.cpp
src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
src/client/ui/widgets/cards/deck_preview_card_picture_widget.cpp
src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp
${VERSION_STRING_CPP}
)

View file

@ -133,13 +133,16 @@ DeckViewContainer::DeckViewContainer(int _playerId, TabGame *parent)
}
buttonHBox->setContentsMargins(0, 0, 0, 0);
buttonHBox->addStretch();
deckView = new DeckView;
connect(deckView, SIGNAL(newCardAdded(AbstractCardItem *)), this, SIGNAL(newCardAdded(AbstractCardItem *)));
connect(deckView, SIGNAL(sideboardPlanChanged()), this, SLOT(sideboardPlanChanged()));
visualDeckStorageWidget = new VisualDeckStorageWidget(this);
auto *deckViewLayout = new QVBoxLayout;
deckViewLayout->addLayout(buttonHBox);
deckViewLayout->addWidget(deckView);
deckViewLayout->addWidget(visualDeckStorageWidget);
deckViewLayout->setContentsMargins(0, 0, 0, 0);
setLayout(deckViewLayout);

View file

@ -3,6 +3,7 @@
#include "../../client/tearoff_menu.h"
#include "../../game/player/player.h"
#include "../ui/widgets/visual_deck_storage/visual_deck_storage_widget.h"
#include "pb/event_leave.pb.h"
#include "pb/serverinfo_game.pb.h"
#include "tab.h"
@ -89,6 +90,7 @@ private:
QPushButton *loadLocalButton, *loadRemoteButton, *forceStartGameButton;
ToggleButton *readyStartButton, *sideboardLockButton;
DeckView *deckView;
VisualDeckStorageWidget *visualDeckStorageWidget;
TabGame *parentGame;
int playerId;
private slots:

View file

@ -1,19 +1,6 @@
#include "tab_deck_storage_visual.h"
#include "../../../deck/deck_list_model.h"
#include "../../../deck/deck_loader.h"
#include "../../../deck/deck_view.h"
#include "../../../game/cards/card_database_manager.h"
#include "../../../game/cards/card_database_model.h"
#include "../../../main.h"
#include "../../../settings/cache_settings.h"
#include "../../dbconverter/src/mocks.h"
#include "../../ui/picture_loader.h"
#include "../../ui/widgets/cards/card_info_picture_widget.h"
#include "../../ui/widgets/cards/card_info_picture_with_text_overlay_widget.h"
#include "../../ui/widgets/cards/deck_preview_card_picture_widget.h"
#include "../../ui/widgets/general/layout_containers/flow_widget.h"
#include "../../ui/widgets/general/layout_containers/overlap_widget.h"
#include "../tab_supervisor.h"
#include "pb/command_deck_del.pb.h"
@ -36,17 +23,15 @@ TabDeckStorageVisual::TabDeckStorageVisual(TabSupervisor *_tabSupervisor, Abstra
deck_list_model = new DeckListModel(this);
deck_list_model->setObjectName("visualDeckModel");
flow_widget = new FlowWidget(this, Qt::ScrollBarAlwaysOff, Qt::ScrollBarPolicy::ScrollBarAsNeeded);
this->setCentralWidget(flow_widget);
// Start adding our Widgets to our FlowLayout...
getBannerCardsForDecks();
QWidget *container = new QWidget(this);
QVBoxLayout *layout = new QVBoxLayout(container);
container->setLayout(layout);
this->setCentralWidget(container);
leftToolBar = new QToolBar;
leftToolBar->setOrientation(Qt::Horizontal);
leftToolBar->setIconSize(QSize(32, 32));
QHBoxLayout *leftToolBarLayout = new QHBoxLayout;
QHBoxLayout *leftToolBarLayout = new QHBoxLayout(this);
leftToolBarLayout->addStretch();
leftToolBarLayout->addWidget(leftToolBar);
leftToolBarLayout->addStretch();
@ -62,6 +47,12 @@ TabDeckStorageVisual::TabDeckStorageVisual(TabSupervisor *_tabSupervisor, Abstra
leftToolBar->addAction(aOpenLocalDeck);
leftToolBar->addAction(aDeleteLocalDeck);
visualDeckStorageWidget = new VisualDeckStorageWidget(this);
layout->addWidget(leftToolBar);
layout->addWidget(visualDeckStorageWidget);
retranslateUi();
}
@ -77,37 +68,7 @@ QString TabDeckStorageVisual::getTargetPath() const
return {};
}
QStringList TabDeckStorageVisual::getBannerCardsForDecks()
{
QStringList allFiles;
// QDirIterator with QDir::Files and QDir::NoSymLinks ensures only files are listed (no directories or symlinks)
QDirIterator it(SettingsCache::instance().getDeckPath(), QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
while (it.hasNext()) {
allFiles << it.next(); // Add each file path to the list
}
foreach (const QString &file, allFiles) {
qDebug() << file;
auto deck_loader = new DeckLoader();
deck_loader->loadFromFile(file, DeckLoader::CockatriceFormat);
deck_list_model->setDeckList(new DeckLoader(*deck_loader));
auto *display = new DeckPreviewCardPictureWidget(flow_widget, true);
qDebug() << "Banner card is: " << deck_loader->getBannerCard();
display->setCard(CardDatabaseManager::getInstance()->getCard(deck_loader->getBannerCard()));
display->setOverlayText(deck_loader->getName().isEmpty() ? QFileInfo(deck_loader->getLastFileName()).fileName()
: deck_loader->getName());
display->setFontSize(24);
display->setFilePath(deck_loader->getLastFileName());
connect(display, &DeckPreviewCardPictureWidget::imageClicked, this, &TabDeckStorageVisual::actOpenLocalDeck);
flow_widget->addWidget(display);
}
return QStringList("lol");
}
void TabDeckStorageVisual::actOpenLocalDeck(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
{

View file

@ -3,11 +3,8 @@
#include "../../../deck/deck_list_model.h"
#include "../../../deck/deck_view.h"
#include "../../ui/layouts/flow_layout.h"
#include "../../ui/layouts/overlap_layout.h"
#include "../../ui/widgets/cards/card_info_picture_with_text_overlay_widget.h"
#include "../../ui/widgets/cards/deck_preview_card_picture_widget.h"
#include "../../ui/widgets/general/layout_containers/flow_widget.h"
#include "../../ui/widgets/visual_deck_storage/visual_deck_storage_widget.h"
#include "../tab.h"
#include <QProcess>
@ -23,26 +20,9 @@ class CommandContainer;
class Response;
class DeckLoader;
class TabDeckStorageVisual : public Tab
class TabDeckStorageVisual final : public Tab
{
Q_OBJECT
private:
AbstractClient *client;
QTreeView *localDirView;
QFileSystemModel *localDirModel;
QToolBar *leftToolBar;
QGroupBox *leftGroupBox;
FlowWidget *flow_widget;
DeckListModel *deck_list_model;
QMap<QString, DeckViewCardContainer *> cardContainers;
QAction *aOpenLocalDeck, *aDeleteLocalDeck;
QString getTargetPath() const;
QStringList getBannerCardsForDecks();
private slots:
void actOpenLocalDeck(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void actDeleteLocalDeck();
public:
TabDeckStorageVisual(TabSupervisor *_tabSupervisor, AbstractClient *_client);
void retranslateUi();
@ -54,6 +34,22 @@ public slots:
void cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus);
signals:
void openDeckEditor(const DeckLoader *deckLoader);
private:
QWidget *container;
QHBoxLayout *layout;
AbstractClient *client;
QTreeView *localDirView;
QFileSystemModel *localDirModel;
QToolBar *leftToolBar;
QGroupBox *leftGroupBox;
VisualDeckStorageWidget *visualDeckStorageWidget;
DeckListModel *deck_list_model;
QAction *aOpenLocalDeck, *aDeleteLocalDeck;
QString getTargetPath() const;
private slots:
void actOpenLocalDeck(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void actDeleteLocalDeck();
};
#endif

View file

@ -0,0 +1,58 @@
#include "visual_deck_storage_widget.h"
#include "../../../../deck/deck_loader.h"
#include "../../../../game/cards/card_database_manager.h"
#include "../../../../settings/cache_settings.h"
#include "../../../ui/widgets/cards/deck_preview_card_picture_widget.h"
#include <QDirIterator>
VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent)
{
deckListModel = new DeckListModel(this);
deckListModel->setObjectName("visualDeckModel");
layout = new QHBoxLayout(this);
flowWidget = new FlowWidget(this, Qt::ScrollBarAlwaysOff, Qt::ScrollBarPolicy::ScrollBarAsNeeded);
layout->addWidget(flowWidget);
getBannerCardsForDecks();
// TODO: Move this to class that uses this widget (The tab one, in this instance, distinct from the game one)
// connect(this, &TabDeckStorageVisual::openDeckEditor, tabSupervisor, &TabSupervisor::addDeckEditorTab);
}
QStringList VisualDeckStorageWidget::getBannerCardsForDecks()
{
QStringList allFiles;
// QDirIterator with QDir::Files and QDir::NoSymLinks ensures only files are listed (no directories or symlinks)
QDirIterator it(SettingsCache::instance().getDeckPath(), QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
while (it.hasNext()) {
allFiles << it.next(); // Add each file path to the list
}
foreach (const QString &file, allFiles) {
qDebug() << file;
auto deckLoader = new DeckLoader();
deckLoader->loadFromFile(file, DeckLoader::CockatriceFormat);
deckListModel->setDeckList(new DeckLoader(*deckLoader));
auto *display = new DeckPreviewCardPictureWidget(flowWidget, true);
qDebug() << "Banner card is: " << deckLoader->getBannerCard();
display->setCard(CardDatabaseManager::getInstance()->getCard(deckLoader->getBannerCard()));
display->setOverlayText(deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName()
: deckLoader->getName());
display->setFontSize(24);
display->setFilePath(deckLoader->getLastFileName());
// TODO: Connect these to the parent.
// connect(display, &DeckPreviewCardPictureWidget::imageClicked, this, &TabDeckStorageVisual::actOpenLocalDeck);
flowWidget->addWidget(display);
}
return QStringList("lol");
}

View file

@ -0,0 +1,26 @@
#ifndef VISUAL_DECK_STORAGE_WIDGET_H
#define VISUAL_DECK_STORAGE_WIDGET_H
#include "../../../../deck/deck_list_model.h"
#include "../../../../deck/deck_view.h"
#include "../../../ui/widgets/general/layout_containers/flow_widget.h"
#include <QFileSystemModel>
class VisualDeckStorageWidget final : public QWidget
{
Q_OBJECT
public:
explicit VisualDeckStorageWidget(QWidget *parent);
void retranslateUi();
private:
QHBoxLayout *layout;
FlowWidget *flowWidget;
DeckListModel *deckListModel;
QMap<QString, DeckViewCardContainer *> cardContainers;
QStringList getBannerCardsForDecks();
};
#endif // VISUAL_DECK_STORAGE_WIDGET_H