diff --git a/config.cpp b/config.cpp index 72dbf60d..2cff9385 100644 --- a/config.cpp +++ b/config.cpp @@ -144,6 +144,14 @@ template struct val_setting : public setting { virtual bool anim_unchanged() { return *value == anim_value; } virtual void anim_restore() { *value = anim_value; if(reaction) reaction(); } + + virtual void load_from_raw(const string& s) { throw hr_exception("load_from_raw not defined"); } + + void load_from(const string& s) override { + auto bak = *value; + load_from_raw(s); + if(*value != bak && reaction) reaction(); + } bool load_from_animation(const string& s) override { if(anim_value != *value) return false; load_from(s); @@ -174,7 +182,7 @@ struct float_setting : public val_setting { float_setting *modif(const function& r) { modify_me = r; return this; } supersaver *make_saver() override; void show_edit_option(int key) override; - void load_from(const string& s) override; + void load_from_raw(const string& s) override { *value = parseld(s); } virtual cld get_cld() override { return *value; } }; @@ -204,9 +212,7 @@ struct int_setting : public val_setting { virtual cld get_cld() override { return *value; } - void load_from(const string& s) override { - *value = parseint(s); - } + void load_from_raw(const string& s) override { *value = parseint(s); } virtual void check_change() { if(*value != last_value) { @@ -228,9 +234,7 @@ struct color_setting : public val_setting { return this; } - void load_from(const string& s) override { - sscanf(s.c_str(), "%x", value); - } + void load_from_raw(const string& s) override { sscanf(s.c_str(), "%x", value); } }; struct matrix_setting : public val_setting { @@ -244,15 +248,15 @@ struct matrix_setting : public val_setting { return this; } - void load_from(const string& s) override; + void load_from_raw(const string& s) override { *value = parsematrix23(s); } }; struct char_setting : public val_setting { supersaver *make_saver() override; void show_edit_option(int key) override; - void load_from(const string& s) override { - if(s == "\\0") value = 0; + void load_from_raw(const string& s) override { + if(s == "\\0") *value = 0; else sscanf(s.c_str(), "%c", value); } }; @@ -265,9 +269,9 @@ struct bool_setting : public val_setting { menu_item_name = cap; default_key = key; return this; } void show_edit_option(int key) override; - void load_from(const string& s) override { - *value = parseint(s); - } + + void load_from_raw(const string& s) override { *value = parseint(s); } + virtual cld get_cld() override { return *value; } }; @@ -490,20 +494,6 @@ supersaver *bool_setting::make_saver() { #endif } -void float_setting::load_from(const string& s) { - auto res = parseld(s); - auto bak = *value; - *value = res; - if(res != bak && reaction) reaction(); - } - -void matrix_setting::load_from(const string& s) { - auto res = parsematrix23(s); - auto bak = *value; - *value = res; - if(res != bak && reaction) reaction(); - } - void non_editable() { dialog::addHelp("Warning: editing this value through this menu may not work correctly"); } diff --git a/dialogs.cpp b/dialogs.cpp index c5545dc4..34c2b7d9 100644 --- a/dialogs.cpp +++ b/dialogs.cpp @@ -1101,7 +1101,7 @@ EX namespace dialog { if(ne.intval) *ne.intval = ldtoint(*ne.editwhat); #if CAP_ANIMATIONS if(ne.animatable) { - auto p = anims::find_param(ne.editwhat); + auto p = anims::find_param(ne.intval ? (void*) ne.intval : (void*) ne.editwhat); if(p) p->load_as_animation(ne.s); } #endif @@ -1388,7 +1388,7 @@ EX namespace dialog { EX void editNumber(int& x, int vmin, int vmax, ld step, int dft, string title, string help) { editNumber(ne.intbuf, vmin, vmax, step, dft, title, help); ne.intbuf = x; ne.intval = &x; ne.s = its(x); - ne.animatable = false; + ne.animatable = true; } EX void helpToEdit(int& x, int vmin, int vmax, int step, int dft) {