Address comments.

This commit is contained in:
Lukas Brübach 2025-04-16 12:32:50 +02:00
parent 579a361b1a
commit 74ca3cc214
8 changed files with 79 additions and 104 deletions

View file

@ -305,7 +305,7 @@ void TabDeckEditorVisual::loadLayout()
databaseDisplayDockWidget->setMinimumSize(100, 100); databaseDisplayDockWidget->setMinimumSize(100, 100);
databaseDisplayDockWidget->setMaximumSize(1400, 5000); databaseDisplayDockWidget->setMaximumSize(1400, 5000);
QTimer::singleShot(100, this, SLOT(freeDocksSize())); QTimer::singleShot(100, this, &TabDeckEditorVisual::freeDocksSize);
} }
void TabDeckEditorVisual::retranslateUi() void TabDeckEditorVisual::retranslateUi()
@ -457,6 +457,7 @@ void TabDeckEditorVisual::dockTopLevelChanged(bool topLevel)
if (o == deckAnalyticsDock) { if (o == deckAnalyticsDock) {
aDeckAnalyticsDockFloating->setChecked(topLevel); aDeckAnalyticsDockFloating->setChecked(topLevel);
return;
} }
if (o == printingSelectorDockWidget) { if (o == printingSelectorDockWidget) {

View file

@ -5,11 +5,11 @@
TabDeckEditorVisualTabWidget::TabDeckEditorVisualTabWidget(QWidget *parent, TabDeckEditorVisualTabWidget::TabDeckEditorVisualTabWidget(QWidget *parent,
AbstractTabDeckEditor *_deckEditor, AbstractTabDeckEditor *_deckEditor,
DeckListModel *model, DeckListModel *_deckModel,
CardDatabaseModel *card_database_model, CardDatabaseModel *_cardDatabaseModel,
CardDatabaseDisplayModel *card_database_display_model) CardDatabaseDisplayModel *_cardDatabaseDisplayModel)
: QTabWidget(parent), deckEditor(_deckEditor), deckModel(model), cardDatabaseModel(card_database_model), : QTabWidget(parent), deckEditor(_deckEditor), deckModel(_deckModel), cardDatabaseModel(_cardDatabaseModel),
cardDatabaseDisplayModel(card_database_display_model) cardDatabaseDisplayModel(_cardDatabaseDisplayModel)
{ {
this->setTabsClosable(true); // Enable tab closing this->setTabsClosable(true); // Enable tab closing
connect(this, &QTabWidget::tabCloseRequested, this, &TabDeckEditorVisualTabWidget::handleTabClose); connect(this, &QTabWidget::tabCloseRequested, this, &TabDeckEditorVisualTabWidget::handleTabClose);
@ -28,7 +28,7 @@ TabDeckEditorVisualTabWidget::TabDeckEditorVisualTabWidget(QWidget *parent,
&AbstractTabDeckEditor::actAddCard); &AbstractTabDeckEditor::actAddCard);
visualDatabaseDisplay = visualDatabaseDisplay =
new VisualDatabaseDisplayWidget(this, deckEditor, cardDatabaseModel, cardDatabaseDisplayModel); new VisualDatabaseDisplayWidget(this, deckEditor, _cardDatabaseModel, _cardDatabaseDisplayModel);
visualDatabaseDisplay->setObjectName("visualDatabaseView"); visualDatabaseDisplay->setObjectName("visualDatabaseView");
connect(visualDatabaseDisplay, &VisualDatabaseDisplayWidget::cardHoveredDatabaseDisplay, this, connect(visualDatabaseDisplay, &VisualDatabaseDisplayWidget::cardHoveredDatabaseDisplay, this,
&TabDeckEditorVisualTabWidget::onCardChangedDatabaseDisplay); &TabDeckEditorVisualTabWidget::onCardChangedDatabaseDisplay);

View file

@ -15,11 +15,11 @@ class TabDeckEditorVisualTabWidget : public QTabWidget
Q_OBJECT Q_OBJECT
public: public:
explicit TabDeckEditorVisualTabWidget(QWidget *parent = nullptr, explicit TabDeckEditorVisualTabWidget(QWidget *parent,
AbstractTabDeckEditor *deckEditor = nullptr, AbstractTabDeckEditor *_deckEditor,
DeckListModel *deckModel = nullptr, DeckListModel *_deckModel,
CardDatabaseModel *card_database_model = nullptr, CardDatabaseModel *_cardDatabaseModel,
CardDatabaseDisplayModel *card_database_display_model = nullptr); CardDatabaseDisplayModel *_cardDatabaseDisplayModel);
// Utility functions // Utility functions
void addNewTab(QWidget *widget, const QString &title); void addNewTab(QWidget *widget, const QString &title);

View file

@ -88,7 +88,7 @@ void FlatCardGroupDisplayWidget::updateCardDisplays()
for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) { for (CardInfoPictureWithTextOverlayWidget *widget : existingWidgets) {
if (!usedWidgets.contains(widget)) { if (!usedWidgets.contains(widget)) {
flowWidget->layout()->removeWidget(widget); flowWidget->layout()->removeWidget(widget);
delete widget; widget->deleteLater();
} }
} }

View file

@ -96,28 +96,30 @@ void DeckCardZoneDisplayWidget::addCardGroupIfItDoesNotExist()
} }
} }
if (!found) { if (found) {
if (displayType == "overlap") { continue;
auto *display_widget = new OverlappedCardGroupDisplayWidget( }
cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria,
subBannerOpacity, cardSizeWidget); if (displayType == "overlap") {
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), auto *display_widget = new OverlappedCardGroupDisplayWidget(
this, SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria,
connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); subBannerOpacity, cardSizeWidget);
connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged); SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)));
cardGroupLayout->addWidget(display_widget); connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr)));
} else if (displayType == "flat") { connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget,
auto *display_widget = new FlatCardGroupDisplayWidget( &CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupContainer, deckListModel, zoneName, cardGroup, activeGroupCriteria, activeSortCriteria, cardGroupLayout->addWidget(display_widget);
subBannerOpacity, cardSizeWidget); } else if (displayType == "flat") {
connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), auto *display_widget = new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, zoneName,
this, SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *))); cardGroup, activeGroupCriteria, activeSortCriteria,
connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr))); subBannerOpacity, cardSizeWidget);
connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget, connect(display_widget, SIGNAL(cardClicked(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)), this,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged); SLOT(onClick(QMouseEvent *, CardInfoPictureWithTextOverlayWidget *)));
cardGroupLayout->addWidget(display_widget); connect(display_widget, SIGNAL(cardHovered(CardInfoPtr)), this, SLOT(onHover(CardInfoPtr)));
} connect(this, &DeckCardZoneDisplayWidget::activeSortCriteriaChanged, display_widget,
&CardGroupDisplayWidget::onActiveSortCriteriaChanged);
cardGroupLayout->addWidget(display_widget);
} }
} }
} }
@ -133,7 +135,6 @@ void DeckCardZoneDisplayWidget::deleteCardGroupIfItDoesNotExist()
if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) { if (!validGroups.contains(cardGroupDisplayWidget->cardGroupCategory)) {
cardGroupLayout->removeWidget(cardGroupDisplayWidget); cardGroupLayout->removeWidget(cardGroupDisplayWidget);
cardGroupDisplayWidget->deleteLater(); // Properly delete the widget after the event loop cycles cardGroupDisplayWidget->deleteLater(); // Properly delete the widget after the event loop cycles
} else {
} }
} }
} }

View file

@ -123,11 +123,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
groupAndSortContainer->setLayout(groupAndSortLayout); groupAndSortContainer->setLayout(groupAndSortLayout);
groupByComboBox = new QComboBox(); groupByComboBox = new QComboBox();
QStringList groupProperties; QStringList groupProperties = {"maintype", "colors", "cmc", "name"};
groupProperties << "maintype"
<< "colors"
<< "cmc"
<< "name";
groupByComboBox->addItems(groupProperties); groupByComboBox->addItems(groupProperties);
groupByComboBox->setMinimumWidth(300); groupByComboBox->setMinimumWidth(300);
connect(groupByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this, connect(groupByComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged), this,
@ -137,6 +133,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
sortCriteriaButton = new SettingsButtonWidget(this); sortCriteriaButton = new SettingsButtonWidget(this);
sortLabel = new QLabel(sortCriteriaButton); sortLabel = new QLabel(sortCriteriaButton);
sortLabel->setWordWrap(true);
QStringList sortProperties = {"colors", "cmc", "name", "maintype"}; QStringList sortProperties = {"colors", "cmc", "name", "maintype"};
sortByListWidget = new QListWidget(); sortByListWidget = new QListWidget();
@ -151,7 +148,6 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
connect(sortByListWidget->model(), &QAbstractItemModel::rowsMoved, this, connect(sortByListWidget->model(), &QAbstractItemModel::rowsMoved, this,
&VisualDeckEditorWidget::actChangeActiveSortCriteria); &VisualDeckEditorWidget::actChangeActiveSortCriteria);
// connect(sortByListWidget, &QListWidget::itemChanged, this, &VisualDeckEditorWidget::actChangeActiveSortCriteria);
actChangeActiveSortCriteria(); actChangeActiveSortCriteria();
sortByListWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); sortByListWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
@ -193,7 +189,7 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, DeckListModel *_
void VisualDeckEditorWidget::retranslateUi() void VisualDeckEditorWidget::retranslateUi()
{ {
sortLabel->setText(tr("Click and drag to change\nthe sort order within the groups")); sortLabel->setText(tr("Click and drag to change the sort order within the groups"));
searchPushButton->setText(tr("Quick search and add card")); searchPushButton->setText(tr("Quick search and add card"));
displayTypeButton->setText(tr("Flat Layout")); displayTypeButton->setText(tr("Flat Layout"));
} }
@ -206,12 +202,19 @@ void VisualDeckEditorWidget::updateZoneWidgets()
void VisualDeckEditorWidget::updateDisplayType() void VisualDeckEditorWidget::updateDisplayType()
{ {
if (displayTypeButton->text() == tr("Overlap Layout")) { // Toggle the display type
emit displayTypeChanged("flat"); currentDisplayType = (currentDisplayType == DisplayType::Overlap) ? DisplayType::Flat : DisplayType::Overlap;
displayTypeButton->setText("Flat Layout");
} else { // Update UI and emit signal
emit displayTypeChanged("overlap"); switch (currentDisplayType) {
displayTypeButton->setText(tr("Overlap Layout")); case DisplayType::Flat:
emit displayTypeChanged("flat");
displayTypeButton->setText(tr("Flat Layout"));
break;
case DisplayType::Overlap:
emit displayTypeChanged("overlap");
displayTypeButton->setText(tr("Overlap Layout"));
break;
} }
} }
@ -224,23 +227,24 @@ void VisualDeckEditorWidget::addZoneIfDoesNotExist()
for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) { for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) {
if (displayWidget->zoneName == zone) { if (displayWidget->zoneName == zone) {
found = true; found = true;
break;
} }
} }
if (!found) { if (found) {
DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget( continue;
zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10, cardSizeWidget);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this,
&VisualDeckEditorWidget::onCardClick);
connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged);
connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::refreshDisplayType);
zoneContainerLayout->addWidget(zoneDisplayWidget);
} }
DeckCardZoneDisplayWidget *zoneDisplayWidget = new DeckCardZoneDisplayWidget(
zoneContainer, deckListModel, zone, activeGroupCriteria, activeSortCriteria, 20, 10, cardSizeWidget);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardHovered, this, &VisualDeckEditorWidget::onHover);
connect(zoneDisplayWidget, &DeckCardZoneDisplayWidget::cardClicked, this, &VisualDeckEditorWidget::onCardClick);
connect(this, &VisualDeckEditorWidget::activeSortCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveSortCriteriaChanged);
connect(this, &VisualDeckEditorWidget::activeGroupCriteriaChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged);
connect(this, &VisualDeckEditorWidget::displayTypeChanged, zoneDisplayWidget,
&DeckCardZoneDisplayWidget::refreshDisplayType);
zoneContainerLayout->addWidget(zoneDisplayWidget);
} }
} }
@ -251,9 +255,9 @@ void VisualDeckEditorWidget::deleteZoneIfDoesNotExist()
for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) { for (DeckCardZoneDisplayWidget *displayWidget : cardZoneDisplayWidgets) {
bool found = false; bool found = false;
for (const QString &zone : *deckListModel->getZones()) { for (const QString &zone : *deckListModel->getZones()) {
if (displayWidget->zoneName == zone) { if (displayWidget->zoneName == zone) {
found = true; found = true;
break;
} }
} }
@ -291,49 +295,13 @@ void VisualDeckEditorWidget::actChangeActiveSortCriteria()
void VisualDeckEditorWidget::decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight) void VisualDeckEditorWidget::decklistDataChanged(QModelIndex topLeft, QModelIndex bottomRight)
{ {
// Might use these at some point. // Might use these at some point.
(void)topLeft; Q_UNUSED(topLeft);
(void)bottomRight; Q_UNUSED(bottomRight);
// Necessary to delay this in this manner else the updateDisplay will nuke widgets while their onClick event // Necessary to delay this in this manner else the updateDisplay will nuke widgets while their onClick event
// hasn't returned yet. Interval of 0 means QT will schedule this after the current event loop has finished. // hasn't returned yet. Interval of 0 means QT will schedule this after the current event loop has finished.
updateZoneWidgets(); updateZoneWidgets();
} }
/*void VisualDeckEditorWidget::sortCards()
{
QStringList sortCriteria;
sortCriteria.append(activeSortCriteria);
this->sortCardList(sortCriteria, Qt::SortOrder::AscendingOrder);
QString lastSortCriteriaValue = "";
overlapCategories = new QWidget(scrollArea);
overlapCategoriesLayout = new QVBoxLayout(overlapCategories);
OverlapWidget *printings_group_widget = new OverlapWidget(80, 1, 1, Qt::Vertical, overlapCategories);
overlap_control_widget->connectOverlapWidget(printings_group_widget);
for (int i = 0; i < cards->size(); i++) {
CardInfoPtr info = cards->at(i);
if (info) {
if (info->getProperty(activeSortCriteria) != lastSortCriteriaValue) {
printings_group_widget->adjustMaxColumnsAndRows();
lastSortCriteriaValue = info->getProperty(activeSortCriteria);
printings_group_widget = new OverlapWidget(80, 1, 1, Qt::Vertical, overlapCategories);
overlapCategoriesLayout->addWidget(printings_group_widget);
overlap_control_widget->connectOverlapWidget(printings_group_widget);
}
CardInfoPictureWithTextOverlayWidget* display = new
CardInfoPictureWithTextOverlayWidget(printings_group_widget, true);
display->setCard(info);
printings_group_widget->addWidget(display);
update();
} else {
qDebug() << "Card not found in database!";
}
}
printings_group_widget->adjustMaxColumnsAndRows();
scrollArea->setWidget(overlapCategories);
update();
}*/
void VisualDeckEditorWidget::onHover(CardInfoPtr hoveredCard) void VisualDeckEditorWidget::onHover(CardInfoPtr hoveredCard)
{ {
emit activeCardChanged(hoveredCard); emit activeCardChanged(hoveredCard);

View file

@ -17,6 +17,12 @@
#include <QWidget> #include <QWidget>
#include <qscrollarea.h> #include <qscrollarea.h>
enum class DisplayType
{
Flat,
Overlap
};
class VisualDeckEditorWidget : public QWidget class VisualDeckEditorWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -62,6 +68,7 @@ private:
CardCompleterProxyModel *proxyModel; CardCompleterProxyModel *proxyModel;
QCompleter *completer; QCompleter *completer;
QPushButton *searchPushButton; QPushButton *searchPushButton;
DisplayType currentDisplayType = DisplayType::Overlap;
QPushButton *displayTypeButton; QPushButton *displayTypeButton;
QWidget *groupAndSortContainer; QWidget *groupAndSortContainer;
QHBoxLayout *groupAndSortLayout; QHBoxLayout *groupAndSortLayout;

View file

@ -66,8 +66,6 @@ void CardSearchModel::updateSearchResults(const QString &query)
emit dataChanged(index(0, 0), index(rowCount() - 1, 0)); emit dataChanged(index(0, 0), index(rowCount() - 1, 0));
emit layoutChanged(); emit layoutChanged();
for (SearchResult &result : searchResults) {
qDebug() << result.card->getName();
}
endResetModel(); endResetModel();
} }