diff --git a/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.cpp new file mode 100644 index 000000000..8a78394aa --- /dev/null +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.cpp @@ -0,0 +1,80 @@ +#include "card_group_display_widget.h" + +#include "../../../../../deck/deck_list_model.h" +#include "../../../../../game/cards/card_database_manager.h" +#include "../../../../../utility/card_info_comparator.h" +#include "../card_info_picture_with_text_overlay_widget.h" + +#include + +CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent, + DeckListModel *_deckListModel, + QString _zoneName, + QString _cardGroupCategory, + QString _activeGroupCriteria, + QStringList _activeSortCriteria, + int bannerOpacity, + CardSizeWidget *_cardSizeWidget) + : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), + activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria), cardSizeWidget(_cardSizeWidget) +{ + layout = new QVBoxLayout(this); + setLayout(layout); + setMinimumSize(QSize(0, 0)); + + banner = new BannerWidget(this, cardGroupCategory, Qt::Orientation::Vertical, bannerOpacity); + + layout->addWidget(banner); + updateCardDisplays(); +} + +void CardGroupDisplayWidget::updateCardDisplays(){ + +} + +QList CardGroupDisplayWidget::getCardsMatchingGroup(QList cardsToSort) +{ + cardsToSort = sortCardList(cardsToSort, activeSortCriteria, Qt::SortOrder::AscendingOrder); + + QList activeList; + for (const CardInfoPtr &info : cardsToSort) { + if (info && info->getProperty(activeGroupCriteria) == cardGroupCategory) { + activeList.append(info); + } + } + + return activeList; +} + +QList CardGroupDisplayWidget::sortCardList(QList cardsToSort, + const QStringList properties, + Qt::SortOrder order = Qt::AscendingOrder) +{ + CardInfoComparator comparator(properties, order); + std::sort(cardsToSort.begin(), cardsToSort.end(), comparator); + + return cardsToSort; +} + +void CardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSortCriteria) +{ + if (activeSortCriteria != _activeSortCriteria) { + activeSortCriteria = _activeSortCriteria; + updateCardDisplays(); // Refresh display with new sorting + } +} + +void CardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card) +{ + emit cardClicked(event, card); +} + +void CardGroupDisplayWidget::onHover(CardInfoPtr card) +{ + emit cardHovered(card); +} + +void CardGroupDisplayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); +} \ No newline at end of file diff --git a/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.h b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.h new file mode 100644 index 000000000..c470b7d83 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/card_group_display_widget.h @@ -0,0 +1,53 @@ +#ifndef CARD_GROUP_DISPLAY_WIDGET_H +#define CARD_GROUP_DISPLAY_WIDGET_H + +#include "../../../../../deck/deck_list_model.h" +#include "../../../../../game/cards/card_database.h" +#include "../../general/display/banner_widget.h" +#include "../card_info_picture_with_text_overlay_widget.h" +#include "../card_size_widget.h" + +#include +#include +#include + +class CardGroupDisplayWidget : public QWidget +{ + Q_OBJECT + +public: + CardGroupDisplayWidget(QWidget *parent, + DeckListModel *deckListModel, + QString zoneName, + QString cardGroupCategory, + QString activeGroupCriteria, + QStringList activeSortCriteria, + int bannerOpacity, + CardSizeWidget *cardSizeWidget); + + QList getCardsMatchingGroup(QList cardsToSort); + void resizeEvent(QResizeEvent *event) override; + + DeckListModel *deckListModel; + QString zoneName; + QString cardGroupCategory; + QString activeGroupCriteria; + QStringList activeSortCriteria; + CardSizeWidget *cardSizeWidget; + +public slots: + QList sortCardList(QList cardsToSort, QStringList properties, Qt::SortOrder order); + void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); + void onHover(CardInfoPtr card); + virtual void updateCardDisplays(); + void onActiveSortCriteriaChanged(QStringList activeSortCriteria); + +signals: + void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); + void cardHovered(CardInfoPtr card); + +protected: + QVBoxLayout *layout; + BannerWidget *banner; +}; +#endif // CARD_GROUP_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.cpp new file mode 100644 index 000000000..b54846223 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.cpp @@ -0,0 +1,99 @@ +#include "flat_card_group_display_widget.h" + +#include "../../../../../deck/deck_list_model.h" +#include "../../../../../game/cards/card_database_manager.h" +#include "../../../../../utility/card_info_comparator.h" +#include "../card_info_picture_with_text_overlay_widget.h" + +#include + +FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent, + DeckListModel *_deckListModel, + QString _zoneName, + QString _cardGroupCategory, + QString _activeGroupCriteria, + QStringList _activeSortCriteria, + int bannerOpacity, + CardSizeWidget *_cardSizeWidget) + : CardGroupDisplayWidget(parent, _deckListModel, _zoneName, _cardGroupCategory, _activeGroupCriteria, _activeSortCriteria, bannerOpacity, _cardSizeWidget) +{ + flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff); + banner->setBuddy(flowWidget); + + layout->addWidget(flowWidget); + FlatCardGroupDisplayWidget::updateCardDisplays(); + connect(deckListModel, &DeckListModel::dataChanged, this, &FlatCardGroupDisplayWidget::updateCardDisplays); +} + +void FlatCardGroupDisplayWidget::updateCardDisplays() +{ + // Retrieve and sort cards + QList cardsInZone = getCardsMatchingGroup(deckListModel->getCardsAsCardInfoPtrsForZone(zoneName)); + + // Show or hide widget + bool shouldBeVisible = !cardsInZone.isEmpty(); + if (shouldBeVisible != isVisible()) { + setVisible(shouldBeVisible); + } + + // Retrieve existing widgets + QList existingWidgets = + flowWidget->findChildren(); + + QHash> widgetMap; + for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) { + widgetMap[widget->getInfo()->getName()].append(widget); + } + + QList sortedWidgets; + QSet usedWidgets; + + // Ensure widgets are ordered to match the sorted cards + for (const CardInfoPtr &card : cardsInZone) { + QString name = card->getName(); + CardInfoPictureWithTextOverlayWidget *widget = nullptr; + + if (!widgetMap[name].isEmpty()) { + // Reuse an existing widget + widget = widgetMap[name].takeFirst(); + } else { + // Create a new widget if needed + widget = new CardInfoPictureWithTextOverlayWidget(flowWidget, true); + widget->setScaleFactor(cardSizeWidget->getSlider()->value()); + widget->setCard(card); + + connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, + &FlatCardGroupDisplayWidget::onClick); + connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, + &FlatCardGroupDisplayWidget::onHover); + connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget, &CardInfoPictureWidget::setScaleFactor); + + flowWidget->addWidget(widget); + } + + // Store in sorted order + sortedWidgets.append(widget); + usedWidgets.insert(widget); + } + + // Remove extra widgets + for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) { + if (!usedWidgets.contains(widget)) { + flowWidget->layout()->removeWidget(widget); + delete widget; + } + } + + // **Reorder widgets in place** + for (int i = 0; i < sortedWidgets.size(); ++i) { + sortedWidgets[i]->setParent(nullptr); // Temporarily detach + } + for (int i = 0; i < sortedWidgets.size(); ++i) { + flowWidget->addWidget(sortedWidgets[i]); // Reattach in correct order + } +} + +void FlatCardGroupDisplayWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); +} \ No newline at end of file diff --git a/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.h b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.h new file mode 100644 index 000000000..45a75907e --- /dev/null +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/flat_card_group_display_widget.h @@ -0,0 +1,30 @@ +#ifndef FLAT_CARD_GROUP_DISPLAY_WIDGET_H +#define FLAT_CARD_GROUP_DISPLAY_WIDGET_H + +#include "../../general/layout_containers/flow_widget.h" +#include "card_group_display_widget.h" + +class FlatCardGroupDisplayWidget : public CardGroupDisplayWidget +{ + Q_OBJECT + +public: + FlatCardGroupDisplayWidget(QWidget *parent, + DeckListModel *deckListModel, + QString zoneName, + QString cardGroupCategory, + QString activeGroupCriteria, + QStringList activeSortCriteria, + int bannerOpacity, + CardSizeWidget *cardSizeWidget); + + void resizeEvent(QResizeEvent *event) override; + +public slots: + void updateCardDisplays() override; + +private: + FlowWidget *flowWidget; +}; + +#endif // FLAT_CARD_GROUP_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.cpp similarity index 65% rename from cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp rename to cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.cpp index 75d12bee9..0dd969fe9 100644 --- a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.cpp @@ -1,9 +1,9 @@ #include "overlapped_card_group_display_widget.h" -#include "../../../../deck/deck_list_model.h" -#include "../../../../game/cards/card_database_manager.h" -#include "../../../../utility/card_info_comparator.h" -#include "card_info_picture_with_text_overlay_widget.h" +#include "../../../../../deck/deck_list_model.h" +#include "../../../../../game/cards/card_database_manager.h" +#include "../../../../../utility/card_info_comparator.h" +#include "../card_info_picture_with_text_overlay_widget.h" #include @@ -13,22 +13,25 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare QString _cardGroupCategory, QString _activeGroupCriteria, QStringList _activeSortCriteria, - int bannerOpacity) - : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), - activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria) + int bannerOpacity, + CardSizeWidget *_cardSizeWidget) + : CardGroupDisplayWidget(parent, + _deckListModel, + _zoneName, + _cardGroupCategory, + _activeGroupCriteria, + _activeSortCriteria, + bannerOpacity, + _cardSizeWidget) { - layout = new QVBoxLayout(this); - setLayout(layout); - setMinimumSize(QSize(0, 0)); - - banner = new BannerWidget(this, cardGroupCategory, Qt::Orientation::Vertical, bannerOpacity); overlapWidget = new OverlapWidget(this, 80, 1, 1, Qt::Vertical, true); banner->setBuddy(overlapWidget); - layout->addWidget(banner); layout->addWidget(overlapWidget); - updateCardDisplays(); + OverlappedCardGroupDisplayWidget::updateCardDisplays(); connect(deckListModel, &DeckListModel::dataChanged, this, &OverlappedCardGroupDisplayWidget::updateCardDisplays); + connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, this, + [this]() { overlapWidget->adjustMaxColumnsAndRows(); }); } void OverlappedCardGroupDisplayWidget::updateCardDisplays() @@ -65,12 +68,15 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays() } else { // Create a new widget if needed widget = new CardInfoPictureWithTextOverlayWidget(overlapWidget, true); + widget->setScaleFactor(cardSizeWidget->getSlider()->value()); widget->setCard(card); connect(widget, &CardInfoPictureWithTextOverlayWidget::imageClicked, this, &OverlappedCardGroupDisplayWidget::onClick); connect(widget, &CardInfoPictureWithTextOverlayWidget::hoveredOnCard, this, &OverlappedCardGroupDisplayWidget::onHover); + connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, widget, + &CardInfoPictureWidget::setScaleFactor); overlapWidget->addWidget(widget); } @@ -104,48 +110,6 @@ void OverlappedCardGroupDisplayWidget::updateCardDisplays() overlapWidget->adjustMaxColumnsAndRows(); } -QList OverlappedCardGroupDisplayWidget::getCardsMatchingGroup(QList cardsToSort) -{ - cardsToSort = sortCardList(cardsToSort, activeSortCriteria, Qt::SortOrder::AscendingOrder); - - QList activeList; - for (const CardInfoPtr &info : cardsToSort) { - if (info && info->getProperty(activeGroupCriteria) == cardGroupCategory) { - activeList.append(info); - } - } - - return activeList; -} - -QList OverlappedCardGroupDisplayWidget::sortCardList(QList cardsToSort, - const QStringList properties, - Qt::SortOrder order = Qt::AscendingOrder) -{ - CardInfoComparator comparator(properties, order); - std::sort(cardsToSort.begin(), cardsToSort.end(), comparator); - - return cardsToSort; -} - -void OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSortCriteria) -{ - if (activeSortCriteria != _activeSortCriteria) { - activeSortCriteria = _activeSortCriteria; - updateCardDisplays(); // Refresh display with new sorting - } -} - -void OverlappedCardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card) -{ - emit cardClicked(event, card); -} - -void OverlappedCardGroupDisplayWidget::onHover(CardInfoPtr card) -{ - emit cardHovered(card); -} - void OverlappedCardGroupDisplayWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); diff --git a/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.h b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.h new file mode 100644 index 000000000..e492316cd --- /dev/null +++ b/cockatrice/src/client/ui/widgets/cards/card_group_display_widgets/overlapped_card_group_display_widget.h @@ -0,0 +1,30 @@ +#ifndef OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H +#define OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H + +#include "../../general/layout_containers/overlap_widget.h" +#include "card_group_display_widget.h" + +class OverlappedCardGroupDisplayWidget : public CardGroupDisplayWidget +{ + Q_OBJECT + +public: + OverlappedCardGroupDisplayWidget(QWidget *parent, + DeckListModel *deckListModel, + QString zoneName, + QString cardGroupCategory, + QString activeGroupCriteria, + QStringList activeSortCriteria, + int bannerOpacity, + CardSizeWidget *cardSizeWidget); + + void resizeEvent(QResizeEvent *event) override; + +public slots: + void updateCardDisplays() override; + +private: + OverlapWidget *overlapWidget; +}; + +#endif // OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp index 81f9f7c7e..b5002d919 100644 --- a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.cpp @@ -2,7 +2,8 @@ #include "../../../../deck/deck_list_model.h" #include "../../../../utility/card_info_comparator.h" -#include "overlapped_card_group_display_widget.h" +#include "card_group_display_widgets/flat_card_group_display_widget.h" +#include "card_group_display_widgets/overlapped_card_group_display_widget.h" #include @@ -12,9 +13,11 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, QString _activeGroupCriteria, QStringList _activeSortCriteria, int bannerOpacity, - int subBannerOpacity) + int subBannerOpacity, + CardSizeWidget *_cardSizeWidget) : QWidget(parent), deckListModel(_deckListModel), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria), - activeSortCriteria(_activeSortCriteria), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity) + activeSortCriteria(_activeSortCriteria), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity), + cardSizeWidget(_cardSizeWidget) { layout = new QVBoxLayout(this); setLayout(layout); @@ -57,43 +60,76 @@ void DeckCardZoneDisplayWidget::displayCards() deleteCardGroupIfItDoesNotExist(); } +void DeckCardZoneDisplayWidget::refreshDisplayType(const QString &_displayType) +{ + displayType = _displayType; + QLayoutItem *item; + while ((item = cardGroupLayout->takeAt(0)) != nullptr) { + if (item->widget()) { + item->widget()->deleteLater(); + } else if (item->layout()) { + delete item->layout(); + } + delete item; + } + + // We gotta wait for all the deleteLater's to finish so we fire after the next event cycle + + auto timer = new QTimer(this); + timer->setSingleShot(true); + connect(timer, &QTimer::timeout, this, [this]() { displayCards(); }); + timer->start(); +} + void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist() { - QList cardGroupsDisplayWidgets = - cardGroupContainer->findChildren(); + QList cardGroupsDisplayWidgets = + cardGroupContainer->findChildren(); QList cardGroups = getGroupCriteriaValueList(); for (QString cardGroup : cardGroups) { bool found = false; - for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { + for (CardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { if (cardGroupDisplayWidget->cardGroupCategory == cardGroup) { found = true; } } if (!found) { - OverlappedCardGroupDisplayWidget *display_widget = - new OverlappedCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName, cardGroup, - activeGroupCriteria, activeSortCriteria, subBannerOpacity); - connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this, - SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); - connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); - connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, - &OverlappedCardGroupDisplayWidget::onActiveSortCriteriaChanged); - cardGroupLayout->addWidget(display_widget); + if (displayType == "overlap") { + auto *display_widget = new OverlappedCardGroupDisplayWidget( + cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria, + subBannerOpacity, cardSizeWidget); + connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), + this, SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); + connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); + connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, + &CardGroupDisplayWidget::onActiveSortCriteriaChanged); + cardGroupLayout->addWidget(display_widget); + } else if (displayType == "flat") { + auto *display_widget = new FlatCardGroupDisplayWidget( + cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria, + subBannerOpacity, cardSizeWidget); + connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), + this, SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); + connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); + connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, + &CardGroupDisplayWidget::onActiveSortCriteriaChanged); + cardGroupLayout->addWidget(display_widget); + } } } } void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist() { - QList cardGroupsDisplayWidgets = - cardGroupContainer->findChildren(); + QList cardGroupsDisplayWidgets = + cardGroupContainer->findChildren(); QList validGroups = getGroupCriteriaValueList(); - for (OverlappedCardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { + for (CardGroupDisplayWidget *cardGroupDisplayWidget : cardGroupsDisplayWidgets) { if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) { cardGroupLayout->removeWidget(cardGroupDisplayWidget); cardGroupDisplayWidget->deleteLater(); // Properly delete the widget after the event loop cycles diff --git a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h index 1f0d28c96..c946b9557 100644 --- a/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h +++ b/cockatrice/src/client/ui/widgets/cards/deck_card_zone_display_widget.h @@ -6,6 +6,7 @@ #include "../general/display/banner_widget.h" #include "../general/layout_containers/overlap_widget.h" #include "card_info_picture_with_text_overlay_widget.h" +#include "card_size_widget.h" #include #include @@ -21,7 +22,8 @@ public: QString activeGroupCriteria, QStringList activeSortCriteria, int bannerOpacity, - int subBannerOpacity); + int subBannerOpacity, + CardSizeWidget *_cardSizeWidget); DeckListModel *deckListModel; QString zoneName; void addCardsToOverlapWidget(); @@ -31,6 +33,7 @@ public slots: void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void onHover(CardInfoPtr card); void displayCards(); + void refreshDisplayType(const QString &displayType); void addCardGroupIfItDoesNotExist(); void deleteCardGroupIfItDoesNotExist(); void onActiveGroupCriteriaChanged(QString activeGroupCriteria); @@ -45,12 +48,14 @@ signals: private: QString activeGroupCriteria; QStringList activeSortCriteria; + int bannerOpacity = 20; + int subBannerOpacity = 10; + CardSizeWidget *cardSizeWidget; QVBoxLayout *layout; BannerWidget *banner; QWidget *cardGroupContainer; QVBoxLayout *cardGroupLayout; - int bannerOpacity = 20; - int subBannerOpacity = 10; + QString displayType = "flat"; OverlapWidget *overlapWidget; }; diff --git a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h b/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h deleted file mode 100644 index cbc3e5428..000000000 --- a/cockatrice/src/client/ui/widgets/cards/overlapped_card_group_display_widget.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H -#define OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H - -#include "../../../../deck/deck_list_model.h" -#include "../../../../game/cards/card_database.h" -#include "../general/display/banner_widget.h" -#include "../general/layout_containers/overlap_widget.h" -#include "card_info_picture_with_text_overlay_widget.h" - -#include -#include -#include - -class OverlappedCardGroupDisplayWidget : public QWidget -{ - Q_OBJECT - -public: - OverlappedCardGroupDisplayWidget(QWidget *parent, - DeckListModel *deckListModel, - QString zoneName, - QString cardGroupCategory, - QString activeGroupCriteria, - QStringList activeSortCriteria, - int bannerOpacity); - - QList getCardsMatchingGroup(QList cardsToSort); - void resizeEvent(QResizeEvent *event) override; - - DeckListModel *deckListModel; - QString zoneName; - QString cardGroupCategory; - QString activeGroupCriteria; - QStringList activeSortCriteria; - -public slots: - QList sortCardList(QList cardsToSort, QStringList properties, Qt::SortOrder order); - void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); - void onHover(CardInfoPtr card); - void updateCardDisplays(); - void onActiveSortCriteriaChanged(QStringList activeSortCriteria); - -signals: - void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); - void cardHovered(CardInfoPtr card); - -private: - QVBoxLayout *layout; - BannerWidget *banner; - OverlapWidget *overlapWidget; -}; - -#endif // OVERLAPPED_CARD_GROUP_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp index 186ab51ef..f85c9a724 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.cpp @@ -15,6 +15,7 @@ #include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/overlap_control_widget.h" +#include #include #include #include @@ -151,8 +152,12 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_ sortCriteriaButton->addSettingsWidget(sortLabel); sortCriteriaButton->addSettingsWidget(sortByListWidget); + displayTypeButton = new QCheckBox(this); + connect(displayTypeButton, &QCheckBox::toggled, this, &VisualDeckEditorWidget::updateDisplayType); + groupAndSortLayout->addWidget(groupByComboBox); groupAndSortLayout->addWidget(sortCriteriaButton); + groupAndSortLayout->addWidget(displayTypeButton); scrollArea = new QScrollArea(); scrollArea->setWidgetResizable(true); @@ -170,11 +175,11 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_ updateZoneWidgets(); - // overlapControlWidget = new OverlapControlWidget(80, 1, 1, Qt::Vertical, this); + cardSizeWidget = new CardSizeWidget(this); mainLayout->addWidget(groupAndSortContainer); mainLayout->addWidget(scrollArea); - // mainLayout->addWidget(overlapControlWidget); + mainLayout->addWidget(cardSizeWidget); retranslateUi(); } @@ -191,6 +196,16 @@ void VisualDeckEditorWidget::updateZoneWidgets() deleteZoneIfDoesNotExist(); } +void VisualDeckEditorWidget::updateDisplayType() +{ + if (displayTypeButton->checkState() == Qt::Checked) { + emit displayTypeChanged("flat"); + } else { + qDebug() << displayTypeButton->checkState(); + emit displayTypeChanged("overlap"); + } +} + void VisualDeckEditorWidget::addZoneIfDoesNotExist() { QList cardZoneDisplayWidgets = @@ -205,7 +220,7 @@ void VisualDeckEditorWidget::addZoneIfDoesNotExist() if (!found) { DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( - zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10); + zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10, cardSizeWidget); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover); connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick); @@ -213,6 +228,8 @@ void VisualDeckEditorWidget::addZoneIfDoesNotExist() &DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged); connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget, &DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged); + connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget, + &DeckCardZoneDisplayWidget::refreshDisplayType); zoneContainerLayout->addWidget(zoneDisplayWidget); } } diff --git a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h index 2e07f7de6..68bb09707 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_editor/visual_deck_editor_widget.h @@ -6,10 +6,12 @@ #include "../../../../game/cards/card_database.h" #include "../../../../game/cards/card_database_model.h" #include "../cards/card_info_picture_with_text_overlay_widget.h" +#include "../cards/card_size_widget.h" #include "../general/layout_containers/flow_widget.h" #include "../general/layout_containers/overlap_control_widget.h" #include "../quick_settings/settings_button_widget.h" +#include #include #include #include @@ -26,9 +28,12 @@ public: void setDeckList(const DeckList &_deckListModel); + CardSizeWidget *cardSizeWidget; + public slots: void decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight); void updateZoneWidgets(); + void updateDisplayType(); void addZoneIfDoesNotExist(); void deleteZoneIfDoesNotExist(); @@ -38,6 +43,7 @@ signals: void activeSortCriteriaChanged(QStringList activeSortCriteria); void cardClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName); void cardAdditionRequested(CardInfoPtr card); + void displayTypeChanged(QString displayType); protected slots: void onHover(CardInfoPtr hoveredCard); @@ -56,6 +62,7 @@ private: CardCompleterProxyModel *proxyModel; QCompleter *completer; QPushButton *searchPushButton; + QCheckBox *displayTypeButton; QWidget *groupAndSortContainer; QHBoxLayout *groupAndSortLayout; QComboBox *groupByComboBox;