aboutsummaryrefslogtreecommitdiff
path: root/engines/m4/viewmgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/m4/viewmgr.h')
-rw-r--r--engines/m4/viewmgr.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/engines/m4/viewmgr.h b/engines/m4/viewmgr.h
new file mode 100644
index 0000000000..148fb565da
--- /dev/null
+++ b/engines/m4/viewmgr.h
@@ -0,0 +1,191 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef M4_VIEWMGR_H
+#define M4_VIEWMGR_H
+
+#include "common/array.h"
+#include "common/list.h"
+#include "common/events.h"
+#include "common/rect.h"
+
+#include "m4/globals.h"
+#include "m4/events.h"
+#include "m4/graphics.h"
+
+namespace M4 {
+
+class View;
+class ViewManager;
+
+enum {SCREEN_DIALOG, SCREEN_BUFFER, SCREEN_TEXT, SCREEN_TRANSPARENT};
+enum ScreenEventType {SCREVENT_NONE = 0, SCREVENT_KEY = 1, SCREVENT_MOUSE = 2, SCREVENT_ALL = 3};
+enum ScreenLayers {
+ LAYER_BACKGROUND = 0, LAYER_DRIFTER = 1, LAYER_INTERFACE = 1, LAYER_FLOATER = 2,
+ LAYER_SURFACE = 3, LAYER_MENU = 9, LAYER_MOUSE = 15
+};
+
+enum ViewIds {
+ VIEWID_MAINMENU = 1,
+ VIEWID_SCENE = 2,
+ VIEWID_TEXTVIEW = 3,
+ VIEWID_ANIMVIEW = 4,
+ VIEWID_MENU = 69,
+ VIEWID_CONVERSATION = 48,
+ VIEWID_INTERFACE = 49
+};
+
+struct ScreenFlags {
+ bool visible:1;
+ bool transparent:1;
+ bool immovable:1;
+
+ enum ScreenEventType blocks:2;
+ enum ScreenEventType get:2;
+
+ uint layer:4;
+};
+
+#define SCREEN_FLAGS_DEFAULT _screenFlags.layer = LAYER_DRIFTER; \
+ _screenFlags.get = SCREVENT_ALL; _screenFlags.blocks = SCREVENT_NONE; \
+ _screenFlags.visible = true;
+#define SCREEN_FLAGS_ALERT _screenFlags.layer = LAYER_FLOATER \
+ _screenFlags.get = SCREVENT_ALL; _screenFlags.blocks = SCREVENT_ALL; \
+ _screenFlags.visible = true;
+
+class RectList: public Common::Array<Common::Rect> {
+public:
+ RectList();
+ ~RectList();
+ void addRect(int x1, int y1, int x2, int y2);
+ void addRect(const Common::Rect &rect);
+
+// Common::Rect& operator [](int idx) { return _rects[idx]; }
+};
+
+struct Hotkey {
+public:
+ typedef void (*Callback)(M4Engine *vm, View *view, uint32 key);
+ Hotkey(uint32 keyVal, Hotkey::Callback callbackFn) : key(keyVal), callback(callbackFn) {};
+ uint32 key;
+ Hotkey::Callback callback;
+};
+
+class HotkeyList {
+public:
+ HotkeyList(View *owner);
+ ~HotkeyList();
+ void add(uint32 key, Hotkey::Callback callback);
+ void remove(uint32 key);
+ bool call(uint32 key);
+private:
+ Common::Array<Hotkey*> _hotkeys;
+ View *_view;
+};
+
+class View: public M4Surface {
+public:
+ View(M4Engine *vm, const Common::Rect &viewBounds, bool transparent = false);
+ View(M4Engine *vm, int x = 0, int y = 0, bool transparent = false);
+ virtual ~View() {}
+
+ void getCoordinates(Common::Rect &rect);
+ void extract(int *status);
+ virtual void show();
+ virtual void hide();
+ void moveToFront() {}
+ void moveToBack();
+ void moveAbsolute(int x, int y);
+ void moveRelative(int x, int y);
+ void resize(int newWidth, int newHeight);
+ void restore(int x1, int y1, int x2, int y2);
+
+ Common::Rect bounds() const { return _coords; }
+ bool isInside(int x, int y) const { return _coords.contains(x, y); }
+ ScreenFlags screenFlags() const { return _screenFlags; }
+ int screenType() const { return _screenType; }
+ bool isOffscreen() const { return !_screenFlags.visible; }
+ bool isTransparent() const { return _screenFlags.transparent; }
+ bool isVisible() const { return _screenFlags.visible; }
+ uint layer() const { return _screenFlags.layer; }
+ HotkeyList &hotkeys() { return _hotkeys; }
+
+ virtual void onRefresh(RectList *rects, M4Surface *destSurface);
+ virtual bool onEvent(M4EventType eventType, int param, int x, int y, bool &captureEvents) { return false; }
+ virtual void updateState() {};
+
+protected:
+ M4Engine *_vm;
+ Common::Rect _coords;
+ HotkeyList _hotkeys;
+ int _screenType;
+ ScreenFlags _screenFlags;
+ bool _transparent;
+};
+
+class ViewManager {
+private:
+ M4Engine *_vm;
+ HotkeyList _systemHotkeys;
+ Common::List<View *> _views;
+ View *_captureScreen;
+ bool _captureEvents;
+public:
+ typedef Common::List<View *>::iterator ListIterator;
+
+ ViewManager(M4Engine *vm);
+ ~ViewManager();
+
+ void addView(View *view);
+ void deleteView(View *view);
+
+ void handleEvents(const Common::Event &event);
+ void handleKeyboardEvents(uint32 keycode);
+ void handleMouseEvents(M4EventType event);
+ void restore(int x1, int y1, int x2, int y2);
+ void restore(const Common::Rect &rect);
+
+ void moveToFront(View *view);
+ void moveToBack(View *view);
+
+ Common::List<View *> views() const { return _views; }
+ bool contains(View *key) const {
+ return find(_views.begin(), _views.end(), key) != _views.end();
+ }
+ bool contains(int screenType) { return getView(screenType) != NULL; }
+ View *getView(int screenType);
+ int viewCount() { return _views.size(); }
+
+ void showTextView(const char *textViewName, bool returnToMainMenu = true);
+ void showAnimView(const char *animViewName, bool returnToMainMenu = true);
+
+ void updateState();
+ void refreshAll();
+ HotkeyList &systemHotkeys() { return _systemHotkeys; }
+};
+
+}
+
+#endif