Browse Source

fix: 完善逻辑编辑和工程服务

main
suyu 4 weeks ago
parent
commit
0cf37a0b63
4 changed files with 39 additions and 12 deletions
  1. +31
    -12
      app/src/services/logic_editor_service.cpp
  2. +1
    -0
      app/src/services/logic_editor_service.h
  3. +5
    -0
      app/src/services/project_service.cpp
  4. +2
    -0
      app/src/services/project_service.h

+ 31
- 12
app/src/services/logic_editor_service.cpp View File

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


+ 1
- 0
app/src/services/logic_editor_service.h View File

@@ -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(


+ 5
- 0
app/src/services/project_service.cpp View File

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


+ 2
- 0
app/src/services/project_service.h View File

@@ -35,6 +35,8 @@ public:
const std::string &currentFilePath() const;
bool hasCurrentFile() const;
bool isModified() const;
// 失败编辑回滚时恢复进入编辑前的脏状态
void restoreModifiedState(bool modified);

/**
* @brief 创建未保存的新工程


Loading…
Cancel
Save