|
|
|
@@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
|