2
0
Эх сурвалжийг харах

Minor code reorganization

Ivan Savenko 2 жил өмнө
parent
commit
6012e0cb45

+ 4 - 2
client/CMakeLists.txt

@@ -30,7 +30,8 @@ set(client_SRCS
 	gui/CGuiHandler.cpp
 	gui/CIntObject.cpp
 	gui/CursorHandler.cpp
-	gui/InterfaceEventDispatcher.cpp
+	gui/EventDispatcher.cpp
+	gui/EventsReceiver.cpp
 	gui/InterfaceObjectConfigurable.cpp
 	gui/FramerateManager.cpp
 	gui/NotificationHandler.cpp
@@ -164,8 +165,9 @@ set(client_HEADERS
 	gui/CGuiHandler.h
 	gui/CIntObject.h
 	gui/CursorHandler.h
+	gui/EventDispatcher.h
+	gui/EventsReceiver.h
 	gui/InterfaceObjectConfigurable.h
-	gui/InterfaceEventDispatcher.h
 	gui/FramerateManager.h
 	gui/MouseButton.h
 	gui/NotificationHandler.h

+ 3 - 3
client/gui/CGuiHandler.cpp

@@ -16,7 +16,7 @@
 #include "ShortcutHandler.h"
 #include "FramerateManager.h"
 #include "WindowHandler.h"
-#include "InterfaceEventDispatcher.h"
+#include "EventDispatcher.h"
 
 #include "../CGameInfo.h"
 #include "../render/Colors.h"
@@ -80,7 +80,7 @@ SSetCaptureState::~SSetCaptureState()
 
 void CGuiHandler::init()
 {
-	eventDispatcherInstance = std::make_unique<InterfaceEventDispatcher>();
+	eventDispatcherInstance = std::make_unique<EventDispatcher>();
 	windowHandlerInstance = std::make_unique<WindowHandler>();
 	screenHandlerInstance = std::make_unique<ScreenHandler>();
 	shortcutsHandlerInstance = std::make_unique<ShortcutHandler>();
@@ -613,7 +613,7 @@ IScreenHandler & CGuiHandler::screenHandler()
 	return *screenHandlerInstance;
 }
 
-InterfaceEventDispatcher & CGuiHandler::eventDispatcher()
+EventDispatcher & CGuiHandler::eventDispatcher()
 {
 	return *eventDispatcherInstance;
 }

+ 3 - 3
client/gui/CGuiHandler.h

@@ -30,7 +30,7 @@ class IUpdateable;
 class IShowActivatable;
 class IScreenHandler;
 class WindowHandler;
-class InterfaceEventDispatcher;
+class EventDispatcher;
 
 // TODO: event handling need refactoring
 enum class EUserEvent
@@ -63,7 +63,7 @@ private:
 
 	std::unique_ptr<IScreenHandler> screenHandlerInstance;
 	std::unique_ptr<FramerateManager> framerateManagerInstance;
-	std::unique_ptr<InterfaceEventDispatcher> eventDispatcherInstance;
+	std::unique_ptr<EventDispatcher> eventDispatcherInstance;
 
 	void handleCurrentEvent(SDL_Event &current);
 	void convertTouchToMouse(SDL_Event * current);
@@ -89,7 +89,7 @@ public:
 
 	ShortcutHandler & shortcutsHandler();
 	FramerateManager & framerateManager();
-	InterfaceEventDispatcher & eventDispatcher();
+	EventDispatcher & eventDispatcher();
 
 	/// Returns current logical screen dimensions
 	/// May not match size of window if user has UI scaling different from 100%

+ 0 - 65
client/gui/CIntObject.cpp

@@ -11,7 +11,6 @@
 #include "CIntObject.h"
 
 #include "CGuiHandler.h"
-#include "InterfaceEventDispatcher.h"
 #include "WindowHandler.h"
 #include "Shortcut.h"
 #include "../renderSDL/SDL_Extensions.h"
@@ -20,70 +19,6 @@
 
 #include <SDL_pixels.h>
 
-AEventsReceiver::AEventsReceiver()
-	: activeState(0)
-	, hoveredState(false)
-	, strongInterestState(false)
-{
-}
-
-bool AEventsReceiver::isHovered() const
-{
-	return hoveredState;
-}
-
-bool AEventsReceiver::isActive() const
-{
-	return activeState;
-}
-
-bool AEventsReceiver::isActive(int flags) const
-{
-	return activeState & flags;
-}
-
-bool AEventsReceiver::isMouseButtonPressed(MouseButton btn) const
-{
-	return currentMouseState.count(btn) ? currentMouseState.at(btn) : false;
-}
-
-void AEventsReceiver::setMoveEventStrongInterest(bool on)
-{
-	strongInterestState = on;
-}
-
-void AEventsReceiver::activateEvents(ui16 what)
-{
-	assert((what & GENERAL) || (activeState & GENERAL));
-
-	activeState |= GENERAL;
-	GH.eventDispatcher().handleElementActivate(this, what);
-}
-
-void AEventsReceiver::deactivateEvents(ui16 what)
-{
-	if (what & GENERAL)
-		activeState &= ~GENERAL;
-	GH.eventDispatcher().handleElementDeActivate(this, what & activeState);
-}
-
-void AEventsReceiver::click(MouseButton btn, tribool down, bool previousState)
-{
-	switch(btn)
-	{
-	default:
-	case MouseButton::LEFT:
-		clickLeft(down, previousState);
-		break;
-	case MouseButton::MIDDLE:
-		clickMiddle(down, previousState);
-		break;
-	case MouseButton::RIGHT:
-		clickRight(down, previousState);
-		break;
-	}
-}
-
 CIntObject::CIntObject(int used_, Point pos_):
 	parent_m(nullptr),
 	parent(parent_m),

+ 1 - 54
client/gui/CIntObject.h

@@ -9,17 +9,13 @@
  */
 #pragma once
 
-#include "MouseButton.h"
 #include "../render/Graphics.h"
 #include "../../lib/Rect.h"
+#include "EventsReceiver.h"
 
 struct SDL_Surface;
 class CGuiHandler;
 class CPicture;
-class InterfaceEventDispatcher;
-enum class EShortcut;
-
-using boost::logic::tribool;
 
 class IUpdateable
 {
@@ -42,55 +38,6 @@ public:
 	virtual ~IShowActivatable() = default;
 };
 
-class AEventsReceiver
-{
-	friend class InterfaceEventDispatcher;
-
-	ui16 activeState;
-	std::map<MouseButton, bool> currentMouseState;
-
-	bool hoveredState; //for determining if object is hovered
-	bool strongInterestState; //if true - report all mouse movements, if not - only when hovered
-
-	void click(MouseButton btn, tribool down, bool previousState);
-protected:
-	void setMoveEventStrongInterest(bool on);
-
-	void activateEvents(ui16 what);
-	void deactivateEvents(ui16 what);
-
-	virtual void clickLeft(tribool down, bool previousState) {}
-	virtual void clickRight(tribool down, bool previousState) {}
-	virtual void clickMiddle(tribool down, bool previousState) {}
-
-	virtual void textInputed(const std::string & enteredText) {}
-	virtual void textEdited(const std::string & enteredText) {}
-
-	virtual void tick(uint32_t msPassed) {}
-	virtual void wheelScrolled(bool down, bool in) {}
-	virtual void mouseMoved(const Point & cursorPosition) {}
-	virtual void hover(bool on) {}
-	virtual void onDoubleClick() {}
-
-	virtual void keyPressed(EShortcut key) {}
-	virtual void keyReleased(EShortcut key) {}
-
-	virtual bool captureThisKey(EShortcut key) = 0;
-	virtual bool isInside(const Point & position) = 0;
-
-public:
-	AEventsReceiver();
-	virtual ~AEventsReceiver() = default;
-
-	// These are the arguments that can be used to determine what kind of input the CIntObject will receive
-	enum {LCLICK=1, RCLICK=2, HOVER=4, MOVE=8, KEYBOARD=16, TIME=32, GENERAL=64, WHEEL=128, DOUBLECLICK=256, TEXTINPUT=512, MCLICK=1024, ALL=0xffff};
-
-	bool isHovered() const;
-	bool isActive() const;
-	bool isActive(int flags) const;
-	bool isMouseButtonPressed(MouseButton btn) const;
-};
-
 // Base UI element
 class CIntObject : public IShowActivatable, public AEventsReceiver //interface object
 {

+ 22 - 21
client/gui/InterfaceEventDispatcher.cpp → client/gui/EventDispatcher.cpp

@@ -1,5 +1,5 @@
 /*
- * CGuiHandler.cpp, part of VCMI engine
+ * EventDispatcher.cpp, part of VCMI engine
  *
  * Authors: listed in file AUTHORS in main folder
  *
@@ -8,23 +8,24 @@
  *
  */
 #include "StdInc.h"
-#include "InterfaceEventDispatcher.h"
-#include "CIntObject.h"
-#include "CGuiHandler.h"
+#include "EventDispatcher.h"
+
+#include "EventsReceiver.h"
 #include "FramerateManager.h"
+#include "CGuiHandler.h"
 
-void InterfaceEventDispatcher::allowEventHandling(bool enable)
+void EventDispatcher::allowEventHandling(bool enable)
 {
 	eventHandlingAllowed = enable;
 }
 
-void InterfaceEventDispatcher::processList(const ui16 mask, const ui16 flag, CIntObjectList *lst, std::function<void (CIntObjectList *)> cb)
+void EventDispatcher::processList(const ui16 mask, const ui16 flag, CIntObjectList *lst, std::function<void (CIntObjectList *)> cb)
 {
 	if (mask & flag)
 		cb(lst);
 }
 
-void InterfaceEventDispatcher::processLists(ui16 activityFlag, std::function<void (CIntObjectList *)> cb)
+void EventDispatcher::processLists(ui16 activityFlag, std::function<void (CIntObjectList *)> cb)
 {
 	processList(AEventsReceiver::LCLICK,activityFlag,&lclickable,cb);
 	processList(AEventsReceiver::RCLICK,activityFlag,&rclickable,cb);
@@ -38,7 +39,7 @@ void InterfaceEventDispatcher::processLists(ui16 activityFlag, std::function<voi
 	processList(AEventsReceiver::TEXTINPUT,activityFlag,&textInterested,cb);
 }
 
-void InterfaceEventDispatcher::handleElementActivate(AEventsReceiver * elem, ui16 activityFlag)
+void EventDispatcher::handleElementActivate(AEventsReceiver * elem, ui16 activityFlag)
 {
 	processLists(activityFlag,[&](CIntObjectList * lst){
 		lst->push_front(elem);
@@ -46,7 +47,7 @@ void InterfaceEventDispatcher::handleElementActivate(AEventsReceiver * elem, ui1
 	elem->activeState |= activityFlag;
 }
 
-void InterfaceEventDispatcher::handleElementDeActivate(AEventsReceiver * elem, ui16 activityFlag)
+void EventDispatcher::handleElementDeActivate(AEventsReceiver * elem, ui16 activityFlag)
 {
 	processLists(activityFlag,[&](CIntObjectList * lst){
 		auto hlp = std::find(lst->begin(),lst->end(),elem);
@@ -56,7 +57,7 @@ void InterfaceEventDispatcher::handleElementDeActivate(AEventsReceiver * elem, u
 	elem->activeState &= ~activityFlag;
 }
 
-void InterfaceEventDispatcher::dispatchTimer(uint32_t msPassed)
+void EventDispatcher::dispatchTimer(uint32_t msPassed)
 {
 	CIntObjectList hlp = timeinterested;
 	for (auto & elem : hlp)
@@ -66,7 +67,7 @@ void InterfaceEventDispatcher::dispatchTimer(uint32_t msPassed)
 	}
 }
 
-void InterfaceEventDispatcher::dispatchShortcutPressed(const std::vector<EShortcut> & shortcutsVector)
+void EventDispatcher::dispatchShortcutPressed(const std::vector<EShortcut> & shortcutsVector)
 {
 	bool keysCaptured = false;
 
@@ -88,7 +89,7 @@ void InterfaceEventDispatcher::dispatchShortcutPressed(const std::vector<EShortc
 	}
 }
 
-void InterfaceEventDispatcher::dispatchShortcutReleased(const std::vector<EShortcut> & shortcutsVector)
+void EventDispatcher::dispatchShortcutReleased(const std::vector<EShortcut> & shortcutsVector)
 {
 	bool keysCaptured = false;
 
@@ -110,7 +111,7 @@ void InterfaceEventDispatcher::dispatchShortcutReleased(const std::vector<EShort
 	}
 }
 
-InterfaceEventDispatcher::CIntObjectList & InterfaceEventDispatcher::getListForMouseButton(MouseButton button)
+EventDispatcher::CIntObjectList & EventDispatcher::getListForMouseButton(MouseButton button)
 {
 	switch (button)
 	{
@@ -124,7 +125,7 @@ InterfaceEventDispatcher::CIntObjectList & InterfaceEventDispatcher::getListForM
 	throw std::runtime_error("Invalid mouse button in getListForMouseButton");
 }
 
-void InterfaceEventDispatcher::dispatchMouseDoubleClick(const Point & position)
+void EventDispatcher::dispatchMouseDoubleClick(const Point & position)
 {
 	bool doubleClicked = false;
 	auto hlp = doubleClickInterested;
@@ -148,17 +149,17 @@ void InterfaceEventDispatcher::dispatchMouseDoubleClick(const Point & position)
 		dispatchMouseButtonPressed(MouseButton::LEFT, position);
 }
 
-void InterfaceEventDispatcher::dispatchMouseButtonPressed(const MouseButton & button, const Point & position)
+void EventDispatcher::dispatchMouseButtonPressed(const MouseButton & button, const Point & position)
 {
 	handleMouseButtonClick(getListForMouseButton(button), button, true);
 }
 
-void InterfaceEventDispatcher::dispatchMouseButtonReleased(const MouseButton & button, const Point & position)
+void EventDispatcher::dispatchMouseButtonReleased(const MouseButton & button, const Point & position)
 {
 	handleMouseButtonClick(getListForMouseButton(button), button, false);
 }
 
-void InterfaceEventDispatcher::handleMouseButtonClick(CIntObjectList & interestedObjs, MouseButton btn, bool isPressed)
+void EventDispatcher::handleMouseButtonClick(CIntObjectList & interestedObjs, MouseButton btn, bool isPressed)
 {
 	auto hlp = interestedObjs;
 	for(auto & i : hlp)
@@ -183,7 +184,7 @@ void InterfaceEventDispatcher::handleMouseButtonClick(CIntObjectList & intereste
 	}
 }
 
-void InterfaceEventDispatcher::dispatchMouseScrolled(const Point & distance, const Point & position)
+void EventDispatcher::dispatchMouseScrolled(const Point & distance, const Point & position)
 {
 	CIntObjectList hlp = wheelInterested;
 	for(auto i = hlp.begin(); i != hlp.end() && eventHandlingAllowed; i++)
@@ -194,7 +195,7 @@ void InterfaceEventDispatcher::dispatchMouseScrolled(const Point & distance, con
 	}
 }
 
-void InterfaceEventDispatcher::dispatchTextInput(const std::string & text)
+void EventDispatcher::dispatchTextInput(const std::string & text)
 {
 	for(auto it : textInterested)
 	{
@@ -202,7 +203,7 @@ void InterfaceEventDispatcher::dispatchTextInput(const std::string & text)
 	}
 }
 
-void InterfaceEventDispatcher::dispatchTextEditing(const std::string & text)
+void EventDispatcher::dispatchTextEditing(const std::string & text)
 {
 	for(auto it : textInterested)
 	{
@@ -210,7 +211,7 @@ void InterfaceEventDispatcher::dispatchTextEditing(const std::string & text)
 	}
 }
 
-void InterfaceEventDispatcher::dispatchMouseMoved(const Point & position)
+void EventDispatcher::dispatchMouseMoved(const Point & position)
 {
 	//sending active, hovered hoverable objects hover() call
 	CIntObjectList hlp;

+ 2 - 2
client/gui/InterfaceEventDispatcher.h → client/gui/EventDispatcher.h

@@ -1,5 +1,5 @@
 /*
- * CGuiHandler.h, part of VCMI engine
+ * EventDispatcher.h, part of VCMI engine
  *
  * Authors: listed in file AUTHORS in main folder
  *
@@ -17,7 +17,7 @@ class AEventsReceiver;
 enum class MouseButton;
 enum class EShortcut;
 
-class InterfaceEventDispatcher
+class EventDispatcher
 {
 	using CIntObjectList = std::list<AEventsReceiver *>;
 

+ 79 - 0
client/gui/EventsReceiver.cpp

@@ -0,0 +1,79 @@
+/*
+ * EventsReceiver.cpp, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#include "StdInc.h"
+#include "EventsReceiver.h"
+
+#include "MouseButton.h"
+#include "CGuiHandler.h"
+#include "EventDispatcher.h"
+
+AEventsReceiver::AEventsReceiver()
+	: activeState(0)
+	, hoveredState(false)
+	, strongInterestState(false)
+{
+}
+
+bool AEventsReceiver::isHovered() const
+{
+	return hoveredState;
+}
+
+bool AEventsReceiver::isActive() const
+{
+	return activeState;
+}
+
+bool AEventsReceiver::isActive(int flags) const
+{
+	return activeState & flags;
+}
+
+bool AEventsReceiver::isMouseButtonPressed(MouseButton btn) const
+{
+	return currentMouseState.count(btn) ? currentMouseState.at(btn) : false;
+}
+
+void AEventsReceiver::setMoveEventStrongInterest(bool on)
+{
+	strongInterestState = on;
+}
+
+void AEventsReceiver::activateEvents(ui16 what)
+{
+	assert((what & GENERAL) || (activeState & GENERAL));
+
+	activeState |= GENERAL;
+	GH.eventDispatcher().handleElementActivate(this, what);
+}
+
+void AEventsReceiver::deactivateEvents(ui16 what)
+{
+	if (what & GENERAL)
+		activeState &= ~GENERAL;
+	GH.eventDispatcher().handleElementDeActivate(this, what & activeState);
+}
+
+void AEventsReceiver::click(MouseButton btn, tribool down, bool previousState)
+{
+	switch(btn)
+	{
+	default:
+	case MouseButton::LEFT:
+		clickLeft(down, previousState);
+		break;
+	case MouseButton::MIDDLE:
+		clickMiddle(down, previousState);
+		break;
+	case MouseButton::RIGHT:
+		clickRight(down, previousState);
+		break;
+	}
+}

+ 68 - 0
client/gui/EventsReceiver.h

@@ -0,0 +1,68 @@
+/*
+ * EventsReceiver.h, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+#pragma once
+
+VCMI_LIB_NAMESPACE_BEGIN
+class Point;
+VCMI_LIB_NAMESPACE_END
+
+class EventDispatcher;
+enum class MouseButton;
+enum class EShortcut;
+using boost::logic::tribool;
+
+class AEventsReceiver
+{
+	friend class EventDispatcher;
+
+	ui16 activeState;
+	std::map<MouseButton, bool> currentMouseState;
+
+	bool hoveredState; //for determining if object is hovered
+	bool strongInterestState; //if true - report all mouse movements, if not - only when hovered
+
+	void click(MouseButton btn, tribool down, bool previousState);
+protected:
+	void setMoveEventStrongInterest(bool on);
+
+	void activateEvents(ui16 what);
+	void deactivateEvents(ui16 what);
+
+	virtual void clickLeft(tribool down, bool previousState) {}
+	virtual void clickRight(tribool down, bool previousState) {}
+	virtual void clickMiddle(tribool down, bool previousState) {}
+
+	virtual void textInputed(const std::string & enteredText) {}
+	virtual void textEdited(const std::string & enteredText) {}
+
+	virtual void tick(uint32_t msPassed) {}
+	virtual void wheelScrolled(bool down, bool in) {}
+	virtual void mouseMoved(const Point & cursorPosition) {}
+	virtual void hover(bool on) {}
+	virtual void onDoubleClick() {}
+
+	virtual void keyPressed(EShortcut key) {}
+	virtual void keyReleased(EShortcut key) {}
+
+	virtual bool captureThisKey(EShortcut key) = 0;
+	virtual bool isInside(const Point & position) = 0;
+
+public:
+	AEventsReceiver();
+	virtual ~AEventsReceiver() = default;
+
+	// These are the arguments that can be used to determine what kind of input the CIntObject will receive
+	enum {LCLICK=1, RCLICK=2, HOVER=4, MOVE=8, KEYBOARD=16, TIME=32, GENERAL=64, WHEEL=128, DOUBLECLICK=256, TEXTINPUT=512, MCLICK=1024, ALL=0xffff};
+
+	bool isHovered() const;
+	bool isActive() const;
+	bool isActive(int flags) const;
+	bool isMouseButtonPressed(MouseButton btn) const;
+};