mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-12 09:04:53 -07:00
Tags in deck editor (#5608)
This commit is contained in:
parent
356b00e8c7
commit
23f4c9c4e4
18 changed files with 359 additions and 61 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
<file>resources/icons/pencil.svg</file>
|
<file>resources/icons/pencil.svg</file>
|
||||||
<file>resources/icons/player.svg</file>
|
<file>resources/icons/player.svg</file>
|
||||||
<file>resources/icons/ready_start.svg</file>
|
<file>resources/icons/ready_start.svg</file>
|
||||||
|
<file>resources/icons/reload.svg</file>
|
||||||
<file>resources/icons/remove_row.svg</file>
|
<file>resources/icons/remove_row.svg</file>
|
||||||
<file>resources/icons/scales.svg</file>
|
<file>resources/icons/scales.svg</file>
|
||||||
<file>resources/icons/search.svg</file>
|
<file>resources/icons/search.svg</file>
|
||||||
|
|
|
||||||
7
cockatrice/resources/icons/reload.svg
Normal file
7
cockatrice/resources/icons/reload.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
|
||||||
|
viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
|
||||||
|
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
|
||||||
|
<g><path d="M586.9,373.6l95.6-84.4c-49.6-39.2-129.4-79.1-198.2-79.1c-134.9,0-248.2,90.5-280.2,212.8L10.6,374.5C64.4,168.3,255.2,15.8,482.5,15.8c126.7,0,258.8,63.7,345.4,141.4l90.8-80.1L990,479.6L586.9,373.6z M317.5,710.8c49.6,39.2,129.4,79.1,198.2,79.1c134.9,0,248.2-90.5,280.2-212.8l193.5,48.5c-53.7,206.2-244.6,358.7-471.9,358.7c-126.7,0-258.8-63.7-345.4-141.4l-90.8,80.1L10,520.4l403.1,106L317.5,710.8z"/></g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 797 B |
|
|
@ -113,6 +113,8 @@ void TabDeckEditor::createDeckDock()
|
||||||
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
||||||
&TabDeckEditor::setBannerCard);
|
&TabDeckEditor::setBannerCard);
|
||||||
|
|
||||||
|
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckModel->getDeckList());
|
||||||
|
|
||||||
aIncrement = new QAction(QString(), this);
|
aIncrement = new QAction(QString(), this);
|
||||||
aIncrement->setIcon(QPixmap("theme:icons/increment"));
|
aIncrement->setIcon(QPixmap("theme:icons/increment"));
|
||||||
connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement()));
|
connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement()));
|
||||||
|
|
@ -148,6 +150,8 @@ void TabDeckEditor::createDeckDock()
|
||||||
upperLayout->addWidget(bannerCardLabel, 2, 0);
|
upperLayout->addWidget(bannerCardLabel, 2, 0);
|
||||||
upperLayout->addWidget(bannerCardComboBox, 2, 1);
|
upperLayout->addWidget(bannerCardComboBox, 2, 1);
|
||||||
|
|
||||||
|
upperLayout->addWidget(deckTagsDisplayWidget, 3, 1);
|
||||||
|
|
||||||
hashLabel1 = new QLabel();
|
hashLabel1 = new QLabel();
|
||||||
hashLabel1->setObjectName("hashLabel1");
|
hashLabel1->setObjectName("hashLabel1");
|
||||||
auto *hashSizePolicy = new QSizePolicy();
|
auto *hashSizePolicy = new QSizePolicy();
|
||||||
|
|
@ -1608,6 +1612,8 @@ void TabDeckEditor::setDeck(DeckLoader *_deck)
|
||||||
deckView->expandAll();
|
deckView->expandAll();
|
||||||
setModified(false);
|
setModified(false);
|
||||||
|
|
||||||
|
deckTagsDisplayWidget->connectDeckList(deckModel->getDeckList());
|
||||||
|
|
||||||
// If they load a deck, make the deck list appear
|
// If they load a deck, make the deck list appear
|
||||||
aDeckDockVisible->setChecked(true);
|
aDeckDockVisible->setChecked(true);
|
||||||
deckDock->setVisible(aDeckDockVisible->isChecked());
|
deckDock->setVisible(aDeckDockVisible->isChecked());
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include "../../game/cards/card_database.h"
|
#include "../../game/cards/card_database.h"
|
||||||
#include "../game_logic/key_signals.h"
|
#include "../game_logic/key_signals.h"
|
||||||
#include "../ui/widgets/printing_selector/printing_selector.h"
|
#include "../ui/widgets/printing_selector/printing_selector.h"
|
||||||
|
#include "../ui/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.h"
|
||||||
#include "tab.h"
|
#include "tab.h"
|
||||||
|
|
||||||
#include <QAbstractItemModel>
|
#include <QAbstractItemModel>
|
||||||
|
|
@ -19,6 +20,7 @@ class CardInfoFrameWidget;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class DeckLoader;
|
class DeckLoader;
|
||||||
|
class DeckPreviewDeckTagsDisplayWidget;
|
||||||
class Response;
|
class Response;
|
||||||
class FilterTreeModel;
|
class FilterTreeModel;
|
||||||
class FilterBuilder;
|
class FilterBuilder;
|
||||||
|
|
@ -136,6 +138,7 @@ private:
|
||||||
QTextEdit *commentsEdit;
|
QTextEdit *commentsEdit;
|
||||||
QLabel *bannerCardLabel;
|
QLabel *bannerCardLabel;
|
||||||
QComboBox *bannerCardComboBox;
|
QComboBox *bannerCardComboBox;
|
||||||
|
DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget;
|
||||||
QLabel *hashLabel1;
|
QLabel *hashLabel1;
|
||||||
LineEditUnfocusable *hashLabel;
|
LineEditUnfocusable *hashLabel;
|
||||||
FilterTreeModel *filterModel;
|
FilterTreeModel *filterModel;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "deck_preview_deck_tags_display_widget.h"
|
#include "deck_preview_deck_tags_display_widget.h"
|
||||||
|
|
||||||
|
#include "../../../../tabs/tab_deck_editor.h"
|
||||||
#include "../../general/layout_containers/flow_widget.h"
|
#include "../../general/layout_containers/flow_widget.h"
|
||||||
#include "deck_preview_tag_addition_widget.h"
|
#include "deck_preview_tag_addition_widget.h"
|
||||||
#include "deck_preview_tag_display_widget.h"
|
#include "deck_preview_tag_display_widget.h"
|
||||||
|
|
@ -8,8 +9,8 @@
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
|
||||||
DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(DeckPreviewWidget *_parent, DeckLoader *_deckLoader)
|
DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, DeckList *_deckList)
|
||||||
: QWidget(_parent), parent(_parent), deckLoader(_deckLoader)
|
: QWidget(_parent), deckList(_deckList)
|
||||||
{
|
{
|
||||||
|
|
||||||
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||||
|
|
@ -21,21 +22,33 @@ DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(DeckPreviewWi
|
||||||
|
|
||||||
setFixedHeight(100);
|
setFixedHeight(100);
|
||||||
|
|
||||||
connect(deckLoader, &DeckList::deckTagsChanged, this, &DeckPreviewDeckTagsDisplayWidget::refreshTags);
|
|
||||||
|
|
||||||
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
||||||
for (const QString &tag : this->deckLoader->getTags()) {
|
|
||||||
|
if (deckList) {
|
||||||
|
connectDeckList(deckList);
|
||||||
|
}
|
||||||
|
|
||||||
|
layout->addWidget(flowWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeckPreviewDeckTagsDisplayWidget::connectDeckList(DeckList *_deckList)
|
||||||
|
{
|
||||||
|
flowWidget->clearLayout();
|
||||||
|
deckList = _deckList;
|
||||||
|
connect(deckList, &DeckList::deckTagsChanged, this, &DeckPreviewDeckTagsDisplayWidget::refreshTags);
|
||||||
|
|
||||||
|
for (const QString &tag : deckList->getTags()) {
|
||||||
flowWidget->addWidget(new DeckPreviewTagDisplayWidget(this, tag));
|
flowWidget->addWidget(new DeckPreviewTagDisplayWidget(this, tag));
|
||||||
}
|
}
|
||||||
flowWidget->addWidget(new DeckPreviewTagAdditionWidget(this, tr("Edit tags ...")));
|
flowWidget->addWidget(new DeckPreviewTagAdditionWidget(this, this, tr("Edit tags ...")));
|
||||||
layout->addWidget(flowWidget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeckPreviewDeckTagsDisplayWidget::refreshTags()
|
void DeckPreviewDeckTagsDisplayWidget::refreshTags()
|
||||||
{
|
{
|
||||||
flowWidget->clearLayout();
|
flowWidget->clearLayout();
|
||||||
for (const QString &tag : this->deckLoader->getTags()) {
|
QStringList tags = deckList->getTags();
|
||||||
|
for (const QString &tag : tags) {
|
||||||
flowWidget->addWidget(new DeckPreviewTagDisplayWidget(this, tag));
|
flowWidget->addWidget(new DeckPreviewTagDisplayWidget(this, tag));
|
||||||
}
|
}
|
||||||
flowWidget->addWidget(new DeckPreviewTagAdditionWidget(this, tr("Edit tags ...")));
|
flowWidget->addWidget(new DeckPreviewTagAdditionWidget(this, this, tr("Edit tags ...")));
|
||||||
}
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#define DECK_PREVIEW_DECK_TAGS_DISPLAY_WIDGET_H
|
#define DECK_PREVIEW_DECK_TAGS_DISPLAY_WIDGET_H
|
||||||
|
|
||||||
#include "../../../../../deck/deck_loader.h"
|
#include "../../../../../deck/deck_loader.h"
|
||||||
|
#include "../../../../tabs/tab_deck_editor.h"
|
||||||
#include "deck_preview_widget.h"
|
#include "deck_preview_widget.h"
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
@ -12,10 +13,10 @@ class DeckPreviewDeckTagsDisplayWidget : public QWidget
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DeckPreviewDeckTagsDisplayWidget(DeckPreviewWidget *_parent, DeckLoader *_deckLoader);
|
explicit DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, DeckList *_deckList);
|
||||||
|
void connectDeckList(DeckList *_deckList);
|
||||||
void refreshTags();
|
void refreshTags();
|
||||||
DeckPreviewWidget *parent;
|
DeckList *deckList;
|
||||||
DeckLoader *deckLoader;
|
|
||||||
FlowWidget *flowWidget;
|
FlowWidget *flowWidget;
|
||||||
};
|
};
|
||||||
#endif // DECK_PREVIEW_DECK_TAGS_DISPLAY_WIDGET_H
|
#endif // DECK_PREVIEW_DECK_TAGS_DISPLAY_WIDGET_H
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,17 @@
|
||||||
#include "../../../../../settings/cache_settings.h"
|
#include "../../../../../settings/cache_settings.h"
|
||||||
#include "deck_preview_tag_dialog.h"
|
#include "deck_preview_tag_dialog.h"
|
||||||
|
|
||||||
|
#include <QDirIterator>
|
||||||
#include <QFontMetrics>
|
#include <QFontMetrics>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
DeckPreviewTagAdditionWidget::DeckPreviewTagAdditionWidget(DeckPreviewDeckTagsDisplayWidget *_parent,
|
DeckPreviewTagAdditionWidget::DeckPreviewTagAdditionWidget(QWidget *_parent,
|
||||||
const QString &_tagName)
|
DeckPreviewDeckTagsDisplayWidget *_tagsDisplayWidget,
|
||||||
: QWidget(_parent), parent(_parent), tagName_(_tagName)
|
QString _tagName)
|
||||||
|
: QWidget(_parent), tagsDisplayWidget(_tagsDisplayWidget), tagName_(std::move(_tagName))
|
||||||
{
|
{
|
||||||
// Create layout
|
// Create layout
|
||||||
auto *layout = new QHBoxLayout(this);
|
auto *layout = new QHBoxLayout(this);
|
||||||
|
|
@ -30,7 +33,23 @@ QSize DeckPreviewTagAdditionWidget::sizeHint() const
|
||||||
int width = textWidth + 50; // Add extra padding
|
int width = textWidth + 50; // Add extra padding
|
||||||
int height = fm.height() + 10; // Height based on font size + padding
|
int height = fm.height() + 10; // Height based on font size + padding
|
||||||
|
|
||||||
return QSize(width, height);
|
return {width, height};
|
||||||
|
}
|
||||||
|
|
||||||
|
static QStringList getAllFiles(const QString &filePath, bool recursive)
|
||||||
|
{
|
||||||
|
QStringList allFiles;
|
||||||
|
|
||||||
|
// QDirIterator with QDir::Files ensures only files are listed (no directories)
|
||||||
|
auto flags =
|
||||||
|
recursive ? QDirIterator::Subdirectories | QDirIterator::FollowSymlinks : QDirIterator::NoIteratorFlags;
|
||||||
|
QDirIterator it(filePath, QDir::Files, flags);
|
||||||
|
|
||||||
|
while (it.hasNext()) {
|
||||||
|
allFiles << it.next(); // Add each file path to the list
|
||||||
|
}
|
||||||
|
|
||||||
|
return allFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeckPreviewTagAdditionWidget::mousePressEvent(QMouseEvent *event)
|
void DeckPreviewTagAdditionWidget::mousePressEvent(QMouseEvent *event)
|
||||||
|
|
@ -39,52 +58,86 @@ void DeckPreviewTagAdditionWidget::mousePressEvent(QMouseEvent *event)
|
||||||
emit tagClicked();
|
emit tagClicked();
|
||||||
}
|
}
|
||||||
QWidget::mousePressEvent(event);
|
QWidget::mousePressEvent(event);
|
||||||
QStringList knownTags = parent->parent->visualDeckStorageWidget->tagFilterWidget->getAllKnownTags();
|
|
||||||
QStringList activeTags = parent->deckLoader->getTags();
|
|
||||||
|
|
||||||
bool canAddTags = true;
|
if (qobject_cast<DeckPreviewWidget *>(tagsDisplayWidget->parentWidget())) {
|
||||||
|
auto *deckPreviewWidget = qobject_cast<DeckPreviewWidget *>(tagsDisplayWidget->parentWidget());
|
||||||
|
QStringList knownTags = deckPreviewWidget->visualDeckStorageWidget->tagFilterWidget->getAllKnownTags();
|
||||||
|
QStringList activeTags = tagsDisplayWidget->deckList->getTags();
|
||||||
|
|
||||||
if (DeckLoader::getFormatFromName(parent->parent->filePath) != DeckLoader::CockatriceFormat) {
|
bool canAddTags = true;
|
||||||
canAddTags = false;
|
|
||||||
// Retrieve saved preference if the prompt is disabled
|
|
||||||
if (!SettingsCache::instance().getVisualDeckStoragePromptForConversion()) {
|
|
||||||
if (SettingsCache::instance().getVisualDeckStorageAlwaysConvert()) {
|
|
||||||
parent->deckLoader->convertToCockatriceFormat(parent->parent->filePath);
|
|
||||||
parent->parent->filePath = parent->deckLoader->getLastFileName();
|
|
||||||
parent->parent->refreshBannerCardText();
|
|
||||||
canAddTags = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Show the dialog to the user
|
|
||||||
DialogConvertDeckToCodFormat conversionDialog(parent);
|
|
||||||
if (conversionDialog.exec() == QDialog::Accepted) {
|
|
||||||
parent->deckLoader->convertToCockatriceFormat(parent->parent->filePath);
|
|
||||||
parent->parent->filePath = parent->deckLoader->getLastFileName();
|
|
||||||
parent->parent->refreshBannerCardText();
|
|
||||||
canAddTags = true;
|
|
||||||
|
|
||||||
if (conversionDialog.dontAskAgain()) {
|
if (DeckLoader::getFormatFromName(deckPreviewWidget->filePath) != DeckLoader::CockatriceFormat) {
|
||||||
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Unchecked);
|
canAddTags = false;
|
||||||
SettingsCache::instance().setVisualDeckStorageAlwaysConvert(Qt::CheckState::Checked);
|
// Retrieve saved preference if the prompt is disabled
|
||||||
|
if (!SettingsCache::instance().getVisualDeckStoragePromptForConversion()) {
|
||||||
|
if (SettingsCache::instance().getVisualDeckStorageAlwaysConvert()) {
|
||||||
|
deckPreviewWidget->deckLoader->convertToCockatriceFormat(deckPreviewWidget->filePath);
|
||||||
|
deckPreviewWidget->filePath = deckPreviewWidget->deckLoader->getLastFileName();
|
||||||
|
deckPreviewWidget->refreshBannerCardText();
|
||||||
|
canAddTags = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SettingsCache::instance().setVisualDeckStorageAlwaysConvert(Qt::CheckState::Unchecked);
|
// Show the dialog to the user
|
||||||
|
DialogConvertDeckToCodFormat conversionDialog(parentWidget());
|
||||||
|
if (conversionDialog.exec() == QDialog::Accepted) {
|
||||||
|
deckPreviewWidget->deckLoader->convertToCockatriceFormat(deckPreviewWidget->filePath);
|
||||||
|
deckPreviewWidget->filePath = deckPreviewWidget->deckLoader->getLastFileName();
|
||||||
|
deckPreviewWidget->refreshBannerCardText();
|
||||||
|
canAddTags = true;
|
||||||
|
|
||||||
if (conversionDialog.dontAskAgain()) {
|
if (conversionDialog.dontAskAgain()) {
|
||||||
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Unchecked);
|
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Unchecked);
|
||||||
|
SettingsCache::instance().setVisualDeckStorageAlwaysConvert(Qt::CheckState::Checked);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Checked);
|
SettingsCache::instance().setVisualDeckStorageAlwaysConvert(Qt::CheckState::Unchecked);
|
||||||
|
|
||||||
|
if (conversionDialog.dontAskAgain()) {
|
||||||
|
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Unchecked);
|
||||||
|
} else {
|
||||||
|
SettingsCache::instance().setVisualDeckStoragePromptForConversion(Qt::CheckState::Checked);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (canAddTags) {
|
if (canAddTags) {
|
||||||
DeckPreviewTagDialog dialog(knownTags, activeTags);
|
DeckPreviewTagDialog dialog(knownTags, activeTags);
|
||||||
if (dialog.exec() == QDialog::Accepted) {
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
QStringList updatedTags = dialog.getActiveTags();
|
QStringList updatedTags = dialog.getActiveTags();
|
||||||
parent->deckLoader->setTags(updatedTags);
|
tagsDisplayWidget->deckList->setTags(updatedTags);
|
||||||
parent->deckLoader->saveToFile(parent->parent->filePath, DeckLoader::CockatriceFormat);
|
deckPreviewWidget->deckLoader->saveToFile(deckPreviewWidget->filePath, DeckLoader::CockatriceFormat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (tagsDisplayWidget->parentWidget()) {
|
||||||
|
// If we're the child of a TabDeckEditor, we are buried under a ton of childWidgets in the DeckInfoDock.
|
||||||
|
QWidget *currentParent = tagsDisplayWidget->parentWidget();
|
||||||
|
while (currentParent) {
|
||||||
|
if (qobject_cast<TabDeckEditor *>(currentParent)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
currentParent = currentParent->parentWidget();
|
||||||
|
}
|
||||||
|
if (qobject_cast<TabDeckEditor *>(currentParent)) {
|
||||||
|
auto *deckEditor = qobject_cast<TabDeckEditor *>(currentParent);
|
||||||
|
QStringList knownTags;
|
||||||
|
QStringList allFiles = getAllFiles(SettingsCache::instance().getDeckPath(), true);
|
||||||
|
auto *loader = new DeckLoader();
|
||||||
|
for (const QString &file : allFiles) {
|
||||||
|
loader->loadFromFile(file, DeckLoader::getFormatFromName(file), false);
|
||||||
|
QStringList tags = loader->getTags();
|
||||||
|
knownTags.append(tags);
|
||||||
|
knownTags.removeDuplicates();
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList activeTags = tagsDisplayWidget->deckList->getTags();
|
||||||
|
|
||||||
|
DeckPreviewTagDialog dialog(knownTags, activeTags);
|
||||||
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
|
QStringList updatedTags = dialog.getActiveTags();
|
||||||
|
tagsDisplayWidget->deckList->setTags(updatedTags);
|
||||||
|
deckEditor->setModified(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,10 @@ class DeckPreviewTagAdditionWidget : public QWidget
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DeckPreviewTagAdditionWidget(DeckPreviewDeckTagsDisplayWidget *_parent, const QString &tagName);
|
explicit DeckPreviewTagAdditionWidget(QWidget *_parent,
|
||||||
QSize sizeHint() const override;
|
DeckPreviewDeckTagsDisplayWidget *_tagsDisplayWidget,
|
||||||
|
QString _tagName);
|
||||||
|
[[nodiscard]] QSize sizeHint() const override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void tagClicked(); // Emitted when the tag is clicked
|
void tagClicked(); // Emitted when the tag is clicked
|
||||||
|
|
@ -24,10 +26,8 @@ protected:
|
||||||
void paintEvent(QPaintEvent *event) override;
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeckPreviewDeckTagsDisplayWidget *parent;
|
DeckPreviewDeckTagsDisplayWidget *tagsDisplayWidget;
|
||||||
QString tagName_;
|
QString tagName_;
|
||||||
QLabel *tagLabel_;
|
|
||||||
QPushButton *closeButton_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DECK_PREVIEW_TAG_ADDITION_WIDGET_H
|
#endif // DECK_PREVIEW_TAG_ADDITION_WIDGET_H
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,26 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent,
|
||||||
|
|
||||||
connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowTagsOnDeckPreviewsChanged, this,
|
connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowTagsOnDeckPreviewsChanged, this,
|
||||||
&DeckPreviewWidget::updateTagsVisibility);
|
&DeckPreviewWidget::updateTagsVisibility);
|
||||||
|
connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowBannerCardComboBoxChanged, this,
|
||||||
|
&DeckPreviewWidget::updateBannerCardComboBoxVisibility);
|
||||||
|
|
||||||
layout->addWidget(bannerCardDisplayWidget);
|
layout->addWidget(bannerCardDisplayWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeckPreviewWidget::retranslateUi()
|
||||||
|
{
|
||||||
|
bannerCardLabel->setText(tr("Banner Card"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeckPreviewWidget::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
if (bannerCardDisplayWidget == nullptr || bannerCardComboBox == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bannerCardComboBox->setMaximumWidth(bannerCardDisplayWidget->width());
|
||||||
|
}
|
||||||
|
|
||||||
void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
|
void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
|
||||||
{
|
{
|
||||||
if (!deckLoadSuccess) {
|
if (!deckLoadSuccess) {
|
||||||
|
|
@ -56,10 +72,27 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
|
||||||
|
|
||||||
colorIdentityWidget = new DeckPreviewColorIdentityWidget(this, getColorIdentity());
|
colorIdentityWidget = new DeckPreviewColorIdentityWidget(this, getColorIdentity());
|
||||||
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader);
|
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader);
|
||||||
|
|
||||||
|
bannerCardLabel = new QLabel();
|
||||||
|
bannerCardLabel->setObjectName("bannerCardLabel");
|
||||||
|
bannerCardComboBox = new QComboBox(this);
|
||||||
|
bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||||
|
bannerCardComboBox->setObjectName("bannerCardComboBox");
|
||||||
|
bannerCardComboBox->setCurrentText(deckLoader->getBannerCard().first);
|
||||||
|
bannerCardComboBox->installEventFilter(new NoScrollFilter());
|
||||||
|
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
||||||
|
&DeckPreviewWidget::setBannerCard);
|
||||||
|
|
||||||
|
updateBannerCardComboBox();
|
||||||
|
updateBannerCardComboBoxVisibility(SettingsCache::instance().getVisualDeckStorageShowBannerCardComboBox());
|
||||||
updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews());
|
updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews());
|
||||||
|
|
||||||
layout->addWidget(colorIdentityWidget);
|
layout->addWidget(colorIdentityWidget);
|
||||||
layout->addWidget(deckTagsDisplayWidget);
|
layout->addWidget(deckTagsDisplayWidget);
|
||||||
|
layout->addWidget(bannerCardLabel);
|
||||||
|
layout->addWidget(bannerCardComboBox);
|
||||||
|
|
||||||
|
retranslateUi();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeckPreviewWidget::updateVisibility()
|
void DeckPreviewWidget::updateVisibility()
|
||||||
|
|
@ -78,9 +111,24 @@ bool DeckPreviewWidget::checkVisibility() const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeckPreviewWidget::updateBannerCardComboBoxVisibility(bool visible)
|
||||||
|
{
|
||||||
|
if (bannerCardComboBox == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visible) {
|
||||||
|
bannerCardComboBox->setVisible(true);
|
||||||
|
bannerCardLabel->setVisible(true);
|
||||||
|
} else {
|
||||||
|
bannerCardComboBox->setHidden(true);
|
||||||
|
bannerCardLabel->setHidden(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DeckPreviewWidget::updateTagsVisibility(bool visible)
|
void DeckPreviewWidget::updateTagsVisibility(bool visible)
|
||||||
{
|
{
|
||||||
if (!deckTagsDisplayWidget) {
|
if (deckTagsDisplayWidget == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,6 +181,81 @@ void DeckPreviewWidget::refreshBannerCardText()
|
||||||
deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName() : deckLoader->getName());
|
deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName() : deckLoader->getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeckPreviewWidget::updateBannerCardComboBox()
|
||||||
|
{
|
||||||
|
// Store the current text of the combo box
|
||||||
|
QString currentText = bannerCardComboBox->currentText();
|
||||||
|
|
||||||
|
// Block signals temporarily
|
||||||
|
bool wasBlocked = bannerCardComboBox->blockSignals(true);
|
||||||
|
|
||||||
|
// Clear the existing items in the combo box
|
||||||
|
bannerCardComboBox->clear();
|
||||||
|
|
||||||
|
// Prepare the new items with deduplication
|
||||||
|
QSet<QPair<QString, QString>> bannerCardSet;
|
||||||
|
InnerDecklistNode *listRoot = deckLoader->getRoot();
|
||||||
|
for (auto i : *listRoot) {
|
||||||
|
auto *currentZone = dynamic_cast<InnerDecklistNode *>(i);
|
||||||
|
for (auto j : *currentZone) {
|
||||||
|
auto *currentCard = dynamic_cast<DecklistCardNode *>(j);
|
||||||
|
if (!currentCard)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int k = 0; k < currentCard->getNumber(); ++k) {
|
||||||
|
CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId(
|
||||||
|
currentCard->getName(), currentCard->getCardProviderId());
|
||||||
|
if (info) {
|
||||||
|
bannerCardSet.insert(
|
||||||
|
QPair<QString, QString>(currentCard->getName(), currentCard->getCardProviderId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QPair<QString, QString>> pairList = bannerCardSet.values();
|
||||||
|
|
||||||
|
// Sort QList by the first() element of the QPair
|
||||||
|
std::sort(pairList.begin(), pairList.end(), [](const QPair<QString, QString> &a, const QPair<QString, QString> &b) {
|
||||||
|
return a.first.toLower() < b.first.toLower();
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const auto &pair : pairList) {
|
||||||
|
QVariantMap dataMap;
|
||||||
|
dataMap["name"] = pair.first;
|
||||||
|
dataMap["uuid"] = pair.second;
|
||||||
|
|
||||||
|
bannerCardComboBox->addItem(pair.first, dataMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to restore the previous selection by finding the currentText
|
||||||
|
int restoredIndex = bannerCardComboBox->findText(currentText);
|
||||||
|
if (restoredIndex != -1) {
|
||||||
|
bannerCardComboBox->setCurrentIndex(restoredIndex);
|
||||||
|
} else {
|
||||||
|
// Add a placeholder "-" and set it as the current selection
|
||||||
|
int bannerIndex = bannerCardComboBox->findText(deckLoader->getBannerCard().first);
|
||||||
|
if (bannerIndex != -1) {
|
||||||
|
bannerCardComboBox->setCurrentIndex(bannerIndex);
|
||||||
|
} else {
|
||||||
|
bannerCardComboBox->insertItem(0, "-");
|
||||||
|
bannerCardComboBox->setCurrentIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore the previous signal blocking state
|
||||||
|
bannerCardComboBox->blockSignals(wasBlocked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeckPreviewWidget::setBannerCard(int /* changedIndex */)
|
||||||
|
{
|
||||||
|
QVariantMap itemData = bannerCardComboBox->itemData(bannerCardComboBox->currentIndex()).toMap();
|
||||||
|
deckLoader->setBannerCard(QPair<QString, QString>(itemData["name"].toString(), itemData["uuid"].toString()));
|
||||||
|
deckLoader->saveToFile(filePath, DeckLoader::getFormatFromName(filePath));
|
||||||
|
bannerCardDisplayWidget->setCard(CardDatabaseManager::getInstance()->getCardByNameAndProviderId(
|
||||||
|
itemData["name"].toString(), itemData["uuid"].toString()));
|
||||||
|
}
|
||||||
|
|
||||||
void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
|
void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance)
|
||||||
{
|
{
|
||||||
Q_UNUSED(instance);
|
Q_UNUSED(instance);
|
||||||
|
|
|
||||||
|
|
@ -19,15 +19,18 @@ public:
|
||||||
explicit DeckPreviewWidget(QWidget *_parent,
|
explicit DeckPreviewWidget(QWidget *_parent,
|
||||||
VisualDeckStorageWidget *_visualDeckStorageWidget,
|
VisualDeckStorageWidget *_visualDeckStorageWidget,
|
||||||
const QString &_filePath);
|
const QString &_filePath);
|
||||||
|
void retranslateUi();
|
||||||
QString getColorIdentity();
|
QString getColorIdentity();
|
||||||
|
|
||||||
VisualDeckStorageWidget *visualDeckStorageWidget;
|
VisualDeckStorageWidget *visualDeckStorageWidget;
|
||||||
QVBoxLayout *layout;
|
QVBoxLayout *layout;
|
||||||
QString filePath;
|
QString filePath;
|
||||||
DeckLoader *deckLoader;
|
DeckLoader *deckLoader;
|
||||||
DeckPreviewCardPictureWidget *bannerCardDisplayWidget;
|
DeckPreviewCardPictureWidget *bannerCardDisplayWidget = nullptr;
|
||||||
DeckPreviewColorIdentityWidget *colorIdentityWidget;
|
DeckPreviewColorIdentityWidget *colorIdentityWidget = nullptr;
|
||||||
DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget;
|
DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget = nullptr;
|
||||||
|
QLabel *bannerCardLabel = nullptr;
|
||||||
|
QComboBox *bannerCardComboBox = nullptr;
|
||||||
bool filteredBySearch = false;
|
bool filteredBySearch = false;
|
||||||
bool filteredByColor = false;
|
bool filteredByColor = false;
|
||||||
bool filteredByTags = false;
|
bool filteredByTags = false;
|
||||||
|
|
@ -41,11 +44,28 @@ signals:
|
||||||
public slots:
|
public slots:
|
||||||
void setFilePath(const QString &filePath);
|
void setFilePath(const QString &filePath);
|
||||||
void refreshBannerCardText();
|
void refreshBannerCardText();
|
||||||
|
void updateBannerCardComboBox();
|
||||||
|
void setBannerCard(int);
|
||||||
void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
|
void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
|
||||||
void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
|
void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
|
||||||
void initializeUi(bool deckLoadSuccess);
|
void initializeUi(bool deckLoadSuccess);
|
||||||
void updateVisibility();
|
void updateVisibility();
|
||||||
|
void updateBannerCardComboBoxVisibility(bool visible);
|
||||||
void updateTagsVisibility(bool visible);
|
void updateTagsVisibility(bool visible);
|
||||||
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NoScrollFilter : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *obj, QEvent *event) override
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::Wheel) {
|
||||||
|
return true; // Blocks the event
|
||||||
|
}
|
||||||
|
return QObject::eventFilter(obj, event);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DECK_PREVIEW_WIDGET_H
|
#endif // DECK_PREVIEW_WIDGET_H
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <QComboBox>
|
#include <QComboBox>
|
||||||
#include <QDirIterator>
|
#include <QDirIterator>
|
||||||
|
#include <QFileSystemWatcher>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
|
@ -35,6 +36,11 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
|
||||||
sortWidget = new VisualDeckStorageSortWidget(this);
|
sortWidget = new VisualDeckStorageSortWidget(this);
|
||||||
searchWidget = new VisualDeckStorageSearchWidget(this);
|
searchWidget = new VisualDeckStorageSearchWidget(this);
|
||||||
|
|
||||||
|
refreshButton = new QToolButton(this);
|
||||||
|
refreshButton->setIcon(QPixmap("theme:icons/reload"));
|
||||||
|
refreshButton->setFixedSize(32, 32);
|
||||||
|
connect(refreshButton, &QPushButton::clicked, this, &VisualDeckStorageWidget::refreshIfPossible);
|
||||||
|
|
||||||
showFoldersCheckBox = new QCheckBox(this);
|
showFoldersCheckBox = new QCheckBox(this);
|
||||||
showFoldersCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowFolders());
|
showFoldersCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowFolders());
|
||||||
connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageWidget::updateShowFolders);
|
connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageWidget::updateShowFolders);
|
||||||
|
|
@ -59,6 +65,12 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
|
||||||
connect(drawUnusedColorIdentitiesCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(),
|
connect(drawUnusedColorIdentitiesCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(),
|
||||||
&SettingsCache::setVisualDeckStorageDrawUnusedColorIdentities);
|
&SettingsCache::setVisualDeckStorageDrawUnusedColorIdentities);
|
||||||
|
|
||||||
|
bannerCardComboBoxVisibilityCheckBox = new QCheckBox(this);
|
||||||
|
bannerCardComboBoxVisibilityCheckBox->setChecked(
|
||||||
|
SettingsCache::instance().getVisualDeckStorageShowBannerCardComboBox());
|
||||||
|
connect(bannerCardComboBoxVisibilityCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(),
|
||||||
|
&SettingsCache::setVisualDeckStorageShowBannerCardComboBox);
|
||||||
|
|
||||||
// card size slider
|
// card size slider
|
||||||
cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckStorageCardSize());
|
cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckStorageCardSize());
|
||||||
|
|
||||||
|
|
@ -67,11 +79,13 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
|
||||||
quickSettingsWidget->addSettingsWidget(tagFilterVisibilityCheckBox);
|
quickSettingsWidget->addSettingsWidget(tagFilterVisibilityCheckBox);
|
||||||
quickSettingsWidget->addSettingsWidget(tagsOnWidgetsVisibilityCheckBox);
|
quickSettingsWidget->addSettingsWidget(tagsOnWidgetsVisibilityCheckBox);
|
||||||
quickSettingsWidget->addSettingsWidget(drawUnusedColorIdentitiesCheckBox);
|
quickSettingsWidget->addSettingsWidget(drawUnusedColorIdentitiesCheckBox);
|
||||||
|
quickSettingsWidget->addSettingsWidget(bannerCardComboBoxVisibilityCheckBox);
|
||||||
quickSettingsWidget->addSettingsWidget(cardSizeWidget);
|
quickSettingsWidget->addSettingsWidget(cardSizeWidget);
|
||||||
|
|
||||||
searchAndSortLayout->addWidget(deckPreviewColorIdentityFilterWidget);
|
searchAndSortLayout->addWidget(deckPreviewColorIdentityFilterWidget);
|
||||||
searchAndSortLayout->addWidget(sortWidget);
|
searchAndSortLayout->addWidget(sortWidget);
|
||||||
searchAndSortLayout->addWidget(searchWidget);
|
searchAndSortLayout->addWidget(searchWidget);
|
||||||
|
searchAndSortLayout->addWidget(refreshButton);
|
||||||
searchAndSortLayout->addWidget(quickSettingsWidget);
|
searchAndSortLayout->addWidget(quickSettingsWidget);
|
||||||
|
|
||||||
// tag filter box
|
// tag filter box
|
||||||
|
|
@ -104,6 +118,29 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
|
||||||
} else {
|
} else {
|
||||||
scrollArea->setWidget(databaseLoadIndicator);
|
scrollArea->setWidget(databaseLoadIndicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addRecursiveWatch(watcher, SettingsCache::instance().getDeckPath());
|
||||||
|
|
||||||
|
// Signals for changes
|
||||||
|
connect(&watcher, &QFileSystemWatcher::fileChanged, this, &VisualDeckStorageWidget::refreshIfPossible);
|
||||||
|
connect(&watcher, &QFileSystemWatcher::directoryChanged, this, &VisualDeckStorageWidget::refreshIfPossible);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisualDeckStorageWidget::refreshIfPossible()
|
||||||
|
{
|
||||||
|
if (scrollArea->widget() != databaseLoadIndicator) {
|
||||||
|
createRootFolderWidget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VisualDeckStorageWidget::addRecursiveWatch(QFileSystemWatcher &watcher, const QString &dirPath)
|
||||||
|
{
|
||||||
|
QDir dir(dirPath);
|
||||||
|
watcher.addPath(dirPath); // Watch the root directory
|
||||||
|
|
||||||
|
for (const QFileInfo &entry : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
|
||||||
|
addRecursiveWatch(watcher, entry.absoluteFilePath());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisualDeckStorageWidget::showEvent(QShowEvent *event)
|
void VisualDeckStorageWidget::showEvent(QShowEvent *event)
|
||||||
|
|
@ -132,6 +169,7 @@ void VisualDeckStorageWidget::retranslateUi()
|
||||||
tagFilterVisibilityCheckBox->setText(tr("Show Tag Filter"));
|
tagFilterVisibilityCheckBox->setText(tr("Show Tag Filter"));
|
||||||
tagsOnWidgetsVisibilityCheckBox->setText(tr("Show Tags On Deck Previews"));
|
tagsOnWidgetsVisibilityCheckBox->setText(tr("Show Tags On Deck Previews"));
|
||||||
drawUnusedColorIdentitiesCheckBox->setText(tr("Draw not contained Color Identities"));
|
drawUnusedColorIdentitiesCheckBox->setText(tr("Draw not contained Color Identities"));
|
||||||
|
bannerCardComboBoxVisibilityCheckBox->setText(tr("Show Banner Card Selection Option"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisualDeckStorageWidget::deckPreviewClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance)
|
void VisualDeckStorageWidget::deckPreviewClickedEvent(QMouseEvent *event, DeckPreviewWidget *instance)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QFileSystemModel>
|
#include <QFileSystemModel>
|
||||||
|
#include <QFileSystemWatcher>
|
||||||
|
|
||||||
class VisualDeckStorageSearchWidget;
|
class VisualDeckStorageSearchWidget;
|
||||||
class VisualDeckStorageSortWidget;
|
class VisualDeckStorageSortWidget;
|
||||||
|
|
@ -25,6 +26,8 @@ class VisualDeckStorageWidget final : public QWidget
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit VisualDeckStorageWidget(QWidget *parent);
|
explicit VisualDeckStorageWidget(QWidget *parent);
|
||||||
|
void refreshIfPossible();
|
||||||
|
void addRecursiveWatch(QFileSystemWatcher &watcher, const QString &dirPath);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
|
|
||||||
CardSizeWidget *cardSizeWidget;
|
CardSizeWidget *cardSizeWidget;
|
||||||
|
|
@ -61,13 +64,16 @@ private:
|
||||||
VisualDeckStorageSortWidget *sortWidget;
|
VisualDeckStorageSortWidget *sortWidget;
|
||||||
VisualDeckStorageSearchWidget *searchWidget;
|
VisualDeckStorageSearchWidget *searchWidget;
|
||||||
DeckPreviewColorIdentityFilterWidget *deckPreviewColorIdentityFilterWidget;
|
DeckPreviewColorIdentityFilterWidget *deckPreviewColorIdentityFilterWidget;
|
||||||
|
QToolButton *refreshButton;
|
||||||
SettingsButtonWidget *quickSettingsWidget;
|
SettingsButtonWidget *quickSettingsWidget;
|
||||||
QCheckBox *showFoldersCheckBox;
|
QCheckBox *showFoldersCheckBox;
|
||||||
QCheckBox *drawUnusedColorIdentitiesCheckBox;
|
QCheckBox *drawUnusedColorIdentitiesCheckBox;
|
||||||
|
QCheckBox *bannerCardComboBoxVisibilityCheckBox;
|
||||||
QCheckBox *tagFilterVisibilityCheckBox;
|
QCheckBox *tagFilterVisibilityCheckBox;
|
||||||
QCheckBox *tagsOnWidgetsVisibilityCheckBox;
|
QCheckBox *tagsOnWidgetsVisibilityCheckBox;
|
||||||
QScrollArea *scrollArea;
|
QScrollArea *scrollArea;
|
||||||
VisualDeckStorageFolderDisplayWidget *folderWidget;
|
VisualDeckStorageFolderDisplayWidget *folderWidget;
|
||||||
|
QFileSystemWatcher watcher;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VISUAL_DECK_STORAGE_WIDGET_H
|
#endif // VISUAL_DECK_STORAGE_WIDGET_H
|
||||||
|
|
|
||||||
|
|
@ -162,6 +162,10 @@ bool DeckLoader::saveToFile(const QString &fileName, FileFormat fmt)
|
||||||
lastFileName = fileName;
|
lastFileName = fileName;
|
||||||
lastFileFormat = fmt;
|
lastFileFormat = fmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file.flush();
|
||||||
|
file.close();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -264,6 +264,8 @@ SettingsCache::SettingsCache()
|
||||||
visualDeckStorageSortingOrder = settings->value("interface/visualdeckstoragesortingorder", 0).toInt();
|
visualDeckStorageSortingOrder = settings->value("interface/visualdeckstoragesortingorder", 0).toInt();
|
||||||
visualDeckStorageShowFolders = settings->value("interface/visualdeckstorageshowfolders", true).toBool();
|
visualDeckStorageShowFolders = settings->value("interface/visualdeckstorageshowfolders", true).toBool();
|
||||||
visualDeckStorageShowTagFilter = settings->value("interface/visualdeckstorageshowtagfilter", true).toBool();
|
visualDeckStorageShowTagFilter = settings->value("interface/visualdeckstorageshowtagfilter", true).toBool();
|
||||||
|
visualDeckStorageShowBannerCardComboBox =
|
||||||
|
settings->value("interface/visualdeckstorageshowbannercardcombobox", true).toBool();
|
||||||
visualDeckStorageShowTagsOnDeckPreviews =
|
visualDeckStorageShowTagsOnDeckPreviews =
|
||||||
settings->value("interface/visualdeckstorageshowtagsondeckpreviews", true).toBool();
|
settings->value("interface/visualdeckstorageshowtagsondeckpreviews", true).toBool();
|
||||||
visualDeckStorageDrawUnusedColorIdentities =
|
visualDeckStorageDrawUnusedColorIdentities =
|
||||||
|
|
@ -670,6 +672,13 @@ void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T _showTa
|
||||||
emit visualDeckStorageShowTagFilterChanged(visualDeckStorageShowTagFilter);
|
emit visualDeckStorageShowTagFilterChanged(visualDeckStorageShowTagFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SettingsCache::setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T _showBannerCardComboBox)
|
||||||
|
{
|
||||||
|
visualDeckStorageShowBannerCardComboBox = _showBannerCardComboBox;
|
||||||
|
settings->setValue("interface/visualdeckstorageshowbannercardcombobox", visualDeckStorageShowBannerCardComboBox);
|
||||||
|
emit visualDeckStorageShowBannerCardComboBoxChanged(visualDeckStorageShowBannerCardComboBox);
|
||||||
|
}
|
||||||
|
|
||||||
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags)
|
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags)
|
||||||
{
|
{
|
||||||
visualDeckStorageShowTagsOnDeckPreviews = _showTags;
|
visualDeckStorageShowTagsOnDeckPreviews = _showTags;
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ signals:
|
||||||
void printingSelectorCardSizeChanged();
|
void printingSelectorCardSizeChanged();
|
||||||
void printingSelectorNavigationButtonsVisibleChanged();
|
void printingSelectorNavigationButtonsVisibleChanged();
|
||||||
void visualDeckStorageShowTagFilterChanged(bool _visible);
|
void visualDeckStorageShowTagFilterChanged(bool _visible);
|
||||||
|
void visualDeckStorageShowBannerCardComboBoxChanged(bool _visible);
|
||||||
void visualDeckStorageShowTagsOnDeckPreviewsChanged(bool _visible);
|
void visualDeckStorageShowTagsOnDeckPreviewsChanged(bool _visible);
|
||||||
void visualDeckStorageCardSizeChanged();
|
void visualDeckStorageCardSizeChanged();
|
||||||
void visualDeckStorageDrawUnusedColorIdentitiesChanged(bool _visible);
|
void visualDeckStorageDrawUnusedColorIdentitiesChanged(bool _visible);
|
||||||
|
|
@ -129,6 +130,7 @@ private:
|
||||||
bool printingSelectorNavigationButtonsVisible;
|
bool printingSelectorNavigationButtonsVisible;
|
||||||
int visualDeckStorageSortingOrder;
|
int visualDeckStorageSortingOrder;
|
||||||
bool visualDeckStorageShowFolders;
|
bool visualDeckStorageShowFolders;
|
||||||
|
bool visualDeckStorageShowBannerCardComboBox;
|
||||||
bool visualDeckStorageShowTagsOnDeckPreviews;
|
bool visualDeckStorageShowTagsOnDeckPreviews;
|
||||||
bool visualDeckStorageShowTagFilter;
|
bool visualDeckStorageShowTagFilter;
|
||||||
int visualDeckStorageCardSize;
|
int visualDeckStorageCardSize;
|
||||||
|
|
@ -412,6 +414,10 @@ public:
|
||||||
{
|
{
|
||||||
return visualDeckStorageShowTagFilter;
|
return visualDeckStorageShowTagFilter;
|
||||||
}
|
}
|
||||||
|
bool getVisualDeckStorageShowBannerCardComboBox() const
|
||||||
|
{
|
||||||
|
return visualDeckStorageShowBannerCardComboBox;
|
||||||
|
}
|
||||||
bool getVisualDeckStorageShowTagsOnDeckPreviews() const
|
bool getVisualDeckStorageShowTagsOnDeckPreviews() const
|
||||||
{
|
{
|
||||||
return visualDeckStorageShowTagsOnDeckPreviews;
|
return visualDeckStorageShowTagsOnDeckPreviews;
|
||||||
|
|
@ -760,6 +766,7 @@ public slots:
|
||||||
void setVisualDeckStorageSortingOrder(int _visualDeckStorageSortingOrder);
|
void setVisualDeckStorageSortingOrder(int _visualDeckStorageSortingOrder);
|
||||||
void setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T value);
|
void setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T value);
|
||||||
void setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T _showTags);
|
void setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T _showTags);
|
||||||
|
void setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T _showBannerCardComboBox);
|
||||||
void setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags);
|
void setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags);
|
||||||
void setVisualDeckStorageCardSize(int _visualDeckStorageCardSize);
|
void setVisualDeckStorageCardSize(int _visualDeckStorageCardSize);
|
||||||
void setVisualDeckStorageDrawUnusedColorIdentities(QT_STATE_CHANGED_T _visualDeckStorageDrawUnusedColorIdentities);
|
void setVisualDeckStorageDrawUnusedColorIdentities(QT_STATE_CHANGED_T _visualDeckStorageDrawUnusedColorIdentities);
|
||||||
|
|
|
||||||
|
|
@ -369,7 +369,7 @@ DeckList::DeckList()
|
||||||
// TODO: https://qt-project.org/doc/qt-4.8/qobject.html#no-copy-constructor-or-assignment-operator
|
// TODO: https://qt-project.org/doc/qt-4.8/qobject.html#no-copy-constructor-or-assignment-operator
|
||||||
DeckList::DeckList(const DeckList &other)
|
DeckList::DeckList(const DeckList &other)
|
||||||
: QObject(), name(other.name), comments(other.comments), bannerCard(other.bannerCard), deckHash(other.deckHash),
|
: QObject(), name(other.name), comments(other.comments), bannerCard(other.bannerCard), deckHash(other.deckHash),
|
||||||
lastLoadedTimestamp(other.lastLoadedTimestamp)
|
lastLoadedTimestamp(other.lastLoadedTimestamp), tags(other.tags)
|
||||||
{
|
{
|
||||||
root = new InnerDecklistNode(other.getRoot());
|
root = new InnerDecklistNode(other.getRoot());
|
||||||
|
|
||||||
|
|
@ -807,6 +807,7 @@ void DeckList::cleanList()
|
||||||
root->clearTree();
|
root->clearTree();
|
||||||
setName();
|
setName();
|
||||||
setComments();
|
setComments();
|
||||||
|
setTags();
|
||||||
deckHash = QString();
|
deckHash = QString();
|
||||||
emit deckHashChanged();
|
emit deckHashChanged();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,6 +208,9 @@ void SettingsCache::setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T /* value
|
||||||
void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T /* _showTags */)
|
void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T /* _showTags */)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
void SettingsCache::setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T /* _showBannerCardComboBox */)
|
||||||
|
{
|
||||||
|
}
|
||||||
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T /* _showTags */)
|
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T /* _showTags */)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -212,6 +212,9 @@ void SettingsCache::setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T /* value
|
||||||
void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T /* _showTags */)
|
void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T /* _showTags */)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
void SettingsCache::setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T /* _showBannerCardComboBox */)
|
||||||
|
{
|
||||||
|
}
|
||||||
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T /* _showTags */)
|
void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T /* _showTags */)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue