undo/redo for deleting special nodes
This commit is contained in:
@@ -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();
|
||||
|
@@ -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);
|
@@ -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;
|
||||
}
|
@@ -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
|
Reference in New Issue
Block a user