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 创建未保存的新工程