undo/redo for deleting special nodes

This commit is contained in:
2025-06-21 14:25:27 -05:00
parent 8ad0044761
commit bcb1d4a055
4 changed files with 66 additions and 4 deletions

View File

@@ -418,8 +418,11 @@ static bool handle_rb_action(location the_point, bool option_hit) {
case RB_SCEN_SPEC:
size_before = scenario.scen_specials.size();
if(option_hit) {
if(j == size_before - 1)
if(j == size_before - 1){
undo_list.add(action_ptr(new aCreateDeleteSpecial(false, 0, scenario.scen_specials.back())));
update_edit_menu();
scenario.scen_specials.pop_back();
}
else if(j == size_before)
break;
else scenario.scen_specials[j] = cSpecial();
@@ -436,8 +439,11 @@ static bool handle_rb_action(location the_point, bool option_hit) {
case RB_OUT_SPEC:
size_before = current_terrain->specials.size();
if(option_hit) {
if(j == size_before - 1)
if(j == size_before - 1){
undo_list.add(action_ptr(new aCreateDeleteSpecial(false, 1, current_terrain->specials.back())));
update_edit_menu();
current_terrain->specials.pop_back();
}
else if(j == size_before)
break;
else current_terrain->specials[j] = cSpecial();
@@ -454,8 +460,11 @@ static bool handle_rb_action(location the_point, bool option_hit) {
case RB_TOWN_SPEC:
size_before = town->specials.size();
if(option_hit) {
if(j == size_before - 1)
if(j == size_before - 1){
undo_list.add(action_ptr(new aCreateDeleteSpecial(false, 2, town->specials.back())));
update_edit_menu();
town->specials.pop_back();
}
else if(j == size_before)
break;
else town->specials[j] = cSpecial();

View File

@@ -49,4 +49,4 @@ void update_mouse_spot(location the_point);
bool monst_on_space(location loc,short m_num);
void place_edit_special(location loc);
void set_special(location spot_hit);
bool save_check(std::string which_dlog, bool allow_no = true);
bool save_check(std::string which_dlog, bool allow_no = true);

View File

@@ -1132,4 +1132,44 @@ bool aCreateStrings::redo_me() {
}
start_string_editing(str_mode);
return true;
}
bool aCreateDeleteSpecial::undo_me() {
switch(mode){
case 0:
scenario.scen_specials.pop_back();
break;
case 1:
set_current_out(which_out);
current_terrain->specials.pop_back();
break;
case 2:
set_current_town(which_town);
town->specials.pop_back();
break;
default:
break;
}
start_special_editing(mode);
return true;
}
bool aCreateDeleteSpecial::redo_me() {
switch(mode){
case 0:
scenario.scen_specials.push_back(spec);
break;
case 1:
set_current_out(which_out);
current_terrain->specials.push_back(spec);
break;
case 2:
set_current_town(which_town);
town->specials.push_back(spec);
break;
default:
break;
}
start_special_editing(mode);
return true;
}

View File

@@ -783,4 +783,17 @@ public:
cAction(edit_string_action_name("Create", mode) + (strs.size() > 1 ? "s" : "")), str_mode(mode), strs(strs), which_town(cur_town), which_out(cur_out) {}
};
class aCreateDeleteSpecial : public cAction {
short mode;
cSpecial spec;
// undo/redo for town and outdoor nodes depends on global state of which town/outdoor section are active
size_t which_town;
location which_out;
bool undo_me() override;
bool redo_me() override;
public:
aCreateDeleteSpecial(bool create, short mode, cSpecial spec) :
cAction(create ? "Create Special Node" : "Delete Special Node", !create), mode(mode), spec(spec), which_town(cur_town), which_out(cur_out) {}
};
#endif