add scroll ability for Window::GetString
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user