mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-10 02:14:06 +00:00
dialog:: cleaned string dialog
This commit is contained in:
parent
f50964d576
commit
c9a9a38188
@ -1349,6 +1349,8 @@ function<void()> setcanvas(char c) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog::string_dialog se;
|
||||||
|
|
||||||
EX void show() {
|
EX void show() {
|
||||||
if(lastsample < isize(samples)) {
|
if(lastsample < isize(samples)) {
|
||||||
string s = samples[lastsample].first;
|
string s = samples[lastsample].first;
|
||||||
@ -1374,7 +1376,7 @@ EX void show() {
|
|||||||
dialog::init(XLAT("Archimedean tilings"));
|
dialog::init(XLAT("Archimedean tilings"));
|
||||||
|
|
||||||
if(symbol_editing) {
|
if(symbol_editing) {
|
||||||
dialog::addSelItem("edit", dialog::view_edited_string(), '/');
|
dialog::addSelItem("edit", se.view_edited_string(), '/');
|
||||||
dialog::add_action([] () {
|
dialog::add_action([] () {
|
||||||
symbol_editing = false;
|
symbol_editing = false;
|
||||||
if(!edited.errors) enable(edited);
|
if(!edited.errors) enable(edited);
|
||||||
@ -1405,7 +1407,7 @@ EX void show() {
|
|||||||
dialog::add_action([] () {
|
dialog::add_action([] () {
|
||||||
symbol_editing = true;
|
symbol_editing = true;
|
||||||
edited = current;
|
edited = current;
|
||||||
dialog::start_editing(edited.symbol);
|
se.start_editing(edited.symbol);
|
||||||
edited.parse();
|
edited.parse();
|
||||||
});
|
});
|
||||||
dialog::addBreak(100);
|
dialog::addBreak(100);
|
||||||
@ -1508,7 +1510,7 @@ EX void show() {
|
|||||||
keyhandler = [] (int sym, int uni) {
|
keyhandler = [] (int sym, int uni) {
|
||||||
if(symbol_editing && sym == SDLK_RETURN) sym = uni = '/';
|
if(symbol_editing && sym == SDLK_RETURN) sym = uni = '/';
|
||||||
dialog::handleNavigation(sym, uni);
|
dialog::handleNavigation(sym, uni);
|
||||||
if(symbol_editing && dialog::handle_edit_string(sym, uni)) {
|
if(symbol_editing && se.handle_edit_string(sym, uni)) {
|
||||||
edited.parse(edited.symbol);
|
edited.parse(edited.symbol);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
36
dialogs.cpp
36
dialogs.cpp
@ -1717,10 +1717,23 @@ EX namespace dialog {
|
|||||||
dialog::v.push_back(make_pair(s, color));
|
dialog::v.push_back(make_pair(s, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
int editpos = 0;
|
EX string editchecker(int sym, int uni) {
|
||||||
EX string *edited_string;
|
if(uni >= 32 && uni < 127) return string("") + char(uni);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
EX string view_edited_string() {
|
#if HDR
|
||||||
|
struct string_dialog : extdialog {
|
||||||
|
int editpos = 0;
|
||||||
|
string *edited_string;
|
||||||
|
string view_edited_string();
|
||||||
|
void draw();
|
||||||
|
void start_editing(string& s);
|
||||||
|
bool handle_edit_string(int sym, int uni, function<string(int, int)> checker = editchecker);
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
string string_dialog::view_edited_string() {
|
||||||
string cs = *edited_string;
|
string cs = *edited_string;
|
||||||
if(editpos < 0) editpos = 0;
|
if(editpos < 0) editpos = 0;
|
||||||
if(editpos > isize(cs)) editpos = isize(cs);
|
if(editpos > isize(cs)) editpos = isize(cs);
|
||||||
@ -1728,17 +1741,12 @@ EX namespace dialog {
|
|||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void start_editing(string& s) {
|
void string_dialog::start_editing(string& s) {
|
||||||
edited_string = &s;
|
edited_string = &s;
|
||||||
editpos = isize(s);
|
editpos = isize(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
EX string editchecker(int sym, int uni) {
|
bool string_dialog::handle_edit_string(int sym, int uni, function<string(int, int)> checker) {
|
||||||
if(uni >= 32 && uni < 127) return string("") + char(uni);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
EX bool handle_edit_string(int sym, int uni, function<string(int, int)> checker IS(editchecker)) {
|
|
||||||
auto& es = *edited_string;
|
auto& es = *edited_string;
|
||||||
string u2;
|
string u2;
|
||||||
if(DKEY == SDLK_LEFT) editpos--;
|
if(DKEY == SDLK_LEFT) editpos--;
|
||||||
@ -1747,21 +1755,19 @@ EX namespace dialog {
|
|||||||
if(editpos == 0) return true;
|
if(editpos == 0) return true;
|
||||||
es.replace(editpos-1, 1, "");
|
es.replace(editpos-1, 1, "");
|
||||||
editpos--;
|
editpos--;
|
||||||
|
if(reaction) reaction();
|
||||||
}
|
}
|
||||||
else if((u2 = checker(sym, uni)) != "") {
|
else if((u2 = checker(sym, uni)) != "") {
|
||||||
for(char c: u2) {
|
for(char c: u2) {
|
||||||
es.insert(editpos, 1, c);
|
es.insert(editpos, 1, c);
|
||||||
editpos ++;
|
editpos ++;
|
||||||
}
|
}
|
||||||
|
if(reaction) reaction();
|
||||||
}
|
}
|
||||||
else return false;
|
else return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct string_dialog : extdialog {
|
|
||||||
void draw();
|
|
||||||
};
|
|
||||||
|
|
||||||
void string_dialog::draw() {
|
void string_dialog::draw() {
|
||||||
cmode = sm::NUMBER | dialogflags;
|
cmode = sm::NUMBER | dialogflags;
|
||||||
gamescreen();
|
gamescreen();
|
||||||
@ -1789,10 +1795,10 @@ EX namespace dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX void edit_string(string& s, string title, string help) {
|
EX void edit_string(string& s, string title, string help) {
|
||||||
start_editing(s);
|
|
||||||
string_dialog ne;
|
string_dialog ne;
|
||||||
ne.title = title;
|
ne.title = title;
|
||||||
ne.help = help;
|
ne.help = help;
|
||||||
|
ne.start_editing(s);
|
||||||
pushScreen(ne);
|
pushScreen(ne);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user