384 lines
12 KiB
C++
384 lines
12 KiB
C++
#include <Client/AxScript/BridgeForm.h>
|
|
#include <Client/AxScript/AxElementWrappers.h>
|
|
#include <Client/AxScript/AxScriptEngine.h>
|
|
#include <Client/AxScript/AxScriptManager.h>
|
|
#include <Client/AxScript/AxUiFactory.h>
|
|
|
|
#include <QMessageBox>
|
|
#include <QMetaMethod>
|
|
#include <QJsonDocument>
|
|
#include <QThread>
|
|
#include <QApplication>
|
|
|
|
|
|
|
|
BridgeForm::BridgeForm(AxScriptEngine* scriptEngine, QObject* parent) : QObject(parent), scriptEngine(scriptEngine), uiFactory(nullptr), localParentWidget(nullptr)
|
|
{
|
|
if (scriptEngine && scriptEngine->manager()) {
|
|
uiFactory = scriptEngine->manager()->GetUiFactory();
|
|
}
|
|
if (!uiFactory) {
|
|
localParentWidget = new QWidget();
|
|
}
|
|
}
|
|
|
|
BridgeForm::~BridgeForm()
|
|
{
|
|
delete localParentWidget;
|
|
}
|
|
|
|
QWidget* BridgeForm::getParentWidget() const
|
|
{
|
|
if (uiFactory) {
|
|
return uiFactory->getParentWidget();
|
|
}
|
|
return localParentWidget;
|
|
}
|
|
|
|
void BridgeForm::connect(QObject* sender, const QString& signalName, const QJSValue& handler)
|
|
{
|
|
if (!sender || !handler.isCallable()) {
|
|
Q_EMIT scriptError("connect -> Invalid sender or handler");
|
|
return;
|
|
}
|
|
|
|
const QMetaObject* meta = sender->metaObject();
|
|
for (int i = 0; i < meta->methodCount(); ++i) {
|
|
QMetaMethod method = meta->method(i);
|
|
if (method.methodType() != QMetaMethod::Signal)
|
|
continue;
|
|
|
|
QString name = QString::fromLatin1(method.methodSignature());
|
|
if (!name.startsWith(signalName))
|
|
continue;
|
|
|
|
int paramCount = method.parameterCount();
|
|
auto* proxy = new SignalProxy(scriptEngine->engine(), handler, sender);
|
|
|
|
bool connected = false;
|
|
|
|
if (paramCount == 0) {
|
|
connected = QObject::connect(sender, method, proxy, proxy->metaObject()->method(proxy->metaObject()->indexOfSlot("call()")));
|
|
}
|
|
else if (paramCount == 1) {
|
|
QByteArray typeName = method.parameterTypes().value(0);
|
|
if (typeName == "QString")
|
|
connected = QObject::connect(sender, method, proxy, proxy->metaObject()->method(proxy->metaObject()->indexOfSlot("callWithArg(QString)")));
|
|
else if (typeName == "int")
|
|
connected = QObject::connect(sender, method, proxy, proxy->metaObject()->method(proxy->metaObject()->indexOfSlot("callWithArg(int)")));
|
|
else if (typeName == "bool")
|
|
connected = QObject::connect(sender, method, proxy, proxy->metaObject()->method(proxy->metaObject()->indexOfSlot("callWithArg(bool)")));
|
|
}
|
|
else if (paramCount == 2) {
|
|
QByteArray typeName1 = method.parameterTypes().value(0);
|
|
QByteArray typeName2 = method.parameterTypes().value(1);
|
|
if (typeName1 == "int" && typeName2 == "int")
|
|
connected = QObject::connect(sender, method, proxy, proxy->metaObject()->method(proxy->metaObject()->indexOfSlot("callWithArgs(int,int)")));
|
|
}
|
|
else {
|
|
Q_EMIT scriptError("connect -> Signal " + signalName + " has too many parameters (not supported)");
|
|
return;
|
|
}
|
|
|
|
if (!connected)
|
|
Q_EMIT scriptError("connect -> Failed to connect signal " + method.methodSignature());
|
|
|
|
return;
|
|
}
|
|
|
|
Q_EMIT scriptError("connect -> Signal " + signalName + " not found");
|
|
}
|
|
|
|
/// Elements
|
|
|
|
QObject* BridgeForm::create_vlayout()
|
|
{
|
|
auto* wrapper = new AxBoxLayoutWrapper(QBoxLayout::TopToBottom, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_hlayout()
|
|
{
|
|
auto* wrapper = new AxBoxLayoutWrapper(QBoxLayout::LeftToRight, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_gridlayout()
|
|
{
|
|
auto* wrapper = new AxGridLayoutWrapper(this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_vline()
|
|
{
|
|
auto* wrapper = new AxLineWrapper(QFrame::VLine, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_hline()
|
|
{
|
|
auto* wrapper = new AxLineWrapper(QFrame::HLine, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_vspacer()
|
|
{
|
|
auto* wrapper = new AxSpacerWrapper(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_hspacer()
|
|
{
|
|
auto* wrapper = new AxSpacerWrapper(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_label(const QString& text)
|
|
{
|
|
auto* label = new QLabel(text, getParentWidget());
|
|
auto* wrapper = new AxLabelWrapper(label, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_textline(const QString &text)
|
|
{
|
|
auto* edit = new QLineEdit(text, getParentWidget());
|
|
auto* wrapper = new AxTextLineWrapper(edit, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_combo()
|
|
{
|
|
auto* combo = new QComboBox(getParentWidget());
|
|
auto* wrapper = new AxComboBoxWrapper(combo, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_check(const QString& label)
|
|
{
|
|
auto* check = new QCheckBox(label, getParentWidget());
|
|
auto* wrapper = new AxCheckBoxWrapper(check, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_spin()
|
|
{
|
|
auto* spin = new QSpinBox(getParentWidget());
|
|
auto* wrapper = new AxSpinBoxWrapper(spin, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_dateline(const QString& format)
|
|
{
|
|
auto* date_widget = new QDateEdit(getParentWidget());
|
|
auto* wrapper = new AxDateEditWrapper(date_widget, format, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_timeline(const QString& format)
|
|
{
|
|
auto* time_widget = new QTimeEdit(getParentWidget());
|
|
auto* wrapper = new AxTimeEditWrapper(time_widget, format, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_button(const QString& text)
|
|
{
|
|
auto* btn = new QPushButton(text, getParentWidget());
|
|
auto* wrapper = new AxButtonWrapper(btn, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_textmulti(const QString& text)
|
|
{
|
|
auto* textEdit = new QPlainTextEdit(text, getParentWidget());
|
|
auto* wrapper = new AxTextMultiWrapper(textEdit, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_list()
|
|
{
|
|
auto* container = new QWidget(getParentWidget());
|
|
auto* list = new QListWidget();
|
|
auto* btnAdd = new QPushButton("+");
|
|
auto* btnRemove = new QPushButton("-");
|
|
|
|
auto* btnLayout = new QVBoxLayout();
|
|
btnLayout->setContentsMargins(0, 0, 0, 0);
|
|
btnLayout->setSpacing(2);
|
|
btnLayout->addWidget(btnAdd);
|
|
btnLayout->addWidget(btnRemove);
|
|
btnLayout->addStretch();
|
|
|
|
auto* mainLayout = new QHBoxLayout(container);
|
|
mainLayout->setContentsMargins(0, 0, 0, 0);
|
|
mainLayout->setSpacing(4);
|
|
mainLayout->addWidget(list);
|
|
mainLayout->addLayout(btnLayout);
|
|
|
|
auto* wrapper = new AxListWidgetWrapper(container, list, btnAdd, btnRemove, scriptEngine->engine(), this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_table(const QJSValue &headers)
|
|
{
|
|
auto* table = new QTableView(getParentWidget());
|
|
auto* wrapper = new AxTableWidgetWrapper(headers, table, scriptEngine->engine(), this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_file()
|
|
{
|
|
auto* lineEdit = new QLineEdit(getParentWidget());
|
|
auto* wrapper = new AxSelectorFile(lineEdit, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_tabs()
|
|
{
|
|
auto* tabWidget = new QTabWidget(getParentWidget());
|
|
auto* wrapper = new AxTabWrapper(tabWidget, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_groupbox(const QString &title, const bool checkable)
|
|
{
|
|
auto* box = new QGroupBox(title, getParentWidget());
|
|
auto* wrapper = new AxGroupBoxWrapper(checkable, box, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_hsplitter()
|
|
{
|
|
auto* splitter = new QSplitter(Qt::Horizontal, getParentWidget());
|
|
auto* wrapper = new AxSplitterWrapper(splitter, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_vsplitter()
|
|
{
|
|
auto* splitter = new QSplitter(Qt::Vertical, getParentWidget());
|
|
auto* wrapper = new AxSplitterWrapper(splitter, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_scrollarea()
|
|
{
|
|
auto* area = new QScrollArea(getParentWidget());
|
|
auto* wrapper = new AxScrollAreaWrapper(area, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_panel()
|
|
{
|
|
auto* panel = new QWidget(getParentWidget());
|
|
panel->setProperty("Main", "base");
|
|
auto* wrapper = new AxPanelWrapper(panel, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_stack()
|
|
{
|
|
auto* stack = new QStackedWidget(getParentWidget());
|
|
auto* wrapper = new AxStackedWidgetWrapper(stack, this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_container()
|
|
{
|
|
auto* wrapper = new AxContainerWrapper(scriptEngine->engine(), this);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_dialog(const QString& title) const
|
|
{
|
|
auto* wrapper = new AxDialogWrapper(title, getParentWidget());
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_credentials(const QJSValue &headers) const
|
|
{
|
|
auto* parentW = getParentWidget();
|
|
auto* wrapper = new AxSelectorCreds(headers, scriptEngine, parentW);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_agents(const QJSValue &headers) const
|
|
{
|
|
auto* parentW = getParentWidget();
|
|
auto* wrapper = new AxSelectorAgents(headers, scriptEngine, parentW);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_listeners(const QJSValue &headers) const
|
|
{
|
|
auto* parentW = getParentWidget();
|
|
auto* wrapper = new AxSelectorListeners(headers, scriptEngine, parentW);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_targets(const QJSValue &headers) const
|
|
{
|
|
auto* parentW = getParentWidget();
|
|
auto* wrapper = new AxSelectorTargets(headers, scriptEngine, parentW);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_selector_downloads(const QJSValue &headers) const
|
|
{
|
|
auto* parentW = getParentWidget();
|
|
auto* wrapper = new AxSelectorDownloads(headers, scriptEngine, parentW);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_ext_dock(const QString &id, const QString &title, const QString &location)
|
|
{
|
|
AdaptixWidget* adaptixWidget = scriptEngine->manager()->GetAdaptix();
|
|
|
|
auto* wrapper = new AxDockWrapper(adaptixWidget, id, title, location);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|
|
|
|
QObject* BridgeForm::create_ext_dialog(const QString &title)
|
|
{
|
|
AdaptixWidget* adaptixWidget = scriptEngine->manager()->GetAdaptix();
|
|
|
|
auto* wrapper = new AxExtDialogWrapper(adaptixWidget, title);
|
|
scriptEngine->registerObject(wrapper);
|
|
return wrapper;
|
|
}
|