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 // Unreachable: Scene::undoStack() returns the address of a value member, never null.
39 if (!undoStack) {
40 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError); // LCOV_EXCL_LINE
41 }
42
43 return tryCommand([&]() -> QJsonObject { // LCOV_EXCL_LINE -- gcov misattributes this multi-line lambda-taking call's entry (pattern 45); the lambda body below is genuinely covered
44 if (!undoStack->canUndo()) {
45 QJsonObject result;
46 result["success"] = false;
47 result["message"] = "Nothing to undo";
48 return createSuccessResponse(result, requestId);
49 }
50
51 undoStack->undo();
52
53 QJsonObject result;
54 result["success"] = true;
55 result["message"] = "Undo operation completed";
56 result["can_undo"] = undoStack->canUndo();
57 result["can_redo"] = undoStack->canRedo();
58 result["undo_text"] = undoStack->undoText();
59 result["redo_text"] = undoStack->redoText();
60
61 return createSuccessResponse(result, requestId);
62 }, "undo", requestId);
63}
64
65QJsonObject HistoryHandler::handleRedo(const QJsonObject &params, const QJsonValue &requestId)
66{
67 (void)params; // Parameter not used
68 Scene *scene = currentScene();
69 if (!scene) {
70 return createErrorResponse("No active circuit scene available", requestId, JsonRpcError::SceneNotAvailable);
71 }
72
73 QUndoStack *undoStack = scene->undoStack();
74 // Unreachable: Scene::undoStack() returns the address of a value member, never null.
75 if (!undoStack) {
76 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError); // LCOV_EXCL_LINE
77 }
78
79 return tryCommand([&]() -> QJsonObject { // LCOV_EXCL_LINE -- gcov misattributes this multi-line lambda-taking call's entry (pattern 45); the lambda body below is genuinely covered
80 if (!undoStack->canRedo()) {
81 QJsonObject result;
82 result["success"] = false;
83 result["message"] = "Nothing to redo";
84 return createSuccessResponse(result, requestId);
85 }
86
87 undoStack->redo();
88
89 QJsonObject result;
90 result["success"] = true;
91 result["message"] = "Redo operation completed";
92 result["can_undo"] = undoStack->canUndo();
93 result["can_redo"] = undoStack->canRedo();
94 result["undo_text"] = undoStack->undoText();
95 result["redo_text"] = undoStack->redoText();
96
97 return createSuccessResponse(result, requestId);
98 }, "redo", requestId);
99}
100
101QJsonObject HistoryHandler::handleGetUndoStack(const QJsonObject &params, const QJsonValue &requestId)
102{
103 (void)params; // Parameter not used
104 Scene *scene = currentScene();
105 if (!scene) {
106 return createErrorResponse("No active circuit scene available", requestId, JsonRpcError::SceneNotAvailable);
107 }
108
109 QUndoStack *undoStack = scene->undoStack();
110 // Unreachable: Scene::undoStack() returns the address of a value member, never null.
111 if (!undoStack) {
112 return createErrorResponse("Undo stack not available", requestId, JsonRpcError::InternalError); // LCOV_EXCL_LINE
113 }
114
115 return tryCommand([&]() -> QJsonObject { // LCOV_EXCL_LINE -- gcov misattributes this multi-line lambda-taking call's entry (pattern 45); the lambda body below is genuinely covered
116 QJsonObject result;
117 result["can_undo"] = undoStack->canUndo();
118 result["can_redo"] = undoStack->canRedo();
119 result["undo_text"] = undoStack->undoText();
120 result["redo_text"] = undoStack->redoText();
121 result["undo_limit"] = undoStack->undoLimit();
122 result["undo_count"] = undoStack->count();
123 result["undo_index"] = undoStack->index();
124
125 return createSuccessResponse(result, requestId);
126 }, "get undo stack info", requestId);
127}
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:46
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).