Add TabDeckStorageVisual

This commit is contained in:
Lukas Brübach 2024-11-05 10:15:57 +01:00
parent 0402d4b853
commit 0a1e0bcf84
5 changed files with 255 additions and 0 deletions

View file

@ -159,6 +159,7 @@ set(cockatrice_SOURCES
src/client/ui/window_main.cpp src/client/ui/window_main.cpp
src/game/zones/view_zone_widget.cpp src/game/zones/view_zone_widget.cpp
src/game/zones/view_zone.cpp src/game/zones/view_zone.cpp
src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
${VERSION_STRING_CPP} ${VERSION_STRING_CPP}
) )

View file

@ -24,6 +24,7 @@
#include "tab_replays.h" #include "tab_replays.h"
#include "tab_room.h" #include "tab_room.h"
#include "tab_server.h" #include "tab_server.h"
#include "visual_deck_storage/tab_deck_storage_visual.h"
#include <QApplication> #include <QApplication>
#include <QDebug> #include <QDebug>
@ -504,6 +505,15 @@ TabDeckEditor *TabSupervisor::addDeckEditorTab(const DeckLoader *deckToOpen)
return tab; return tab;
} }
TabDeckStorageVisual *TabSupervisor::addVisualDeckStorageTab()
{
TabDeckStorageVisual *tab = new TabDeckStorageVisual(this, client);
int tabIndex = myAddTab(tab);
addCloseButtonToTab(tab, tabIndex);
setCurrentWidget(tab);
return tab;
}
void TabSupervisor::deckEditorClosed(TabDeckEditor *tab) void TabSupervisor::deckEditorClosed(TabDeckEditor *tab)
{ {
if (tab == currentWidget()) if (tab == currentWidget())

View file

@ -3,6 +3,7 @@
#include "../../deck/deck_loader.h" #include "../../deck/deck_loader.h"
#include "../../server/chat_view/user_list_proxy.h" #include "../../server/chat_view/user_list_proxy.h"
#include "visual_deck_storage/tab_deck_storage_visual.h"
#include <QAbstractButton> #include <QAbstractButton>
#include <QCommonStyle> #include <QCommonStyle>
@ -130,6 +131,7 @@ signals:
public slots: public slots:
TabDeckEditor *addDeckEditorTab(const DeckLoader *deckToOpen); TabDeckEditor *addDeckEditorTab(const DeckLoader *deckToOpen);
TabDeckStorageVisual *addVisualDeckStorageTab();
void openReplay(GameReplay *replay); void openReplay(GameReplay *replay);
void maximizeMainWindow(); void maximizeMainWindow();
private slots: private slots:

View file

@ -0,0 +1,184 @@
#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/general/layout_containers/flow_widget.h"
#include "../../ui/widgets/general/layout_containers/overlap_widget.h"
#include "pb/command_deck_del.pb.h"
#include <QAction>
#include <QDebug>
#include <QFileSystemModel>
#include <QHBoxLayout>
#include <QInputDialog>
#include <QMessageBox>
#include <QScreen>
#include <QToolBar>
#include <QTreeView>
class FlowLayout;
TabDeckStorageVisual::TabDeckStorageVisual(TabSupervisor *_tabSupervisor, AbstractClient *_client)
: Tab(_tabSupervisor), client(_client)
{
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();
leftToolBar = new QToolBar;
leftToolBar->setOrientation(Qt::Horizontal);
leftToolBar->setIconSize(QSize(32, 32));
QHBoxLayout *leftToolBarLayout = new QHBoxLayout;
leftToolBarLayout->addStretch();
leftToolBarLayout->addWidget(leftToolBar);
leftToolBarLayout->addStretch();
aOpenLocalDeck = new QAction(this);
aOpenLocalDeck->setIcon(QPixmap("theme:icons/pencil"));
connect(aOpenLocalDeck, SIGNAL(triggered()), this, SLOT(actOpenLocalDeck()));
aDeleteLocalDeck = new QAction(this);
aDeleteLocalDeck->setIcon(QPixmap("theme:icons/remove_row"));
connect(aDeleteLocalDeck, SIGNAL(triggered()), this, SLOT(actDeleteLocalDeck()));
leftToolBar->addAction(aOpenLocalDeck);
leftToolBar->addAction(aDeleteLocalDeck);
retranslateUi();
}
void TabDeckStorageVisual::retranslateUi()
{
aOpenLocalDeck->setText(tr("Open in deck editor"));
aDeleteLocalDeck->setText(tr("Delete"));
}
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
}
auto deck_loader = new DeckLoader();
foreach (const QString &file, allFiles) {
qDebug() << file;
deck_loader->loadFromFile(file, DeckLoader::CockatriceFormat);
deck_list_model->setDeckList(new DeckLoader(*deck_loader));
InnerDecklistNode *listRoot = deck_list_model->getDeckList()->getRoot();
bool shouldExitOuterLoop = false; // Flag to indicate if we should exit the outer loop
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) {
CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName());
if (info) {
if (info->getCardType().contains("Legendary Creature")) {
//qDebug() << currentCard->getName();
//qDebug() << info->getCmc();
//qDebug() << info->getProperties();
//qDebug() << info->getCardType();
CardInfoPerSetMap setMap = info->getSets();
OverlapWidget *printings_group_widget = new OverlapWidget(80, 0, 0, Qt::Orientation::Vertical, this);
for (auto set : setMap) {
//qDebug() << set.getPtr()->getLongName();
CardInfoPtr set_info = CardDatabaseManager::getInstance()->getCardByNameAndUUID(currentCard->getName(), set.getProperty("uuid"));
CardInfoPictureWithTextOverlayWidget* display = new CardInfoPictureWithTextOverlayWidget(printings_group_widget, true);
display->setCard(set_info);
display->setOverlayText(deck_loader->getName());
display->setFontSize(24);
printings_group_widget->addWidget(display);
}
flow_widget->addWidget(printings_group_widget);
//db->getPreferredPrintingForCard(info->getName());
//PictureLoader::getCardBackPixmap();
shouldExitOuterLoop = true; // Set the flag to exit the outer loop
break; // Break the innermost loop
}
} else {
//qDebug() << "Card not found in database!";
}
// emit newCardAdded(newCard);
}
if (shouldExitOuterLoop) {
break; // Break the middle loop if flag is set
}
}
if (shouldExitOuterLoop) {
break; // Break the outer loop if flag is set
}
}
}
return QStringList("lol");
}
void TabDeckStorageVisual::actOpenLocalDeck()
{
QModelIndex curLeft = localDirView->selectionModel()->currentIndex();
if (localDirModel->isDir(curLeft))
return;
QString filePath = localDirModel->filePath(curLeft);
DeckLoader deckLoader;
if (!deckLoader.loadFromFile(filePath, DeckLoader::CockatriceFormat))
return;
emit openDeckEditor(&deckLoader);
}
void TabDeckStorageVisual::actDeleteLocalDeck()
{
QModelIndex curLeft = localDirView->selectionModel()->currentIndex();
if (localDirModel->isDir(curLeft))
return;
if (QMessageBox::warning(this, tr("Delete local file"),
tr("Are you sure you want to delete \"%1\"?").arg(localDirModel->fileName(curLeft)),
QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
return;
localDirModel->remove(curLeft);
}
void TabDeckStorageVisual::cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << "Card update process finished with exit code:" << exitCode << "and exit status:" << exitStatus;
// You can add any additional logic you need here.
}

View file

@ -0,0 +1,58 @@
#ifndef TAB_DECK_STORAGE_VISUAL_H
#define TAB_DECK_STORAGE_VISUAL_H
#include "../../../deck/deck_list_model.h"
#include "../../../deck/deck_view.h"
#include "../../ui/layouts/flow_layout.h"
#include "../../ui/widgets/general/layout_containers/flow_widget.h"
#include "../../ui/layouts/overlap_layout.h"
#include "../tab.h"
#include <QProcess>
class AbstractClient;
class QTreeView;
class QFileSystemModel;
class QToolBar;
class QTreeWidget;
class QTreeWidgetItem;
class QGroupBox;
class CommandContainer;
class Response;
class DeckLoader;
class TabDeckStorageVisual : 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();
void actDeleteLocalDeck();
public:
TabDeckStorageVisual(TabSupervisor *_tabSupervisor, AbstractClient *_client);
void retranslateUi();
QString getTabText() const
{
return tr("Deck storage");
}
public slots:
void cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus);
signals:
void openDeckEditor(const DeckLoader *deckLoader);
};
#endif