[Scummvm-git-logs] scummvm master -> 3f3e618bcc5c7fc5855c7aa5b35302710287a81c

OMGPizzaGuy noreply at scummvm.org
Fri Dec 23 00:58:37 UTC 2022


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

Summary:
0d3e44915d ULTIMA8: use correct coords for gump onDragStop
3f3e618bcc ULTIMA8: Implement resizeable gump and use for minimap


Commit: 0d3e44915d8c9cfc354b3f973a86a6b1f5f52f6f
    https://github.com/scummvm/scummvm/commit/0d3e44915d8c9cfc354b3f973a86a6b1f5f52f6f
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2022-12-22T18:58:11-06:00

Commit Message:
ULTIMA8: use correct coords for gump onDragStop

Changed paths:
    engines/ultima/ultima8/kernel/mouse.cpp


diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index 90ed1cf39bc..fac228e1cbe 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -481,7 +481,7 @@ void Mouse::stopDragging(int mx, int my) {
 		assert(parent); // can't drag root gump
 		int32 px = mx, py = my;
 		parent->ScreenSpaceToGump(px, py);
-		gump->onDragStop(mx, my);
+		gump->onDragStop(px, py);
 	} else if (item) {
 		// for an item: notify gumps
 		if (_dragging != DRAG_INVALID) {


Commit: 3f3e618bcc5c7fc5855c7aa5b35302710287a81c
    https://github.com/scummvm/scummvm/commit/3f3e618bcc5c7fc5855c7aa5b35302710287a81c
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2022-12-22T18:58:11-06:00

Commit Message:
ULTIMA8: Implement resizeable gump and use for minimap

Changed paths:
    engines/ultima/ultima8/gumps/gump.cpp
    engines/ultima/ultima8/gumps/gump.h
    engines/ultima/ultima8/gumps/minimap_gump.cpp
    engines/ultima/ultima8/gumps/minimap_gump.h
    engines/ultima/ultima8/gumps/resizable_gump.cpp
    engines/ultima/ultima8/gumps/resizable_gump.h


diff --git a/engines/ultima/ultima8/gumps/gump.cpp b/engines/ultima/ultima8/gumps/gump.cpp
index a29d1bebcc4..42834af7f03 100644
--- a/engines/ultima/ultima8/gumps/gump.cpp
+++ b/engines/ultima/ultima8/gumps/gump.cpp
@@ -377,6 +377,12 @@ void Gump::setRelativePosition(Gump::Position pos, int xoffset, int yoffset) {
 		case BOTTOM_CENTER:
 			Move(rect.width() / 2 - _dims.width() / 2 + xoffset, rect.height() - _dims.height() + yoffset);
 			break;
+		case LEFT_CENTER:
+			Move(xoffset, rect.height() / 2 - _dims.height() / 2 + yoffset);
+			break;
+		case RIGHT_CENTER:
+			Move(rect.width() - _dims.width() + xoffset, rect.height() / 2 - _dims.height() / 2 + yoffset);
+			break;
 		default:
 			break;
 		}
diff --git a/engines/ultima/ultima8/gumps/gump.h b/engines/ultima/ultima8/gumps/gump.h
index c7a7cdf95ad..0a31d329679 100644
--- a/engines/ultima/ultima8/gumps/gump.h
+++ b/engines/ultima/ultima8/gumps/gump.h
@@ -225,7 +225,9 @@ public:
 		BOTTOM_LEFT = 4,
 		BOTTOM_RIGHT = 5,
 		TOP_CENTER = 6,
-		BOTTOM_CENTER = 7
+		BOTTOM_CENTER = 7,
+		LEFT_CENTER = 8,
+		RIGHT_CENTER = 9
 	};
 
 	//! Moves this gump to a relative location on the parent gump
diff --git a/engines/ultima/ultima8/gumps/minimap_gump.cpp b/engines/ultima/ultima8/gumps/minimap_gump.cpp
index 018b2eca651..f9c0db16f6e 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.cpp
+++ b/engines/ultima/ultima8/gumps/minimap_gump.cpp
@@ -33,11 +33,12 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(MiniMapGump)
 
-MiniMapGump::MiniMapGump(int x, int y) :
-	Gump(x, y, 120, 120, 0, FLAG_DRAGGABLE, LAYER_NORMAL), _minimaps(), _ax(0), _ay(0) {
+MiniMapGump::MiniMapGump(int x, int y) : ResizableGump(x, y, 120, 120), _minimaps(), _ax(0), _ay(0) {
+	setMinSize(60, 60);
 }
 
-MiniMapGump::MiniMapGump() : Gump(), _minimaps(), _ax(0), _ay(0) {
+MiniMapGump::MiniMapGump() : ResizableGump(), _minimaps(), _ax(0), _ay(0) {
+	setMinSize(60, 60);
 }
 
 MiniMapGump::~MiniMapGump(void) {
diff --git a/engines/ultima/ultima8/gumps/minimap_gump.h b/engines/ultima/ultima8/gumps/minimap_gump.h
index 1d27830c7f4..d4d29599dc9 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.h
+++ b/engines/ultima/ultima8/gumps/minimap_gump.h
@@ -22,7 +22,7 @@
 #ifndef ULTIMA8_GUMPS_MINIMAPGUMP_H
 #define ULTIMA8_GUMPS_MINIMAPGUMP_H
 
-#include "ultima/ultima8/gumps/gump.h"
+#include "ultima/ultima8/gumps/resizable_gump.h"
 #include "ultima/ultima8/misc/classtype.h"
 
 namespace Ultima {
@@ -30,7 +30,7 @@ namespace Ultima8 {
 
 class MiniMap;
 
-class MiniMapGump : public Gump {
+class MiniMapGump : public ResizableGump {
 private:
 	Common::HashMap<uint32, MiniMap *> _minimaps;
 	int32 _ax, _ay;
diff --git a/engines/ultima/ultima8/gumps/resizable_gump.cpp b/engines/ultima/ultima8/gumps/resizable_gump.cpp
index d178c3b8757..4b4b870b0d7 100644
--- a/engines/ultima/ultima8/gumps/resizable_gump.cpp
+++ b/engines/ultima/ultima8/gumps/resizable_gump.cpp
@@ -20,15 +20,115 @@
  */
 
 #include "ultima/ultima8/gumps/resizable_gump.h"
+#include "ultima/ultima8/kernel/mouse.h"
 
 namespace Ultima {
 namespace Ultima8 {
 
-ResizableGump::ResizableGump(int x, int y, int width, int height) : Gump(x, y, width, height) {
+#define RESIZE_BORDER 5
+
+ResizableGump::ResizableGump(int x, int y, int width, int height)
+	: Gump(x, y, width, height, 0, FLAG_DRAGGABLE, LAYER_NORMAL), _dragPosition(Gump::CENTER), _minWidth(20), _minHeight(20) {
+}
+
+ResizableGump::ResizableGump() : Gump(), _dragPosition(Gump::CENTER), _minWidth(20), _minHeight(20) {
 }
 
 ResizableGump::~ResizableGump() {
 }
 
+bool ResizableGump::onDragStart(int32 mx, int32 my) {
+	if (Gump::onDragStart(mx, my)) {
+		ParentToGump(mx, my);
+		if (mx < _dims.left + RESIZE_BORDER && my < _dims.top + RESIZE_BORDER) {
+			_dragPosition = Gump::TOP_LEFT;
+		} else if (mx >= _dims.right - RESIZE_BORDER && my < _dims.top + RESIZE_BORDER) {
+			_dragPosition = Gump::TOP_RIGHT;
+		} else if (mx < _dims.left + RESIZE_BORDER && my >= _dims.bottom - RESIZE_BORDER) {
+			_dragPosition = Gump::BOTTOM_LEFT;
+		} else if (mx >= _dims.right - RESIZE_BORDER && my >= _dims.bottom - RESIZE_BORDER) {
+			_dragPosition = Gump::BOTTOM_RIGHT;
+		} else if (my < _dims.top + RESIZE_BORDER) {
+			_dragPosition = Gump::TOP_CENTER;
+		} else if (my >= _dims.bottom - RESIZE_BORDER) {
+			_dragPosition = Gump::BOTTOM_CENTER;
+		} else if (mx < _dims.left + RESIZE_BORDER) {
+			_dragPosition = Gump::LEFT_CENTER;
+		} else if (mx >= _dims.right - RESIZE_BORDER) {
+			_dragPosition = Gump::RIGHT_CENTER;
+		} else {
+			_dragPosition = Gump::CENTER;
+		}
+		return true;
+	}
+	return false;
+}
+
+void ResizableGump::onDrag(int32 mx, int32 my) {
+	int32 x = _x;
+	int32 y = _y;
+	int32 w = _dims.width();
+	int32 h = _dims.height();
+
+	int32 dx, dy;
+	Mouse::get_instance()->getDraggingOffset(dx, dy);
+
+	int32 px = mx, py = my;
+	ParentToGump(px, py);
+
+	switch (_dragPosition) {
+	case Gump::CENTER:
+		x = mx - dx;
+		y = my - dy;
+		break;
+	case Gump::TOP_LEFT:
+		w -= px - dx;
+		h -= py - dy;
+		x = mx - dx;
+		y = my - dy;
+		break;
+	case Gump::TOP_RIGHT:
+		w = px;
+		h -= py - dy;
+		y = my - dy;
+		break;
+	case Gump::BOTTOM_LEFT:
+		w -= px - dx;
+		h = py;
+		x = mx - dx;
+		break;
+	case Gump::BOTTOM_RIGHT:
+		w = px;
+		h = py;
+		break;
+	case Gump::TOP_CENTER:
+		h -= py - dy;
+		y = my - dy;
+		break;
+	case Gump::BOTTOM_CENTER:
+		h = py;
+		break;
+	case Gump::LEFT_CENTER:
+		w -= px - dx;
+		x = mx - dx;
+		break;
+	case Gump::RIGHT_CENTER:
+		w = px;
+		break;
+	default:
+		break;
+	}
+
+	if (w >= _minWidth) {
+		_dims.setWidth(w);
+		_x = x;
+	}
+
+	if (h >= _minHeight) {
+		_dims.setHeight(h);
+		_y = y;
+	}
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/gumps/resizable_gump.h b/engines/ultima/ultima8/gumps/resizable_gump.h
index 9d6fb336973..c13999d2e6f 100644
--- a/engines/ultima/ultima8/gumps/resizable_gump.h
+++ b/engines/ultima/ultima8/gumps/resizable_gump.h
@@ -32,9 +32,23 @@ namespace Ultima8 {
  * An example of such would be the Console and the GameMap gumps
  */
 class ResizableGump : public Gump {
+private:
+	Gump::Position _dragPosition;
+	int32 _minWidth;
+	int32 _minHeight;
+
 public:
+	ResizableGump();
 	ResizableGump(int x, int y, int width, int height);
 	~ResizableGump() override;
+
+	void setMinSize(int minWidth, int minHeight) {
+		_minWidth = minWidth;
+		_minHeight = minHeight;
+	}
+
+	bool onDragStart(int32 mx, int32 my) override;
+	void onDrag(int32 mx, int32 my) override;
 };
 
 } // End of namespace Ultima8




More information about the Scummvm-git-logs mailing list