Skip to content

EN Reference Editor

Cavanshirpro edited this page Sep 19, 2026 · 1 revision

Editor preferences, templates and plugin API

English · Türkçe · Languages / Diller

Scope: JSON API Forge 0.5.1 · Source review: 17 September 2026 · Language: English

Menus and workflows are described in the workspace guide; network/session setup is in the remote guide. The following preference fields come directly from source. Durations ending in Ms use milliseconds.

Local preferences and defaults

int requestTimeoutMs = 60'000;
    int authenticationTimeoutMs = 120'000;
    int uploadTimeoutMs = 300'000;
    int downloadTimeoutMs = 300'000;
    int safeGetRetries = 1;
    int retryBaseDelayMs = 750;
    int maxResponseMiB = 8;
    bool confirmDiscard = true;
    bool restoreWindowLayout = true;
    bool rightDragPan = true;
    double graphZoomSensitivity = 1.0;
    QStringList serverHistory;

Preference bounds

The source applies these bounds when loading/saving preferences:

requestTimeoutMs = qBound(MinimumTimeoutMs, requestTimeoutMs, MaximumTimeoutMs);
    authenticationTimeoutMs = qBound(MinimumTimeoutMs, authenticationTimeoutMs, MaximumTimeoutMs);
    uploadTimeoutMs = qBound(MinimumTimeoutMs, uploadTimeoutMs, MaximumTimeoutMs);
    downloadTimeoutMs = qBound(MinimumTimeoutMs, downloadTimeoutMs, MaximumTimeoutMs);
    safeGetRetries = qBound(0, safeGetRetries, 3);
    retryBaseDelayMs = qBound(100, retryBaseDelayMs, 10'000);
    maxResponseMiB = qBound(1, maxResponseMiB, 64);
    graphZoomSensitivity = std::isfinite(graphZoomSensitivity) ? qBound(0.25, graphZoomSensitivity, 3.0) : 1.0;
    QStringList sanitizedHistory;
    for (const auto &entry : std::as_const(serverHistory)) {
        const QUrl url(entry);
        if (entry.size() > 2048 || !url.isValid() || url.host().isEmpty()
            || !url.userInfo().isEmpty() || url.hasQuery() || url.hasFragment()
            || (url.scheme() != QStringLiteral("https") && url.scheme() != QStringLiteral("http"))) {
            continue;
        }
        const auto normalized = url.toString();
        if (!sanitizedHistory.contains(normalized)) {
            sanitizedHistory.append(normalized);
        }
        if (sanitizedHistory.size() == 10) {
            break;
        }
    }
    serverHistory = sanitizedHistory;

Built-in project templates

Templates generate starting configurations, not every business-domain rule. Review database/environment/permission choices before running generated projects.

ID Name Category Resource path RPC name
secure-crud Secure Operations Hub Foundation operations/records operations.summary
saas-control-plane SaaS Control Plane Platform tenants/subscriptions tenants.subscription-summary
event-orders Event-Driven Commerce Commerce commerce/orders commerce.order-summary
analytics-read-model Analytics Read Model Data analytics/snapshots analytics.status-rollup
plugin-registry Forge Plugin Registry Editor editor/plugins editor.plugin-summary
python-enterprise-gateway Python Enterprise Gateway Integration integrations/jobs integrations.job-summary
media-operations Media Operations Content media/jobs media.processing-summary
ledger-workflow Audited Ledger Workflow Finance ledger/batches ledger.batch-summary

Native plugin interface

The compiler interface for Plugin API 2 follows. See the plugin guide for loading, manifests and ZIP trust boundaries.

#pragma once

#include <QAction>
#include <QDockWidget>
#include <QJsonObject>
#include <QObject>
#include <QString>

namespace ForgeEditor {

inline constexpr int PluginApiVersion = 2;

class EditorHost {
public:
    virtual ~EditorHost() = default;
    virtual void addPaletteComponent(const QString &label, const QString &collection, const QJsonObject &documentTemplate) = 0;
    virtual void addGraphNodeType(const QString &label, const QString &type, const QJsonObject &defaultProperties) = 0;
    virtual void addToolAction(QAction *action) = 0;
    virtual void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dock) = 0;
    virtual void showStatusMessage(const QString &message, int timeoutMs = 4000) = 0;
};

class IEditorPlugin {
public:
    virtual ~IEditorPlugin() = default;
    [[nodiscard]] virtual QString pluginId() const = 0;
    [[nodiscard]] virtual QString displayName() const = 0;
    [[nodiscard]] virtual int apiVersion() const = 0;
    virtual bool initialize(EditorHost *host, QString *errorMessage) = 0;
    virtual void shutdown() = 0;
};

} // namespace ForgeEditor

#define ForgeEditorPluginInterface_iid "dev.jsonapiforge.EditorPlugin/2.0"
Q_DECLARE_INTERFACE(ForgeEditor::IEditorPlugin, ForgeEditorPluginInterface_iid)

Sources and verification

This page describes the behavior at the pinned commits below. Recheck these contracts when upgrading.


English home · All English pages · Version maintenance

Clone this wiki locally