From 0a1e0bcf8438dd89638fea23ff208b0447c86d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Tue, 5 Nov 2024 10:15:57 +0100 Subject: [PATCH] Add TabDeckStorageVisual --- cockatrice/CMakeLists.txt | 1 + cockatrice/src/client/tabs/tab_supervisor.cpp | 10 + cockatrice/src/client/tabs/tab_supervisor.h | 2 + .../tab_deck_storage_visual.cpp | 184 ++++++++++++++++++ .../tab_deck_storage_visual.h | 58 ++++++ 5 files changed, 255 insertions(+) create mode 100644 cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp create mode 100644 cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 06870b36c..de02c5dd3 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -159,6 +159,7 @@ set(cockatrice_SOURCES src/client/ui/window_main.cpp src/game/zones/view_zone_widget.cpp src/game/zones/view_zone.cpp + src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp ${VERSION_STRING_CPP} ) diff --git a/cockatrice/src/client/tabs/tab_supervisor.cpp b/cockatrice/src/client/tabs/tab_supervisor.cpp index 9ef7ee385..c71b19a3f 100644 --- a/cockatrice/src/client/tabs/tab_supervisor.cpp +++ b/cockatrice/src/client/tabs/tab_supervisor.cpp @@ -24,6 +24,7 @@ #include "tab_replays.h" #include "tab_room.h" #include "tab_server.h" +#include "visual_deck_storage/tab_deck_storage_visual.h" #include #include @@ -504,6 +505,15 @@ TabDeckEditor *TabSupervisor::addDeckEditorTab(const DeckLoader *deckToOpen) 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) { if (tab == currentWidget()) diff --git a/cockatrice/src/client/tabs/tab_supervisor.h b/cockatrice/src/client/tabs/tab_supervisor.h index 7b43881d3..0f7dcf4ed 100644 --- a/cockatrice/src/client/tabs/tab_supervisor.h +++ b/cockatrice/src/client/tabs/tab_supervisor.h @@ -3,6 +3,7 @@ #include "../../deck/deck_loader.h" #include "../../server/chat_view/user_list_proxy.h" +#include "visual_deck_storage/tab_deck_storage_visual.h" #include #include @@ -130,6 +131,7 @@ signals: public slots: TabDeckEditor *addDeckEditorTab(const DeckLoader *deckToOpen); + TabDeckStorageVisual *addVisualDeckStorageTab(); void openReplay(GameReplay *replay); void maximizeMainWindow(); private slots: diff --git a/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp new file mode 100644 index 000000000..6a54dad7f --- /dev/null +++ b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include + +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(listRoot->at(i)); + + for (int j = 0; j < currentZone->size(); j++) { + DecklistCardNode *currentCard = dynamic_cast(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. +} diff --git a/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.h b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.h new file mode 100644 index 000000000..e35fc23b2 --- /dev/null +++ b/cockatrice/src/client/tabs/visual_deck_storage/tab_deck_storage_visual.h @@ -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 + +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 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