[Scummvm-cvs-logs] CVS: scummvm/gui ListWidget.cpp,1.2,1.3 ScrollBarWidget.cpp,1.1,1.2 ScrollBarWidget.h,1.1,1.2

Max Horn fingolfin at users.sourceforge.net
Fri Jul 12 16:01:15 CEST 2002


Update of /cvsroot/scummvm/scummvm/gui
In directory usw-pr-cvs1:/tmp/cvs-serv12710/gui

Modified Files:
	ListWidget.cpp ScrollBarWidget.cpp ScrollBarWidget.h 
Log Message:
implemented scrollbar 'dragging' (based largely on painelf's patch)

Index: ListWidget.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/ListWidget.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ListWidget.cpp	12 Jul 2002 16:24:11 -0000	1.2
+++ ListWidget.cpp	12 Jul 2002 23:00:35 -0000	1.3
@@ -41,7 +41,7 @@
 
 
 ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h)
-	: Widget(boss, x, y, w - SCROLLBAR_WIDTH, h)
+	: Widget(boss, x, y, w - kScrollBarWidth, h)
 {
 	_flags = WIDGET_ENABLED | WIDGET_CLEARBG;
 	_type = kListWidget;
@@ -49,7 +49,7 @@
 	_entriesPerPage = (_h - 4) / LINE_HEIGHT;
 	_currentPos = 3;
 	
-	_scrollBar = new ScrollBarWidget(boss, _x + _w, _y, SCROLLBAR_WIDTH, _h);
+	_scrollBar = new ScrollBarWidget(boss, _x + _w, _y, kScrollBarWidth, _h);
 	_scrollBar->setTarget(this);
 	
 	// FIXME - fill in dummy data for now

Index: ScrollBarWidget.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/ScrollBarWidget.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ScrollBarWidget.cpp	12 Jul 2002 16:24:11 -0000	1.1
+++ ScrollBarWidget.cpp	12 Jul 2002 23:00:35 -0000	1.2
@@ -32,6 +32,7 @@
  * - Allow for a horizontal scrollbar, too?
  */
 
+#define UP_DOWN_BOX_HEIGHT	10
 
 // Up arrow
 static uint32 up_arrow[8] = {
@@ -58,22 +59,24 @@
 };
 
 ScrollBarWidget::ScrollBarWidget(Dialog *boss, int x, int y, int w, int h)
-	: Widget(boss, x, y, w, h), CommandSender(boss)
+	: Widget (boss, x, y, w, h), CommandSender(boss)
 {
 	_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG;
 	_type = kScrollBarWidget;
-	
+
 	_part = kNoPart;
-	
+	_isDraggingSlider = false;
+
 }
 
 void ScrollBarWidget::handleClick(int x, int y, int button)
 {
 	int old_pos = _currentPos;
-	if (y <= 10) {
+
+	if (y <= UP_DOWN_BOX_HEIGHT) {
 		// Up arrow
 		_currentPos--;
-	} else if (y >= _h-10) {
+	} else if (y >= _h - UP_DOWN_BOX_HEIGHT) {
 		// Down arrow
 		_currentPos++;
 	} else if (y < _sliderPos) {
@@ -81,16 +84,13 @@
 	} else if (y >= _sliderPos + _sliderHeight) {
 		_currentPos += _entriesPerPage;
 	} else {
-		printf("Slider\n");
+		_isDraggingSlider = true;
+		_sliderDeltaMouseDownPos = y - _sliderPos;
 	}
-	
-	// Bound checking
-	if (_currentPos > _numEntries - _entriesPerPage)
-		_currentPos = _numEntries - _entriesPerPage;
-	else if (_currentPos < 0)
-		_currentPos = 0;
-	
-	// Redraw & notify, but only if the position really changed
+
+	// Make sure that _currentPos is still inside the bounds
+	checkbounds();
+
 	if (old_pos != _currentPos) {
 		recalc();
 		draw();
@@ -100,58 +100,88 @@
 
 void ScrollBarWidget::handleMouseMoved(int x, int y, int button)
 {
-	int old_part = _part;
-	if (y <= 10)				// Up arrow
-		_part = kUpArrowPart;
-	else if (y >= _h-10)		// Down arrow
-		_part = kDownArrowPart;
-	else if (y < _sliderPos)
-		_part = kPageUpPart;
-	else if (y >= _sliderPos + _sliderHeight)
-		_part = kPageDownPart;
-	else
-		_part = kSliderPart;
-	
-	if (old_part != _part)
-		draw();
+	if (button == 0)
+		_isDraggingSlider = false;
+
+	if (_isDraggingSlider) {
+		int old_pos = _currentPos;
+		_sliderPos = y - _sliderDeltaMouseDownPos;
+
+		if (_sliderPos < UP_DOWN_BOX_HEIGHT)
+			_sliderPos = UP_DOWN_BOX_HEIGHT;
+
+		if (_sliderPos > _h - UP_DOWN_BOX_HEIGHT - _sliderHeight + 1)
+			_sliderPos = _h - UP_DOWN_BOX_HEIGHT - _sliderHeight + 1;
+
+		_currentPos =
+			(_sliderPos - UP_DOWN_BOX_HEIGHT) * (_numEntries - _entriesPerPage) / (_h - _sliderHeight -
+																																						 2 * UP_DOWN_BOX_HEIGHT);
+		checkbounds();
+
+		if (_currentPos != old_pos) {
+			draw();
+			sendCommand(kSetPositionCmd, _currentPos);
+		}
+	} else {
+		int old_part = _part;
+
+		if (y <= UP_DOWN_BOX_HEIGHT)	// Up arrow
+			_part = kUpArrowPart;
+		else if (y >= _h - UP_DOWN_BOX_HEIGHT)	// Down arrow
+			_part = kDownArrowPart;
+		else if (y < _sliderPos)
+			_part = kPageUpPart;
+		else if (y >= _sliderPos + _sliderHeight)
+			_part = kPageDownPart;
+		else
+			_part = kSliderPart;
+
+		if (old_part != _part)
+			draw();
+	}
+}
+
+void ScrollBarWidget::checkbounds()
+{
+	if (_currentPos > _numEntries - _entriesPerPage)
+		_currentPos = _numEntries - _entriesPerPage;
+	else if (_currentPos < 0)
+		_currentPos = 0;
 }
 
 void ScrollBarWidget::recalc()
 {
-	_sliderHeight = (_h-20) * _entriesPerPage / _numEntries;
+	_sliderHeight = (_h - 2 * UP_DOWN_BOX_HEIGHT) * _entriesPerPage / _numEntries;
 	if (_sliderHeight < 4)
 		_sliderHeight = 4;
-	
-	_sliderPos = 10 + (_h-20-_sliderHeight+1) *_currentPos / (_numEntries - _entriesPerPage);
+
+	_sliderPos =
+		UP_DOWN_BOX_HEIGHT + (_h - 2 * UP_DOWN_BOX_HEIGHT - _sliderHeight + 1) * _currentPos / (_numEntries -
+																																														_entriesPerPage);
 	if (_sliderPos < 0)
 		_sliderPos = 0;
-	
 }
 
 
 void ScrollBarWidget::drawWidget(bool hilite)
 {
 	NewGui *gui = _boss->getGui();
-	int		bottomY = _y + _h;
-	
+	int bottomY = _y + _h;
+
 	gui->frameRect(_x, _y, _w, _h, gui->_shadowcolor);
-	
+
 	// Up arrow
-	gui->frameRect(_x, _y, _w, 10, gui->_color);
+	gui->frameRect(_x, _y, _w, UP_DOWN_BOX_HEIGHT, gui->_color);
 	gui->drawBitmap(up_arrow, _x, _y,
-				(hilite && _part == kUpArrowPart) ? gui->_textcolorhi : gui->_textcolor);
-	
+									(hilite && _part == kUpArrowPart) ? gui->_textcolorhi : gui->_textcolor);
+
 	// Down arrow
-	gui->frameRect(_x, bottomY - 9, _w, 10, gui->_color);
-	gui->drawBitmap(down_arrow, _x, bottomY - 9,
-				(hilite && _part == kDownArrowPart) ? gui->_textcolorhi : gui->_textcolor);
-	
+	gui->frameRect(_x, bottomY - UP_DOWN_BOX_HEIGHT + 1, _w, UP_DOWN_BOX_HEIGHT, gui->_color);
+	gui->drawBitmap(down_arrow, _x, bottomY - UP_DOWN_BOX_HEIGHT + 1,
+									(hilite && _part == kDownArrowPart) ? gui->_textcolorhi : gui->_textcolor);
+
 	// Slider
-	// FIXME - determine slider position and size. This depends on:
-	// * the number of entries per page
-	// * total number of entries
-	// * current scroll position (i.e. index of "first" visible entry)
 	gui->checkerRect(_x, _y + _sliderPos, _w, _sliderHeight,
-				(hilite && _part == kSliderPart) ? gui->_textcolorhi : gui->_textcolor);
+									(hilite && _part == kSliderPart) ? gui->_textcolorhi : gui->_textcolor);
 	gui->frameRect(_x, _y + _sliderPos, _w, _sliderHeight, gui->_color);
 }

Index: ScrollBarWidget.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/ScrollBarWidget.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ScrollBarWidget.h	12 Jul 2002 16:24:11 -0000	1.1
+++ ScrollBarWidget.h	12 Jul 2002 23:00:35 -0000	1.2
@@ -23,7 +23,9 @@
 
 #include "widget.h"
 
-#define SCROLLBAR_WIDTH	9
+enum {
+	kScrollBarWidth		= 9
+};
 
 enum {
 	kSetPositionCmd		= 'SETP'
@@ -42,6 +44,10 @@
 	}		_part;
 	int		_sliderHeight;
 	int		_sliderPos;
+
+	bool	_isDraggingSlider;
+	int		_sliderDeltaMouseDownPos;
+
 public:
 	int		_numEntries;
 	int		_entriesPerPage;
@@ -53,12 +59,13 @@
 	void handleClick(int x, int y, int button);
 	void handleMouseMoved(int x, int y, int button);
 	void handleMouseEntered(int button)	{ setFlags(WIDGET_HILITED); }
-	void handleMouseLeft(int button)	{ clearFlags(WIDGET_HILITED); _part = kNoPart; draw(); }
+	void handleMouseLeft(int button)	{ clearFlags(WIDGET_HILITED); _part = kNoPart; _isDraggingSlider = false; draw(); }
 
 	void recalc();
 
 protected:
 	void drawWidget(bool hilite);
+	void checkbounds();
 };
 
 





More information about the Scummvm-git-logs mailing list