[Scummvm-git-logs] scummvm master -> 49fb52efd6da41cfe984217804ab09ae67646fd0
dreammaster
noreply at scummvm.org
Fri May 10 03:41:08 UTC 2024
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:
49fb52efd6 CREATE_ENGINE: Added View class for events template
Commit: 49fb52efd6da41cfe984217804ab09ae67646fd0
https://github.com/scummvm/scummvm/commit/49fb52efd6da41cfe984217804ab09ae67646fd0
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2024-05-09T20:40:58-07:00
Commit Message:
CREATE_ENGINE: Added View class for events template
Improves mouse events for the events-based project template.
This includes a View class that:
1) Mouse events only get sent to the control under the mouse
rather than all controls on the view
2) Elements will get Focus/Unfocus messages as the mouse
moves in or out of their bounds
Changed paths:
A devtools/create_engine/files_events/view.cpp
A devtools/create_engine/files_events/view.h
devtools/create_engine/create_engine.cpp
devtools/create_engine/files_events/events.cpp
devtools/create_engine/files_events/events.h
devtools/create_engine/files_events/messages.h
devtools/create_engine/files_events/module.mk
devtools/create_engine/files_events/view1.h
diff --git a/devtools/create_engine/create_engine.cpp b/devtools/create_engine/create_engine.cpp
index f31af277559..12aa7f1a77f 100644
--- a/devtools/create_engine/create_engine.cpp
+++ b/devtools/create_engine/create_engine.cpp
@@ -56,9 +56,10 @@ static const char *const FILENAMES_EVENTS[] = {
"files_events/messages.cpp", "files_events/messages.h",
"files/metaengine.cpp", "files/metaengine.h",
"files_events/module.mk", "files_events/xyzzy.cpp",
- "files_events/xyzzy.h", "files/POTFILES",
- "files_events/views.h", "files_events/view1.cpp",
- "files_events/view1.h", nullptr
+ "files_events/xyzzy.h", "files/POTFILES", "files_events/views.h",
+ "files_events/view.cpp", "files_events/view.h",
+ "files_events/view1.cpp", "files_events/view1.h",
+ nullptr
};
const char *const ENGINES = "create_project ..\\.. --msvc\n";
diff --git a/devtools/create_engine/files_events/events.cpp b/devtools/create_engine/files_events/events.cpp
index df7a10a2ba5..7d3b2335865 100644
--- a/devtools/create_engine/files_events/events.cpp
+++ b/devtools/create_engine/files_events/events.cpp
@@ -87,14 +87,17 @@ void Events::processEvent(Common::Event &ev) {
break;
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_RBUTTONDOWN:
- //case Common::EVENT_MBUTTONDOWN:
+ case Common::EVENT_MBUTTONDOWN:
msgMouseDown(MouseDownMessage(ev.type, ev.mouse));
break;
case Common::EVENT_LBUTTONUP:
case Common::EVENT_RBUTTONUP:
- //case Common::EVENT_MBUTTONUP:
+ case Common::EVENT_MBUTTONUP:
msgMouseUp(MouseUpMessage(ev.type, ev.mouse));
break;
+ case Common::EVENT_MOUSEMOVE:
+ msgMouseMove(MouseMoveMessage(ev.type, ev.mouse));
+ break;
default:
break;
}
diff --git a/devtools/create_engine/files_events/events.h b/devtools/create_engine/files_events/events.h
index 1c94f247430..84fa8068223 100644
--- a/devtools/create_engine/files_events/events.h
+++ b/devtools/create_engine/files_events/events.h
@@ -207,6 +207,12 @@ public:
/**
* Handles events
*/
+ // Mouse move only has a minimal implementation for performance reasons
+protected:
+ virtual bool msgMouseMove(const MouseMoveMessage &msg) { return false; }
+public:
+ bool send(const MouseMoveMessage &msg) { return msgMouseMove(msg); }
+
#define MESSAGE(NAME) \
protected: \
virtual bool msg##NAME(const NAME##Message &e) { \
@@ -223,7 +229,7 @@ public:
return view->msg##NAME(msg); \
} \
bool send(const NAME##Message &msg) { \
- return send("Root", msg); \
+ return msg##NAME(msg); \
} \
MESSAGE(Focus);
@@ -272,6 +278,7 @@ protected:
MESSAGE(Keypress);
MESSAGE(MouseDown);
MESSAGE(MouseUp);
+ MESSAGE(MouseMove);
#undef MESSAGE
public:
Events();
diff --git a/devtools/create_engine/files_events/messages.h b/devtools/create_engine/files_events/messages.h
index aaa6e3685a1..16b624c613f 100644
--- a/devtools/create_engine/files_events/messages.h
+++ b/devtools/create_engine/files_events/messages.h
@@ -71,6 +71,7 @@ struct MouseUpMessage : public MouseMessage {
MouseUpMessage(Common::EventType type, const Common::Point &pos) :
MouseMessage(type, pos) {}
};
+typedef MouseMessage MouseMoveMessage;
struct GameMessage : public Message {
Common::String _name;
diff --git a/devtools/create_engine/files_events/module.mk b/devtools/create_engine/files_events/module.mk
index 9af3a1cb34a..bc94a085190 100644
--- a/devtools/create_engine/files_events/module.mk
+++ b/devtools/create_engine/files_events/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS = \
events.o \
messages.o \
metaengine.o \
+ view.o \
view1.o
# This module can be built as a plugin
diff --git a/devtools/create_engine/files_events/view.cpp b/devtools/create_engine/files_events/view.cpp
new file mode 100644
index 00000000000..db9423fa97b
--- /dev/null
+++ b/devtools/create_engine/files_events/view.cpp
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "xyzzy/view.h"
+
+namespace Xyzzy {
+
+void View::checkFocusedControl(const Common::Point &mousePos) {
+ if (_focusedElement) {
+ if (!_focusedElement->getBounds().contains(mousePos)) {
+ _focusedElement->send(UnfocusMessage());
+ _focusedElement = nullptr;
+ }
+
+ } else {
+ for (UIElement *child : _children) {
+ if (child->getBounds().contains(mousePos)) {
+ _focusedElement = child;
+ child->send(FocusMessage());
+ break;
+ }
+ }
+ }
+}
+
+UIElement *View::getElementAtPos(const Common::Point &pos) const {
+ for (UIElement *child : _children) {
+ if (child->getBounds().contains(pos))
+ return child;
+ }
+
+ return nullptr;
+}
+
+
+bool View::msgFocus(const FocusMessage &msg) {
+ _focusedElement = nullptr;
+ return UIElement::msgFocus(msg);
+}
+
+bool View::msgUnfocus(const UnfocusMessage &msg) {
+ if (_focusedElement)
+ _focusedElement->send(UnfocusMessage());
+
+ return UIElement::msgUnfocus(msg);
+}
+
+bool View::msgMouseMove(const MouseMoveMessage &msg) {
+ checkFocusedControl(msg._pos);
+ return true;
+}
+
+bool View::msgMouseDown(const MouseDownMessage &msg) {
+ UIElement *child = getElementAtPos(msg._pos);
+ return child ? child->send(msg) : false;
+}
+
+bool View::msgMouseUp(const MouseUpMessage &msg) {
+ UIElement *child = getElementAtPos(msg._pos);
+ return child ? child->send(msg) : false;
+}
+
+} // namespace Xyzzy
diff --git a/devtools/create_engine/files_events/view.h b/devtools/create_engine/files_events/view.h
new file mode 100644
index 00000000000..f916883d400
--- /dev/null
+++ b/devtools/create_engine/files_events/view.h
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef XYZZY_VIEW_H
+#define XYZZY_VIEW_H
+
+#include "xyzzy/events.h"
+
+namespace Xyzzy {
+
+/**
+ * Base view class for screens and dialogs that appear on-screen.
+ * The View class takes care of two important things:
+ * 1) By default events get sent to all controls on a view until one
+ * handles it. For mouse events, we instead want only the control the
+ * mouse cursor is over to receive the events, saving the individual
+ * controls from having to check if the mouse is within their bounds.
+ * 2) Individual elements will get a Focus/Unfocus message as the
+ * mouse enters and leaves them. This allows, for example, buttons
+ * that have been pressed to de-select if the mouse leaves their bounds.
+ */
+class View : public UIElement {
+private:
+ UIElement *_focusedElement = nullptr;
+
+ /**
+ * Checks if a control is entered or left
+ */
+ void checkFocusedControl(const Common::Point &mousePos);
+
+ /**
+ * Check for an element at the given position
+ */
+ UIElement *getElementAtPos(const Common::Point &pos) const;
+
+public:
+ View(const Common::String &name, UIElement *uiParent) :
+ UIElement(name, uiParent) {
+ }
+ View(const Common::String &name) :
+ UIElement(name) {
+ }
+ virtual ~View() {
+ }
+
+ bool msgFocus(const FocusMessage &msg) override;
+ bool msgUnfocus(const UnfocusMessage &msg) override;
+ bool msgMouseMove(const MouseMoveMessage &msg) override;
+ bool msgMouseDown(const MouseDownMessage &msg) override;
+ bool msgMouseUp(const MouseUpMessage &msg) override;
+};
+
+} // namespace Xyzzy
+
+#endif
diff --git a/devtools/create_engine/files_events/view1.h b/devtools/create_engine/files_events/view1.h
index fcb6fbba6c5..62d0fc50bf9 100644
--- a/devtools/create_engine/files_events/view1.h
+++ b/devtools/create_engine/files_events/view1.h
@@ -22,17 +22,17 @@
#ifndef XYZZY_VIEW1_H
#define XYZZY_VIEW1_H
-#include "xyzzy/events.h"
+#include "xyzzy/view.h"
namespace Xyzzy {
-class View1 : public UIElement {
+class View1 : public View {
private:
byte _pal[256 * 3] = { 0 };
int _offset = 0;
public:
- View1() : UIElement("View1") {}
+ View1() : View("View1") {}
virtual ~View1() {}
bool msgFocus(const FocusMessage &msg) override;
More information about the Scummvm-git-logs
mailing list