Shuffle some classes and signals around.

This commit is contained in:
Lukas Brübach 2025-01-07 22:23:27 +01:00
parent bb4d30107e
commit 11f92bf101
13 changed files with 224 additions and 97 deletions

View file

@ -162,8 +162,10 @@ 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/deck_preview_widget.cpp
src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp
src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp
src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp
${VERSION_STRING_CPP}
)

View file

@ -145,7 +145,7 @@ DeckViewContainer::DeckViewContainer(int _playerId, TabGame *parent)
deckView->setVisible(false);
visualDeckStorageWidget = new VisualDeckStorageWidget(this);
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::imageDoubleClicked, this,
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::deckPreviewDoubleClicked, this,
&DeckViewContainer::replaceDeckStorageWithDeckView);
deckViewLayout = new QVBoxLayout;
@ -299,20 +299,12 @@ void TabGame::refreshShortcuts()
}
}
void DeckViewContainer::replaceDeckStorageWithDeckView(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
void DeckViewContainer::replaceDeckStorageWithDeckView(QMouseEvent *event, DeckPreviewWidget *instance)
{
Q_UNUSED(event);
QString fileName = instance->filePath;
DeckLoader::FileFormat fmt = DeckLoader::getFormatFromName(fileName);
QString deckString;
DeckLoader deck;
QString deckString = instance->deckLoader->writeToString_Native();
bool error = !deck.loadFromFile(fileName, fmt, true);
if (!error) {
deckString = deck.writeToString_Native();
error = deckString.length() > MAX_FILE_LENGTH;
}
if (error) {
if (deckString.length() > MAX_FILE_LENGTH) {
QMessageBox::critical(this, tr("Error"), tr("The selected file could not be loaded."));
return;
}

View file

@ -95,7 +95,7 @@ private:
TabGame *parentGame;
int playerId;
private slots:
void replaceDeckStorageWithDeckView(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void replaceDeckStorageWithDeckView(QMouseEvent *event, DeckPreviewWidget *instance);
void loadLocalDeck();
void loadRemoteDeck();
void unloadDeck();

View file

@ -49,7 +49,7 @@ TabDeckStorageVisual::TabDeckStorageVisual(TabSupervisor *_tabSupervisor, Abstra
leftToolBar->addAction(aDeleteLocalDeck);
visualDeckStorageWidget = new VisualDeckStorageWidget(this);
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::imageDoubleClicked, this,
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::deckPreviewDoubleClicked, this,
&TabDeckStorageVisual::actOpenLocalDeck);
// layout->addWidget(leftToolBar);
@ -74,7 +74,7 @@ QString TabDeckStorageVisual::getTargetPath() const
return {};
}
void TabDeckStorageVisual::actOpenLocalDeck(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
void TabDeckStorageVisual::actOpenLocalDeck(QMouseEvent *event, DeckPreviewWidget *instance)
{
(void)event;
DeckLoader deckLoader;

View file

@ -34,7 +34,7 @@ public:
public slots:
void cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus);
void closeRequest() override;
void actOpenLocalDeck(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void actOpenLocalDeck(QMouseEvent *event, DeckPreviewWidget *instance);
void actDeleteLocalDeck();
signals:
void openDeckEditor(const DeckLoader *deckLoader);

View file

@ -1,6 +1,7 @@
#include "deck_preview_card_picture_widget.h"
#include <QApplication>
#include <QFileInfo>
#include <QFontMetrics>
#include <QMouseEvent>
#include <QPainterPath>
@ -15,6 +16,7 @@
* @param outlineColor The color of the outline around the text.
* @param fontSize The font size of the overlay text.
* @param alignment The alignment of the text within the overlay.
* @param _deckLoader The Deck Loader holding the Deck associated with this preview.
*
* Sets the widget's size policy and default border style.
*/
@ -26,7 +28,6 @@ DeckPreviewCardPictureWidget::DeckPreviewCardPictureWidget(QWidget *parent,
const Qt::Alignment alignment)
: CardInfoPictureWithTextOverlayWidget(parent, hoverToZoomEnabled, textColor, outlineColor, fontSize, alignment)
{
// TODO Make this hold the deckloader
singleClickTimer = new QTimer(this);
singleClickTimer->setSingleShot(true);
connect(singleClickTimer, &QTimer::timeout, this, [this]() { emit imageClicked(lastMouseEvent, this); });
@ -47,8 +48,3 @@ void DeckPreviewCardPictureWidget::mouseDoubleClickEvent(QMouseEvent *event)
emit imageDoubleClicked(lastMouseEvent, this);
}
}
void DeckPreviewCardPictureWidget::setFilePath(const QString &_filePath)
{
filePath = _filePath;
}

View file

@ -12,22 +12,17 @@ class DeckPreviewCardPictureWidget final : public CardInfoPictureWithTextOverlay
Q_OBJECT
public:
explicit DeckPreviewCardPictureWidget(QWidget *parent = nullptr,
explicit DeckPreviewCardPictureWidget(QWidget *parent,
bool hoverToZoomEnabled = false,
const QColor &textColor = Qt::white,
const QColor &outlineColor = Qt::black,
int fontSize = 12,
Qt::Alignment alignment = Qt::AlignCenter);
QString filePath;
signals:
void imageClicked(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void imageDoubleClicked(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
public slots:
void setFilePath(const QString &filePath);
private:
QTimer *singleClickTimer;
QMouseEvent *lastMouseEvent = nullptr; // Store the last mouse event

View file

@ -0,0 +1,52 @@
#include "deck_preview_widget.h"
#include "../../../../game/cards/card_database_manager.h"
#include "../cards/deck_preview_card_picture_widget.h"
#include <QFileInfo>
#include <QVBoxLayout>
DeckPreviewWidget::DeckPreviewWidget(QWidget *parent, const QString &_filePath) : QWidget(parent), filePath(_filePath)
{
layout = new QVBoxLayout(this);
setLayout(layout);
deckLoader = new DeckLoader();
deckLoader->loadFromFile(filePath, DeckLoader::CockatriceFormat);
auto bannerCard = deckLoader->getBannerCard().isEmpty()
? CardInfoPtr()
: CardDatabaseManager::getInstance()->getCard(deckLoader->getBannerCard());
bannerCardDisplayWidget = new DeckPreviewCardPictureWidget(this);
connect(bannerCardDisplayWidget, &DeckPreviewCardPictureWidget::imageClicked, this,
&DeckPreviewWidget::imageClickedEvent);
connect(bannerCardDisplayWidget, &DeckPreviewCardPictureWidget::imageDoubleClicked, this,
&DeckPreviewWidget::imageDoubleClickedEvent);
bannerCardDisplayWidget->setCard(bannerCard);
bannerCardDisplayWidget->setOverlayText(
deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName() : deckLoader->getName());
bannerCardDisplayWidget->setFontSize(24);
setFilePath(deckLoader->getLastFileName());
layout->addWidget(bannerCardDisplayWidget);
}
void DeckPreviewWidget::setFilePath(const QString &_filePath)
{
filePath = _filePath;
}
void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
{
Q_UNUSED(instance);
emit deckPreviewClicked(event, this);
}
void DeckPreviewWidget::imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
{
Q_UNUSED(instance);
emit deckPreviewDoubleClicked(event, this);
}

View file

@ -0,0 +1,31 @@
#ifndef DECK_PREVIEW_WIDGET_H
#define DECK_PREVIEW_WIDGET_H
#include "../../../../deck/deck_loader.h"
#include "../cards/deck_preview_card_picture_widget.h"
#include <QVBoxLayout>
#include <QWidget>
class DeckPreviewWidget final : public QWidget
{
Q_OBJECT
public:
explicit DeckPreviewWidget(QWidget *parent, const QString &_filePath);
QVBoxLayout *layout;
QString filePath;
DeckLoader *deckLoader;
DeckPreviewCardPictureWidget *bannerCardDisplayWidget;
signals:
void deckPreviewClicked(QMouseEvent *event, DeckPreviewWidget *instance);
void deckPreviewDoubleClicked(QMouseEvent *event, DeckPreviewWidget *instance);
public slots:
void setFilePath(const QString &filePath);
void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
};
#endif // DECK_PREVIEW_WIDGET_H

View file

@ -0,0 +1,63 @@
#include "visual_deck_storage_sort_widget.h"
#include "../../../../settings/cache_settings.h"
/**
* @brief Constructs a PrintingSelectorCardSortWidget for searching cards by set name or set code.
*
* This widget provides a search bar that allows users to search for cards by either their set name
* or set code. It uses a debounced timer to trigger the search action after the user stops typing.
*
* @param parent The parent PrintingSelector widget that will handle the search results.
*/
VisualDeckStorageSortWidget::VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent)
: parent(parent), sortOrder(Alphabetical)
{
layout = new QHBoxLayout(this);
setLayout(layout);
// ComboBox for sorting options
sortComboBox = new QComboBox(this);
sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical);
sortComboBox->addItem("Sort by Last Modified", ByLastModified);
// Connect sorting change signal to refresh the file list
connect(sortComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&VisualDeckStorageSortWidget::updateSortOrder);
connect(this, &VisualDeckStorageSortWidget::sortOrderChanged, parent, &VisualDeckStorageWidget::updateSortOrder);
layout->addWidget(sortComboBox);
}
void VisualDeckStorageSortWidget::showEvent(QShowEvent *event)
{
QWidget::showEvent(event);
sortComboBox->setCurrentIndex(SettingsCache::instance().getVisualDeckStorageSortingOrder());
}
void VisualDeckStorageSortWidget::updateSortOrder()
{
sortOrder = static_cast<SortOrder>(sortComboBox->currentData().toInt());
SettingsCache::instance().setVisualDeckStorageSortingOrder(sortComboBox->currentData().toInt());
emit sortOrderChanged();
}
QStringList VisualDeckStorageSortWidget::filterFiles(QStringList &files)
{
// Sort files based on the current sort order
std::sort(files.begin(), files.end(), [this](const QString &file1, const QString &file2) {
QFileInfo info1(file1);
QFileInfo info2(file2);
switch (sortOrder) {
case Alphabetical:
return info1.fileName().toLower() < info2.fileName().toLower();
case ByLastModified:
return info1.lastModified() > info2.lastModified();
}
return false; // Default case
});
return files;
}

View file

@ -0,0 +1,39 @@
#ifndef VISUAL_DECK_STORAGE_SORT_WIDGET_H
#define VISUAL_DECK_STORAGE_SORT_WIDGET_H
#include "visual_deck_storage_widget.h"
#include <QComboBox>
#include <QHBoxLayout>
#include <QWidget>
class VisualDeckStorageWidget;
class VisualDeckStorageSortWidget : public QWidget
{
Q_OBJECT
public:
explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent);
void updateSortOrder();
QString getSearchText();
QStringList filterFiles(QStringList &files);
public slots:
void showEvent(QShowEvent *event) override;
signals:
void sortOrderChanged();
private:
enum SortOrder
{
Alphabetical,
ByLastModified
};
QHBoxLayout *layout;
VisualDeckStorageWidget *parent;
SortOrder sortOrder; // Current sorting option
QComboBox *sortComboBox;
};
#endif // VISUAL_DECK_STORAGE_SORT_WIDGET_H

View file

@ -3,14 +3,16 @@
#include "../../../../deck/deck_loader.h"
#include "../../../../game/cards/card_database_manager.h"
#include "../../../../settings/cache_settings.h"
#include "deck_preview_widget.h"
#include "visual_deck_storage_search_widget.h"
#include "visual_deck_storage_sort_widget.h"
#include <QComboBox>
#include <QDirIterator>
#include <QMouseEvent>
#include <QVBoxLayout>
VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent), sortOrder(Alphabetical)
VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent)
{
deckListModel = new DeckListModel(this);
deckListModel->setObjectName("visualDeckModel");
@ -18,16 +20,11 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
layout = new QVBoxLayout();
setLayout(layout);
// ComboBox for sorting options
sortComboBox = new QComboBox(this);
sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical);
sortComboBox->addItem("Sort by Last Modified", ByLastModified);
sortComboBox->setCurrentIndex(SettingsCache::instance().getVisualDeckStorageSortingOrder());
sortWidget = new VisualDeckStorageSortWidget(this);
searchWidget = new VisualDeckStorageSearchWidget(this);
// Add combo box to the main layout
layout->addWidget(sortComboBox);
layout->addWidget(sortWidget);
layout->addWidget(searchWidget);
flowWidget = new FlowWidget(this, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
@ -35,10 +32,6 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
cardSizeWidget = new CardSizeWidget(this, flowWidget, SettingsCache::instance().getVisualDeckStorageCardSize());
layout->addWidget(cardSizeWidget);
// Connect sorting change signal to refresh the file list
connect(sortComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&VisualDeckStorageWidget::updateSortOrder);
}
void VisualDeckStorageWidget::showEvent(QShowEvent *event)
@ -49,19 +42,17 @@ void VisualDeckStorageWidget::showEvent(QShowEvent *event)
void VisualDeckStorageWidget::updateSortOrder()
{
sortOrder = static_cast<SortOrder>(sortComboBox->currentData().toInt());
SettingsCache::instance().setVisualDeckStorageSortingOrder(sortComboBox->currentData().toInt());
refreshBannerCards(); // Refresh the banner cards with the new sort order
}
void VisualDeckStorageWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
void VisualDeckStorageWidget::deckPreviewClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance)
{
emit imageClicked(event, instance);
emit deckPreviewClicked(event, instance);
}
void VisualDeckStorageWidget::imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
void VisualDeckStorageWidget::deckPreviewDoubleClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance)
{
emit imageDoubleClicked(event, instance);
emit deckPreviewDoubleClicked(event, instance);
}
void VisualDeckStorageWidget::refreshBannerCards()
@ -76,48 +67,20 @@ void VisualDeckStorageWidget::refreshBannerCards()
allFiles << it.next(); // Add each file path to the list
}
// Sort files based on the current sort order
std::sort(allFiles.begin(), allFiles.end(), [this](const QString &file1, const QString &file2) {
QFileInfo info1(file1);
QFileInfo info2(file2);
switch (sortOrder) {
case Alphabetical:
return info1.fileName().toLower() < info2.fileName().toLower();
case ByLastModified:
return info1.lastModified() > info2.lastModified();
}
return false; // Default case
});
auto filteredFiles = searchWidget->filterFiles(allFiles, searchWidget->getSearchText());
auto filteredFiles = searchWidget->filterFiles(sortWidget->filterFiles(allFiles), searchWidget->getSearchText());
flowWidget->clearLayout(); // Clear existing widgets in the flow layout
foreach (const QString &file, filteredFiles) {
// TODO: We load the deck here to retrieve information (we sorta really have to) but since we do the work,
// we may as well persist the deckLoader to save ourselves some heavy lifting later?
auto deckLoader = new DeckLoader();
deckLoader->loadFromFile(file, DeckLoader::CockatriceFormat);
deckListModel->setDeckList(new DeckLoader(*deckLoader));
auto *display = new DeckPreviewWidget(flowWidget, file);
auto *display = new DeckPreviewCardPictureWidget(flowWidget, false);
auto bannerCard = deckLoader->getBannerCard().isEmpty()
? CardInfoPtr()
: CardDatabaseManager::getInstance()->getCard(deckLoader->getBannerCard());
display->setCard(bannerCard);
display->setOverlayText(deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName()
: deckLoader->getName());
display->setFontSize(24);
display->setFilePath(deckLoader->getLastFileName());
connect(display, &DeckPreviewCardPictureWidget::imageClicked, this,
&VisualDeckStorageWidget::imageClickedEvent);
connect(display, &DeckPreviewCardPictureWidget::imageDoubleClicked, this,
&VisualDeckStorageWidget::imageDoubleClickedEvent);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, display, &CardInfoPictureWidget::setScaleFactor);
display->setScaleFactor(cardSizeWidget->getSlider()->value());
connect(display, &DeckPreviewWidget::deckPreviewClicked, this,
&VisualDeckStorageWidget::deckPreviewClickedEvent);
connect(display, &DeckPreviewWidget::deckPreviewDoubleClicked, this,
&VisualDeckStorageWidget::deckPreviewDoubleClickedEvent);
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, display->bannerCardDisplayWidget,
&CardInfoPictureWidget::setScaleFactor);
display->bannerCardDisplayWidget->setScaleFactor(cardSizeWidget->getSlider()->value());
flowWidget->addWidget(display);
}
}

View file

@ -3,15 +3,16 @@
#include "../../../../deck/deck_list_model.h"
#include "../../../../deck/deck_view.h"
#include "../../../ui/widgets/cards/deck_preview_card_picture_widget.h"
#include "../../../ui/widgets/general/layout_containers/flow_widget.h"
#include "../cards/card_size_widget.h"
#include "deck_preview_widget.h"
#include "visual_deck_storage_search_widget.h"
#include "visual_deck_storage_sort_widget.h"
#include <QComboBox>
#include <QFileSystemModel>
class VisualDeckStorageSearchWidget;
class VisualDeckStorageSortWidget;
class VisualDeckStorageWidget final : public QWidget
{
Q_OBJECT
@ -20,30 +21,23 @@ public:
void retranslateUi();
public slots:
void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void deckPreviewClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance);
void deckPreviewDoubleClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance);
void refreshBannerCards(); // Refresh the display of cards based on the current sorting option
void showEvent(QShowEvent *event) override;
void updateSortOrder();
signals:
void imageClicked(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void imageDoubleClicked(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void deckPreviewClicked(QMouseEvent *event, DeckPreviewWidget *instance);
void deckPreviewDoubleClicked(QMouseEvent *event, DeckPreviewWidget *instance);
private:
enum SortOrder
{
Alphabetical,
ByLastModified
};
QVBoxLayout *layout;
FlowWidget *flowWidget;
DeckListModel *deckListModel;
QMap<QString, DeckViewCardContainer *> cardContainers;
SortOrder sortOrder; // Current sorting option
QComboBox *sortComboBox;
VisualDeckStorageSortWidget *sortWidget;
VisualDeckStorageSearchWidget *searchWidget;
CardSizeWidget *cardSizeWidget;
};