#include #include #include #include #include #include #include #include #include #include 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; }