make edit_stack a vector
This commit is contained in:
@@ -756,7 +756,7 @@ struct editing_node_t {
|
|||||||
cSpecial node;
|
cSpecial node;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::stack<editing_node_t> node_stack_t;
|
typedef std::vector<editing_node_t> node_stack_t;
|
||||||
|
|
||||||
static void setup_node_field(cDialog& me, std::string field, short value, const node_function_t& fcn) {
|
static void setup_node_field(cDialog& me, std::string field, short value, const node_function_t& fcn) {
|
||||||
me[field + "-lbl"].setText(fcn.label());
|
me[field + "-lbl"].setText(fcn.label());
|
||||||
@@ -794,15 +794,15 @@ static void setup_node_field(cDialog& me, std::string field, short value, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void put_spec_enc_in_dlog(cDialog& me, node_stack_t& edit_stack) {
|
static void put_spec_enc_in_dlog(cDialog& me, node_stack_t& edit_stack) {
|
||||||
cSpecial& spec = edit_stack.top().node;
|
cSpecial& spec = edit_stack.back().node;
|
||||||
|
|
||||||
// Show which node is being edited and what type of node it is
|
// Show which node is being edited and what type of node it is
|
||||||
switch(edit_stack.top().mode) {
|
switch(edit_stack.back().mode) {
|
||||||
case 0: me["title"].setText("Edit Scenario Special Node"); break;
|
case 0: me["title"].setText("Edit Scenario Special Node"); break;
|
||||||
case 1: me["title"].setText("Edit Outdoors Special Node"); break;
|
case 1: me["title"].setText("Edit Outdoors Special Node"); break;
|
||||||
case 2: me["title"].setText("Edit Town Special Node"); break;
|
case 2: me["title"].setText("Edit Town Special Node"); break;
|
||||||
}
|
}
|
||||||
me["num"].setTextToNum(edit_stack.top().which);
|
me["num"].setTextToNum(edit_stack.back().which);
|
||||||
|
|
||||||
// Show the node opcode information
|
// Show the node opcode information
|
||||||
me["type"].setText((*spec.type).name());
|
me["type"].setText((*spec.type).name());
|
||||||
@@ -837,7 +837,7 @@ static void put_spec_enc_in_dlog(cDialog& me, node_stack_t& edit_stack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void save_spec_enc(cDialog& me, node_stack_t& edit_stack) {
|
static void save_spec_enc(cDialog& me, node_stack_t& edit_stack) {
|
||||||
cSpecial& the_node = edit_stack.top().node;
|
cSpecial& the_node = edit_stack.back().node;
|
||||||
the_node.sd1 = me["sdf1"].getTextAsNum();
|
the_node.sd1 = me["sdf1"].getTextAsNum();
|
||||||
the_node.sd2 = me["sdf2"].getTextAsNum();
|
the_node.sd2 = me["sdf2"].getTextAsNum();
|
||||||
the_node.m1 = me["msg1"].getTextAsNum();
|
the_node.m1 = me["msg1"].getTextAsNum();
|
||||||
@@ -898,20 +898,20 @@ static bool preview_spec_enc_dlog(cDialog& me, std::string item_hit, cSpecial& s
|
|||||||
|
|
||||||
static bool preview_spec_enc_dlog_stack(cDialog& me, std::string item_hit, node_stack_t& edit_stack, short mode) {
|
static bool preview_spec_enc_dlog_stack(cDialog& me, std::string item_hit, node_stack_t& edit_stack, short mode) {
|
||||||
save_spec_enc(me, edit_stack);
|
save_spec_enc(me, edit_stack);
|
||||||
cSpecial& special = edit_stack.top().node;
|
cSpecial& special = edit_stack.back().node;
|
||||||
return preview_spec_enc_dlog(me, item_hit, special, mode);
|
return preview_spec_enc_dlog(me, item_hit, special, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool commit_spec_enc(cDialog& me, std::string item_hit, node_stack_t& edit_stack) {
|
static bool commit_spec_enc(cDialog& me, std::string item_hit, node_stack_t& edit_stack) {
|
||||||
if(item_hit != "unwind")
|
if(item_hit != "unwind")
|
||||||
save_spec_enc(me, edit_stack);
|
save_spec_enc(me, edit_stack);
|
||||||
int mode = edit_stack.top().mode, node = edit_stack.top().which;
|
int mode = edit_stack.back().mode, node = edit_stack.back().which;
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case 0: scenario.scen_specials[node] = edit_stack.top().node; break;
|
case 0: scenario.scen_specials[node] = edit_stack.back().node; break;
|
||||||
case 1: current_terrain->specials[node] = edit_stack.top().node; break;
|
case 1: current_terrain->specials[node] = edit_stack.back().node; break;
|
||||||
case 2: town->specials[node] = edit_stack.top().node; break;
|
case 2: town->specials[node] = edit_stack.back().node; break;
|
||||||
}
|
}
|
||||||
edit_stack.pop();
|
edit_stack.pop_back();
|
||||||
if(item_hit == "okay") {
|
if(item_hit == "okay") {
|
||||||
while(!edit_stack.empty())
|
while(!edit_stack.empty())
|
||||||
commit_spec_enc(me, "unwind", edit_stack);
|
commit_spec_enc(me, "unwind", edit_stack);
|
||||||
@@ -932,18 +932,18 @@ static bool discard_spec_enc(cDialog& me, node_stack_t& edit_stack) {
|
|||||||
action = cChoiceDlog("discard-special-node", {"save", "cancel", "revert"}).show();
|
action = cChoiceDlog("discard-special-node", {"save", "cancel", "revert"}).show();
|
||||||
if(action == "save") return true;
|
if(action == "save") return true;
|
||||||
}
|
}
|
||||||
auto cur = edit_stack.top();
|
auto cur = edit_stack.back();
|
||||||
auto& list = cur.mode == 0 ? scenario.scen_specials : (cur.mode == 1 ? current_terrain->specials : town->specials);
|
auto& list = cur.mode == 0 ? scenario.scen_specials : (cur.mode == 1 ? current_terrain->specials : town->specials);
|
||||||
if(cur.which == list.size() - 1 && list[cur.which].type == eSpecType::NONE && list[cur.which].jumpto == -1)
|
if(cur.which == list.size() - 1 && list[cur.which].type == eSpecType::NONE && list[cur.which].jumpto == -1)
|
||||||
list.pop_back();
|
list.pop_back();
|
||||||
edit_stack.pop();
|
edit_stack.pop_back();
|
||||||
if(action == "cancel") {
|
if(action == "cancel") {
|
||||||
while(!edit_stack.empty()) {
|
while(!edit_stack.empty()) {
|
||||||
auto cur = edit_stack.top();
|
auto cur = edit_stack.back();
|
||||||
auto& list = cur.mode == 0 ? scenario.scen_specials : (cur.mode == 1 ? current_terrain->specials : town->specials);
|
auto& list = cur.mode == 0 ? scenario.scen_specials : (cur.mode == 1 ? current_terrain->specials : town->specials);
|
||||||
if(cur.which == list.size() - 1 && list[cur.which].type == eSpecType::NONE && list[cur.which].jumpto == -1)
|
if(cur.which == list.size() - 1 && list[cur.which].type == eSpecType::NONE && list[cur.which].jumpto == -1)
|
||||||
list.pop_back();
|
list.pop_back();
|
||||||
edit_stack.pop();
|
edit_stack.pop_back();
|
||||||
}
|
}
|
||||||
} else if(edit_stack.size() == 1)
|
} else if(edit_stack.size() == 1)
|
||||||
me["back"].hide();
|
me["back"].hide();
|
||||||
@@ -964,7 +964,7 @@ static bool edit_spec_enc_type(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
else if(item_hit == "out") category = eSpecCat::OUTDOOR;
|
else if(item_hit == "out") category = eSpecCat::OUTDOOR;
|
||||||
else if(item_hit == "rect") category = eSpecCat::RECT;
|
else if(item_hit == "rect") category = eSpecCat::RECT;
|
||||||
auto bounds = *category;
|
auto bounds = *category;
|
||||||
int start = int(bounds.first), finish = int(bounds.last), current = int(edit_stack.top().node.type);
|
int start = int(bounds.first), finish = int(bounds.last), current = int(edit_stack.back().node.type);
|
||||||
if(start < 0 || finish < 0) return true;
|
if(start < 0 || finish < 0) return true;
|
||||||
std::vector<std::string> choices;
|
std::vector<std::string> choices;
|
||||||
for(int i = start; i <= finish; i++) {
|
for(int i = start; i <= finish; i++) {
|
||||||
@@ -977,7 +977,7 @@ static bool edit_spec_enc_type(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
cStringChoice choose(choices, "Select a special node type:",&me);
|
cStringChoice choose(choices, "Select a special node type:",&me);
|
||||||
result = choose.show((current < start || current > finish) ? cancelled : current - start);
|
result = choose.show((current < start || current > finish) ? cancelled : current - start);
|
||||||
if(result != cancelled) {
|
if(result != cancelled) {
|
||||||
edit_stack.top().node.type = eSpecType(result + start);
|
edit_stack.back().node.type = eSpecType(result + start);
|
||||||
put_spec_enc_in_dlog(me, edit_stack);
|
put_spec_enc_in_dlog(me, edit_stack);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -1137,7 +1137,7 @@ static std::string get_control_for_field(eSpecField field) {
|
|||||||
|
|
||||||
static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t& edit_stack) {
|
static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t& edit_stack) {
|
||||||
std::string field = item_hit.substr(0, item_hit.find_first_of('-'));
|
std::string field = item_hit.substr(0, item_hit.find_first_of('-'));
|
||||||
const cSpecial& spec = edit_stack.top().node;
|
const cSpecial& spec = edit_stack.back().node;
|
||||||
node_function_t fcn = get_field_function(spec, field);
|
node_function_t fcn = get_field_function(spec, field);
|
||||||
short val = me[field].getTextAsNum(), store;
|
short val = me[field].getTextAsNum(), store;
|
||||||
switch(fcn.button) {
|
switch(fcn.button) {
|
||||||
@@ -1148,22 +1148,22 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
}
|
}
|
||||||
auto otherField = get_control_for_field(fcn.continuation);
|
auto otherField = get_control_for_field(fcn.continuation);
|
||||||
store = me[otherField].getTextAsNum();
|
store = me[otherField].getTextAsNum();
|
||||||
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.top().mode), &val, &store, &me);
|
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.back().mode), &val, &store, &me);
|
||||||
me[otherField].setTextToNum(store);
|
me[otherField].setTextToNum(store);
|
||||||
store = val;
|
store = val;
|
||||||
} break;
|
} break;
|
||||||
case eSpecPicker::MSG_SINGLE:
|
case eSpecPicker::MSG_SINGLE:
|
||||||
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.top().mode), &val, nullptr, &me);
|
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.back().mode), &val, nullptr, &me);
|
||||||
store = val;
|
store = val;
|
||||||
break;
|
break;
|
||||||
case eSpecPicker::MSG_SEQUENCE:
|
case eSpecPicker::MSG_SEQUENCE:
|
||||||
store = val;
|
store = val;
|
||||||
edit_dialog_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.top().mode), &store, &me);
|
edit_dialog_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.back().mode), &store, &me);
|
||||||
break;
|
break;
|
||||||
case eSpecPicker::MSG_SEQUENCE_VAR:
|
case eSpecPicker::MSG_SEQUENCE_VAR:
|
||||||
if(val < 0) {
|
if(val < 0) {
|
||||||
// If no string was specified, start appending strings to the end of the list.
|
// If no string was specified, start appending strings to the end of the list.
|
||||||
auto mode = eStrMode(edit_stack.top().mode);
|
auto mode = eStrMode(edit_stack.back().mode);
|
||||||
store = num_strs(mode);
|
store = num_strs(mode);
|
||||||
ensure_str(mode, store);
|
ensure_str(mode, store);
|
||||||
bool is_new = true;
|
bool is_new = true;
|
||||||
@@ -1176,7 +1176,7 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
store = val;
|
store = val;
|
||||||
bool is_new = false;
|
bool is_new = false;
|
||||||
auto otherField = get_control_for_field(fcn.continuation);
|
auto otherField = get_control_for_field(fcn.continuation);
|
||||||
edit_text_str(val, eStrMode(edit_stack.top().mode), is_new, false, val, me[otherField].getTextAsNum());
|
edit_text_str(val, eStrMode(edit_stack.back().mode), is_new, false, val, me[otherField].getTextAsNum());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case eSpecPicker::TOGGLE: {
|
case eSpecPicker::TOGGLE: {
|
||||||
@@ -1191,7 +1191,7 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case eSpecPicker::NODE: {
|
case eSpecPicker::NODE: {
|
||||||
short mode = fcn.force_global ? 0 : edit_stack.top().mode;
|
short mode = fcn.force_global ? 0 : edit_stack.back().mode;
|
||||||
store = val < 0 ? get_fresh_spec(mode) : val;
|
store = val < 0 ? get_fresh_spec(mode) : val;
|
||||||
me[field].setTextToNum(store);
|
me[field].setTextToNum(store);
|
||||||
save_spec_enc(me, edit_stack);
|
save_spec_enc(me, edit_stack);
|
||||||
@@ -1205,7 +1205,7 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
if (node_to_change_to) {
|
if (node_to_change_to) {
|
||||||
if(node_to_change_to->pic < 0)
|
if(node_to_change_to->pic < 0)
|
||||||
node_to_change_to->pic = 0;
|
node_to_change_to->pic = 0;
|
||||||
edit_stack.push({store,mode,*node_to_change_to});
|
edit_stack.push_back({store,mode,*node_to_change_to});
|
||||||
}
|
}
|
||||||
put_spec_enc_in_dlog(me, edit_stack);
|
put_spec_enc_in_dlog(me, edit_stack);
|
||||||
me["back"].show();
|
me["back"].show();
|
||||||
@@ -1319,7 +1319,7 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
|
|||||||
case eLocType::ACTIVE_OUT: loc = cLocationPicker(loc, *current_terrain, outStr, &me).run(); break;
|
case eLocType::ACTIVE_OUT: loc = cLocationPicker(loc, *current_terrain, outStr, &me).run(); break;
|
||||||
case eLocType::ACTIVE_TOWN: loc = cLocationPicker(loc, *town, townStr, &me).run(); break;
|
case eLocType::ACTIVE_TOWN: loc = cLocationPicker(loc, *town, townStr, &me).run(); break;
|
||||||
case eLocType::ACTIVE_AUTO: {
|
case eLocType::ACTIVE_AUTO: {
|
||||||
switch(edit_stack.top().mode) {
|
switch(edit_stack.back().mode) {
|
||||||
case 1: loc = cLocationPicker(loc, *current_terrain, outStr, &me).run(); break;
|
case 1: loc = cLocationPicker(loc, *current_terrain, outStr, &me).run(); break;
|
||||||
case 2: loc = cLocationPicker(loc, *town, townStr, &me).run(); break;
|
case 2: loc = cLocationPicker(loc, *town, townStr, &me).run(); break;
|
||||||
case 0: {
|
case 0: {
|
||||||
@@ -1485,7 +1485,7 @@ bool edit_spec_enc(short which_node,short mode,cDialog* parent) {
|
|||||||
});
|
});
|
||||||
special["cancel"].attachClickHandler(std::bind(discard_spec_enc, _1, std::ref(edit_stack)));
|
special["cancel"].attachClickHandler(std::bind(discard_spec_enc, _1, std::ref(edit_stack)));
|
||||||
special["node-help"].attachClickHandler([&edit_stack](cDialog& me, std::string, eKeyMod) {
|
special["node-help"].attachClickHandler([&edit_stack](cDialog& me, std::string, eKeyMod) {
|
||||||
eSpecType type = edit_stack.top().node.type;
|
eSpecType type = edit_stack.back().node.type;
|
||||||
const std::string& str = (*type).descr();
|
const std::string& str = (*type).descr();
|
||||||
// TODO: This is the same dialog as give_help(), the only difference being that we don't have a string number!
|
// TODO: This is the same dialog as give_help(), the only difference being that we don't have a string number!
|
||||||
cStrDlog display_help(str,"","Instant Help",24,PIC_DLOG, &me);
|
cStrDlog display_help(str,"","Instant Help",24,PIC_DLOG, &me);
|
||||||
@@ -1496,7 +1496,7 @@ bool edit_spec_enc(short which_node,short mode,cDialog* parent) {
|
|||||||
|
|
||||||
|
|
||||||
special["back"].hide();
|
special["back"].hide();
|
||||||
edit_stack.push({which_node,mode,the_node});
|
edit_stack.push_back({which_node,mode,the_node});
|
||||||
special["preview-dialog"].attachClickHandler(std::bind(preview_spec_enc_dlog_stack, _1, _2, std::ref(edit_stack), mode));
|
special["preview-dialog"].attachClickHandler(std::bind(preview_spec_enc_dlog_stack, _1, _2, std::ref(edit_stack), mode));
|
||||||
|
|
||||||
put_spec_enc_in_dlog(special, edit_stack);
|
put_spec_enc_in_dlog(special, edit_stack);
|
||||||
|
Reference in New Issue
Block a user