[Scummvm-git-logs] scummvm master -> d56b63fdfe13da807f91d1f8c9da40b75f597165

mduggan mgithub at guarana.org
Wed May 13 22:13:35 UTC 2020


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:
d56b63fdfe ULTIMA8: Custom type checking cleanup (#2244)


Commit: d56b63fdfe13da807f91d1f8c9da40b75f597165
    https://github.com/scummvm/scummvm/commit/d56b63fdfe13da807f91d1f8c9da40b75f597165
Author: Matthew Jimenez (48367439+OMGPizzaGuy at users.noreply.github.com)
Date: 2020-05-14T07:13:32+09:00

Commit Message:
ULTIMA8: Custom type checking cleanup (#2244)

* ULTIMA8: Alter Gump::FindGump to check matches against a function instead of referencing the RunTimeClassType

Removed no_inheritence option as it is never used. These changes should help migration from p_dynamic_cast if desired

* ULTIMA8: Use template methods for type checking instead of referencing static ::ClassType variable directly

* ULTIMA8: fix code formatting

Changed paths:
    engines/ultima/ultima8/gumps/container_gump.cpp
    engines/ultima/ultima8/gumps/gump.cpp
    engines/ultima/ultima8/gumps/gump.h
    engines/ultima/ultima8/gumps/item_relative_gump.cpp
    engines/ultima/ultima8/gumps/paperdoll_gump.cpp
    engines/ultima/ultima8/gumps/slider_gump.cpp
    engines/ultima/ultima8/misc/debugger.cpp
    engines/ultima/ultima8/ultima8.cpp


diff --git a/engines/ultima/ultima8/gumps/container_gump.cpp b/engines/ultima/ultima8/gumps/container_gump.cpp
index 6ae0242a5b..5754204d91 100644
--- a/engines/ultima/ultima8/gumps/container_gump.cpp
+++ b/engines/ultima/ultima8/gumps/container_gump.cpp
@@ -234,7 +234,7 @@ void ContainerGump::GetItemLocation(int32 lerp_factor) {
 		topitem = p;
 	}
 
-	Gump *gump = GetRootGump()->FindGump(GameMapGump::ClassType);
+	Gump *gump = GetRootGump()->FindGump<GameMapGump>();
 	assert(gump);
 	gump->GetLocationOfItem(topitem->getObjId(), gx, gy, lerp_factor);
 
diff --git a/engines/ultima/ultima8/gumps/gump.cpp b/engines/ultima/ultima8/gumps/gump.cpp
index 3119fd9f13..61fad4613c 100644
--- a/engines/ultima/ultima8/gumps/gump.cpp
+++ b/engines/ultima/ultima8/gumps/gump.cpp
@@ -532,13 +532,9 @@ bool Gump::GetLocationOfItem(uint16 itemid, int32 &gx, int32 &gy,
 	return false;
 }
 
-// Find a child gump of the specified type
-Gump *Gump::FindGump(const RunTimeClassType &t, bool recursive,
-                     bool no_inheritance) {
-	// If that is our type, then return us!
-	if (GetClassType() == t)
-		return this;
-	else if (!no_inheritance && IsOfType(t))
+// Find a child gump that matches the matching function 
+Gump *Gump::FindGump(const FindPredicate predicate, bool recursive) {
+	if ((this->*predicate)())
 		return this;
 
 	// Iterate all children
@@ -552,9 +548,7 @@ Gump *Gump::FindGump(const RunTimeClassType &t, bool recursive,
 		if (g->_flags & FLAG_CLOSING)
 			continue;
 
-		if (g->GetClassType() == t)
-			return g;
-		else if (!no_inheritance && g->IsOfType(t))
+		if ((g->*predicate)())
 			return g;
 	}
 
@@ -572,7 +566,7 @@ Gump *Gump::FindGump(const RunTimeClassType &t, bool recursive,
 		if (g->_flags & FLAG_CLOSING)
 			continue;
 
-		g = g->FindGump(t, recursive, no_inheritance);
+		g = g->FindGump(predicate, recursive);
 
 		if (g)
 			return g;
diff --git a/engines/ultima/ultima8/gumps/gump.h b/engines/ultima/ultima8/gumps/gump.h
index 1839c780ed..a5b49711d9 100644
--- a/engines/ultima/ultima8/gumps/gump.h
+++ b/engines/ultima/ultima8/gumps/gump.h
@@ -108,23 +108,20 @@ public:
 	//! \param takefocus If true, set parent's _focusChild to this
 	virtual void                InitGump(Gump *newparent, bool take_focus = true);
 
-	//! Find a gump of the specified type (this or child)
-	//! \param t Type of gump to look for
+	typedef bool (Gump::*FindPredicate)() const;
+
+	//! Find a gump of that matches a predicate function (this or child)
+	//! \param predicate Function to check if a gump is a match
 	//! \param recursive Recursively search through children?
-	//! \param no_inheritance Exactly this type, or is a subclass also allowed?
 	//! \return the desired Gump, or NULL if not found
-	virtual Gump               *FindGump(const RunTimeClassType &t,
-	                                     bool recursive = true,
-	                                     bool no_inheritance = false);
+	virtual Gump               *FindGump(FindPredicate predicate, bool recursive = true);
 
 	//! Find a gump of the specified type (this or child)
 	//! \param T Type of gump to look for
 	//! \param recursive Recursively search through children?
-	//! \param no_inheritance Exactly this type, or is a subclass also allowed?
 	//! \return the desired Gump, or NULL if not found
-	template<class T> Gump     *FindGump(bool recursive = true,
-	                                     bool no_inheritance = false) {
-		return FindGump(T::ClassType, recursive, no_inheritance);
+	template<class T> Gump     *FindGump(bool recursive = true) {
+		return FindGump(&Gump::IsOfType<T>, recursive);
 	}
 
 	//! Find gump (this, child or NULL) at parent coordinates (mx,my)
diff --git a/engines/ultima/ultima8/gumps/item_relative_gump.cpp b/engines/ultima/ultima8/gumps/item_relative_gump.cpp
index 7612ef5426..dba4ee4bf3 100644
--- a/engines/ultima/ultima8/gumps/item_relative_gump.cpp
+++ b/engines/ultima/ultima8/gumps/item_relative_gump.cpp
@@ -132,7 +132,7 @@ void ItemRelativeGump::GetItemLocation(int32 lerp_factor) {
 	int32 gx, gy;
 
 	if (!gump) {
-		gump = GetRootGump()->FindGump(GameMapGump::ClassType);
+		gump = GetRootGump()->FindGump<GameMapGump>();
 
 		if (!gump) {
 			perr << "ItemRelativeGump::GetItemLocation(): "
diff --git a/engines/ultima/ultima8/gumps/paperdoll_gump.cpp b/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
index 7c5a905d1f..f3eab5dc3e 100644
--- a/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
+++ b/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
@@ -385,7 +385,7 @@ void PaperdollGump::ChildNotify(Gump *child, uint32 message) {
 	        message == ButtonWidget::BUTTON_CLICK) {
 		// check if there already is an open MiniStatsGump
 		Gump *desktop = Ultima8Engine::get_instance()->getDesktopGump();
-		Gump *statsgump = desktop->FindGump(MiniStatsGump::ClassType);
+		Gump *statsgump = desktop->FindGump<MiniStatsGump>();
 
 		if (!statsgump) {
 			Gump *gump = new MiniStatsGump(0, 0);
diff --git a/engines/ultima/ultima8/gumps/slider_gump.cpp b/engines/ultima/ultima8/gumps/slider_gump.cpp
index e34fef4a69..c2101c38a2 100644
--- a/engines/ultima/ultima8/gumps/slider_gump.cpp
+++ b/engines/ultima/ultima8/gumps/slider_gump.cpp
@@ -92,7 +92,7 @@ void SliderGump::setValueFromSlider(int sliderx) {
 }
 
 void SliderGump::setSliderPos() {
-	Gump *slider = Gump::FindGump(SlidingWidget::ClassType);
+	Gump *slider = Gump::FindGump<SlidingWidget>();
 	assert(slider);
 	slider->Move(getSliderPos(), slidery);
 }
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index c0ae25016d..3db7bffce8 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -1447,7 +1447,7 @@ bool Debugger::cmdShowMenu(int argc, const char **argv) {
 bool Debugger::cmdToggleFastArea(int argc, const char **argv) {
 	Ultima8Engine *app = Ultima8Engine::get_instance();
 	Gump *desktop = app->getDesktopGump();
-	Gump *favg = desktop->FindGump(FastAreaVisGump::ClassType);
+	Gump *favg = desktop->FindGump<FastAreaVisGump>();
 
 	if (!favg) {
 		favg = new FastAreaVisGump;
@@ -1502,7 +1502,7 @@ bool Debugger::cmdPlayMusic(int argc, const char **argv) {
 bool Debugger::cmdToggleMinimap(int argc, const char **argv) {
 	Ultima8Engine *app = Ultima8Engine::get_instance();
 	Gump *desktop = app->getDesktopGump();
-	Gump *mmg = desktop->FindGump(MiniMapGump::ClassType);
+	Gump *mmg = desktop->FindGump<MiniMapGump>();
 
 	if (!mmg) {
 		mmg = new MiniMapGump(4, 4);
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 90abd9d1d0..d63dd55837 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -945,7 +945,7 @@ bool Ultima8Engine::canSaveGameStateCurrently(bool isAutosave) {
 		// Can't save when a modal gump is open, or avatar in statsis  during cutscenes
 		return false;
 
-	if (_kernel->getRunningProcess() && _kernel->getRunningProcess()->IsOfType(StartU8Process::ClassType))
+	if (_kernel->getRunningProcess() && _kernel->getRunningProcess()->IsOfType<StartU8Process>())
 		// Don't save while starting up.
 		return false;
 




More information about the Scummvm-git-logs mailing list