1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
#include "uiloader.h"
#include "common/unused.h"
#include "uiloaderpropertyhandler.h"
#include "uiscriptingcombo.h"
#include "uiscriptingedit.h"
#include "uicustomicon.h"
#include "uiurlbutton.h"
#include "sqlview.h"
#include "common/configradiobutton.h"
#include "common/configcombobox.h"
#include "common/fileedit.h"
#include "common/colorbutton.h"
#include <QComboBox>
#include <QDebug>
#include <QMetaProperty>
#include <QXmlSimpleReader>
#define REGISTER_WIDGET(Class) \
registerWidgetClass(#Class, [](QWidget* parent, const QString& name) -> QWidget*\
{\
Class* w = new Class(parent);\
w->setObjectName(name);\
return w;\
})
UiLoader::UiLoader(QObject *parent) :
QUiLoader(parent)
{
registerPropertyHandler(new UiScriptingCombo());
registerPropertyHandler(new UiScriptingEdit());
registerPropertyHandler(new UiCustomIcon());
registerPropertyHandler(new UiUrlButton());
REGISTER_WIDGET(ConfigRadioButton);
REGISTER_WIDGET(ConfigComboBox);
REGISTER_WIDGET(FileEdit);
REGISTER_WIDGET(ColorButton);
REGISTER_WIDGET(SqlView);
}
QWidget* UiLoader::createWidget(const QString& className, QWidget* parent, const QString& name)
{
QWidget* w = nullptr;
if (registeredClasses.contains(className))
w = registeredClasses[className](parent, name);
else
w = QUiLoader::createWidget(className, parent, name);
return w;
}
void UiLoader::registerWidgetClass(const QString& className, FactoryFunction factoryFunction)
{
registeredClasses[className] = factoryFunction;
}
void UiLoader::handlePropertiesRecursively(QWidget* widget)
{
if (widget->dynamicPropertyNames().size() > 0)
handleProperties(widget);
for (QWidget* w : widget->findChildren<QWidget*>())
handleProperties(w);
}
void UiLoader::handleProperties(QWidget* widget)
{
QVariant propValue;
for (UiLoaderPropertyHandler* handler : propertyHandlers)
{
propValue = widget->property(handler->getPropertyName());
if (propValue.isValid())
handler->handle(widget, propValue);
}
}
QWidget* UiLoader::load(const QString& path)
{
QFile file(path);
if (!file.open(QIODevice::ReadOnly))
{
qCritical() << "FormManager was unable to open ui file:" << path;
return nullptr;
}
QWidget* w = QUiLoader::load(&file, nullptr);
handlePropertiesRecursively(w);
return w;
}
void UiLoader::registerPropertyHandler(UiLoaderPropertyHandler* handler)
{
propertyHandlers << handler;
}
|