From 0cf37a0b63a84265693e97aa72882b42368146e2 Mon Sep 17 00:00:00 2001 From: suyu <1643689728@qq.com> Date: Fri, 21 Aug 2026 10:26:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=92=8C=E5=B7=A5=E7=A8=8B=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/services/logic_editor_service.cpp | 43 ++++++++++++++++------- app/src/services/logic_editor_service.h | 1 + app/src/services/project_service.cpp | 5 +++ app/src/services/project_service.h | 2 ++ 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/src/services/logic_editor_service.cpp b/app/src/services/logic_editor_service.cpp index a1a278e..923ca0b 100644 --- a/app/src/services/logic_editor_service.cpp +++ b/app/src/services/logic_editor_service.cpp @@ -367,6 +367,13 @@ void LogicEditorService::recordHistory(HistoryState before) history_.record(std::move(before), after, &LogicEditorService::statesEqual); } +void LogicEditorService::rollbackEdit( + HistoryState before, bool modified_before) +{ + project_service_.editProject().controlLogics = std::move(before.logics); + project_service_.restoreModifiedState(modified_before); +} + bool LogicEditorService::statesEqual( const HistoryState &left, const HistoryState &right) { @@ -914,6 +921,7 @@ LogicEditorResult LogicEditorService::appendCondition( const std::string node_id = makeUniqueNodeId(*logic, nodePrefix(config)); ConditionExpression leaf = ConditionExpression::fromNode(makeNode(node_id, config)); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); LadderRung *rung = findEditableRung(project, logic_id, rung_id); if (!rung->condition.has_value()) @@ -935,7 +943,7 @@ LogicEditorResult LogicEditorService::appendCondition( std::string validation_error; if (!rung->validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -977,6 +985,7 @@ LogicEditorResult LogicEditorService::insertConditionAtColumn( const std::string node_id = makeUniqueNodeId(*logic, nodePrefix(config)); ConditionExpression leaf = ConditionExpression::fromNode(makeNode(node_id, config)); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); LadderRung *rung = findEditableRung(project, logic_id, rung_id); @@ -1028,7 +1037,7 @@ LogicEditorResult LogicEditorService::insertConditionAtColumn( std::string validation_error; if (!rung->validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1057,6 +1066,7 @@ LogicEditorResult LogicEditorService::appendWire( const std::string wire_id = makeUniqueWireId(*logic); ConditionExpression leaf = ConditionExpression::fromWire(wire_id, column_span); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); LadderRung *rung = findEditableRung( project_service_.editProject(), logic_id, rung_id); if (!rung->condition.has_value()) @@ -1078,7 +1088,7 @@ LogicEditorResult LogicEditorService::appendWire( std::string validation_error; if (!rung->validate(&validation_error)) { - project_service_.editProject().controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1107,6 +1117,7 @@ LogicEditorResult LogicEditorService::insertConditionAfter( const std::string node_id = makeUniqueNodeId(*logic, nodePrefix(config)); ConditionExpression leaf = ConditionExpression::fromNode(makeNode(node_id, config)); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); LadderRung *rung = findEditableRung(project, logic_id, rung_id); ConditionExpression *target = findConditionExpression(*rung->condition, target_node_id); @@ -1151,7 +1162,7 @@ LogicEditorResult LogicEditorService::insertConditionAfter( std::string validation_error; if (!rung->validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1185,6 +1196,7 @@ LogicEditorResult LogicEditorService::insertWireAfter( const std::string wire_id = makeUniqueWireId(*logic); ConditionExpression leaf = ConditionExpression::fromWire(wire_id, column_span); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); LadderRung *rung = findEditableRung( project_service_.editProject(), logic_id, rung_id); ConditionExpression *editable_target = findConditionExpression( @@ -1213,7 +1225,7 @@ LogicEditorResult LogicEditorService::insertWireAfter( std::string validation_error; if (!rung->validate(&validation_error)) { - project_service_.editProject().controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1240,6 +1252,7 @@ LogicEditorResult LogicEditorService::replaceWireWithCondition( } const std::string node_id = makeUniqueNodeId(*logic, nodePrefix(config)); HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); LadderRung *rung = findEditableRung( project_service_.editProject(), logic_id, rung_id); ConditionExpression *editable = findConditionExpression( @@ -1248,7 +1261,7 @@ LogicEditorResult LogicEditorService::replaceWireWithCondition( std::string validation_error; if (!rung->validate(&validation_error)) { - project_service_.editProject().controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidNode, validation_error); } recordHistory(std::move(before)); @@ -1305,6 +1318,7 @@ LogicEditorResult LogicEditorService::replaceWireColumnWithCondition( } HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); LadderRung *rung = findEditableRung(project, logic_id, rung_id); ConditionExpression *editable = findConditionExpression( @@ -1314,7 +1328,7 @@ LogicEditorResult LogicEditorService::replaceWireColumnWithCondition( std::string validation_error; if (!rung->validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidNode, validation_error); } recordHistory(std::move(before)); @@ -1364,6 +1378,7 @@ LogicEditorResult LogicEditorService::addParallelBranch( series_id += "-range"; } HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); LadderRung *rung = findEditableRung(project, logic_id, rung_id); if (!addParallelForSelection( @@ -1373,7 +1388,7 @@ LogicEditorResult LogicEditorService::addParallelBranch( parallel_id, series_id)) { - project.controlLogics = before.logics; + rollbackEdit(std::move(before), modified_before); return failure( LogicEditorError::InvalidOperation, "并联选择必须是一个连续的逻辑范围"); @@ -1381,7 +1396,7 @@ LogicEditorResult LogicEditorService::addParallelBranch( std::string validation_error; if (!rung->validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1437,6 +1452,7 @@ LogicEditorResult LogicEditorService::addParallelWireBranch( series_id += "-range"; } HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); LadderRung *rung = findEditableRung( project_service_.editProject(), logic_id, rung_id); if (!addParallelForSelection( @@ -1446,7 +1462,7 @@ LogicEditorResult LogicEditorService::addParallelWireBranch( parallel_id, series_id)) { - project_service_.editProject().controlLogics = before.logics; + rollbackEdit(std::move(before), modified_before); return failure( LogicEditorError::InvalidOperation, "竖线连接只能围绕同一支路中的连续逻辑范围"); @@ -1454,7 +1470,7 @@ LogicEditorResult LogicEditorService::addParallelWireBranch( std::string validation_error; if (!rung->validate(&validation_error)) { - project_service_.editProject().controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } recordHistory(std::move(before)); @@ -1523,6 +1539,7 @@ LogicEditorResult LogicEditorService::updateNodeConfig( return {true, LogicEditorError::None, {}, node_id}; } HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); for (ControlLogic &logic : project.controlLogics) { @@ -1549,6 +1566,7 @@ LogicEditorResult LogicEditorService::updateNodeConfig( } } } + project_service_.restoreModifiedState(modified_before); return failure(LogicEditorError::NodeNotFound, "未找到逻辑节点"); } @@ -1584,6 +1602,7 @@ LogicEditorResult LogicEditorService::removeNodes( } HistoryState before = captureState(); + const bool modified_before = project_service_.isModified(); Project &project = project_service_.editProject(); ControlLogic *editable_logic = nullptr; for (ControlLogic &candidate : project.controlLogics) @@ -1624,7 +1643,7 @@ LogicEditorResult LogicEditorService::removeNodes( std::string validation_error; if (!rung.validate(&validation_error)) { - project.controlLogics = std::move(before.logics); + rollbackEdit(std::move(before), modified_before); return failure(LogicEditorError::InvalidOperation, validation_error); } } diff --git a/app/src/services/logic_editor_service.h b/app/src/services/logic_editor_service.h index ef46fff..833d78b 100644 --- a/app/src/services/logic_editor_service.h +++ b/app/src/services/logic_editor_service.h @@ -144,6 +144,7 @@ private: HistoryState captureState() const; void recordHistory(HistoryState before); + void rollbackEdit(HistoryState before, bool modified_before); static bool statesEqual( const HistoryState &left, const HistoryState &right); static bool logicsEqual( diff --git a/app/src/services/project_service.cpp b/app/src/services/project_service.cpp index e519134..3a5a710 100644 --- a/app/src/services/project_service.cpp +++ b/app/src/services/project_service.cpp @@ -57,6 +57,11 @@ bool ProjectService::isModified() const return modified_; } +void ProjectService::restoreModifiedState(bool modified) +{ + modified_ = modified; +} + ProjectOperationResult ProjectService::createNewProject(const std::string &name) { if (isBlank(name)) diff --git a/app/src/services/project_service.h b/app/src/services/project_service.h index 4d731f1..6fd9a8e 100644 --- a/app/src/services/project_service.h +++ b/app/src/services/project_service.h @@ -35,6 +35,8 @@ public: const std::string ¤tFilePath() const; bool hasCurrentFile() const; bool isModified() const; + // 失败编辑回滚时恢复进入编辑前的脏状态 + void restoreModifiedState(bool modified); /** * @brief 创建未保存的新工程