mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2025-12-21 23:00:24 -08:00
* Have CardDatabase::getPreferredPrintingInfo respect card provider ID overrides (pinned printings)
Took 13 minutes
Took 37 seconds
Took 10 seconds
Took 10 seconds
# Commit time for manual adjustment:
# Took 30 seconds
Took 15 seconds
Took 8 minutes
Took 21 seconds
* Move settings cache and settings card preference provider out of libcockatrice_settings and into cockatrice
Took 52 minutes
Took 9 minutes
Took 1 minute
* Temp cache.
Took 16 minutes
* Dependency Injection for SettingsCache
* Turn SettingsCache into a QSharedPointer.
* Implement interfaces for settings that need it
Took 2 hours 38 minutes
* Adjust oracle.
Took 5 minutes
* Move abstract/noop interfaces to libcockatrice_interfaces so they can be linked against independently.
Took 52 minutes
* Clean up some links.
Took 3 minutes
* Cleanup two includes.
Took 3 minutes
* More fixes.
Took 7 minutes
* More includes that slipped past.
Took 3 minutes
* Stop mocking and start injecting for tests.
Took 15 minutes
* I don't know why remote_client was including main.
Took 4 minutes
* Include.
Took 3 minutes
* Lint.
Took 2 minutes
* Don't use Qt pointers.
Took 1 hour 7 minutes
* Make parser use CardSettingsInterface
Took 13 minutes
* Also adjust constructor lol.
Took 8 minutes
* Lint.
Took 32 minutes
* Revert "Lint."
This reverts commit ecb596c39e.
Took 3 minutes
* Test.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
168 lines
5.9 KiB
C++
168 lines
5.9 KiB
C++
#include "shortcut_treeview.h"
|
|
|
|
#include "cache_settings.h"
|
|
#include "shortcuts_settings.h"
|
|
|
|
#include <QHeaderView>
|
|
|
|
ShortcutFilterProxyModel::ShortcutFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Appends the parent and source row together before doing the regex match.
|
|
*/
|
|
bool ShortcutFilterProxyModel::filterAcceptsRow(const int sourceRow, const QModelIndex &sourceParent) const
|
|
{
|
|
QModelIndex nameIndex = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent);
|
|
QModelIndex parentIndex = sourceModel()->index(sourceParent.row(), filterKeyColumn(), sourceParent.parent());
|
|
|
|
QString name = sourceModel()->data(nameIndex).toString();
|
|
QString parentName = sourceModel()->data(parentIndex).toString();
|
|
|
|
QString searchedString = parentName + " " + name;
|
|
|
|
return searchedString.contains(filterRegularExpression());
|
|
}
|
|
|
|
ShortcutTreeView::ShortcutTreeView(QWidget *parent) : QTreeView(parent)
|
|
{
|
|
// model
|
|
shortcutsModel = new QStandardItemModel(this);
|
|
shortcutsModel->setColumnCount(3);
|
|
populateShortcutsModel();
|
|
|
|
// filter proxy
|
|
proxyModel = new ShortcutFilterProxyModel(this);
|
|
proxyModel->setRecursiveFilteringEnabled(true);
|
|
proxyModel->setSourceModel(shortcutsModel);
|
|
proxyModel->setDynamicSortFilter(true);
|
|
proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
|
|
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
|
|
proxyModel->setFilterKeyColumn(0);
|
|
|
|
QTreeView::setModel(proxyModel);
|
|
|
|
// treeview
|
|
hideColumn(2);
|
|
|
|
setUniformRowHeights(true);
|
|
setAlternatingRowColors(true);
|
|
|
|
setSortingEnabled(true);
|
|
proxyModel->sort(0, Qt::AscendingOrder);
|
|
|
|
header()->setSectionResizeMode(QHeaderView::Interactive);
|
|
header()->setSortIndicator(0, Qt::AscendingOrder);
|
|
setSelectionMode(SingleSelection);
|
|
setSelectionBehavior(SelectRows);
|
|
|
|
expandAll();
|
|
|
|
connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this,
|
|
&ShortcutTreeView::refreshShortcuts);
|
|
}
|
|
|
|
void ShortcutTreeView::populateShortcutsModel()
|
|
{
|
|
QHash<QString, QStandardItem *> parentItems;
|
|
QStandardItem *curParent = nullptr;
|
|
for (const auto &key : SettingsCache::instance().shortcuts().getAllShortcutKeys()) {
|
|
QString name = SettingsCache::instance().shortcuts().getShortcut(key).getName();
|
|
QString group = SettingsCache::instance().shortcuts().getShortcut(key).getGroupName();
|
|
QString shortcut = SettingsCache::instance().shortcuts().getShortcutString(key);
|
|
|
|
if (parentItems.contains(group)) {
|
|
curParent = parentItems.value(group);
|
|
} else {
|
|
curParent = new QStandardItem(group);
|
|
static QFont font = curParent->font();
|
|
font.setBold(true);
|
|
curParent->setFont(font);
|
|
parentItems.insert(group, curParent);
|
|
}
|
|
|
|
QList<QStandardItem *> list = {};
|
|
list << new QStandardItem(name) << new QStandardItem(shortcut) << new QStandardItem(key);
|
|
curParent->appendRow(list);
|
|
}
|
|
|
|
for (const auto &parent : parentItems) {
|
|
shortcutsModel->appendRow(parent);
|
|
}
|
|
}
|
|
|
|
void ShortcutTreeView::retranslateUi()
|
|
{
|
|
shortcutsModel->setHeaderData(0, Qt::Horizontal, tr("Action"));
|
|
shortcutsModel->setHeaderData(1, Qt::Horizontal, tr("Shortcut"));
|
|
refreshShortcuts();
|
|
}
|
|
|
|
/**
|
|
* Loops over the model and reloads all rows
|
|
*/
|
|
static void loopOverModel(QAbstractItemModel *model, const QModelIndex &parent = QModelIndex())
|
|
{
|
|
for (int r = 0; r < model->rowCount(parent); ++r) {
|
|
const auto friendlyNameIndex = model->index(r, 0, parent);
|
|
|
|
if (model->hasChildren(friendlyNameIndex)) {
|
|
const auto childIndex = model->index(0, 2, friendlyNameIndex);
|
|
const auto key = model->data(childIndex).toString();
|
|
const auto shortcutGroupName = SettingsCache::instance().shortcuts().getShortcut(key).getGroupName();
|
|
model->setData(friendlyNameIndex, shortcutGroupName);
|
|
|
|
loopOverModel(model, friendlyNameIndex);
|
|
} else {
|
|
const auto shortcutSequenceIndex = model->index(r, 1, parent);
|
|
const auto keyIndex = model->index(r, 2, parent);
|
|
const auto key = model->data(keyIndex).toString();
|
|
|
|
const auto shortcutKey = SettingsCache::instance().shortcuts().getShortcut(key).getName();
|
|
const auto shortcutSequence = SettingsCache::instance().shortcuts().getShortcutString(key);
|
|
model->setData(friendlyNameIndex, shortcutKey);
|
|
model->setData(shortcutSequenceIndex, shortcutSequence);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ShortcutTreeView::refreshShortcuts()
|
|
{
|
|
loopOverModel(shortcutsModel);
|
|
}
|
|
|
|
void ShortcutTreeView::currentChanged(const QModelIndex ¤t, const QModelIndex & /* previous */)
|
|
{
|
|
QTreeView::scrollTo(current, QAbstractItemView::EnsureVisible);
|
|
if (current.parent().isValid()) {
|
|
auto shortcutName = model()->data(model()->index(current.row(), 2, current.parent())).toString();
|
|
emit currentItemChanged(shortcutName);
|
|
} else {
|
|
// emit empty string if the selection is a category header
|
|
emit currentItemChanged("");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The search string is split by word.
|
|
* A String is a match as long as it contains all the words in the search string in order
|
|
*/
|
|
void ShortcutTreeView::updateSearchString(const QString &searchString)
|
|
{
|
|
#if QT_VERSION > QT_VERSION_CHECK(5, 14, 0)
|
|
const auto skipEmptyParts = Qt::SkipEmptyParts;
|
|
#else
|
|
const auto skipEmptyParts = QString::SkipEmptyParts;
|
|
#endif
|
|
QStringList searchWords = searchString.split(" ", skipEmptyParts);
|
|
|
|
auto escapeRegex = [](const QString &s) { return QRegularExpression::escape(s); };
|
|
std::transform(searchWords.begin(), searchWords.end(), searchWords.begin(), escapeRegex);
|
|
|
|
auto regex = QRegularExpression(searchWords.join(".*"), QRegularExpression::CaseInsensitiveOption);
|
|
|
|
proxyModel->setFilterRegularExpression(regex);
|
|
expandAll();
|
|
}
|