Make findWidget more powerful

This commit is contained in:
Dominik Schmidt 2019-06-05 21:04:16 +02:00 committed by Kevin Ottens
parent 67656fb136
commit d1f9b1a4f8
No known key found for this signature in database
GPG key ID: 074BBBCB8DECC9E2

View file

@ -79,15 +79,65 @@
namespace {
#if GUI_TESTING
QWidget *findWidget(const QString &objectName)
QList<QObject*> allObjects(const QList<QWidget*> &widgets) {
QList<QObject*> objects;
std::copy(widgets.constBegin(), widgets.constEnd(), std::back_inserter(objects));
objects << qApp;
return objects;
}
QObject *findWidget(const QString &queryString, const QList<QWidget*> &widgets = QApplication::allWidgets())
{
auto widgets = QApplication::allWidgets();
auto objects = allObjects(widgets);
auto foundWidget = std::find_if(widgets.constBegin(), widgets.constEnd(), [&](QWidget *widget) {
return widget->objectName() == objectName;
});
QList<QObject*>::const_iterator foundWidget;
if (foundWidget == widgets.constEnd()) {
if (queryString.contains('>')) {
DEBUG << "queryString contains >";
auto subQueries = queryString.split('>', QString::SkipEmptyParts);
Q_ASSERT(subQueries.count() == 2);
auto parentQueryString = subQueries[0].trimmed();
DEBUG << "Find parent: " << parentQueryString;
auto parent = findWidget(parentQueryString);
if(!parent) {
return nullptr;
}
auto childQueryString = subQueries[1].trimmed();
auto child = findWidget(childQueryString, parent->findChildren<QWidget*>());
DEBUG << "found child: " << !!child;
return child;
} else if(queryString.startsWith('#')) {
auto objectName = queryString.mid(1);
DEBUG << "find objectName: " << objectName;
foundWidget = std::find_if(objects.constBegin(), objects.constEnd(), [&](QObject *widget) {
return widget->objectName() == objectName;
});
} else {
QList<QObject*> matches;
std::copy_if(objects.constBegin(), objects.constEnd(), std::back_inserter(matches), [&](QObject* widget) {
return widget->inherits(queryString.toLatin1());
});
std::for_each(matches.constBegin(), matches.constEnd(), [](QObject* w) {
if(!w) return;
DEBUG << "WIDGET: " << w->objectName() << w->metaObject()->className();
});
if(matches.empty()) {
return nullptr;
}
return matches[0];
}
if (foundWidget == objects.constEnd()) {
return nullptr;
}
@ -1135,7 +1185,7 @@ DirectEditor* SocketApi::getDirectEditorForLocalFile(const QString &localFile)
void SocketApi::command_ASYNC_LIST_WIDGETS(const QSharedPointer<SocketApiJob> &job)
{
QString response;
for (auto &widget : QApplication::allWidgets()) {
for (auto &widget : allObjects(QApplication::allWidgets())) {
auto objectName = widget->objectName();
if (!objectName.isEmpty()) {
response += objectName + ":" + widget->property("text").toString() + ", ";
@ -1162,16 +1212,39 @@ void SocketApi::command_ASYNC_GET_WIDGET_PROPERTY(const QSharedPointer<SocketApi
{
auto widget = findWidget(job->arguments()[QLatin1String("objectName")].toString());
if (!widget) {
job->reject(QLatin1String("widget not found"));
QString message("Widget not found: 2: ");
message.append(job->arguments()["objectName"].toString());
job->reject(message);
return;
}
auto propertyName = job->arguments()[QLatin1String("property")].toString();
job->resolve(widget->property(propertyName.toUtf8().constData())
.toString()
.toUtf8()
.constData());
auto segments = propertyName.split('.');
QObject* currentObject = widget;
QString value;
for(int i = 0;i<segments.count(); i++) {
auto segment = segments.at(i);
auto var = currentObject->property(segment.toUtf8().constData());
if(var.canConvert<QString>()) {
var.convert(QMetaType::QString);
value = var.value<QString>();
DEBUG << "VALUE: " << value;
break;
}
auto tmpObject = var.value<QObject*>();
if(tmpObject) {
currentObject = tmpObject;
} else {
DEBUG << "TODO: object not found, what should happen here now?";
}
}
job->resolve(value.toUtf8().constData());
}
void SocketApi::command_ASYNC_SET_WIDGET_PROPERTY(const QSharedPointer<SocketApiJob> &job)