forked from qt-creator/qt-creator
File system index locator: Make sorting results optional
Some tools have sorting options of their own, and this gives users the chance to keep that order. Fixes: QTCREATORBUG-27789 Change-Id: I1577de9ee36b5c51e1e588f371f6bbc78a3ec22a Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
#include <utils/stringutils.h>
|
#include <utils/stringutils.h>
|
||||||
#include <utils/variablechooser.h>
|
#include <utils/variablechooser.h>
|
||||||
|
|
||||||
|
#include <QCheckBox>
|
||||||
#include <QFormLayout>
|
#include <QFormLayout>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
@@ -59,9 +60,12 @@ static QString defaultArguments(Qt::CaseSensitivity sens = Qt::CaseInsensitive)
|
|||||||
.arg(sens == Qt::CaseInsensitive ? QString() : "-i ");
|
.arg(sens == Qt::CaseInsensitive ? QString() : "-i ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bool kSortResultsDefault = true;
|
||||||
|
|
||||||
const char kCommandKey[] = "command";
|
const char kCommandKey[] = "command";
|
||||||
const char kArgumentsKey[] = "arguments";
|
const char kArgumentsKey[] = "arguments";
|
||||||
const char kCaseSensitiveKey[] = "caseSensitive";
|
const char kCaseSensitiveKey[] = "caseSensitive";
|
||||||
|
const char kSortResultsKey[] = "sortResults";
|
||||||
|
|
||||||
static QString escaped(const QString &query)
|
static QString escaped(const QString &query)
|
||||||
{
|
{
|
||||||
@@ -112,8 +116,10 @@ SpotlightLocatorFilter::SpotlightLocatorFilter()
|
|||||||
m_caseSensitiveArguments = defaultArguments(Qt::CaseSensitive);
|
m_caseSensitiveArguments = defaultArguments(Qt::CaseSensitive);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void matches(QPromise<void> &promise, const LocatorStorage &storage,
|
static void matches(QPromise<void> &promise,
|
||||||
const CommandLine &command)
|
const LocatorStorage &storage,
|
||||||
|
const CommandLine &command,
|
||||||
|
bool sortResults)
|
||||||
{
|
{
|
||||||
// If search string contains spaces, treat them as wildcard '*' and search in full path
|
// If search string contains spaces, treat them as wildcard '*' and search in full path
|
||||||
const QString wildcardInput = QDir::fromNativeSeparators(storage.input()).replace(' ', '*');
|
const QString wildcardInput = QDir::fromNativeSeparators(storage.input()).replace(' ', '*');
|
||||||
@@ -156,12 +162,14 @@ static void matches(QPromise<void> &promise, const LocatorStorage &storage,
|
|||||||
process.start();
|
process.start();
|
||||||
loop.exec();
|
loop.exec();
|
||||||
|
|
||||||
|
if (sortResults) {
|
||||||
for (auto &entry : entries) {
|
for (auto &entry : entries) {
|
||||||
if (promise.isCanceled())
|
if (promise.isCanceled())
|
||||||
return;
|
return;
|
||||||
if (entry.size() < 1000)
|
if (entry.size() < 1000)
|
||||||
Utils::sort(entry, LocatorFilterEntry::compareLexigraphically);
|
Utils::sort(entry, LocatorFilterEntry::compareLexigraphically);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (promise.isCanceled())
|
if (promise.isCanceled())
|
||||||
return;
|
return;
|
||||||
storage.reportOutput(std::accumulate(std::begin(entries), std::end(entries),
|
storage.reportOutput(std::accumulate(std::begin(entries), std::end(entries),
|
||||||
@@ -174,8 +182,11 @@ LocatorMatcherTasks SpotlightLocatorFilter::matchers()
|
|||||||
|
|
||||||
TreeStorage<LocatorStorage> storage;
|
TreeStorage<LocatorStorage> storage;
|
||||||
|
|
||||||
const auto onSetup = [storage, command = m_command, insensArgs = m_arguments,
|
const auto onSetup = [storage,
|
||||||
sensArgs = m_caseSensitiveArguments](Async<void> &async) {
|
command = m_command,
|
||||||
|
insensArgs = m_arguments,
|
||||||
|
sensArgs = m_caseSensitiveArguments,
|
||||||
|
sortResults = m_sortResults](Async<void> &async) {
|
||||||
const Link link = Link::fromString(storage->input(), true);
|
const Link link = Link::fromString(storage->input(), true);
|
||||||
const FilePath input = link.targetFilePath;
|
const FilePath input = link.targetFilePath;
|
||||||
if (input.isEmpty())
|
if (input.isEmpty())
|
||||||
@@ -188,7 +199,7 @@ LocatorMatcherTasks SpotlightLocatorFilter::matchers()
|
|||||||
const CommandLine cmd(FilePath::fromString(command), expander->expand(args),
|
const CommandLine cmd(FilePath::fromString(command), expander->expand(args),
|
||||||
CommandLine::Raw);
|
CommandLine::Raw);
|
||||||
async.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
|
async.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
|
||||||
async.setConcurrentCallData(matches, *storage, cmd);
|
async.setConcurrentCallData(matches, *storage, cmd, sortResults);
|
||||||
return SetupResult::Continue;
|
return SetupResult::Continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -210,9 +221,12 @@ bool SpotlightLocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefres
|
|||||||
argumentsEdit->setText(m_arguments);
|
argumentsEdit->setText(m_arguments);
|
||||||
FancyLineEdit *caseSensitiveArgumentsEdit = new FancyLineEdit;
|
FancyLineEdit *caseSensitiveArgumentsEdit = new FancyLineEdit;
|
||||||
caseSensitiveArgumentsEdit->setText(m_caseSensitiveArguments);
|
caseSensitiveArgumentsEdit->setText(m_caseSensitiveArguments);
|
||||||
|
auto sortResults = new QCheckBox(Tr::tr("Sort results"));
|
||||||
|
sortResults->setChecked(m_sortResults);
|
||||||
layout->addRow(Tr::tr("Executable:"), commandEdit);
|
layout->addRow(Tr::tr("Executable:"), commandEdit);
|
||||||
layout->addRow(Tr::tr("Arguments:"), argumentsEdit);
|
layout->addRow(Tr::tr("Arguments:"), argumentsEdit);
|
||||||
layout->addRow(Tr::tr("Case sensitive:"), caseSensitiveArgumentsEdit);
|
layout->addRow(Tr::tr("Case sensitive:"), caseSensitiveArgumentsEdit);
|
||||||
|
layout->addRow({}, sortResults);
|
||||||
std::unique_ptr<MacroExpander> expander(createMacroExpander(""));
|
std::unique_ptr<MacroExpander> expander(createMacroExpander(""));
|
||||||
auto chooser = new VariableChooser(&configWidget);
|
auto chooser = new VariableChooser(&configWidget);
|
||||||
chooser->addMacroExpanderProvider([expander = expander.get()] { return expander; });
|
chooser->addMacroExpanderProvider([expander = expander.get()] { return expander; });
|
||||||
@@ -223,6 +237,7 @@ bool SpotlightLocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefres
|
|||||||
m_command = commandEdit->rawFilePath().toString();
|
m_command = commandEdit->rawFilePath().toString();
|
||||||
m_arguments = argumentsEdit->text();
|
m_arguments = argumentsEdit->text();
|
||||||
m_caseSensitiveArguments = caseSensitiveArgumentsEdit->text();
|
m_caseSensitiveArguments = caseSensitiveArgumentsEdit->text();
|
||||||
|
m_sortResults = sortResults->isChecked();
|
||||||
}
|
}
|
||||||
return accepted;
|
return accepted;
|
||||||
}
|
}
|
||||||
@@ -235,6 +250,8 @@ void SpotlightLocatorFilter::saveState(QJsonObject &obj) const
|
|||||||
obj.insert(kArgumentsKey, m_arguments);
|
obj.insert(kArgumentsKey, m_arguments);
|
||||||
if (m_caseSensitiveArguments != defaultArguments(Qt::CaseSensitive))
|
if (m_caseSensitiveArguments != defaultArguments(Qt::CaseSensitive))
|
||||||
obj.insert(kCaseSensitiveKey, m_caseSensitiveArguments);
|
obj.insert(kCaseSensitiveKey, m_caseSensitiveArguments);
|
||||||
|
if (m_sortResults != kSortResultsDefault)
|
||||||
|
obj.insert(kSortResultsKey, m_sortResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpotlightLocatorFilter::restoreState(const QJsonObject &obj)
|
void SpotlightLocatorFilter::restoreState(const QJsonObject &obj)
|
||||||
@@ -242,6 +259,7 @@ void SpotlightLocatorFilter::restoreState(const QJsonObject &obj)
|
|||||||
m_command = obj.value(kCommandKey).toString(defaultCommand());
|
m_command = obj.value(kCommandKey).toString(defaultCommand());
|
||||||
m_arguments = obj.value(kArgumentsKey).toString(defaultArguments());
|
m_arguments = obj.value(kArgumentsKey).toString(defaultArguments());
|
||||||
m_caseSensitiveArguments = obj.value(kCaseSensitiveKey).toString(defaultArguments(Qt::CaseSensitive));
|
m_caseSensitiveArguments = obj.value(kCaseSensitiveKey).toString(defaultArguments(Qt::CaseSensitive));
|
||||||
|
m_sortResults = obj.value(kSortResultsKey).toBool(kSortResultsDefault);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Core::Internal
|
} // namespace Core::Internal
|
||||||
|
@@ -24,6 +24,7 @@ private:
|
|||||||
QString m_command;
|
QString m_command;
|
||||||
QString m_arguments;
|
QString m_arguments;
|
||||||
QString m_caseSensitiveArguments;
|
QString m_caseSensitiveArguments;
|
||||||
|
bool m_sortResults = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Core::Internal
|
} // namespace Core::Internal
|
||||||
|
Reference in New Issue
Block a user