[VDS] Reload deck on hover if file has been modified since last load

This commit is contained in:
RickyRister 2026-01-10 01:58:04 -08:00
parent 11391a1a21
commit dbf788a183
5 changed files with 93 additions and 20 deletions

View file

@ -53,6 +53,16 @@ void ColorIdentityWidget::populateManaSymbolWidgets()
}
}
void ColorIdentityWidget::setColorIdentity(const QString &_colorIdentity)
{
if (colorIdentity == _colorIdentity) {
return;
}
colorIdentity = _colorIdentity;
populateManaSymbolWidgets();
}
void ColorIdentityWidget::toggleUnusedVisibility()
{
populateManaSymbolWidgets();

View file

@ -23,6 +23,7 @@ public:
static QStringList parseColorIdentity(const QString &manaString);
public slots:
void setColorIdentity(const QString &_colorIdentity);
void resizeEvent(QResizeEvent *event) override;
void toggleUnusedVisibility();

View file

@ -21,7 +21,7 @@ class DeckPreviewDeckTagsDisplayWidget : public QWidget
FlowWidget *flowWidget;
public:
explicit DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, const QStringList &_tags);
explicit DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, const QStringList &_tags = {});
void setTags(const QStringList &_tags);
void refreshTags();

View file

@ -71,21 +71,44 @@ void DeckPreviewWidget::resizeEvent(QResizeEvent *event)
}
}
void DeckPreviewWidget::enterEvent(QEnterEvent *event)
{
QWidget::enterEvent(event);
reloadIfModified();
}
/**
* @brief Sets the lastModifiedTime to the value given by the file.
*/
void DeckPreviewWidget::updateLastModifiedTime()
{
QFileInfo fileInfo(filePath);
lastModifiedTime = fileInfo.lastModified();
}
/**
* @brief Writes the current contents of the deck to file. Updates the lastModifiedTime afterward.
*/
void DeckPreviewWidget::writeDeckToFile()
{
DeckLoader::saveToFile(deckLoader->getDeck());
updateLastModifiedTime();
}
void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
{
if (!deckLoadSuccess) {
return;
}
auto bannerCard = deckLoader->getDeck().deckList.getBannerCard().name.isEmpty()
? ExactCard()
: CardDatabaseManager::query()->getCard(deckLoader->getDeck().deckList.getBannerCard());
bannerCardDisplayWidget->setCard(bannerCard);
QFileInfo fileInfo(filePath);
lastModifiedTime = fileInfo.lastModified();
bannerCardDisplayWidget->setFontSize(24);
setFilePath(deckLoader->getDeck().lastLoadInfo.fileName);
colorIdentityWidget = new ColorIdentityWidget(this, getColorIdentity());
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader->getDeck().deckList.getTags());
colorIdentityWidget = new ColorIdentityWidget(this);
deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this);
connect(deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::tagsChanged, this, &DeckPreviewWidget::setTags);
bannerCardLabel = new QLabel(this);
@ -93,13 +116,11 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
bannerCardComboBox = new QComboBox(this);
bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
bannerCardComboBox->setObjectName("bannerCardComboBox");
bannerCardComboBox->setCurrentText(deckLoader->getDeck().deckList.getBannerCard().name);
bannerCardComboBox->installEventFilter(new NoScrollFilter(bannerCardComboBox));
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&DeckPreviewWidget::setBannerCard);
updateColorIdentityVisibility(SettingsCache::instance().getVisualDeckStorageShowColorIdentity());
updateBannerCardComboBox();
updateBannerCardComboBoxVisibility(SettingsCache::instance().getVisualDeckStorageShowBannerCardComboBox());
updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews());
@ -108,9 +129,44 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
layout->addWidget(bannerCardLabel);
layout->addWidget(bannerCardComboBox);
refreshBannerCardText();
retranslateUi();
resyncWidgets();
}
/**
* @brief Syncs the contents of the child widgets with the current deck.
*/
void DeckPreviewWidget::resyncWidgets()
{
auto bannerCardRef = deckLoader->getDeck().deckList.getBannerCard();
auto bannerCard = bannerCardRef.name.isEmpty() ? ExactCard() : CardDatabaseManager::query()->getCard(bannerCardRef);
bannerCardDisplayWidget->setCard(bannerCard);
refreshBannerCardText();
updateBannerCardComboBox(bannerCardRef.name);
colorIdentityWidget->setColorIdentity(getColorIdentity());
deckTagsDisplayWidget->setTags(deckLoader->getDeck().deckList.getTags());
}
/**
* @brief Reloads the deck if the file's last modified time has increased since we last checked.
*/
void DeckPreviewWidget::reloadIfModified()
{
QFileInfo fileInfo(filePath);
QDateTime newLastModifiedTime = fileInfo.lastModified();
if (!newLastModifiedTime.isValid() || newLastModifiedTime <= lastModifiedTime) {
return;
}
bool success = deckLoader->reload();
if (success) {
fileInfo.refresh();
lastModifiedTime = fileInfo.lastModified();
resyncWidgets();
}
}
void DeckPreviewWidget::updateVisibility()
@ -232,11 +288,8 @@ void DeckPreviewWidget::refreshBannerCardToolTip()
}
}
void DeckPreviewWidget::updateBannerCardComboBox()
void DeckPreviewWidget::updateBannerCardComboBox(const QString &currentText)
{
// Store the current text of the combo box
QString currentText = bannerCardComboBox->currentText();
// Block signals temporarily
bool wasBlocked = bannerCardComboBox->blockSignals(true);
bannerCardComboBox->setUpdatesEnabled(false);
@ -300,7 +353,7 @@ void DeckPreviewWidget::setBannerCard(int /* changedIndex */)
auto [name, id] = bannerCardComboBox->currentData().value<QPair<QString, QString>>();
CardRef cardRef = {name, id};
deckLoader->getDeck().deckList.setBannerCard(cardRef);
DeckLoader::saveToFile(deckLoader->getDeck());
writeDeckToFile();
bannerCardDisplayWidget->setCard(CardDatabaseManager::query()->getCard(cardRef));
}
@ -323,7 +376,7 @@ void DeckPreviewWidget::imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewC
void DeckPreviewWidget::setTags(const QStringList &tags)
{
deckLoader->getDeck().deckList.setTags(tags);
DeckLoader::saveToFile(deckLoader->getDeck());
writeDeckToFile();
}
QMenu *DeckPreviewWidget::createRightClickMenu()
@ -398,7 +451,7 @@ void DeckPreviewWidget::actRenameDeck()
// write change
deckLoader->getDeck().deckList.setName(newName);
DeckLoader::saveToFile(deckLoader->getDeck());
writeDeckToFile();
// update VDS
refreshBannerCardText();
@ -429,9 +482,10 @@ void DeckPreviewWidget::actRenameFile()
}
deckLoader->getDeck().lastLoadInfo.fileName = newFilePath;
setFilePath(newFilePath);
// update VDS
setFilePath(newFilePath);
updateLastModifiedTime();
refreshBannerCardText();
}

View file

@ -38,6 +38,7 @@ public:
VisualDeckStorageWidget *visualDeckStorageWidget;
QVBoxLayout *layout;
QString filePath;
QDateTime lastModifiedTime;
DeckLoader *deckLoader;
DeckPreviewCardPictureWidget *bannerCardDisplayWidget = nullptr;
ColorIdentityWidget *colorIdentityWidget = nullptr;
@ -57,18 +58,25 @@ public slots:
void setFilePath(const QString &filePath);
void refreshBannerCardText();
void refreshBannerCardToolTip();
void updateBannerCardComboBox();
void updateBannerCardComboBox(const QString &currentText);
void setBannerCard(int);
void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance);
void initializeUi(bool deckLoadSuccess);
void resyncWidgets();
void reloadIfModified();
void updateVisibility();
void updateColorIdentityVisibility(bool visible);
void updateBannerCardComboBoxVisibility(bool visible);
void updateTagsVisibility(bool visible);
void resizeEvent(QResizeEvent *event) override;
protected:
void enterEvent(QEnterEvent *event) override;
private:
void updateLastModifiedTime();
void writeDeckToFile();
QMenu *createRightClickMenu();
void addSetBannerCardMenu(QMenu *menu);