Add a string editor for the Story Dialog special node

This commit is contained in:
2025-03-07 20:42:01 -05:00
committed by Celtic Minstrel
parent 3c811ef43d
commit 678518a053
2 changed files with 34 additions and 6 deletions

View File

@@ -638,7 +638,7 @@ short choose_text_editable(std::vector<std::string>& list, short cur_choice, cDi
return cur_choice; return cur_choice;
} }
static bool edit_text_event_filter(cDialog& me, std::string item_hit, short& which_str, eStrMode str_mode) { static bool edit_text_event_filter(cDialog& me, std::string item_hit, short& which_str, eStrMode str_mode,bool loop,short min_str,short max_str) {
std::string newVal = me["text"].getText(); std::string newVal = me["text"].getText();
fetch_str(str_mode, which_str) = newVal; fetch_str(str_mode, which_str) = newVal;
if(item_hit == "okay") me.toast(true); if(item_hit == "okay") me.toast(true);
@@ -646,24 +646,35 @@ static bool edit_text_event_filter(cDialog& me, std::string item_hit, short& whi
if(item_hit[0] == 'l') if(item_hit[0] == 'l')
which_str--; which_str--;
else which_str++; else which_str++;
if(which_str < 0) which_str = num_strs(str_mode) - 1; if(!loop) {
if(which_str >= num_strs(str_mode)) which_str = 0; if(which_str == min_str) me["left"].hide();
else me["left"].show();
if(max_str == -1 && which_str >= num_strs(str_mode)) {
ensure_str(str_mode, which_str);
} else if(which_str == max_str) me["right"].hide();
else me["right"].show();
} else {
if(which_str < 0) which_str = num_strs(str_mode) - 1;
if(which_str >= num_strs(str_mode)) which_str = 0;
}
} }
me["num"].setText(str_info(str_mode, which_str)); me["num"].setText(str_info(str_mode, which_str));
me["text"].setText(fetch_str(str_mode, which_str)); me["text"].setText(fetch_str(str_mode, which_str));
return true; return true;
} }
bool edit_text_str(short which_str,eStrMode mode) { bool edit_text_str(short which_str,eStrMode mode,bool loop,short min_str,short max_str) {
using namespace std::placeholders; using namespace std::placeholders;
short first = which_str; short first = which_str;
cDialog dlog(*ResMgr::dialogs.get("edit-text")); cDialog dlog(*ResMgr::dialogs.get("edit-text"));
dlog.attachClickHandlers(std::bind(edit_text_event_filter, _1, _2, std::ref(which_str), mode), {"okay", "left", "right"}); dlog.attachClickHandlers(std::bind(edit_text_event_filter, _1, _2, std::ref(which_str), mode, loop, min_str, max_str), {"okay", "left", "right"});
dlog["cancel"].attachClickHandler(std::bind(&cDialog::toast, _1, false)); dlog["cancel"].attachClickHandler(std::bind(&cDialog::toast, _1, false));
dlog["num"].setText(str_info(mode, which_str)); dlog["num"].setText(str_info(mode, which_str));
dlog["text"].setText(fetch_str(mode, which_str)); dlog["text"].setText(fetch_str(mode, which_str));
if(!loop && which_str == min_str) dlog["left"].hide();
if(!loop && max_str >= 0 && which_str == max_str) dlog["right"].hide();
dlog.run(); dlog.run();
return dlog.accepted() || which_str != first; return dlog.accepted() || which_str != first;
@@ -1056,6 +1067,23 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
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.top().mode), &store, &me);
break; break;
case eSpecPicker::MSG_SEQUENCE_VAR:
if(val < 0) {
// If no string was specified, start appending strings to the end of the list.
auto mode = eStrMode(edit_stack.top().mode);
store = num_strs(mode);
ensure_str(mode, store);
if(edit_text_str(store, mode, false, store)) {
auto otherField = get_control_for_field(fcn.continuation);
me[otherField].setTextToNum(num_strs(mode) - 1);
} else store = val;
} else {
// Otherwise, edit only the sequence of strings specified. The values of the fields won't change.
store = val;
auto otherField = get_control_for_field(fcn.continuation);
edit_text_str(val, eStrMode(edit_stack.top().mode), false, val, me[otherField].getTextAsNum());
}
break;
case eSpecPicker::TOGGLE: { case eSpecPicker::TOGGLE: {
// TODO: We should also add a focus handler so that manually changing the field value updates the toggle... // TODO: We should also add a focus handler so that manually changing the field value updates the toggle...
cLed& toggle = dynamic_cast<cLed&>(me[item_hit]); cLed& toggle = dynamic_cast<cLed&>(me[item_hit]);

View File

@@ -14,7 +14,7 @@ short choose_text_res(std::string res_list,short first_t,short last_t,unsigned s
short choose_text(eStrType list, unsigned short cur_choice, cDialog* parent,std::string title); short choose_text(eStrType list, unsigned short cur_choice, cDialog* parent,std::string title);
short choose_text_editable(std::vector<std::string>& list, short cur_choice, cDialog* parent, std::string title); short choose_text_editable(std::vector<std::string>& list, short cur_choice, cDialog* parent, std::string title);
short choose_pattern(short cur_choice, cDialog* parent, bool expandRotatable); short choose_pattern(short cur_choice, cDialog* parent, bool expandRotatable);
bool edit_text_str(short which_str,eStrMode mode); bool edit_text_str(short which_str,eStrMode mode,bool loop = true,short min_str = 0,short max_str = -1);
bool edit_spec_enc(short which_node,short mode,cDialog* parent); bool edit_spec_enc(short which_node,short mode,cDialog* parent);
short get_fresh_spec(short which_mode); short get_fresh_spec(short which_mode);
void edit_spec_text(eStrMode mode,short *str1,short *str2,cDialog* parent); void edit_spec_text(eStrMode mode,short *str1,short *str2,cDialog* parent);