aboutsummaryrefslogtreecommitdiff
path: root/gui/gui-manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'gui/gui-manager.h')
-rw-r--r--gui/gui-manager.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/gui/gui-manager.h b/gui/gui-manager.h
new file mode 100644
index 0000000000..ee1351dc9b
--- /dev/null
+++ b/gui/gui-manager.h
@@ -0,0 +1,157 @@
+/* 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 GUIMANAGER_H
+#define GUIMANAGER_H
+
+#include "common/scummsys.h"
+#include "common/singleton.h"
+#include "common/stack.h"
+#include "common/str.h"
+
+#include "graphics/font.h"
+
+#include "gui/widget.h"
+#include "gui/Tooltip.h"
+#include "gui/ThemeEngine.h"
+
+class OSystem;
+
+namespace GUI {
+
+class Dialog;
+class ThemeEval;
+
+#define g_gui (GUI::GuiManager::instance())
+
+
+// Height of a single text line
+#define kLineHeight (g_gui.getFontHeight() + 2)
+
+
+
+// Simple dialog stack class
+// Anybody nesting dialogs deeper than 4 is mad anyway
+typedef Common::FixedStack<Dialog *> DialogStack;
+
+
+/**
+ * GUI manager singleton.
+ */
+class GuiManager : public Common::Singleton<GuiManager> {
+ friend class Dialog;
+ friend class Tooltip;
+ friend class Common::Singleton<SingletonBaseType>;
+ GuiManager();
+ ~GuiManager();
+public:
+
+ // Main entry for the GUI: this will start an event loop that keeps running
+ // until no dialogs are active anymore.
+ void runLoop();
+
+ bool isActive() const { return ! _dialogStack.empty(); }
+
+ bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled, bool force = false);
+ ThemeEngine *theme() { return _theme; }
+
+ ThemeEval *xmlEval() { return _theme->getEvaluator(); }
+
+ int getWidth() const { return _width; }
+ int getHeight() const { return _height; }
+
+ const Graphics::Font &getFont(ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return *(_theme->getFont(style)); }
+ int getFontHeight(ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getFontHeight(style); }
+ int getStringWidth(const Common::String &str, ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getStringWidth(str, style); }
+ int getCharWidth(byte c, ThemeEngine::FontStyle style = ThemeEngine::kFontStyleBold) const { return _theme->getCharWidth(c, style); }
+
+ /**
+ * Tell the GuiManager to check whether the screen resolution has changed.
+ * If that is the case, the GuiManager will reload/refresh the active theme.
+ *
+ * @return true if the a screen change indeed occurred, false otherwise
+ */
+ bool checkScreenChange();
+
+protected:
+ enum RedrawStatus {
+ kRedrawDisabled = 0,
+ kRedrawOpenDialog,
+ kRedrawCloseDialog,
+ kRedrawTopDialog,
+ kRedrawFull
+ };
+
+ OSystem *_system;
+
+ ThemeEngine *_theme;
+
+// bool _needRedraw;
+ RedrawStatus _redrawStatus;
+ int _lastScreenChangeID;
+ int _width, _height;
+ DialogStack _dialogStack;
+
+ bool _stateIsSaved;
+
+ bool _useStdCursor;
+
+ Tooltip *_tooltip;
+ bool _tooltipCheck;
+
+ // position and time of last mouse click (used to detect double clicks)
+ struct {
+ int16 x, y; // Position of mouse when the click occurred
+ uint32 time; // Time
+ int count; // How often was it already pressed?
+ } _lastClick, _lastMousePosition;
+
+ // mouse cursor state
+ int _cursorAnimateCounter;
+ int _cursorAnimateTimer;
+ byte _cursor[2048];
+
+ void initKeymap();
+
+ void saveState();
+ void restoreState();
+
+ void openDialog(Dialog *dialog);
+ void closeTopDialog();
+
+ void redraw();
+
+ void loop();
+
+ void setupCursor();
+ void animateCursor();
+
+ Dialog *getTopDialog() const;
+
+ void screenChange();
+};
+
+} // End of namespace GUI
+
+#endif