undo/redo for talk nodes handle edit stack
This commit is contained in:
@@ -550,16 +550,7 @@ static bool handle_rb_action(location the_point, bool option_hit) {
|
|||||||
if(is_new)
|
if(is_new)
|
||||||
town->talking.talk_nodes.erase(town->talking.talk_nodes.begin() + canceled);
|
town->talking.talk_nodes.erase(town->talking.talk_nodes.begin() + canceled);
|
||||||
}
|
}
|
||||||
// Create confirmed
|
update_edit_menu();
|
||||||
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 if(old_node != town->talking.talk_nodes[j]){
|
|
||||||
undo_list.add(action_ptr(new aEditTalkNode(cur_town, j, old_node, town->talking.talk_nodes[j])));
|
|
||||||
update_edit_menu();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
start_dialogue_editing();
|
start_dialogue_editing();
|
||||||
if(size_before > town->talking.talk_nodes.size())
|
if(size_before > town->talking.talk_nodes.size())
|
||||||
|
@@ -1426,7 +1426,7 @@ static bool check_talk_xtra(cDialog& me, std::stack<node_ref_t>& talk_edit_stack
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool save_talk_node(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool close_dlg, bool commit) {
|
static bool save_talk_node(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool close_dlg, bool commit, bool is_new = false) {
|
||||||
if(!me.toast(true)) return false;
|
if(!me.toast(true)) return false;
|
||||||
if(!close_dlg) me.untoast();
|
if(!close_dlg) me.untoast();
|
||||||
|
|
||||||
@@ -1455,8 +1455,14 @@ static bool save_talk_node(cDialog& me, std::stack<node_ref_t>& talk_edit_stack,
|
|||||||
talk_node.str1 = me["str1"].getText();
|
talk_node.str1 = me["str1"].getText();
|
||||||
talk_node.str2 = me["str2"].getText();
|
talk_node.str2 = me["str2"].getText();
|
||||||
|
|
||||||
if(commit){
|
size_t which = talk_edit_stack.top().first;
|
||||||
town->talking.talk_nodes[talk_edit_stack.top().first] = talk_node;
|
if(commit && talk_node != town->talking.talk_nodes[which]){
|
||||||
|
if(is_new){
|
||||||
|
undo_list.add(action_ptr(new aCreateDeleteTalkNode(true, cur_town, which, talk_node)));
|
||||||
|
}else{
|
||||||
|
undo_list.add(action_ptr(new aEditTalkNode(cur_town, which, town->talking.talk_nodes[which], talk_node)));
|
||||||
|
}
|
||||||
|
town->talking.talk_nodes[which] = talk_node;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1532,7 +1538,7 @@ static void put_talk_node_in_dlog(cDialog& me, std::stack<node_ref_t>& talk_edit
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool talk_node_back(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool& is_new) {
|
static bool talk_node_back(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool& is_new) {
|
||||||
if(!save_talk_node(me, talk_edit_stack, false, true)) return true;
|
if(!save_talk_node(me, talk_edit_stack, false, true, is_new)) return true;
|
||||||
is_new = false;
|
is_new = false;
|
||||||
talk_edit_stack.pop();
|
talk_edit_stack.pop();
|
||||||
put_talk_node_in_dlog(me, talk_edit_stack);
|
put_talk_node_in_dlog(me, talk_edit_stack);
|
||||||
@@ -1540,7 +1546,7 @@ static bool talk_node_back(cDialog& me, std::stack<node_ref_t>& talk_edit_stack,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool talk_node_branch(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool& is_new) {
|
static bool talk_node_branch(cDialog& me, std::stack<node_ref_t>& talk_edit_stack, bool& is_new) {
|
||||||
if(!save_talk_node(me, talk_edit_stack, false, true)) return true;
|
if(!save_talk_node(me, talk_edit_stack, false, true, is_new)) return true;
|
||||||
|
|
||||||
int spec = -1;
|
int spec = -1;
|
||||||
for(int j = 0; j < town->talking.talk_nodes.size(); j++)
|
for(int j = 0; j < town->talking.talk_nodes.size(); j++)
|
||||||
@@ -1648,7 +1654,7 @@ short edit_talk_node(short which_node, bool& is_new) {
|
|||||||
talk_edit_stack.push({which_node, town->talking.talk_nodes[which_node]});
|
talk_edit_stack.push({which_node, town->talking.talk_nodes[which_node]});
|
||||||
|
|
||||||
cDialog talk_dlg(*ResMgr::dialogs.get("edit-talk-node"));
|
cDialog talk_dlg(*ResMgr::dialogs.get("edit-talk-node"));
|
||||||
talk_dlg["okay"].attachClickHandler(std::bind(save_talk_node, _1, std::ref(talk_edit_stack), true, true));
|
talk_dlg["okay"].attachClickHandler(std::bind(save_talk_node, _1, std::ref(talk_edit_stack), true, true, std::ref(is_new)));
|
||||||
talk_dlg["cancel"].attachClickHandler(std::bind(&cDialog::toast, &talk_dlg, false));
|
talk_dlg["cancel"].attachClickHandler(std::bind(&cDialog::toast, &talk_dlg, false));
|
||||||
talk_dlg["back"].attachClickHandler(std::bind(talk_node_back, _1, std::ref(talk_edit_stack), std::ref(is_new)));
|
talk_dlg["back"].attachClickHandler(std::bind(talk_node_back, _1, std::ref(talk_edit_stack), std::ref(is_new)));
|
||||||
talk_dlg["new"].attachClickHandler(std::bind(talk_node_branch, _1, std::ref(talk_edit_stack), std::ref(is_new)));
|
talk_dlg["new"].attachClickHandler(std::bind(talk_node_branch, _1, std::ref(talk_edit_stack), std::ref(is_new)));
|
||||||
|
Reference in New Issue
Block a user