From ff8bb20a55d868d7e9fcfd5f9283bc16c5affb92 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 26 May 2024 20:51:33 +0200 Subject: [PATCH] config:: custom parameters now have custom_do_save --- config.cpp | 11 ++++++++--- models.cpp | 7 ++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/config.cpp b/config.cpp index 089602e7..5d984e10 100644 --- a/config.cpp +++ b/config.cpp @@ -408,6 +408,7 @@ struct custom_parameter : public parameter { function custom_affect; function custom_load; function custom_save; + function custom_do_save; function(struct local_parameter_set& lps, void *value)> custom_clone; virtual shared_ptr clone(struct local_parameter_set& lps, void *value) { @@ -449,7 +450,7 @@ struct custom_parameter : public parameter { virtual cld get_cld() override { return custom_value(); } virtual string save() override { if(custom_save) return custom_save(); else return "not saveable"; } - virtual bool dosave() override { return false; } + virtual bool dosave() override { if(custom_do_save) return custom_do_save(); else return false; } virtual void reset() override {} virtual void set_default() override {} virtual void swap_with(parameter*) override {} @@ -725,12 +726,14 @@ template shared_ptr param_custom_int(T& val, const parameter_names& n, function menuitem, char key) { shared_ptr u ( new custom_parameter ); u->setup(n); - u->last_value = (int) val; + int dft = (int) val; + u->last_value = dft; u->custom_viewer = menuitem; u->custom_value = [&val] () { return (int) val; }; u->custom_affect = [&val] (void *v) { return &val == v; }; u->custom_load = [&val] (const string& s) { val = (T) parseint(s); }; u->custom_save = [&val] { return its(int(val)); }; + u->custom_do_save = [dft, &val] { return int(val) != dft; }; u->custom_clone = [u] (struct local_parameter_set& lps, void *value) { auto val = (int*) value; return param_i(*val, lps.mod(&*u), *val); }; u->default_key = key; u->is_editable = true; @@ -741,12 +744,14 @@ shared_ptr param_custom_int(T& val, const parameter_names& n, EX shared_ptr param_custom_ld(ld& val, const parameter_names& n, function menuitem, char key) { shared_ptr u ( new custom_parameter ); u->setup(n); - u->last_value = (int) val; + ld dft = val; + u->last_value = dft; u->custom_viewer = menuitem; u->custom_value = [&val] () { return val; }; u->custom_affect = [&val] (void *v) { return &val == v; }; u->custom_load = [&val] (const string& s) { val = parseld(s); }; u->custom_save = [&val] { return fts(val, 10); }; + u->custom_do_save = [dft, &val] { return val != dft; }; u->custom_clone = [u] (struct local_parameter_set& lps, void *value) { auto val = (ld*) value; return param_f(*val, lps.mod(&*u), *val); }; u->default_key = key; diff --git a/models.cpp b/models.cpp index ff5977e2..92532d6c 100644 --- a/models.cpp +++ b/models.cpp @@ -949,8 +949,9 @@ EX namespace models { dynamicval> ds(auto_restrict); auto_restrict = [&p] { return &vpconf == &p; }; - param_enum(p.model, parameter_names(pp+"used_model", pp+"used model"), mdDisk); - if(&p.model == &pmodel) param_custom_int(pmodel, "projection|Poincare|Klein|half-plane|perspective", menuitem_projection, '1'); + if(&p.model == &pmodel) + param_custom_int(pmodel, "projection|Poincare|Klein|half-plane|perspective", menuitem_projection, '1'); + else param_enum(p.model, parameter_names(pp+"used_model", pp+"used model"), mdDisk); param_matrix(p.mori().v2, pp+"mori", 2) -> editable("model orientation", "", 'o'); @@ -1063,9 +1064,9 @@ EX namespace models { param_i(p.back_and_front, sp+"backandfront", 0); if(&p.model == &pmodel) { + p.alpha = 1; auto proj = param_custom_ld(p.alpha, sp+"projection", menuitem_projection_distance, 'p'); proj->help_text = "projection distance|Gans Klein Poincare orthographic stereographic"; - p.alpha = 1; } else { param_f(p.alpha, sp+"projection", 1);