add deck search syntax help

This commit is contained in:
RickyRister 2025-05-15 23:05:38 -07:00
parent d3db83b73d
commit bc096e6be8
6 changed files with 66 additions and 4 deletions

View file

@ -379,5 +379,6 @@
<file>resources/tips/tips_of_the_day.xml</file> <file>resources/tips/tips_of_the_day.xml</file>
<file>resources/help/search.md</file> <file>resources/help/search.md</file>
<file>resources/help/deck_search.md</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -62,3 +62,4 @@
# deck_filter_string = false # deck_filter_string = false
# filter_string = false # filter_string = false
# syntax_help = false

View file

@ -0,0 +1,26 @@
## Deck Search Syntax Help
-----
The search bar recognizes a set of special commands.<br>
In this list of examples below, each entry has an explanation and can be clicked to test the query. Note that all
searches are case insensitive.
<dl>
<dt>Filename:</dt>
<dd>[red deck wins](#red deck wins) <small>(Any deck filename containing the words red, deck, and wins)</small></dd>
<dd>["red deck wins"](#%22red deck wins%22) <small>(Any deck filename containing the exact phrase "red deck wins")</small></dd>
<dt>Deck Contents (Uses [card search expressions](#cardSearchSyntaxHelp)):</dt>
<dd><a href="#[[plains]]">[[plains]]</a> <small>(Any deck that contains at least one card with "plains" in its name)</small></dd>
<dd><a href="#[[t:legendary]]">[[t:legendary]]</a> <small>(Any deck that contains at least one legendary)</small></dd>
<dd><a href="#[[t:legendary]]>5">[[t:legendary]]>5</a> <small>(Any card that contains at least 5 legendaries)</small></dd>
<dd><a href="#[[]]:100">[[]]:100</a> <small>(Any deck that contains exactly 100 cards)</small></dd>
<dt>Negate:</dt>
<dd>[soldier -aggro](#soldier -aggro) <small>(Any deck filename that contains "soldier", but not "aggro")</small></dd>
<dt>Branching:</dt>
<dd>[t:aggro OR o:control](#t:aggro OR o:control) <small>(Any deck filename that contains either aggro or control)</small></dd>
<dt>Grouping:</dt>
<dd><a href="#red -([[]]:100 or aggro)">red -([[]]:100 or aggro)</a> <small>(Any deck that has red in its filename but is not 100 cards or has aggro in its filename)</small></dd>
</dl>

View file

@ -1,7 +1,9 @@
#include "visual_deck_storage_search_widget.h" #include "visual_deck_storage_search_widget.h"
#include "../../../../game/filters/deck_filter_string.h" #include "../../../../game/filters/deck_filter_string.h"
#include "../../../../game/filters/syntax_help.h"
#include "../../../../settings/cache_settings.h" #include "../../../../settings/cache_settings.h"
#include "../../pixel_map_generator.h"
/** /**
* @brief Constructs a PrintingSelectorCardSearchWidget for searching cards by set name or set code. * @brief Constructs a PrintingSelectorCardSearchWidget for searching cards by set name or set code.
@ -18,7 +20,13 @@ VisualDeckStorageSearchWidget::VisualDeckStorageSearchWidget(VisualDeckStorageWi
setLayout(layout); setLayout(layout);
searchBar = new QLineEdit(this); searchBar = new QLineEdit(this);
searchBar->setPlaceholderText(tr("Search by filename")); searchBar->setPlaceholderText(tr("Search by filename (or search expression)"));
searchBar->setClearButtonEnabled(true);
searchBar->addAction(loadColorAdjustedPixmap("theme:icons/search"), QLineEdit::LeadingPosition);
auto help = searchBar->addAction(QPixmap("theme:icons/info"), QLineEdit::TrailingPosition);
connect(help, &QAction::triggered, this, [this] { createDeckSearchSyntaxHelpWindow(searchBar); });
layout->addWidget(searchBar); layout->addWidget(searchBar);
// Add a debounce timer for the search bar to limit frequent updates // Add a debounce timer for the search bar to limit frequent updates

View file

@ -9,11 +9,12 @@
* *
* @return the QTextBrowser * @return the QTextBrowser
*/ */
static QTextBrowser *createBrowser() static QTextBrowser *createBrowser(const QString &helpFile)
{ {
QFile file("theme:help/search.md"); QFile file(helpFile);
if (!file.open(QFile::ReadOnly | QFile::Text)) { if (!file.open(QFile::ReadOnly | QFile::Text)) {
qCWarning(SyntaxHelpLog) << "Could not open syntax help file: " << helpFile;
return nullptr; return nullptr;
} }
@ -54,9 +55,29 @@ static QTextBrowser *createBrowser()
*/ */
QTextBrowser *createSearchSyntaxHelpWindow(QLineEdit *lineEdit) QTextBrowser *createSearchSyntaxHelpWindow(QLineEdit *lineEdit)
{ {
auto browser = createBrowser(); auto browser = createBrowser("theme:help/search.md");
QObject::connect(browser, &QTextBrowser::anchorClicked, QObject::connect(browser, &QTextBrowser::anchorClicked,
[lineEdit](const QUrl &link) { lineEdit->setText(link.fragment()); }); [lineEdit](const QUrl &link) { lineEdit->setText(link.fragment()); });
QObject::connect(lineEdit, &QObject::destroyed, browser, &QTextBrowser::close); QObject::connect(lineEdit, &QObject::destroyed, browser, &QTextBrowser::close);
return browser; return browser;
}
/**
* Creates the deck search syntax help window and connects its anchorClicked signal to the given QLineEdit.
* The window will automatically close when the QLineEdit is destroyed.
*
* @return the QTextBrowser
*/
QTextBrowser *createDeckSearchSyntaxHelpWindow(QLineEdit *lineEdit)
{
auto browser = createBrowser("theme:help/deck_search.md");
QObject::connect(browser, &QTextBrowser::anchorClicked, [lineEdit](const QUrl &link) {
if (link.fragment() == "cardSearchSyntaxHelp") {
createSearchSyntaxHelpWindow(lineEdit);
} else {
lineEdit->setText(link.fragment());
}
});
QObject::connect(lineEdit, &QObject::destroyed, browser, &QTextBrowser::close);
return browser;
} }

View file

@ -2,8 +2,13 @@
#define SEARCH_SYNTAX_HELP_H #define SEARCH_SYNTAX_HELP_H
#include <QLineEdit> #include <QLineEdit>
#include <QLoggingCategory>
#include <QTextBrowser> #include <QTextBrowser>
inline Q_LOGGING_CATEGORY(SyntaxHelpLog, "syntax_help");
QTextBrowser *createSearchSyntaxHelpWindow(QLineEdit *lineEdit); QTextBrowser *createSearchSyntaxHelpWindow(QLineEdit *lineEdit);
QTextBrowser *createDeckSearchSyntaxHelpWindow(QLineEdit *lineEdit);
#endif // SEARCH_SYNTAX_HELP_H #endif // SEARCH_SYNTAX_HELP_H