undo/redo for editing intro text/picture
This commit is contained in:
@@ -3061,8 +3061,8 @@ void edit_item_placement() {
|
||||
static bool save_scen_details(cDialog& me, std::string, eKeyMod) {
|
||||
if(!me.toast(true)) return true;
|
||||
|
||||
scenario_details_t old_details = details_from_scen(scenario);
|
||||
scenario_details_t new_details;
|
||||
scen_details_t old_details = details_from_scen(scenario);
|
||||
scen_details_t new_details;
|
||||
|
||||
{
|
||||
cLedGroup& difficulty = dynamic_cast<cLedGroup&>(me["difficulty"]);
|
||||
|
@@ -38,6 +38,8 @@ extern ter_num_t template_terrain[64][64];
|
||||
extern cScenario scenario;
|
||||
extern cOutdoors* current_terrain;
|
||||
extern cCustomGraphics spec_scen_g;
|
||||
extern cUndoList undo_list;
|
||||
extern void update_edit_menu();
|
||||
|
||||
std::vector<pic_num_t> field_pics = {0,3,5,6,7,8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,4};
|
||||
std::vector<pic_num_t> static_boom_pics = {0,1,2,3,4,5};
|
||||
@@ -1691,14 +1693,23 @@ short edit_special_num(short mode,short what_start) {
|
||||
|
||||
static bool edit_scen_intro_event_filter(cDialog& me, std::string item_hit, eKeyMod) {
|
||||
if(item_hit == "okay") {
|
||||
scenario.intro_pic = me["picnum"].getTextAsNum();
|
||||
if(scenario.intro_pic > 29) {
|
||||
scen_intro_t old_intro = intro_from_scen(scenario);
|
||||
scen_intro_t new_intro;
|
||||
|
||||
new_intro.intro_pic = me["picnum"].getTextAsNum();
|
||||
if(new_intro.intro_pic > 29) {
|
||||
showError("Intro picture number is out of range.","",&me);
|
||||
return true;
|
||||
}
|
||||
for(short i = 0; i < scenario.intro_strs.size(); i++) {
|
||||
for(short i = 0; i < new_intro.intro_strs.size(); i++) {
|
||||
std::string id = "str" + std::to_string(i + 1);
|
||||
scenario.intro_strs[i] = me[id].getText();
|
||||
new_intro.intro_strs[i] = me[id].getText();
|
||||
}
|
||||
|
||||
if(new_intro != old_intro){
|
||||
scen_set_intro(scenario, new_intro);
|
||||
undo_list.add(action_ptr(new aEditIntro(old_intro, new_intro)));
|
||||
update_edit_menu();
|
||||
}
|
||||
me.toast(true);
|
||||
} else if(item_hit == "cancel") {
|
||||
|
@@ -868,4 +868,14 @@ bool aEditScenarioDetails::undo_me() {
|
||||
bool aEditScenarioDetails::redo_me() {
|
||||
scen_set_details(scenario, new_details);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool aEditIntro::undo_me() {
|
||||
scen_set_intro(scenario, old_intro);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool aEditIntro::redo_me() {
|
||||
scen_set_intro(scenario, new_intro);
|
||||
return true;
|
||||
}
|
@@ -513,13 +513,23 @@ public:
|
||||
};
|
||||
|
||||
class aEditScenarioDetails : public cAction {
|
||||
scenario_details_t old_details;
|
||||
scenario_details_t new_details;
|
||||
scen_details_t old_details;
|
||||
scen_details_t new_details;
|
||||
bool undo_me() override;
|
||||
bool redo_me() override;
|
||||
public:
|
||||
aEditScenarioDetails(scenario_details_t old_details, scenario_details_t new_details) :
|
||||
aEditScenarioDetails(scen_details_t old_details, scen_details_t new_details) :
|
||||
cAction("Edit Scenario Details"), old_details(old_details), new_details(new_details) {}
|
||||
};
|
||||
|
||||
class aEditIntro : public cAction {
|
||||
scen_intro_t old_intro;
|
||||
scen_intro_t new_intro;
|
||||
bool undo_me() override;
|
||||
bool redo_me() override;
|
||||
public:
|
||||
aEditIntro(scen_intro_t old_intro, scen_intro_t new_intro) :
|
||||
cAction("Edit Scenario Intro/Picture"), old_intro(old_intro), new_intro(new_intro) {}
|
||||
};
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user