[Scummvm-cvs-logs] scummvm master -> 05eb787ce5fcc41daf2d26eec015e895f7e7ed02

dreammaster dreammaster at scummvm.org
Sun Jul 26 05:25:35 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
05eb787ce5 SHERLOCK: RT: Refactoring scrolling code to WidgetBase


Commit: 05eb787ce5fcc41daf2d26eec015e895f7e7ed02
    https://github.com/scummvm/scummvm/commit/05eb787ce5fcc41daf2d26eec015e895f7e7ed02
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-07-25T23:24:39-04:00

Commit Message:
SHERLOCK: RT: Refactoring scrolling code to WidgetBase

Changed paths:
    engines/sherlock/events.cpp
    engines/sherlock/tattoo/widget_base.cpp
    engines/sherlock/tattoo/widget_base.h
    engines/sherlock/tattoo/widget_files.cpp
    engines/sherlock/tattoo/widget_files.h
    engines/sherlock/tattoo/widget_talk.cpp



diff --git a/engines/sherlock/events.cpp b/engines/sherlock/events.cpp
index 456f055..46e4e09 100644
--- a/engines/sherlock/events.cpp
+++ b/engines/sherlock/events.cpp
@@ -251,7 +251,38 @@ bool Events::checkForNextFrameCounter() {
 }
 
 Common::KeyState Events::getKey() {
-	return _pendingKeys.pop();
+	Common::KeyState keyState = _pendingKeys.pop();
+
+	switch (keyState.keycode) {
+	case Common::KEYCODE_KP1:
+		keyState.keycode = Common::KEYCODE_END;
+		break;
+	case Common::KEYCODE_KP2:
+		keyState.keycode = Common::KEYCODE_DOWN;
+		break;
+	case Common::KEYCODE_KP3:
+		keyState.keycode = Common::KEYCODE_PAGEDOWN;
+		break;
+	case Common::KEYCODE_KP4:
+		keyState.keycode = Common::KEYCODE_LEFT;
+		break;
+	case Common::KEYCODE_KP6:
+		keyState.keycode = Common::KEYCODE_RIGHT;
+		break;
+	case Common::KEYCODE_KP7:
+		keyState.keycode = Common::KEYCODE_HOME;
+		break;
+	case Common::KEYCODE_KP8:
+		keyState.keycode = Common::KEYCODE_UP;
+		break;
+	case Common::KEYCODE_KP9:
+		keyState.keycode = Common::KEYCODE_PAGEUP;
+		break;
+	default:
+		break;
+	}
+
+	return keyState;
 }
 
 void Events::clearEvents() {
diff --git a/engines/sherlock/tattoo/widget_base.cpp b/engines/sherlock/tattoo/widget_base.cpp
index 60d057e..e0b9039 100644
--- a/engines/sherlock/tattoo/widget_base.cpp
+++ b/engines/sherlock/tattoo/widget_base.cpp
@@ -32,6 +32,7 @@ namespace Tattoo {
 
 WidgetBase::WidgetBase(SherlockEngine *vm) : _vm(vm) {
 	_scroll = false;
+	_dialogTimer = 0;
 }
 
 void WidgetBase::summonWindow() {
@@ -222,16 +223,17 @@ void WidgetBase::drawDialogRect(const Common::Rect &r, bool raised) {
 void WidgetBase::checkTabbingKeys(int numOptions) {
 }
 
-void WidgetBase::drawScrollBar(int index, int pageSize, int count) {
+Common::Rect WidgetBase::getScrollBarBounds() const {
 	Common::Rect r(BUTTON_SIZE, _bounds.height() - 6);
 	r.moveTo(_bounds.width() - BUTTON_SIZE - 3, 3);
-	drawScrollBar(index, pageSize, count, r);
+	return r;
 }
 
-void WidgetBase::drawScrollBar(int index, int pageSize, int count, const Common::Rect &r) {
+void WidgetBase::drawScrollBar(int index, int pageSize, int count) {
 	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
 
 	// Fill the area with transparency
+	Common::Rect r = getScrollBarBounds();
 	_surface.fillRect(r, TRANSPARENCY);
 
 	bool raised = ui._scrollHighlight != 1;
@@ -263,25 +265,21 @@ void WidgetBase::drawScrollBar(int index, int pageSize, int count, const Common:
 		r.right / 2, r.bottom - 1 - BUTTON_SIZE + 3 + BUTTON_SIZE / 2), color);
 
 	// Draw the scroll position bar
-	int barHeight = (_bounds.height() - BUTTON_SIZE * 2) * pageSize / count;
-	barHeight = CLIP(barHeight, BUTTON_SIZE, _bounds.height() - BUTTON_SIZE * 2);
-	int barY = (r.height() - BUTTON_SIZE * 2 - barHeight) * index / pageSize + r.top + BUTTON_SIZE;
+	int barHeight = (r.height() - BUTTON_SIZE * 2) * pageSize / count;
+	barHeight = CLIP(barHeight, BUTTON_SIZE, r.height() - BUTTON_SIZE * 2);
+	int barY = r.top + BUTTON_SIZE + (r.height() - BUTTON_SIZE * 2 - barHeight) * index / (count - pageSize);
 
 	_surface.fillRect(Common::Rect(r.left + 2, barY + 2, r.right - 2, barY + barHeight - 3), INFO_MIDDLE);
 	ui.drawDialogRect(_surface, Common::Rect(r.left, barY, r.right, barY + barHeight), true);
 }
 
 void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count) {
-	handleScrollbarEvents(index, pageSize, count, Common::Rect(_bounds.right - BUTTON_SIZE - 3, _bounds.top + 3, _bounds.right - 3, _bounds.bottom - 3));
-}
-
-void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count, const Common::Rect &r) {
 	Events &events = *_vm->_events;
 	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
 	Common::Point mousePos = events.mousePos();
 
 	// If they have selected the sollbar, return with the Scroll Bar Still selected
-	if (ui._scrollHighlight == 3)
+	if ((events._pressed || events._released) && ui._scrollHighlight == SH_THUMBNAIL)
 		return;
 
 	ui._scrollHighlight = SH_NONE;
@@ -289,10 +287,13 @@ void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count, const
 	if ((!events._pressed && !events._rightReleased) || !_scroll)
 		return;
 
+	Common::Rect r = getScrollBarBounds();
+	r.translate(_bounds.left, _bounds.top);
+
 	// Calculate the Scroll Position bar
-	int barHeight = (_bounds.height() - BUTTON_SIZE * 2) * pageSize / count;
-	barHeight = CLIP(barHeight, BUTTON_SIZE, _bounds.height() - BUTTON_SIZE * 2);
-	int barY = (r.height() - BUTTON_SIZE * 2 - barHeight) * index / pageSize + r.top + BUTTON_SIZE;
+	int barHeight = (r.height() - BUTTON_SIZE * 2) * pageSize / count;
+	barHeight = CLIP(barHeight, BUTTON_SIZE, r.height() - BUTTON_SIZE * 2);
+	int barY = r.top + BUTTON_SIZE + (r.height() - BUTTON_SIZE * 2 - barHeight) * index / (count - pageSize);
 
 	if (Common::Rect(r.left, r.top, r.right, r.top + BUTTON_SIZE).contains(mousePos))
 		// Mouse on scroll up button
@@ -311,6 +312,77 @@ void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count, const
 		ui._scrollHighlight = SH_SCROLL_DOWN;
 }
 
+void WidgetBase::handleScrolling(int &scrollIndex, int pageSize, int max) {
+	Events &events = *_vm->_events;
+	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+	Common::KeyCode keycode = ui._keyState.keycode;
+	Common::Point mousePos = events.mousePos();
+
+	Common::Rect r = getScrollBarBounds();
+	r.translate(_bounds.left, _bounds.top);
+
+	if (ui._scrollHighlight != SH_NONE || keycode == Common::KEYCODE_HOME || keycode == Common::KEYCODE_END
+		|| keycode == Common::KEYCODE_PAGEUP || keycode == Common::KEYCODE_PAGEDOWN
+		|| keycode == Common::KEYCODE_UP || keycode == Common::KEYCODE_DOWN) {
+		// Check for the scrollbar
+		if (ui._scrollHighlight == SH_THUMBNAIL) {
+			int yp = mousePos.y;
+			yp = CLIP(yp, r.top + BUTTON_SIZE + 3, r.bottom - BUTTON_SIZE - 3);
+
+			// Calculate the line number that corresponds to the position that the mouse is on the scrollbar
+			int lineNum = (yp - _bounds.top - BUTTON_SIZE - 3) * 100 / (_bounds.height() - BUTTON_SIZE * 2 - 6)
+				* max / 100 - 3;
+
+			// If the new position would place part of the text outsidethe text window, adjust it so it doesn't
+			if (lineNum < 0)
+				lineNum = 0;
+			else if (lineNum + pageSize > max) {
+				lineNum = max - pageSize;
+
+				// Make sure it's not below zero now
+				if (lineNum < 0)
+					lineNum = 0;
+			}
+
+			scrollIndex = lineNum;
+		}
+
+		// Get the current frame so we can check the scroll timer against it
+		uint32 frameNum = events.getFrameCounter();
+
+		if (frameNum > _dialogTimer) {
+			// Set the timeout for the next scroll if the mouse button remains held down
+			_dialogTimer = (_dialogTimer == 0) ? frameNum + pageSize : frameNum + 1;
+
+			// Check for Scroll Up
+			if ((ui._scrollHighlight == SH_SCROLL_UP || keycode == Common::KEYCODE_UP) && scrollIndex)
+				--scrollIndex;
+
+			// Check for Page Up
+			else if ((ui._scrollHighlight == SH_PAGE_UP || keycode == Common::KEYCODE_PAGEUP) && scrollIndex)
+				scrollIndex -= pageSize;
+
+			// Check for Page Down
+			else if ((ui._scrollHighlight == SH_PAGE_DOWN || keycode == Common::KEYCODE_PAGEDOWN)
+				&& (scrollIndex + pageSize < max)) {
+				scrollIndex += pageSize;
+				if (scrollIndex + pageSize >max)
+					scrollIndex = max - pageSize;
+			}
+
+			// Check for Scroll Down
+			else if ((ui._scrollHighlight == SH_SCROLL_DOWN || keycode == Common::KEYCODE_DOWN) && (scrollIndex + pageSize < max))
+				++scrollIndex;
+		}
+
+		if (keycode == Common::KEYCODE_END)
+			scrollIndex = max - pageSize;
+
+		if (scrollIndex < 0 || keycode == Common::KEYCODE_HOME)
+			scrollIndex = 0;
+	}
+}
+
 } // End of namespace Tattoo
 
 } // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/widget_base.h b/engines/sherlock/tattoo/widget_base.h
index 87f513e..dcafc8f 100644
--- a/engines/sherlock/tattoo/widget_base.h
+++ b/engines/sherlock/tattoo/widget_base.h
@@ -36,6 +36,8 @@ class ImageFile;
 namespace Tattoo {
 
 class WidgetBase {
+private:
+	uint32 _dialogTimer;
 protected:
 	SherlockEngine *_vm;
 	Common::Rect _bounds;
@@ -70,14 +72,14 @@ protected:
 	void drawDialogRect(const Common::Rect &r, bool raised = true);
 
 	/**
-	 * Draw the scrollbar for the dialog
+	 * Return the area of a widget that the scrollbar will be drawn in
 	 */
-	void drawScrollBar(int index, int pageSize, int count);
+	virtual Common::Rect getScrollBarBounds() const;
 
 	/**
-	 * Draw a scrollbar for the dialog in a specified area
+	 * Draw the scrollbar for the dialog
 	 */
-	void drawScrollBar(int index, int pageSize, int count, const Common::Rect &r);
+	void drawScrollBar(int index, int pageSize, int count);
 
 	/**
 	 * Handles any events when the mouse is on the scrollbar
@@ -85,9 +87,9 @@ protected:
 	void handleScrollbarEvents(int index, int pageSize, int count);
 
 	/**
-	 * Handles any events when the mouse is on the scrollbar
+	 * Handle adjusting a passed scrolling index as necessary
 	 */
-	void handleScrollbarEvents(int index, int pageSize, int count, const Common::Rect &r);
+	void handleScrolling(int &scrollIndex, int pageSize, int max);
 
 	/**
 	 * Close the dialog
diff --git a/engines/sherlock/tattoo/widget_files.cpp b/engines/sherlock/tattoo/widget_files.cpp
index 21dd108..4a0c049 100644
--- a/engines/sherlock/tattoo/widget_files.cpp
+++ b/engines/sherlock/tattoo/widget_files.cpp
@@ -38,7 +38,6 @@ WidgetFiles::WidgetFiles(SherlockEngine *vm, const Common::String &target) :
 		SaveManager(vm, target), WidgetBase(vm), _vm(vm) {
 	_fileMode = SAVEMODE_NONE;
 	_selector = _oldSelector = -1;
-	savegameIndex = 0;
 }
 
 void WidgetFiles::show(SaveMode mode) {
@@ -162,11 +161,8 @@ void WidgetFiles::render(FilesRenderMode mode) {
 	}
 
 	// Draw the Scrollbar if neccessary
-	if (mode != RENDER_NAMES) {
-		Common::Rect scrollRect(BUTTON_SIZE, _bounds.height() - _surface.fontHeight() - 16);
-		scrollRect.moveTo(_bounds.width() - BUTTON_SIZE - 3, _surface.fontHeight() + 13);
-		drawScrollBar(_savegameIndex, FILES_LINES_COUNT, _savegames.size(), scrollRect);
-	}
+	if (mode != RENDER_NAMES)
+		drawScrollBar(_savegameIndex, FILES_LINES_COUNT, _savegames.size());
 }
 
 void WidgetFiles::handleEvents() {
@@ -175,17 +171,25 @@ void WidgetFiles::handleEvents() {
 
 	// Handle scrollbar events
 	ScrollHighlight oldHighlight = ui._scrollHighlight;	
-	Common::Rect scrollRect(BUTTON_SIZE, _bounds.height() - _surface.fontHeight() - 16);
-	scrollRect.moveTo(_bounds.right - BUTTON_SIZE - 3, _bounds.top + _surface.fontHeight() + 13);
-	handleScrollbarEvents(_savegameIndex, FILES_LINES_COUNT, _savegames.size(), scrollRect);
+	handleScrollbarEvents(_savegameIndex, FILES_LINES_COUNT, _savegames.size());
 
-	// If the highlight has changed, redraw the scrollbar
-	if (ui._scrollHighlight != oldHighlight)
+	int oldScrollIndex = _savegameIndex;
+	handleScrolling(_savegameIndex, FILES_LINES_COUNT, _savegames.size());
+
+	// Only redraw the window if the the scrollbar position has changed
+	if (ui._scrollHighlight != oldHighlight || oldScrollIndex != _savegameIndex)
 		render(RENDER_NAMES_AND_SCROLLBAR);
 
 	// TODO
 }
 
+Common::Rect WidgetFiles::getScrollBarBounds() const {
+	Common::Rect scrollRect(BUTTON_SIZE, _bounds.height() - _surface.fontHeight() - 16);
+	scrollRect.moveTo(_bounds.width() - BUTTON_SIZE - 3, _surface.fontHeight() + 13);
+
+	return scrollRect;
+}
+
 } // End of namespace Tattoo
 
 } // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/widget_files.h b/engines/sherlock/tattoo/widget_files.h
index bf4eb85..e861206 100644
--- a/engines/sherlock/tattoo/widget_files.h
+++ b/engines/sherlock/tattoo/widget_files.h
@@ -40,7 +40,6 @@ private:
 	SherlockEngine *_vm;
 	SaveMode _fileMode;
 	int _selector, _oldSelector;
-	int savegameIndex;
 
 	/**
 	 * Render the dialog
@@ -56,6 +55,11 @@ private:
 	 * Show the ScummVM Load Game dialog
 	 */
 	void showScummVMRestoreDialog();
+
+	/**
+	 * Return the area of a widget that the scrollbar will be drawn in
+	 */
+	virtual Common::Rect getScrollBarBounds() const;
 public:
 	WidgetFiles(SherlockEngine *vm, const Common::String &target);
 	virtual ~WidgetFiles() {}
diff --git a/engines/sherlock/tattoo/widget_talk.cpp b/engines/sherlock/tattoo/widget_talk.cpp
index 5190773..bc2f833 100644
--- a/engines/sherlock/tattoo/widget_talk.cpp
+++ b/engines/sherlock/tattoo/widget_talk.cpp
@@ -123,77 +123,12 @@ void WidgetTalk::handleEvents() {
 	ScrollHighlight oldHighlight = ui._scrollHighlight;
 	handleScrollbarEvents(_talkScrollIndex, NUM_VISIBLE_TALK_LINES, _statementLines.size());
 
-	// If the highlight has changed, redraw the scrollbar
-	if (ui._scrollHighlight != oldHighlight)
-		render(HL_SCROLLBAR_ONLY);
-
-	if (ui._scrollHighlight != SH_NONE || keycode == Common::KEYCODE_HOME || keycode == Common::KEYCODE_END
-			|| keycode == Common::KEYCODE_PAGEUP || keycode == Common::KEYCODE_PAGEDOWN) {
-		int scrollIndex = _talkScrollIndex;
-
-		// Check for the scrollbar
-		if (ui._scrollHighlight == SH_THUMBNAIL) {
-			int yp = mousePos.y;
-			yp = CLIP(yp, _bounds.top + BUTTON_SIZE + 3, _bounds.bottom - BUTTON_SIZE - 3);
-
-			// Calculate the line number that corresponds to the position that the mouse is on the scrollbar
-			int lineNum = (yp - _bounds.top - BUTTON_SIZE - 3) * 100 / (_bounds.height() - BUTTON_SIZE * 2 - 6)
-				* _statementLines.size() / 100 - 3;
-
-			// If the new position would place part of the text outsidethe text window, adjust it so it doesn't
-			if (lineNum < 0)
-				lineNum = 0;
-			else if (lineNum + NUM_VISIBLE_TALK_LINES > (int)_statementLines.size()) {
-				lineNum = (int)_statementLines.size() - NUM_VISIBLE_TALK_LINES;
-
-				// Make sure it's not below zero now
-				if (lineNum < 0)
-					lineNum = 0;
-			}
-
-			_talkScrollIndex = lineNum;
-		}
-
-		// Get the current frame so we can check the scroll timer against it
-		uint32 frameNum = events.getFrameCounter();
-
-		if (frameNum > _dialogTimer) {
-			// Set the timeout for the next scroll if the mouse button remains held down
-			_dialogTimer = (_dialogTimer == 0) ? frameNum + NUM_VISIBLE_TALK_LINES : frameNum + 1;
+	int oldScrollIndex = _talkScrollIndex;
+	handleScrolling(_talkScrollIndex, NUM_VISIBLE_TALK_LINES, _statementLines.size());
 
-			// Check for Scroll Up
-			if (ui._scrollHighlight == SH_SCROLL_UP && _talkScrollIndex)
-				--_talkScrollIndex;
-
-			// Check for Page Up
-			if ((ui._scrollHighlight == SH_PAGE_UP || keycode == Common::KEYCODE_PAGEUP) && _talkScrollIndex)
-				_talkScrollIndex -= NUM_VISIBLE_TALK_LINES;
-
-			// Check for Page Down
-			if ((ui._scrollHighlight == SH_PAGE_DOWN || keycode == Common::KEYCODE_PAGEDOWN) 
-					&& (_talkScrollIndex + NUM_VISIBLE_TALK_LINES < (int)_statementLines.size())) {
-				_talkScrollIndex += 6;
-				if (_talkScrollIndex + NUM_VISIBLE_TALK_LINES >(int)_statementLines.size())
-					_talkScrollIndex = _statementLines.size() - NUM_VISIBLE_TALK_LINES;
-			}
-
-			// Check for Scroll Down
-			if (ui._scrollHighlight == SH_SCROLL_DOWN && (_talkScrollIndex + NUM_VISIBLE_TALK_LINES < (int)_statementLines.size()))
-				_talkScrollIndex++;
-		}
-
-		if (keycode == Common::KEYCODE_END)
-			_talkScrollIndex = _statementLines.size() - NUM_VISIBLE_TALK_LINES;
-
-		if (_talkScrollIndex < 0 || keycode == Common::KEYCODE_HOME)
-			_talkScrollIndex = 0;
-
-		// Only redraw the window if the the scrollbar position has changed
-		if (scrollIndex != _talkScrollIndex) {
-			_surface.fillRect(Common::Rect(4, 5, _surface.w() - BUTTON_SIZE - 8, _surface.h() - 4), TRANSPARENCY);
-			render(HL_NO_HIGHLIGHTING);
-		}
-	}
+	// Only redraw the window if the the scrollbar position has changed
+	if (ui._scrollHighlight != oldHighlight || oldScrollIndex != _talkScrollIndex)
+		render(HL_SCROLLBAR_ONLY);
 
 	// Flag if they started pressing outside of the window
 	if (events._firstPress && !_bounds.contains(mousePos))






More information about the Scummvm-git-logs mailing list