aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorMax Horn2003-05-05 16:10:19 +0000
committerMax Horn2003-05-05 16:10:19 +0000
commit898387e1ac906af80f7ee459306e75743c37a75a (patch)
tree1a058e3ed840e534e4815fd3fefbc9b1dde49015 /gui
parenta0c98d1f145c7e4b4d558673fc67b7635b94eacc (diff)
downloadscummvm-rg350-898387e1ac906af80f7ee459306e75743c37a75a.tar.gz
scummvm-rg350-898387e1ac906af80f7ee459306e75743c37a75a.tar.bz2
scummvm-rg350-898387e1ac906af80f7ee459306e75743c37a75a.zip
Patch #732707: EditTextWidget: long string support
svn-id: r7359
Diffstat (limited to 'gui')
-rw-r--r--gui/EditTextWidget.cpp76
-rw-r--r--gui/EditTextWidget.h4
-rw-r--r--gui/newgui.cpp3
-rw-r--r--gui/newgui.h2
4 files changed, 71 insertions, 14 deletions
diff --git a/gui/EditTextWidget.cpp b/gui/EditTextWidget.cpp
index 66dc654b8f..4ead9a73d6 100644
--- a/gui/EditTextWidget.cpp
+++ b/gui/EditTextWidget.cpp
@@ -32,6 +32,11 @@ EditTextWidget::EditTextWidget(Dialog *boss, int x, int y, int w, int h, const S
_caretTime = 0;
_pos = _label.size();
+
+ NewGui *gui = _boss->getGui();
+ _labelOffset = (gui->getStringWidth(_label) - (_w - 6));
+ if (_labelOffset < 0)
+ _labelOffset = 0;
}
void EditTextWidget::handleTickle() {
@@ -67,8 +72,10 @@ bool EditTextWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
break;
case 27: // escape
_label = _backupString;
- if (_pos >= _label.size())
- _pos = _label.size() - 1;
+ _pos = _label.size() - 1;
+ _labelOffset = (_boss->getGui()->getStringWidth(_label) - (_w-6));
+ if (_labelOffset < 0)
+ _labelOffset = 0;
_boss->releaseFocus();
dirty = true;
break;
@@ -84,18 +91,24 @@ bool EditTextWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
dirty = true;
break;
case 256 + 20: // left arrow
- if (_pos > 0)
+ if (_pos > 0) {
_pos--;
+ dirty = adjustOffset();
+ }
break;
case 256 + 19: // right arrow
- if (_pos < _label.size())
+ if (_pos < _label.size()) {
_pos++;
+ dirty = adjustOffset();
+ }
break;
case 256 + 22: // home
_pos = 0;
+ dirty = adjustOffset();
break;
case 256 + 23: // end
_pos = _label.size();
+ dirty = adjustOffset();
break;
default:
if (isprint((char)ascii)) {
@@ -123,8 +136,19 @@ void EditTextWidget::drawWidget(bool hilite) {
gui->vline(_x + _w - 1, _y, _y + _h - 1, gui->_shadowcolor);
// Draw the text
- _align = (gui->getStringWidth(_label) > _w - 6) ? kTextAlignRight : kTextAlignLeft;
- gui->drawString(_label, _x + 2, _y + 3, _w - 6, gui->_textcolor, _align);
+ adjustOffset();
+ gui->drawString(_label, _x + 2, _y + 3, _w - 6, gui->_textcolor, kTextAlignLeft, -_labelOffset);
+}
+
+int EditTextWidget::getCaretPos() {
+ NewGui *gui = _boss->getGui();
+ int caretpos = 0;
+ for (int i = 0; i < _pos; i++)
+ caretpos += gui->getCharWidth(_label[i]);
+
+ caretpos -= _labelOffset;
+
+ return caretpos;
}
void EditTextWidget::drawCaret(bool erase) {
@@ -138,12 +162,7 @@ void EditTextWidget::drawCaret(bool erase) {
int x = _x + _boss->getX() + 2;
int y = _y + _boss->getY() + 1;
- int width = 0;
- for (int i = 0; i < _pos; i++)
- width += gui->getCharWidth(_label[i]);
-
- if (gui->getStringWidth(_label) - (_w - 6) > 0)
- width -= gui->getStringWidth(_label) - (_w - 6);
+ int width = getCaretPos();
x += width;
gui->vline(x, y, y + kLineHeight, color);
@@ -151,3 +170,36 @@ void EditTextWidget::drawCaret(bool erase) {
_caretVisible = !erase;
}
+
+
+
+bool EditTextWidget::adjustOffset() {
+ // check if the caret is still within the textbox; if it isn't,
+ // adjust _labelOffset
+
+ int caretpos = getCaretPos();
+
+ if (caretpos < 0) {
+ // scroll left
+ _labelOffset += caretpos;
+ return true;
+ }
+ else if (caretpos >= _w - 6)
+ {
+ // scroll right
+ _labelOffset -= (_w - 6 - caretpos);
+ return true;
+ }
+ else if (_labelOffset > 0)
+ {
+ int width = _boss->getGui()->getStringWidth(_label);
+ if (width - _labelOffset < (_w - 6)) {
+ // scroll right
+ _labelOffset = (width - (_w - 6));
+ if (_labelOffset < 0)
+ _labelOffset = 0;
+ }
+ }
+
+ return false;
+}
diff --git a/gui/EditTextWidget.h b/gui/EditTextWidget.h
index e321d4715a..c81e50a29f 100644
--- a/gui/EditTextWidget.h
+++ b/gui/EditTextWidget.h
@@ -34,6 +34,7 @@ protected:
bool _caretVisible;
uint32 _caretTime;
int _pos;
+ int _labelOffset;
public:
EditTextWidget(Dialog *boss, int x, int y, int w, int h, const String &text);
@@ -47,6 +48,9 @@ protected:
void drawWidget(bool hilite);
void drawCaret(bool erase);
void lostFocusWidget() { _backupString = _label; drawCaret(true); }
+
+ int getCaretPos();
+ bool adjustOffset();
};
#endif
diff --git a/gui/newgui.cpp b/gui/newgui.cpp
index 5eb7550c82..f1292d49bc 100644
--- a/gui/newgui.cpp
+++ b/gui/newgui.cpp
@@ -429,13 +429,14 @@ int NewGui::getCharWidth(byte c) {
return guifont[c+6];
}
-void NewGui::drawString(const String &str, int x, int y, int w, NewGuiColor color, int align) {
+void NewGui::drawString(const String &str, int x, int y, int w, NewGuiColor color, int align, int deltax) {
const int leftX = x, rightX = x + w;
int width = getStringWidth(str);
if (align == kTextAlignCenter)
x = x + (w - width - 1)/2;
else if (align == kTextAlignRight)
x = x + w - width;
+ x += deltax;
for (int i = 0; i < str.size(); ++i) {
w = getCharWidth(str[i]);
diff --git a/gui/newgui.h b/gui/newgui.h
index c0f8fe5d4b..c3aceaf902 100644
--- a/gui/newgui.h
+++ b/gui/newgui.h
@@ -135,7 +135,7 @@ public:
void drawChar(byte c, int x, int y, NewGuiColor color);
int getStringWidth(const String &str);
int getCharWidth(byte c);
- void drawString(const String &str, int x, int y, int w, NewGuiColor color, int align = kTextAlignLeft);
+ void drawString(const String &str, int x, int y, int w, NewGuiColor color, int align = kTextAlignLeft, int deltax = 0);
void blitFromBuffer(int x, int y, int w, int h, const byte *buf, int pitch);
void blitToBuffer(int x, int y, int w, int h, byte *buf, int pitch);