undo/redo for create/delete talk node

This commit is contained in:
2025-06-20 09:57:47 -05:00
parent 8f83427d3f
commit 9e22ed04ea
3 changed files with 45 additions and 2 deletions

View File

@@ -534,6 +534,8 @@ static bool handle_rb_action(location the_point, bool option_hit) {
if(option_hit) {
if(j == size_before)
break;
undo_list.add(action_ptr(new aCreateDeleteTalkNode(false, cur_town, j, town->talking.talk_nodes[j])));
update_edit_menu();
town->talking.talk_nodes.erase(town->talking.talk_nodes.begin() + j);
} else {
bool is_new = false;
@@ -541,8 +543,20 @@ static bool handle_rb_action(location the_point, bool option_hit) {
is_new = true;
town->talking.talk_nodes.emplace_back();
}
if((j = edit_talk_node(j)) >= 0 && is_new)
town->talking.talk_nodes.erase(town->talking.talk_nodes.begin() + j);
if((j = edit_talk_node(j)) >= 0){
// Cancel create new
if(is_new)
town->talking.talk_nodes.erase(town->talking.talk_nodes.begin() + j);
}
// Create confirmed
else if(is_new){
undo_list.add(action_ptr(new aCreateDeleteTalkNode(true, cur_town, j, town->talking.talk_nodes[j])));
update_edit_menu();
}
// Edit confirmed
else{
}
}
start_dialogue_editing();
if(size_before > town->talking.talk_nodes.size())

View File

@@ -1000,10 +1000,28 @@ bool aEditOutEncounter::redo_me() {
bool aEditPersonality::undo_me() {
scenario.towns[town_num]->talking.people[which] = old_pers;
// Show the change
start_dialogue_editing();
return true;
}
bool aEditPersonality::redo_me() {
scenario.towns[town_num]->talking.people[which] = new_pers;
// Show the change
start_dialogue_editing();
return true;
}
bool aCreateDeleteTalkNode::undo_me() {
scenario.towns[town_num]->talking.talk_nodes.erase(scenario.towns[town_num]->talking.talk_nodes.begin() + which);
// Show the change
start_dialogue_editing();
return true;
}
bool aCreateDeleteTalkNode::redo_me() {
scenario.towns[town_num]->talking.talk_nodes.insert(scenario.towns[town_num]->talking.talk_nodes.begin() + which, node);
// Show the change
start_dialogue_editing();
return true;
}

View File

@@ -674,4 +674,15 @@ public:
cAction("Edit Personality"), town_num(town_num), which(which), old_pers(old_pers), new_pers(new_pers) {}
};
class aCreateDeleteTalkNode : public cAction {
size_t town_num;
size_t which;
cSpeech::cNode node;
bool undo_me() override;
bool redo_me() override;
public:
aCreateDeleteTalkNode(bool create, size_t town_num, size_t which, cSpeech::cNode node) :
cAction(create ? "Create Talk Node" : "Delete Talk Node", !create), town_num(town_num), which(which), node(node) {}
};
#endif