Implement a mechanism for a special node picker to affect two fields

Use it for the MSG_PAIR picker and the PIC_NONE picker.
This commit is contained in:
2025-02-22 20:41:26 -05:00
committed by Celtic Minstrel
parent 1d119e1f26
commit 2b93d739e8
3 changed files with 40 additions and 11 deletions

View File

@@ -762,7 +762,7 @@ node_builder_t& node_builder_t::sdf() {
}
node_builder_t& node_builder_t::msg() {
return msg1(eSpecPicker::MSG_PAIR).msg2(eSpecPicker::NONE);
return field_pair(eSpecField::MSG1, eSpecField::MSG2, eSpecPicker::MSG_PAIR);
};
node_builder_t& node_builder_t::rect() {
@@ -772,7 +772,7 @@ node_builder_t& node_builder_t::rect() {
};
node_builder_t& node_builder_t::pic() {
return pict(eSpecPicker::PICTURE).ptyp(STRT_PICT);
return field_pair(eSpecField::PICT, eSpecField::PTYP, eSpecPicker::PICTURE).ptyp(STRT_PICT);
}
node_builder_t& node_builder_t::sdf1(node_function_t picker) {
@@ -838,8 +838,9 @@ node_builder_t& node_builder_t::field(eSpecField field, node_function_t picker)
}
node_builder_t& node_builder_t::field_pair(eSpecField main, eSpecField extra, node_function_t picker) {
// Not implemented yet, so just assign the picker to the main field and NONE to the extra field.
return field(main, picker).field(extra, eSpecPicker::NONE);
field(main, picker).field(extra, eSpecPicker::NONE);
(node.*fields().map[main]).continuation = extra;
return *this;
}
node_builder_t& node_builder_t::sdf(eSpecField a, eSpecField b) {

View File

@@ -160,7 +160,7 @@ enum class eSpecPicker {
POINTER,
};
enum class eSpecField { SDF1, SDF2, MSG1, MSG2, MSG3, PICT, PTYP, EX1A, EX1B, EX1C, EX2A, EX2B, EX2C, JUMP };
enum class eSpecField { NONE, SDF1, SDF2, MSG1, MSG2, MSG3, PICT, PTYP, EX1A, EX1B, EX1C, EX2A, EX2B, EX2C, JUMP };
struct node_function_t {
eSpecPicker button = eSpecPicker::NONE;
@@ -172,6 +172,7 @@ struct node_function_t {
};
bool augmented = false; // only for eSpecPicker::FIELD and eSpecPicker::STRING with certain string types
int adjust = 0; // only for eSpecPicker::STRING
eSpecField continuation = eSpecField::NONE;
std::string label() const;
std::string help() const; // maybe we don't need this though? I guess it would be for a hypothetical help button next to each field to give addition info on how that one field works.
node_function_t();

View File

@@ -855,18 +855,44 @@ static node_function_t get_field_function(const cSpecial& spec, const std::strin
return node_function_t();
}
static std::string get_control_for_field(eSpecField field) {
switch(field) {
case eSpecField::SDF1: return "sdf1";
case eSpecField::SDF2: return "sdf2";
case eSpecField::MSG1: return "msg1";
case eSpecField::MSG2: return "msg2";
case eSpecField::MSG3: return "msg3";
case eSpecField::PICT: return "pict";
case eSpecField::PTYP: return "pictype";
case eSpecField::EX1A: return "x1a";
case eSpecField::EX1B: return "x1b";
case eSpecField::EX1C: return "x1c";
case eSpecField::EX2A: return "x2a";
case eSpecField::EX2B: return "x2b";
case eSpecField::EX2C: return "x2c";
case eSpecField::JUMP: return "jump";
case eSpecField::NONE: break;
}
return "num";
}
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('-'));
const cSpecial& spec = edit_stack.top().node;
node_function_t fcn = get_field_function(spec, field);
short val = me[field].getTextAsNum(), store;
switch(fcn.button) {
case eSpecPicker::MSG_PAIR:
store = me["msg2"].getTextAsNum();
case eSpecPicker::MSG_PAIR: {
if(fcn.continuation == eSpecField::NONE) {
store = val;
break;
}
auto otherField = get_control_for_field(fcn.continuation);
store = me[otherField].getTextAsNum();
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.top().mode), &val, &store, &me);
me["msg2"].setTextToNum(store);
me[otherField].setTextToNum(store);
store = val;
break;
} break;
case eSpecPicker::MSG_SINGLE:
edit_spec_text(fcn.force_global ? STRS_SCEN : eStrMode(edit_stack.top().mode), &val, nullptr, &me);
store = val;
@@ -958,9 +984,10 @@ static bool edit_spec_enc_value(cDialog& me, std::string item_hit, node_stack_t&
case eSpecPicker::PICTURE: {
ePicType type = fcn.pic_type;
if(type == PIC_NONE) {
short pictype = me["pictype"].getTextAsNum();
auto otherField = get_control_for_field(fcn.continuation);
short pictype = me[otherField].getTextAsNum();
if(pictype < 0) {
me["pictype"].setTextToNum(PIC_DLOG);
me[otherField].setTextToNum(PIC_DLOG);
type = PIC_DLOG;
} else type = ePicType(pictype);
}