diff --git a/cockatrice/cockatrice.desktop b/cockatrice/cockatrice.desktop index 70db9d472..4b15fa9c1 100644 --- a/cockatrice/cockatrice.desktop +++ b/cockatrice/cockatrice.desktop @@ -6,4 +6,5 @@ Name=Cockatrice Exec=cockatrice %U Icon=cockatrice Categories=Game;CardGame; -MimeType=application/x-cockatrice;x-scheme-handler/cockatrice; +MimeType=application/x-cockatrice; +X-Scheme-Handler/cockatrice=true diff --git a/cockatrice/src/interface/deck_loader/card_node_function.cpp b/cockatrice/src/interface/deck_loader/card_node_function.cpp index 8d59a6c15..0934b34da 100644 --- a/cockatrice/src/interface/deck_loader/card_node_function.cpp +++ b/cockatrice/src/interface/deck_loader/card_node_function.cpp @@ -15,14 +15,13 @@ void CardNodeFunction::SetProviderIdToPreferred::operator()(const InnerDecklistN { Q_UNUSED(node); PrintingInfo preferredPrinting = CardDatabaseManager::query()->getPreferredPrinting(card->getName()); - CardSetPtr preferredSet = preferredPrinting.getSet(); - if (!preferredSet) { - return; - } + QString providerId = preferredPrinting.getUuid(); + QString setShortName = preferredPrinting.getSet()->getShortName(); + QString collectorNumber = preferredPrinting.getProperty("num"); - card->setCardProviderId(preferredPrinting.getUuid()); - card->setCardCollectorNumber(preferredPrinting.getProperty("num")); - card->setCardSetShortName(preferredSet->getShortName()); + card->setCardProviderId(providerId); + card->setCardCollectorNumber(collectorNumber); + card->setCardSetShortName(setShortName); } void CardNodeFunction::ClearPrintingData::operator()(const InnerDecklistNode *node, DecklistCardNode *card) const diff --git a/cockatrice/src/interface/widgets/utility/card_completer_styler.cpp b/cockatrice/src/interface/widgets/utility/card_completer_styler.cpp index 1ddcc4200..fef1dcbf7 100644 --- a/cockatrice/src/interface/widgets/utility/card_completer_styler.cpp +++ b/cockatrice/src/interface/widgets/utility/card_completer_styler.cpp @@ -150,8 +150,7 @@ bool CardCompleterStyler::handlePopupKeyPress(QKeyEvent *event) if (newRow != currentRow) { const QModelIndex newIndex = completer->completionModel()->index(newRow, completer->completionColumn()); - popup->selectionModel()->setCurrentIndex(newIndex, - QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + popup->selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::NoUpdate); } return true; @@ -181,7 +180,7 @@ void CardCompleterStyler::ensureClosestSelected() if (currentRow != closestRow) { popup->selectionModel()->setCurrentIndex(completionModel->index(closestRow, completer->completionColumn()), - QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + QItemSelectionModel::NoUpdate); } } diff --git a/cockatrice/src/interface/widgets/utility/completer_utils.cpp b/cockatrice/src/interface/widgets/utility/completer_utils.cpp index f1cd9c6a7..53db58b70 100644 --- a/cockatrice/src/interface/widgets/utility/completer_utils.cpp +++ b/cockatrice/src/interface/widgets/utility/completer_utils.cpp @@ -3,19 +3,12 @@ #include "../../../client/settings/cache_settings.h" #include "card_completer_styler.h" -#include #include #include -#include #include -#include -#include #include #include #include -#include -#include -#include #include #include #include @@ -24,45 +17,6 @@ namespace { -/** - * @brief Paints the mention popup's current row with a visible highlight. - * - * A completer popup is a transient window that is usually not the application's - * active window, so the style paints a selected row using the palette's - * Inactive highlight group. Most themes set that colour close to the popup - * background, which hides the current completion entirely. Mirror the active - * highlight into the inactive group so the selection stays visible. - */ -class MentionCompleterDelegate : public QStyledItemDelegate -{ -public: - explicit MentionCompleterDelegate(QAbstractItemView *view) : QStyledItemDelegate(view), view(view) - { - } - - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override - { - QStyleOptionViewItem opt = option; - opt.showDecorationSelected = true; - - if (view->currentIndex() == index) { - opt.state |= QStyle::State_HasFocus; - } - - if (opt.state & QStyle::State_Selected) { - opt.palette.setColor(QPalette::Inactive, QPalette::Highlight, - opt.palette.color(QPalette::Active, QPalette::Highlight)); - opt.palette.setColor(QPalette::Inactive, QPalette::HighlightedText, - opt.palette.color(QPalette::Active, QPalette::HighlightedText)); - } - - QStyledItemDelegate::paint(painter, opt, index); - } - -private: - QAbstractItemView *view; -}; - void applyCardSearchLanguage(CardSearchModel *searchModel) { const CardsDisplaySettings &cardsDisplay = SettingsCache::instance().cardsDisplay(); @@ -115,11 +69,5 @@ QCompleter *createMentionCompleter(QStringListModel *model, QObject *parent) completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setMaxVisibleItems(5); completer->setFilterMode(Qt::MatchStartsWith); - - // Force the popup to be created so the highlight delegate can be installed; - // otherwise QCompleter's own delegate hides the selection on most themes. - QAbstractItemView *popup = completer->popup(); - popup->setItemDelegate(new MentionCompleterDelegate(popup)); - return completer; } diff --git a/cockatrice/src/interface/widgets/utility/line_edit_completer.cpp b/cockatrice/src/interface/widgets/utility/line_edit_completer.cpp index 056887f1a..38e3e4350 100644 --- a/cockatrice/src/interface/widgets/utility/line_edit_completer.cpp +++ b/cockatrice/src/interface/widgets/utility/line_edit_completer.cpp @@ -1,11 +1,9 @@ #include "line_edit_completer.h" -#include #include #include #include #include -#include #include #include #include @@ -50,80 +48,37 @@ void LineEditCompleter::focusOutEvent(QFocusEvent *e) { LineEditUnfocusable::focusOutEvent(e); - // Commit completion when focus moves away via Tab if popup is visible. + // Only commit the highlighted completion when focus moves away via Tab. // Other focus losses (e.g. the unfocus shortcut / Escape) must simply close // the popup without inserting anything. - bool popupWasVisible = false; + if (e->reason() != Qt::TabFocusReason) { + hideCompleterPopups(); + return; + } + for (auto &info : completers) { - if (info.completer->popup()->isVisible()) { - popupWasVisible = true; - const QModelIndex currentIndex = info.completer->popup()->currentIndex(); - QString completionText; - if (currentIndex.isValid()) { - completionText = currentIndex.data().toString(); - } else { - completionText = info.completer->currentCompletion(); - } - if (!completionText.isEmpty()) { - insertCompletion(info.completer, completionText); - } + if (!info.completer->popup()->isVisible()) { + continue; + } + + const QModelIndex currentIndex = info.completer->popup()->currentIndex(); + if (currentIndex.isValid()) { + insertCompletion(info.completer, currentIndex.data().toString()); } } + hideCompleterPopups(); - - if (popupWasVisible && e->reason() == Qt::TabFocusReason) { - // Refocus the edit so Tab doesn't move focus away - // Use a queued connection to ensure focus is restored after the focus change completes - QMetaObject::invokeMethod(this, "setFocus", Qt::QueuedConnection); - e->accept(); - return; - } - - if (popupWasVisible) { - return; - } } void LineEditCompleter::keyPressEvent(QKeyEvent *event) { - if (event->key() == Qt::Key_Escape) { - if (hasVisibleCompleterPopup()) { - event->ignore(); - hideCompleterPopups(); - return; - } - LineEditUnfocusable::keyPressEvent(event); - return; - } - - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter || event->key() == Qt::Key_Space) { - for (auto &info : completers) { - if (info.completer->popup()->isVisible()) { - event->ignore(); - const QModelIndex currentIndex = info.completer->popup()->currentIndex(); - QString completionText; - if (currentIndex.isValid()) { - completionText = currentIndex.data().toString(); - } else { - completionText = info.completer->currentCompletion(); - } - if (!completionText.isEmpty()) { - insertCompletion(info.completer, completionText); - } - hideCompleterPopups(); - return; - } - } - } - - if (event->key() == Qt::Key_Tab) { - // Let Tab proceed normally; focusOutEvent will handle completion if popup is visible - LineEditUnfocusable::keyPressEvent(event); - return; - } - LineEditUnfocusable::keyPressEvent(event); + if (event->key() == Qt::Key_Escape) { + hideCompleterPopups(); + return; + } + QString textValue = text(); int cursorPos = cursorPosition(); @@ -177,17 +132,6 @@ void LineEditCompleter::keyPressEvent(QKeyEvent *event) } active->completer->complete(); - - // The popup opens without a current row, so nothing is highlighted and there - // is no visual indication of what Enter will insert. Select the row that - // currentCompletion() would use so the current mention stays visible. - auto *completionModel = active->completer->completionModel(); - const int currentRow = active->completer->currentRow(); - if (currentRow >= 0 && currentRow < completionModel->rowCount()) { - active->completer->popup()->selectionModel()->setCurrentIndex( - completionModel->index(currentRow, active->completer->completionColumn()), - QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); - } } void LineEditCompleter::insertCompletion(const QString &completion)