[Scummvm-cvs-logs] CVS: scummvm/gui EditTextWidget.cpp,1.11,1.12 EditTextWidget.h,1.6,1.7 newgui.cpp,1.45,1.46 newgui.h,1.24,1.25

Max Horn fingolfin at users.sourceforge.net
Mon May 5 09:11:06 CEST 2003


Update of /cvsroot/scummvm/scummvm/gui
In directory sc8-pr-cvs1:/tmp/cvs-serv29223

Modified Files:
	EditTextWidget.cpp EditTextWidget.h newgui.cpp newgui.h 
Log Message:
Patch #732707: EditTextWidget: long string support

Index: EditTextWidget.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/EditTextWidget.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- EditTextWidget.cpp	5 May 2003 10:38:16 -0000	1.11
+++ EditTextWidget.cpp	5 May 2003 16:10:18 -0000	1.12
@@ -32,6 +32,11 @@
 	_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 @@
 			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 @@
 			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 @@
 	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,16 +162,44 @@
 	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);
 	gui->addDirtyRect(x, y, 2, kLineHeight);
 
 	_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;
 }

Index: EditTextWidget.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/EditTextWidget.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- EditTextWidget.h	6 Mar 2003 21:45:33 -0000	1.6
+++ EditTextWidget.h	5 May 2003 16:10:19 -0000	1.7
@@ -34,6 +34,7 @@
 	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 @@
 	void drawWidget(bool hilite);
 	void drawCaret(bool erase);
 	void lostFocusWidget() { _backupString = _label; drawCaret(true); }
+
+	int getCaretPos();
+	bool adjustOffset();
 };
 
 #endif

Index: newgui.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/newgui.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- newgui.cpp	30 Apr 2003 21:37:02 -0000	1.45
+++ newgui.cpp	5 May 2003 16:10:19 -0000	1.46
@@ -429,13 +429,14 @@
 	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]);

Index: newgui.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/newgui.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- newgui.h	30 Apr 2003 13:57:57 -0000	1.24
+++ newgui.h	5 May 2003 16:10:19 -0000	1.25
@@ -135,7 +135,7 @@
 	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);





More information about the Scummvm-git-logs mailing list