forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user