mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-24 01:00:25 +00:00
dialog:: abstracted string editing
This commit is contained in:
parent
ade8bda5f9
commit
7e80be5a87
@ -929,8 +929,6 @@ vector<archimedean_tiling> tilings;
|
||||
|
||||
int spos = 0;
|
||||
|
||||
int editpos = 0;
|
||||
|
||||
archimedean_tiling edited;
|
||||
|
||||
bool symbol_editing;
|
||||
@ -1008,11 +1006,7 @@ void show() {
|
||||
dialog::init(XLAT("Archimedean tilings"));
|
||||
|
||||
if(symbol_editing) {
|
||||
string cs = edited.symbol;
|
||||
if(editpos < 0) editpos = 0;
|
||||
if(editpos > isize(cs)) editpos = isize(cs);
|
||||
cs.insert(editpos, "°");
|
||||
dialog::addSelItem("edit", cs, '/');
|
||||
dialog::addSelItem("edit", dialog::view_edited_string(), '/');
|
||||
dialog::add_action([] () {
|
||||
symbol_editing = false;
|
||||
if(!edited.errors) enable(edited);
|
||||
@ -1038,7 +1032,7 @@ void show() {
|
||||
dialog::add_action([] () {
|
||||
symbol_editing = true;
|
||||
edited = current;
|
||||
editpos = isize(current.symbol);
|
||||
dialog::start_editing(edited.symbol);
|
||||
edited.parse();
|
||||
});
|
||||
dialog::addBreak(100);
|
||||
@ -1128,19 +1122,8 @@ void show() {
|
||||
|
||||
keyhandler = [] (int sym, int uni) {
|
||||
if(symbol_editing && sym == SDLK_RETURN) sym = uni = '/';
|
||||
if(sym == SDLK_LEFT) editpos--;
|
||||
if(sym == SDLK_RIGHT) editpos++;
|
||||
dialog::handleNavigation(sym, uni);
|
||||
if(symbol_editing && uni == 8) {
|
||||
if(editpos == 0) return;
|
||||
edited.symbol.replace(editpos-1, 1, "");
|
||||
editpos--;
|
||||
edited.parse(edited.symbol);
|
||||
return;
|
||||
}
|
||||
if(symbol_editing && uni >= 32 && uni < 128) {
|
||||
edited.symbol.insert(editpos, 1, uni);
|
||||
editpos++;
|
||||
if(symbol_editing && dialog::handle_edit_string(sym, uni)) {
|
||||
edited.parse(edited.symbol);
|
||||
return;
|
||||
}
|
||||
|
77
dialogs.cpp
77
dialogs.cpp
@ -596,6 +596,7 @@ namespace dialog {
|
||||
string disp(ld x) { if(ne.intval) return its(ldtoint(x)); else if(ne.vmax-ne.vmin < 1) return fts4(x); else return fts(x); }
|
||||
|
||||
reaction_t reaction;
|
||||
reaction_t reaction_final;
|
||||
|
||||
reaction_t extra_options;
|
||||
|
||||
@ -770,7 +771,7 @@ namespace dialog {
|
||||
ne.sc.inverse(d * (ne.sc.direct(ne.vmax) - ne.sc.direct(ne.vmin)) + ne.sc.direct(ne.vmin));
|
||||
affect('v');
|
||||
}
|
||||
else if(doexiton(sym, uni)) popScreen();
|
||||
else if(doexiton(sym, uni)) { popScreen(); if(reaction_final) reaction_final(); }
|
||||
};
|
||||
}
|
||||
|
||||
@ -839,6 +840,7 @@ namespace dialog {
|
||||
cmode |= sm::NUMBER;
|
||||
pushScreen(drawNumberDialog);
|
||||
reaction = reaction_t();
|
||||
reaction_final = reaction_t();
|
||||
extra_options = reaction_t();
|
||||
numberdark = 0;
|
||||
}
|
||||
@ -1021,6 +1023,79 @@ namespace dialog {
|
||||
dialog::v.push_back(make_pair(s, color));
|
||||
}
|
||||
|
||||
int editpos = 0;
|
||||
string *edited_string;
|
||||
|
||||
string view_edited_string() {
|
||||
string cs = *edited_string;
|
||||
if(editpos < 0) editpos = 0;
|
||||
if(editpos > isize(cs)) editpos = isize(cs);
|
||||
cs.insert(editpos, "°");
|
||||
return cs;
|
||||
}
|
||||
|
||||
void start_editing(string& s) {
|
||||
edited_string = &s;
|
||||
editpos = isize(s);
|
||||
}
|
||||
|
||||
bool handle_edit_string(int sym, int uni) {
|
||||
auto& es = *edited_string;
|
||||
if(sym == SDLK_LEFT) editpos--;
|
||||
else if(sym == SDLK_RIGHT) editpos++;
|
||||
else if(uni == 8) {
|
||||
if(editpos == 0) return true;
|
||||
es.replace(editpos-1, 1, "");
|
||||
editpos--;
|
||||
}
|
||||
else if(uni >= 32 && uni < 128) {
|
||||
es.insert(editpos, 1, uni);
|
||||
editpos++;
|
||||
}
|
||||
else return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void string_edit_dialog() {
|
||||
cmode = sm::NUMBER | dialogflags;
|
||||
gamescreen(numberdark);
|
||||
init(ne.title);
|
||||
addInfo(view_edited_string());
|
||||
addBreak(100);
|
||||
dialog::addBack();
|
||||
addBreak(100);
|
||||
|
||||
if(ne.help != "") {
|
||||
addHelp(ne.help);
|
||||
}
|
||||
|
||||
if(extra_options) extra_options();
|
||||
|
||||
display();
|
||||
|
||||
keyhandler = [] (int sym, int uni) {
|
||||
handleNavigation(sym, uni);
|
||||
if(handle_edit_string(sym, uni)) ;
|
||||
else if(doexiton(sym, uni)) {
|
||||
popScreen();
|
||||
if(reaction_final) reaction_final();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void edit_string(string& s, string title, string help) {
|
||||
start_editing(s);
|
||||
ne.title = title;
|
||||
ne.help = help;
|
||||
dialogflags = (cmode & sm::A3);
|
||||
if(cmode & sm::SIDE) dialogflags |= sm::MAYDARK | sm::SIDE;
|
||||
cmode |= sm::NUMBER;
|
||||
pushScreen(string_edit_dialog);
|
||||
reaction = reaction_t();
|
||||
extra_options = reaction_t();
|
||||
numberdark = 0;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
7
hyper.h
7
hyper.h
@ -1741,7 +1741,7 @@ namespace dialog {
|
||||
|
||||
extern vector<item> items;
|
||||
|
||||
extern reaction_t reaction, extra_options;
|
||||
extern reaction_t reaction, extra_options, reaction_final;
|
||||
|
||||
item& lastItem();
|
||||
extern color_t *palette;
|
||||
@ -1797,6 +1797,11 @@ namespace dialog {
|
||||
void addHelp();
|
||||
void addBack();
|
||||
void add_action(reaction_t action);
|
||||
|
||||
string view_edited_string();
|
||||
void start_editing(string& s);
|
||||
bool handle_edit_string(int sym, int uni);
|
||||
void edit_string(string& s, string title, string help);
|
||||
}
|
||||
|
||||
void checkStunKill(cell *dest);
|
||||
|
@ -350,7 +350,7 @@ void draw_to(ld t0, hyperpoint h0, ld t1, hyperpoint h1, int small = 0, int big
|
||||
draw_to(t2, h2, t1, h1, small, big+1);
|
||||
}
|
||||
|
||||
int editpos = -1, editwhich = -1;
|
||||
int editwhich = -1;
|
||||
|
||||
void show_graph() {
|
||||
cmode = sm::SIDE | sm::MAYDARK;
|
||||
@ -358,15 +358,11 @@ void show_graph() {
|
||||
dialog::init(XLAT("graph"));
|
||||
for(int i=0; i<isize(formula); i++) {
|
||||
if(editwhich == i) {
|
||||
string cs = formula[i];
|
||||
if(editpos < 0) editpos = 0;
|
||||
if(editpos > isize(cs)) editpos = isize(cs);
|
||||
cs.insert(editpos, "°");
|
||||
dialog::addItem(cs, '1'+i);
|
||||
dialog::addItem(dialog::view_edited_string(), '1'+i);
|
||||
}
|
||||
else {
|
||||
dialog::addItem(formula[i], editwhich == -1 ? '1'+i : 0);
|
||||
dialog::add_action([i] () { editwhich = i; editpos = isize(formula[i]); });
|
||||
dialog::add_action([i] () { editwhich = i; dialog::start_editing(formula[i]); });
|
||||
}
|
||||
}
|
||||
|
||||
@ -375,20 +371,7 @@ void show_graph() {
|
||||
|
||||
keyhandler = [] (int sym, int uni) {
|
||||
if(editwhich >= 0) {
|
||||
string& edited = formula[editwhich];
|
||||
if(sym == SDLK_LEFT) editpos--;
|
||||
else if(sym == SDLK_RIGHT) editpos++;
|
||||
else if(uni == 8) {
|
||||
if(editpos == 0) return;
|
||||
edited.replace(editpos-1, 1, "");
|
||||
editpos--;
|
||||
return;
|
||||
}
|
||||
else if(uni >= 32 && uni < 128) {
|
||||
edited.insert(editpos, 1, uni);
|
||||
editpos++;
|
||||
return;
|
||||
}
|
||||
if(dialog::handle_edit_string(sym, uni)) ;
|
||||
else if(doexiton(sym, uni))
|
||||
editwhich = -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user