a system for all settings in one place

This commit is contained in:
Zeno Rogue 2021-01-31 19:55:33 +01:00
parent 0dc00763d5
commit 3d6e38a321
2 changed files with 132 additions and 29 deletions

View File

@ -30,6 +30,30 @@ typedef vector<shared_ptr<supersaver>> saverlist;
extern saverlist savers;
struct float_setting {
string parameter_name;
ld *value;
string config_name;
string menu_item_name;
string help_text;
ld dft;
ld min_value, max_value, step;
char default_key;
void add_as_saver();
void show_edit_option(char key);
void show_edit_option() { show_edit_option(default_key); }
float_setting *editable(string menu_item_name, ld min_value, ld max_value, ld step, string help_text, char key) {
this->min_value = min_value;
this->max_value = max_value;
this->menu_item_name = menu_item_name;
this->help_text = help_text;
this->step = step;
default_key = key;
return this;
}
};
#if CAP_CONFIG
template<class T> struct dsaver : supersaver {
@ -131,32 +155,45 @@ template<> struct saver<ld> : dsaver<ld> {
#endif
#endif
EX void addparamsaver(ld& val, const string s) {
params.insert({s, val});
#if CAP_CONFIG
addsaver(val, s);
#endif
void float_setting::add_as_saver() {
#if CAP_CONFIG
addsaver(*value, config_name);
#endif
}
EX void addparamsaver(ld& val, const string p, const string s) {
params.insert({p, val});
#if CAP_CONFIG
addsaver(val, s);
#endif
void float_setting::show_edit_option(char key) {
dialog::addSelItem(XLAT(menu_item_name), fts(*value), key);
dialog::add_action([this] () {
add_to_changed(this);
dialog::editNumber(*value, min_value, max_value, step, dft, XLAT(menu_item_name), help_text);
});
}
EX void addparamsaver(ld& val, const string s, ld dft) {
params.insert({s, val});
#if CAP_CONFIG
addsaver(val, s, dft);
#endif
EX float_setting *addparamsaver(ld& val, const string p, const string s, ld dft) {
unique_ptr<float_setting> u ( new float_setting );
u->parameter_name = p;
u->config_name = s;
u->menu_item_name = s;
u->value = &val;
u->min_value = 0;
u->max_value = 2 * dft;
u->step = dft / 10;
u->dft = dft;
val = dft;
u->add_as_saver();
return &* (params[s] = std::move(u));
}
EX void addparamsaver(ld& val, const string p, const string s, ld dft) {
params.insert({p, val});
#if CAP_CONFIG
addsaver(val, s, dft);
#endif
EX float_setting *addparamsaver(ld& val, const string s) {
return addparamsaver(val, s, s, val);
}
EX float_setting *addparamsaver(ld& val, const string p, const string s) {
return addparamsaver(val, p, s, val);
}
EX float_setting *addparamsaver(ld& val, const string s, ld dft) {
return addparamsaver(val, s, s, dft);
}
EX ld bounded_mine_percentage = 0.1;
@ -2350,6 +2387,72 @@ EX void configureMouse() {
dialog::display();
}
vector<float_setting*> last_changed;
EX void add_to_changed(float_setting *f) {
for(int i=0; i<isize(last_changed); i++) {
if(last_changed[i] == f)
return;
swap(last_changed[i], f);
}
last_changed.push_back(f);
}
EX void add_edit(ld& val) {
for(auto& fs: params)
if(fs.second->value == &val)
fs.second->show_edit_option();
}
EX void find_setting() {
cmode = sm::SIDE | sm::MAYDARK | sm::DIALOG_STRICT_X;
gamescreen(1);
dialog::init(XLAT("find setting"));
if(dialog::infix != "") mouseovers = dialog::infix;
vector<float_setting*> found;
for(auto& p: params) {
auto& fs = p.second;
string key = fs->parameter_name + "|" + fs->config_name + "|" + fs->menu_item_name;
if(dialog::hasInfix(key))
found.push_back(&*fs);
}
for(int i=0; i<9; i++) {
if(i < isize(found)) {
found[i]->show_edit_option('1' + i);
}
else dialog::addBreak(100);
}
dialog::addSelItem("matching items", its(isize(found)), 0);
dialog::display();
keyhandler = [] (int sym, int uni) {
dialog::handleNavigation(sym, uni);
if(dialog::editInfix(uni)) ;
else if(doexiton(sym, uni)) popScreen();
};
}
EX void edit_all_settings() {
gamescreen(1);
dialog::init(XLAT("edit all"));
int id = 0;
for(auto l: last_changed)
if(id < 10)
l->show_edit_option('a'+(id++));
dialog::addBreak(100);
dialog::addItem(XLAT("find a setting"), '/');
dialog::add_action_push(find_setting);
dialog::addBack();
dialog::display();
}
EX void showSettings() {
gamescreen(1);
dialog::init(XLAT("settings"));
@ -2626,6 +2729,9 @@ EX int read_config_args() {
PHASEFROM(2);
shift_arg_formula(precise_width);
}
else if(argis("-d:all")) {
PHASEFROM(2); launch_dialog(edit_all_settings);
}
else if(argis("-char")) {
auto& cs = vid.cs;
shift(); cs.charid = argi();
@ -2659,7 +2765,7 @@ EX int read_gamemode_args() {
auto ah_config = addHook(hooks_args, 0, read_config_args) + addHook(hooks_args, 0, read_gamemode_args) + addHook(hooks_args, 0, read_color_args);
#endif
EX map<string, ld&> params;
EX map<string, std::unique_ptr<float_setting>> params;
}

View File

@ -1459,7 +1459,7 @@ void list_animated_parameters() {
dialog::addBreak(50);
for(auto& ap: aps) {
string what = "?";
for(auto& p: params) if(&p.second == ap.value) what = p.first;
for(auto& p: params) if(p.second->value == ap.value) what = p.first;
dialog::addInfo(what + " = " + ap.formula);
}
dialog::addBreak(50);
@ -1576,12 +1576,8 @@ EX void show() {
};
});
}
else {
dialog::addSelItem(XLAT("cells to go"), fts(parabolic_length), 'c');
dialog::add_action([] () {
dialog::editNumber(parabolic_length, 0, 10, 1, 1, "cells to go", "");
});
}
else
add_edit(parabolic_length);
dialog::addSelItem(XLAT("shift"), fts(shift_angle) + "°", 'C');
dialog::add_action([] () {
dialog::editNumber(shift_angle, 0, 90, 15, 0, XLAT("shift"), "");
@ -1804,7 +1800,8 @@ auto animhook = addHook(hooks_frame, 100, display_animation)
addparamsaver(anims::period, "aperiod", "animation period");
addsaver(anims::noframes, "animation frames");
addparamsaver(anims::cycle_length, "acycle", "animation cycle length");
addparamsaver(anims::parabolic_length, "aparabolic", "animation parabolic length");
addparamsaver(anims::parabolic_length, "aparabolic", "animation parabolic length")
->editable("cells to go", 0, 10, 1, "", 'c');
addparamsaver(anims::rug_angle, "arugangle", "animation rug angle");
addparamsaver(anims::circle_radius, "acradius", "animation circle radius");
addparamsaver(anims::circle_spins, "acspins", "animation circle spins");