Utils: Add async variant of DataFromProcess

... and make use of it in PathChooser.

Change-Id: I0e81afec2caf38f488a8ab98b55016535c187fc2
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Christian Kandeler
2024-02-19 15:46:46 +01:00
parent 15fc626a78
commit 4a722bfa9d
4 changed files with 108 additions and 52 deletions

View File

@@ -19,6 +19,7 @@
#include <QFileDialog>
#include <QFuture>
#include <QGuiApplication>
#include <QHelpEvent>
#include <QHBoxLayout>
#include <QMenu>
#include <QPushButton>
@@ -85,8 +86,6 @@ public:
QStringList arguments() const { return m_arguments; }
void setArguments(const QStringList &arguments) { m_arguments = arguments; }
static QString toolVersion(const CommandLine &cmd);
private:
// Extension point for concatenating existing tooltips.
virtual QString defaultToolTip() const { return QString(); }
@@ -108,35 +107,41 @@ bool BinaryVersionToolTipEventFilter::eventFilter(QObject *o, QEvent *e)
QTC_ASSERT(le, return false);
const QString binary = le->text();
if (!binary.isEmpty()) {
const QString version = BinaryVersionToolTipEventFilter::toolVersion(
CommandLine(FilePath::fromString(QDir::cleanPath(binary)), m_arguments));
if (!version.isEmpty()) {
// Concatenate tooltips.
QString tooltip = "<html><head/><body>";
const QString defaultValue = defaultToolTip();
if (!defaultValue.isEmpty()) {
tooltip += "<p>";
tooltip += defaultValue;
tooltip += "</p>";
}
tooltip += "<pre>";
tooltip += version;
tooltip += "</pre><body></html>";
le->setToolTip(tooltip);
}
}
return false;
}
DataFromProcess<QString>::Parameters params(CommandLine(FilePath::fromString(
QDir::cleanPath(binary)),
m_arguments),
[](const QString &output) { return output; });
params.callback = [binary, self = QPointer(this),
le = QPointer(le)](const std::optional<QString> &version) {
if (!self || !le)
return;
if (!version || version->isEmpty())
return;
if (binary != le->text())
return;
QString BinaryVersionToolTipEventFilter::toolVersion(const CommandLine &cmd)
{
DataFromProcess<QString>::Parameters params(cmd, [](const QString &output) { return output; });
using namespace std::chrono_literals;
params.timeout = 1s;
if (const auto version = DataFromProcess<QString>::getData(params))
return *version;
return {};
// Concatenate tooltips.
QString tooltip = "<html><head/><body>";
const QString defaultValue = self->defaultToolTip();
if (!defaultValue.isEmpty()) {
tooltip += "<p>";
tooltip += defaultValue;
tooltip += "</p>";
}
tooltip += "<pre>";
tooltip += *version;
tooltip += "</pre><body></html>";
le->setToolTip(tooltip);
if (QRect(le->mapToGlobal(QPoint(0, 0)), le->size()).contains(QCursor::pos())) {
QCoreApplication::postEvent(le,
new QHelpEvent(QEvent::ToolTip,
le->mapFromGlobal(QCursor::pos()),
QCursor::pos()));
}
};
DataFromProcess<QString>::provideData(params);
return false;
}
// Extends BinaryVersionToolTipEventFilter to prepend the existing pathchooser
@@ -722,11 +727,6 @@ FancyLineEdit *PathChooser::lineEdit() const
return d->m_lineEdit;
}
QString PathChooser::toolVersion(const CommandLine &cmd)
{
return BinaryVersionToolTipEventFilter::toolVersion(cmd);
}
void PathChooser::installLineEditVersionToolTip(QLineEdit *le, const QStringList &arguments)
{
auto ef = new BinaryVersionToolTipEventFilter(le);