wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
HistoryHandler.cpp
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
5
6#include <QUndoStack>
7
8#include "App/Scene/Scene.h"
9
11 : BaseHandler(mainWindow, validator)
12{
13}
14
15QJsonObject HistoryHandler::handleCommand(const QString &command, const QJsonObject &params, const QJsonValue &requestId)
16{
17 if (command == "undo") {
18 return handleUndo(params, requestId);
19 } else if (command == "redo") {
20 return handleRedo(params, requestId);
21 } else if (command == "get_undo_stack") {
22 return handleGetUndoStack(params, requestId);
23 } else {
24 return createErrorResponse(QString("Unknown history command: %1").arg(command),
26 }
27}
28
29QJsonObject HistoryHandler::handleUndo(const QJsonObject &params, const QJsonValue &requestId)
30{
31 (void)params; // Parameter not used
32 Scene *scene = currentScene();
33 if (!scene) {
34 return createErrorResponse("No active circuit scene available", requestId, JsonRpcError::SceneNotAvailable);
35 }
36
37 QUndoStack *undoStack = scene->undoStack();
38 if (!undoStack) {
39 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError);
40 }
41
42 return tryCommand([&]() -> QJsonObject {
43 if (!undoStack->canUndo()) {
44 QJsonObject result;
45 result["success"] = false;
46 result["message"] = "Nothing to undo";
47 return createSuccessResponse(result, requestId);
48 }
49
50 undoStack->undo();
51
52 QJsonObject result;
53 result["success"] = true;
54 result["message"] = "Undo operation completed";
55 result["can_undo"] = undoStack->canUndo();
56 result["can_redo"] = undoStack->canRedo();
57 result["undo_text"] = undoStack->undoText();
58 result["redo_text"] = undoStack->redoText();
59
60 return createSuccessResponse(result, requestId);
61 }, "undo", requestId);
62}
63
64QJsonObject HistoryHandler::handleRedo(const QJsonObject &params, const QJsonValue &requestId)
65{
66 (void)params; // Parameter not used
67 Scene *scene = currentScene();
68 if (!scene) {
69 return createErrorResponse("No active circuit scene available", requestId, JsonRpcError::SceneNotAvailable);
70 }
71
72 QUndoStack *undoStack = scene->undoStack();
73 if (!undoStack) {
74 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError);
75 }
76
77 return tryCommand([&]() -> QJsonObject {
78 if (!undoStack->canRedo()) {
79 QJsonObject result;
80 result["success"] = false;
81 result["message"] = "Nothing to redo";
82 return createSuccessResponse(result, requestId);
83 }
84
85 undoStack->redo();
86
87 QJsonObject result;
88 result["success"] = true;
89 result["message"] = "Redo operation completed";
90 result["can_undo"] = undoStack->canUndo();
91 result["can_redo"] = undoStack->canRedo();
92 result["undo_text"] = undoStack->undoText();
93 result["redo_text"] = undoStack->redoText();
94
95 return createSuccessResponse(result, requestId);
96 }, "redo", requestId);
97}
98
99QJsonObject HistoryHandler::handleGetUndoStack(const QJsonObject &params, const QJsonValue &requestId)
100{
101 (void)params; // Parameter not used
102 Scene *scene = currentScene();
103 if (!scene) {
104 return createErrorResponse("No active circuit scene available", requestId, JsonRpcError::SceneNotAvailable);
105 }
106
107 QUndoStack *undoStack = scene->undoStack();
108 if (!undoStack) {
109 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError);
110 }
111
112 return tryCommand([&]() -> QJsonObject {
113 QJsonObject result;
114 result["can_undo"] = undoStack->canUndo();
115 result["can_redo"] = undoStack->canRedo();
116 result["undo_text"] = undoStack->undoText();
117 result["redo_text"] = undoStack->redoText();
118 result["undo_limit"] = undoStack->undoLimit();
119 result["undo_count"] = undoStack->count();
120 result["undo_index"] = undoStack->index();
121
122 return createSuccessResponse(result, requestId);
123 }, "get undo stack info", requestId);
124}
Main circuit editing scene with undo/redo and user interaction.
QJsonObject createSuccessResponse(const QJsonObject &result={}, const QJsonValue &requestId=QJsonValue()) const
QJsonObject tryCommand(Fn &&fn, const QString &action, const QJsonValue &requestId=QJsonValue())
Wraps fn in a try/catch, returning an error response on exception.
Definition BaseHandler.h:55
BaseHandler(MainWindow *mainWindow, const MCPValidator *validator)
QJsonObject createErrorResponse(const QString &error, const QJsonValue &requestId=QJsonValue(), int code=JsonRpcError::InternalError) const
Scene * currentScene()
QJsonObject handleCommand(const QString &command, const QJsonObject &params, const QJsonValue &requestId) override
HistoryHandler(MainWindow *mainWindow, const MCPValidator *validator)
JSON Schema validator for MCP commands and responses using native json-schema-validator.
The top-level application window hosting the tab bar, menus, element palette, and editor.
Definition MainWindow.h:47
Main circuit editing scene.
Definition Scene.h:56
QUndoStack * undoStack()
Returns the scene's undo stack.
Definition Scene.cpp:672
constexpr int SceneNotAvailable
No active circuit scene to operate on.
constexpr int MethodNotFound
The requested method does not exist or is unavailable.
constexpr int InternalError
Internal JSON-RPC error (last-resort).