diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.cpp index c7f1b9f13..6f954b01b 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.cpp @@ -54,15 +54,12 @@ void VisualDeckStorageTagFilterWidget::refreshTags() } // Add chips for tags that are not shown yet. + QSet existingTags; + for (DeckPreviewTagDisplayWidget *tagWidget : chips) { + existingTags.insert(tagWidget->getTagName()); + } for (const QString &tag : allTags) { - bool tagExists = false; - for (DeckPreviewTagDisplayWidget *tagWidget : chips) { - if (tagWidget->getTagName() == tag) { - tagExists = true; - break; - } - } - if (!tagExists) { + if (!existingTags.contains(tag)) { auto *newTagWidget = new DeckPreviewTagDisplayWidget(this, tag); connect(newTagWidget, &DeckPreviewTagDisplayWidget::tagClicked, this, &VisualDeckStorageTagFilterWidget::filterChanged); @@ -75,7 +72,10 @@ void VisualDeckStorageTagFilterWidget::refreshTags() // FlowWidget inherits QLayout::removeWidget's linear scan, so rebuilding an unchanged // order would be quadratic plus a full relayout on every chip click and load batch. std::sort(chips.begin(), chips.end(), [](DeckPreviewTagDisplayWidget *a, DeckPreviewTagDisplayWidget *b) { - return a->getTagName().toLower() < b->getTagName().toLower(); + const QString aName = a->getTagName(); + const QString bName = b->getTagName(); + const int compared = aName.compare(bName, Qt::CaseInsensitive); + return compared != 0 ? compared < 0 : aName < bName; }); if (chips == currentChipOrder) { return; diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.h b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.h index 8d89bed34..5e3cb398c 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_tag_filter_widget.h @@ -46,7 +46,7 @@ signals: * Emitted when a chip's selection or exclusion state changes. * * The chip only emits when its state actually changed, so this fires once per - * effective toggle rather than on every click." + * effective toggle rather than on every click. */ void filterChanged();