Compare commits

..

No commits in common. "efc7e7a07940b747c9e9d948ede7ef491fe815a2" and "1e1f79db0dc157c7498222ca45c7384084f95b14" have entirely different histories.

5 changed files with 29 additions and 138 deletions

View file

@ -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

View file

@ -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

View file

@ -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);
}
}

View file

@ -3,19 +3,12 @@
#include "../../../client/settings/cache_settings.h"
#include "card_completer_styler.h"
#include <QAbstractItemView>
#include <QCompleter>
#include <QLineEdit>
#include <QModelIndex>
#include <QObject>
#include <QPainter>
#include <QPalette>
#include <QRegularExpression>
#include <QString>
#include <QStringListModel>
#include <QStyle>
#include <QStyleOptionViewItem>
#include <QStyledItemDelegate>
#include <libcockatrice/card/card_localization.h>
#include <libcockatrice/models/database/card/card_completer_proxy_model.h>
#include <libcockatrice/models/database/card/card_search_model.h>
@ -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;
}

View file

@ -1,11 +1,9 @@
#include "line_edit_completer.h"
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QChar>
#include <QCompleter>
#include <QFocusEvent>
#include <QItemSelectionModel>
#include <QKeyEvent>
#include <QModelIndex>
#include <QVariant>
@ -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)