add scroll ability for Window::GetString

This commit is contained in:
unK
2008-09-10 21:22:38 +02:00
parent 415096c067
commit 25c2f3fb49
2 changed files with 58 additions and 39 deletions

View File

@@ -408,38 +408,42 @@ void Window::WriteXY(int x, int y, int limit, const string &str, bool cleartoeol
Write(limit, str, cleartoeol); Write(limit, str, cleartoeol);
} }
string Window::GetString(const string &base, unsigned int length) const string Window::GetString(const string &base, unsigned int length, int width) const
{ {
curs_set(1); int input, beginning, maxbeginning, minx, x, y, maxx;
keypad(itsWindow,TRUE);
int input, minx, x, y, maxx;
wstring tmp;
getyx(itsWindow,y,x); getyx(itsWindow,y,x);
minx = maxx = x; minx = maxx = x;
tmp = ToWString(base); if (width == -1)
width = itsWidth-x-1;
if (width < 0)
return "";
wmove(itsWindow,y,minx); curs_set(1);
wprintw(itsWindow, "%ls",tmp.c_str()); keypad(itsWindow, 1);
wstring tmp = ToWString(base);
maxx += tmp.length();
wrefresh(itsWindow);
string tmp_in; string tmp_in;
wchar_t wc_in; wchar_t wc_in;
maxbeginning = beginning = tmp.length() < width ? 0 : tmp.length()-width;
maxx += tmp.length() < width ? tmp.length() : width;
x = maxx; x = maxx;
do do
{ {
mvwprintw(itsWindow, y, minx, "%ls",tmp.c_str()); maxbeginning = tmp.length() < width ? 0 : tmp.length()-width;
wclrtoeol(itsWindow); maxx = minx + (tmp.length() < width ? tmp.length() : width);
if (beginning > maxbeginning)
beginning = maxbeginning;
mvwhline(itsWindow, y, minx, 32, width);
mvwprintw(itsWindow, y, minx, "%ls", tmp.substr(beginning, width+1).c_str());
if (itsGetStringHelper) if (itsGetStringHelper)
itsGetStringHelper(); itsGetStringHelper();
wmove(itsWindow,y,x); wmove(itsWindow,y,x);
input = wgetch(itsWindow); input = wgetch(itsWindow);
@@ -448,68 +452,83 @@ string Window::GetString(const string &base, unsigned int length) const
case ERR: case ERR:
continue; continue;
case KEY_UP: case KEY_UP:
case KEY_DOWN: break; case KEY_DOWN:
break;
case KEY_RIGHT: case KEY_RIGHT:
{ {
if (x < maxx) if (x < maxx)
x++; x++;
else if (beginning < maxbeginning)
beginning++;
break; break;
} }
case KEY_BACKSPACE: case 127: case KEY_BACKSPACE: case 127:
{ {
if (x <= minx) break; if (x <= minx && !beginning)
break;
} }
case KEY_LEFT: case KEY_LEFT:
{ {
if (x > minx) if (x > minx)
x--; x--;
if (input != KEY_BACKSPACE && input != 127) break; // backspace = left & delete. else if (beginning > 0)
beginning--;
if (input != KEY_BACKSPACE && input != 127)
break; // backspace = left & delete.
} }
case KEY_DC: case KEY_DC:
{ {
if ((maxx-x) < 1) break; if ((x-minx)+beginning == tmp.length())
tmp.erase(tmp.end()-(maxx-x)); break;
wmove(itsWindow,y,x); // for backspace tmp.erase(tmp.begin()+(x-minx)+beginning);
//wdelch(itsWindow); if (beginning && beginning == maxbeginning && x < maxx)
maxx--; x++;
break; break;
} }
case KEY_HOME: case KEY_HOME:
{ {
x = minx; x = minx;
beginning = 0;
break; break;
} }
case KEY_END: case KEY_END:
{ {
x = maxx; x = maxx;
beginning = maxbeginning;
break; break;
} }
case 10: break; case 10:
break;
default: default:
{ {
if (maxx-minx >= length) if (tmp.length() >= length)
break; break;
tmp_in += input; tmp_in += input;
if (mbtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX) < 0) if (mbtowc(&wc_in, tmp_in.c_str(), MB_CUR_MAX) < 0)
break; break;
if (maxx == x) if ((x-minx)+beginning == tmp.length())
{
tmp.push_back(wc_in); tmp.push_back(wc_in);
else if (!beginning)
tmp.insert(tmp.end()-(maxx-x),wc_in);
//winsstr(itsWindow, tmp_in.c_str());
tmp_in.clear();
x++; x++;
maxx++; beginning++;
}
else
{
tmp.insert(tmp.begin()+(x-minx)+beginning, wc_in);
if (x < maxx)
x++;
else if (beginning < maxbeginning)
beginning++;
}
tmp_in.clear();
} }
} }
} }
while (input != 10); while (input != 10);
keypad(itsWindow, 0);
keypad(itsWindow, FALSE);
curs_set(0); curs_set(0);
return ToString(tmp); return ToString(tmp);
} }

View File

@@ -96,8 +96,8 @@ class Window
virtual void WriteXY(int x, int y, const wstring &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); } virtual void WriteXY(int x, int y, const wstring &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); }
virtual void WriteXY(int, int, int, const wstring &, bool = 0); virtual void WriteXY(int, int, int, const wstring &, bool = 0);
#endif #endif
virtual string GetString(const string &, unsigned int = -1) const; virtual string GetString(const string &, unsigned int = -1, int = -1) const;
virtual string GetString(unsigned int length = -1) const { return GetString("", length); } virtual string GetString(unsigned int length = -1, int width = -1) const { return GetString("", length, width); }
virtual void Scrollable(bool) const; virtual void Scrollable(bool) const;
virtual void GetXY(int &, int &) const; virtual void GetXY(int &, int &) const;
virtual void GotoXY(int, int) const; virtual void GotoXY(int, int) const;