diff options
Diffstat (limited to 'gui/InterfaceManager.h')
-rw-r--r-- | gui/InterfaceManager.h | 127 |
1 files changed, 110 insertions, 17 deletions
diff --git a/gui/InterfaceManager.h b/gui/InterfaceManager.h index 906c5173e1..779f9aab57 100644 --- a/gui/InterfaceManager.h +++ b/gui/InterfaceManager.h @@ -33,6 +33,7 @@ #include "graphics/surface.h" #include "graphics/fontman.h" +#include "gui/dialog.h" #include "gui/ThemeParser.h" #include "graphics/VectorRenderer.h" @@ -43,12 +44,37 @@ namespace GUI { struct WidgetDrawData; class InterfaceManager; +struct WidgetDrawData { + Common::Array<Graphics::DrawStep*> _steps; + + bool _cached; + Graphics::Surface *_surfaceCache; + uint32 _cachedW, _cachedH; + + ~WidgetDrawData() { + for (uint i = 0; i < _steps.size(); ++i) + delete _steps[i]; + + _steps.clear(); + + if (_surfaceCache) { + _surfaceCache->free(); + delete _surfaceCache; + } + } +}; + class InterfaceManager : public Common::Singleton<InterfaceManager> { - friend class Common::Singleton<SingletonBaseType>; typedef Common::String String; + typedef GUI::Dialog Dialog; + + friend class GUI::Dialog; + friend class GUI::GuiObject; + friend class Common::Singleton<SingletonBaseType>; static const char *kDrawDataStrings[]; + static const int kMaxDialogDepth = 4; public: enum Graphics_Mode { @@ -57,6 +83,11 @@ public: kGfxAntialias16bit }; + enum { + kDoubleClickDelay = 500, // milliseconds + kCursorAnimateDelay = 250 + }; + enum DrawData { kDDMainDialogBackground, kDDSpecialColorBackground, @@ -150,8 +181,7 @@ public: void setGraphicsMode(Graphics_Mode mode); int runGUI(); - bool init(); - bool deinit(); + void init(); /** Font management */ const Graphics::Font *getFont(FontStyle font) const { return _font; } @@ -190,6 +220,43 @@ public: return _initOk && _themeOk; } + void refresh() { + init(); + if (_enabled) { + _system->showOverlay(); +// CursorMan.replaceCursorPalette(_cursorPal, 0, MAX_CURS_COLORS); +// CursorMan.replaceCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, 255, _cursorTargetScale); + } + } + + void enable() { + init(); + _system->showOverlay(); + _enabled = true; + } + + void disable() { + _system->hideOverlay(); + _enabled = false; + } + + void deinit() { + if (_initOk) { + _system->hideOverlay(); + _initOk = false; + } + } + + bool loadTheme() { + ConfMan.registerDefault("gui_theme", "default"); + Common::String style(ConfMan.get("gui_theme")); + + if (style.compareToIgnoreCase("default") == 0) + style = "modern"; + + return loadTheme(style); + } + bool loadTheme(Common::String themeName); protected: @@ -198,6 +265,18 @@ protected: bool loadThemeXML(Common::String themeName); bool loadDefaultXML(); + void unloadTheme() { + if (!_themeOk) + return; + + for (int i = 0; i < kDrawDataMAX; ++i) { + delete _widgets[i]; + _widgets[i] = 0; + } + } + + void screenChange() {} + void freeRenderer() { delete _vectorRenderer; _vectorRenderer = 0; @@ -211,17 +290,33 @@ protected: } } + Dialog *getTopDialog() const { + if (_dialogStack.empty()) + return 0; + return _dialogStack.top(); + } + + bool needThemeReload() { + return (_themeOk == false || _needThemeLoad == true); + } + + bool isWidgetCached(DrawData type, const Common::Rect &r); void drawCached(DrawData type, const Common::Rect &r); inline void drawDD(DrawData type, const Common::Rect &r); - void addDirtyRect(const Common::Rect &r) {} + + void addDirtyRect(const Common::Rect &r) { + _dirtyScreen.extend(r); + } OSystem *_system; Graphics::VectorRenderer *_vectorRenderer; - Graphics::Surface *_screen; GUI::ThemeParser *_parser; + Graphics::Surface *_screen; + Graphics::Surface *_screenCache; + int _bytesPerPixel; Graphics_Mode _graphicsMode; @@ -229,22 +324,20 @@ protected: const Graphics::Font *_font; WidgetDrawData *_widgets[kDrawDataMAX]; + Common::FixedStack<Dialog *, kMaxDialogDepth> _dialogStack; + Common::Rect _dirtyScreen; bool _initOk; bool _themeOk; bool _caching; - - static const char *_defaultXML; -}; - -struct WidgetDrawData { - Common::Array<Graphics::DrawStep*> _steps; - - bool _cached; - Graphics::Surface *_surfaceCache; - uint32 _cachedW, _cachedH; - - InterfaceManager::DrawData _type; + bool _needThemeLoad; + bool _enabled; + + struct { + int16 x, y; // Position of mouse when the click occured + uint32 time; // Time + int count; // How often was it already pressed? + } _lastClick; }; } // end of namespace GUI. |