Compare commits

...

4 Commits

Author SHA1 Message Date
RickyRister
0deaa9d9b4 [DeckEditor] Don't change widget focus when adding card (#6503) 2026-01-09 18:27:54 -08:00
RickyRister
7c7755b61d [VDE] Fix crash vy adding null check for card in PrintingSelector (#6500) 2026-01-06 22:41:40 -08:00
github-actions[bot]
6340c4a6b7 Update translation source strings (#6465) 2026-01-06 19:35:53 +01:00
RickyRister
0a2fdb05ad [VDS] Try to fix memory leak by properly parenting widgets (#6498)
* [VDS] Try to fix memory leak by properly parenting widgets

* format
2026-01-06 11:42:35 +01:00
11 changed files with 2883 additions and 2054 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -47,7 +47,7 @@ CardInfoPictureWidget::CardInfoPictureWidget(QWidget *parent, const bool _hoverT
originalPos = this->pos();
// Create the animation
animation = new QPropertyAnimation(this, "pos");
animation = new QPropertyAnimation(this, "pos", this);
animation->setDuration(200); // 200ms animation duration
animation->setEasingCurve(QEasingCurve::OutQuad);

View File

@@ -459,12 +459,15 @@ void DeckEditorDeckDockWidget::syncBannerCardComboBoxSelectionWithDeck()
}
}
void DeckEditorDeckDockWidget::setSelectedIndex(const QModelIndex &newCardIndex)
void DeckEditorDeckDockWidget::setSelectedIndex(const QModelIndex &newCardIndex, bool preserveWidgetFocus)
{
deckView->clearSelection();
deckView->setCurrentIndex(newCardIndex);
recursiveExpand(newCardIndex);
deckView->setFocus(Qt::FocusReason::MouseFocusReason);
if (!preserveWidgetFocus) {
deckView->setFocus(Qt::FocusReason::MouseFocusReason);
}
}
void DeckEditorDeckDockWidget::syncDisplayWidgetsToModel()

View File

@@ -100,7 +100,7 @@ private slots:
void writeComments();
void writeBannerCard(int);
void applyActiveGroupCriteria();
void setSelectedIndex(const QModelIndex &newCardIndex);
void setSelectedIndex(const QModelIndex &newCardIndex, bool preserveWidgetFocus);
void updateHash();
void refreshShortcuts();
void updateShowBannerCardComboBox(bool visible);

View File

@@ -182,7 +182,7 @@ QModelIndex DeckStateManager::addCard(const ExactCard &card, const QString &zone
QModelIndex idx = modifyDeck(reason, [&card, &zone](auto model) { return model->addCard(card, zone); });
if (idx.isValid()) {
emit focusIndexChanged(idx);
emit focusIndexChanged(idx, true);
}
return idx;
@@ -208,7 +208,7 @@ QModelIndex DeckStateManager::decrementCard(const ExactCard &card, const QString
}
if (idx.isValid()) {
emit focusIndexChanged(idx);
emit focusIndexChanged(idx, true);
}
return idx;

View File

@@ -290,8 +290,9 @@ signals:
/**
* The selected card on any views connected to this deck should be changed to this index.
* @param index The model index
* @param preserveWidgetFocus Whether to keep the widget focus unchanged
*/
void focusIndexChanged(QModelIndex index);
void focusIndexChanged(QModelIndex index, bool preserveWidgetFocus);
};
#endif // COCKATRICE_DECK_STATE_MANAGER_H

View File

@@ -198,7 +198,7 @@ void CardAmountWidget::addPrinting(const QString &zone)
});
if (newCardIndex.isValid()) {
emit deckStateManager->focusIndexChanged(newCardIndex);
emit deckStateManager->focusIndexChanged(newCardIndex, false);
}
}

View File

@@ -122,6 +122,10 @@ static QMap<QString, QPair<int, int>> tallyUuidCounts(const DeckListModel *model
void PrintingSelector::updateCardAmounts()
{
if (selectedCard.isNull()) {
return;
}
auto map = tallyUuidCounts(deckStateManager->getModel(), selectedCard->getName());
emit cardAmountsChanged(map);
}

View File

@@ -92,7 +92,7 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess)
bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
bannerCardComboBox->setObjectName("bannerCardComboBox");
bannerCardComboBox->setCurrentText(deckLoader->getDeck().deckList.getBannerCard().name);
bannerCardComboBox->installEventFilter(new NoScrollFilter());
bannerCardComboBox->installEventFilter(new NoScrollFilter(bannerCardComboBox));
connect(bannerCardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&DeckPreviewWidget::setBannerCard);

View File

@@ -82,6 +82,11 @@ private slots:
class NoScrollFilter : public QObject
{
Q_OBJECT
public:
explicit NoScrollFilter(QObject *parent = nullptr) : QObject(parent)
{
}
protected:
bool eventFilter(QObject *obj, QEvent *event) override
{

View File

@@ -4,22 +4,22 @@
<context>
<name>IntroPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="215"/>
<location filename="src/pages.cpp" line="127"/>
<source>Introduction</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="216"/>
<location filename="src/pages.cpp" line="128"/>
<source>This wizard will import the list of sets, cards, and tokens that will be used by Cockatrice.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="218"/>
<location filename="src/pages.cpp" line="130"/>
<source>Interface language:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="219"/>
<location filename="src/pages.cpp" line="131"/>
<source>Version:</source>
<translation type="unfinished"></translation>
</message>
@@ -27,134 +27,134 @@
<context>
<name>LoadSetsPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="288"/>
<location filename="src/pages.cpp" line="200"/>
<source>Source selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="289"/>
<location filename="src/pages.cpp" line="201"/>
<source>Please specify a compatible source for the list of sets and cards. You can specify a URL address that will be downloaded or use an existing file from your computer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="293"/>
<location filename="src/pages.cpp" line="205"/>
<source>Download URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="294"/>
<location filename="src/pages.cpp" line="206"/>
<source>Local file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="295"/>
<location filename="src/pages.cpp" line="207"/>
<source>Restore default URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="296"/>
<location filename="src/pages.cpp" line="208"/>
<source>Choose file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="306"/>
<location filename="src/pages.cpp" line="218"/>
<source>Load sets file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="316"/>
<location filename="src/pages.cpp" line="228"/>
<source>Sets file (%1)</source>
<oldsource>Sets JSON file (%1)</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="346"/>
<location filename="src/oraclewizard.cpp" line="365"/>
<location filename="src/oraclewizard.cpp" line="370"/>
<location filename="src/oraclewizard.cpp" line="438"/>
<location filename="src/oraclewizard.cpp" line="569"/>
<location filename="src/oraclewizard.cpp" line="582"/>
<location filename="src/oraclewizard.cpp" line="603"/>
<location filename="src/pages.cpp" line="258"/>
<location filename="src/pages.cpp" line="277"/>
<location filename="src/pages.cpp" line="282"/>
<location filename="src/pages.cpp" line="354"/>
<location filename="src/pages.cpp" line="485"/>
<location filename="src/pages.cpp" line="498"/>
<location filename="src/pages.cpp" line="519"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="346"/>
<location filename="src/pages.cpp" line="258"/>
<source>The provided URL is not valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="350"/>
<location filename="src/pages.cpp" line="262"/>
<source>Downloading (0MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="365"/>
<location filename="src/pages.cpp" line="277"/>
<source>Please choose a file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="370"/>
<location filename="src/pages.cpp" line="282"/>
<source>Cannot open file &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="429"/>
<location filename="src/pages.cpp" line="345"/>
<source>Downloading (%1MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="438"/>
<location filename="src/pages.cpp" line="354"/>
<source>Network error: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="476"/>
<location filename="src/pages.cpp" line="392"/>
<source>Parsing file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="498"/>
<location filename="src/pages.cpp" line="414"/>
<source>Xz extraction failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="505"/>
<location filename="src/pages.cpp" line="421"/>
<source>Sorry, this version of Oracle does not support xz compressed files.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="525"/>
<location filename="src/pages.cpp" line="441"/>
<source>Failed to open Zip archive: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="530"/>
<location filename="src/pages.cpp" line="446"/>
<source>Zip extraction failed: the Zip archive doesn&apos;t contain exactly one file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="538"/>
<location filename="src/pages.cpp" line="454"/>
<source>Zip extraction failed: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="546"/>
<location filename="src/pages.cpp" line="462"/>
<source>Sorry, this version of Oracle does not support zipped files.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="569"/>
<location filename="src/pages.cpp" line="485"/>
<source>Failed to interpret downloaded data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="582"/>
<location filename="src/pages.cpp" line="498"/>
<source>Do you want to download the uncompressed file instead?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="604"/>
<location filename="src/pages.cpp" line="520"/>
<source>The file was retrieved successfully, but it does not contain any sets data.</source>
<translation type="unfinished"></translation>
</message>
@@ -162,42 +162,57 @@
<context>
<name>LoadSpoilersPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="790"/>
<location filename="src/pages.cpp" line="716"/>
<source>Save spoiler database</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="795"/>
<location filename="src/pages.cpp" line="721"/>
<source>XML; spoiler database (*.xml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="800"/>
<location filename="src/pages.cpp" line="726"/>
<source>spoiler</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="731"/>
<source>Spoilers import</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="801"/>
<location filename="src/pages.cpp" line="732"/>
<source>Please specify a compatible source for spoiler data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="803"/>
<location filename="src/pages.cpp" line="734"/>
<source>Download URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="804"/>
<location filename="src/pages.cpp" line="735"/>
<source>Local file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="736"/>
<source>Restore default URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="805"/>
<location filename="src/pages.cpp" line="737"/>
<source>Choose file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="739"/>
<source>The spoiler database will be saved at the following location:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="807"/>
<location filename="src/pages.cpp" line="741"/>
<source>Save to a custom path (not recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -205,42 +220,57 @@
<context>
<name>LoadTokensPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="753"/>
<location filename="src/pages.cpp" line="671"/>
<source>Save token database</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="758"/>
<location filename="src/pages.cpp" line="676"/>
<source>XML; token database (*.xml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="763"/>
<location filename="src/pages.cpp" line="681"/>
<source>tokens</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="686"/>
<source>Tokens import</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="764"/>
<location filename="src/pages.cpp" line="687"/>
<source>Please specify a compatible source for token data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="766"/>
<location filename="src/pages.cpp" line="689"/>
<source>Download URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="767"/>
<location filename="src/pages.cpp" line="690"/>
<source>Local file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="691"/>
<source>Restore default URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="768"/>
<location filename="src/pages.cpp" line="692"/>
<source>Choose file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pages.cpp" line="694"/>
<source>The token database will be saved at the following location:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="770"/>
<location filename="src/pages.cpp" line="696"/>
<source>Save to a custom path (not recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -248,7 +278,7 @@
<context>
<name>OracleImporter</name>
<message>
<location filename="src/oracleimporter.cpp" line="466"/>
<location filename="src/oracleimporter.cpp" line="541"/>
<source>Dummy set containing tokens</source>
<translation type="unfinished"></translation>
</message>
@@ -256,7 +286,7 @@
<context>
<name>OracleWizard</name>
<message>
<location filename="src/oraclewizard.cpp" line="106"/>
<location filename="src/oraclewizard.cpp" line="70"/>
<source>Oracle Importer</source>
<translation type="unfinished"></translation>
</message>
@@ -264,22 +294,22 @@
<context>
<name>OutroPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="224"/>
<location filename="src/pages.cpp" line="136"/>
<source>Finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="225"/>
<location filename="src/pages.cpp" line="137"/>
<source>The wizard has finished.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="226"/>
<location filename="src/pages.cpp" line="138"/>
<source>You can now start using Cockatrice with the newly updated cards.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="227"/>
<location filename="src/pages.cpp" line="139"/>
<source>If the card databases don&apos;t reload automatically, restart the Cockatrice client.</source>
<translation type="unfinished"></translation>
</message>
@@ -287,73 +317,73 @@
<context>
<name>SaveSetsPage</name>
<message>
<location filename="src/oraclewizard.cpp" line="646"/>
<location filename="src/oraclewizard.cpp" line="720"/>
<location filename="src/pages.cpp" line="563"/>
<location filename="src/pages.cpp" line="638"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="646"/>
<location filename="src/pages.cpp" line="563"/>
<source>No set has been imported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="656"/>
<location filename="src/pages.cpp" line="574"/>
<source>Sets imported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="658"/>
<location filename="src/pages.cpp" line="576"/>
<source>A cockatrice database file of %1 MB has been downloaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="661"/>
<location filename="src/pages.cpp" line="579"/>
<source>The following sets have been found:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="664"/>
<location filename="src/pages.cpp" line="582"/>
<source>Press &quot;Save&quot; to store the imported cards in the Cockatrice database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="665"/>
<location filename="src/pages.cpp" line="583"/>
<source>The card database will be saved at the following location:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="667"/>
<location filename="src/pages.cpp" line="585"/>
<source>Save to a custom path (not recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="669"/>
<location filename="src/pages.cpp" line="587"/>
<source>&amp;Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="675"/>
<location filename="src/pages.cpp" line="593"/>
<source>Import finished: %1 cards.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="678"/>
<location filename="src/pages.cpp" line="596"/>
<source>%1: %2 cards imported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="687"/>
<location filename="src/pages.cpp" line="605"/>
<source>Save card database</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="688"/>
<location filename="src/pages.cpp" line="606"/>
<source>XML; card database (*.xml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/oraclewizard.cpp" line="720"/>
<location filename="src/pages.cpp" line="638"/>
<source>The file could not be saved to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -361,34 +391,56 @@
<context>
<name>SimpleDownloadFilePage</name>
<message>
<location filename="src/pagetemplates.cpp" line="73"/>
<location filename="src/pagetemplates.cpp" line="113"/>
<location filename="src/pagetemplates.cpp" line="169"/>
<location filename="src/pagetemplates.cpp" line="72"/>
<source>Load %1 file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="82"/>
<source>%1 file (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="111"/>
<location filename="src/pagetemplates.cpp" line="129"/>
<location filename="src/pagetemplates.cpp" line="134"/>
<location filename="src/pagetemplates.cpp" line="168"/>
<location filename="src/pagetemplates.cpp" line="224"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="73"/>
<location filename="src/pagetemplates.cpp" line="111"/>
<source>The provided URL is not valid: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="77"/>
<location filename="src/pagetemplates.cpp" line="115"/>
<source>Downloading (0MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="104"/>
<location filename="src/pagetemplates.cpp" line="129"/>
<source>Please choose a file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="134"/>
<source>Cannot open file &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="159"/>
<source>Downloading (%1MB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="113"/>
<location filename="src/pagetemplates.cpp" line="168"/>
<source>Network error: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/pagetemplates.cpp" line="169"/>
<location filename="src/pagetemplates.cpp" line="224"/>
<source>The file could not be saved to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -537,7 +589,7 @@
<context>
<name>i18n</name>
<message>
<location filename="src/oraclewizard.cpp" line="58"/>
<location filename="src/oraclewizard.cpp" line="22"/>
<source>English</source>
<translation type="unfinished"></translation>
</message>