diff options
author | Vicent Marti | 2008-07-02 18:11:41 +0000 |
---|---|---|
committer | Vicent Marti | 2008-07-02 18:11:41 +0000 |
commit | d385c34dd0c52ccc4c7fff50e88361dbb2cd588d (patch) | |
tree | ce1a73453fb8d76a84bfa9f068c05555c6a47d3e /gui | |
parent | 6c85e960b202ea8cb3af87c7d3c644690f51e511 (diff) | |
download | scummvm-rg350-d385c34dd0c52ccc4c7fff50e88361dbb2cd588d.tar.gz scummvm-rg350-d385c34dd0c52ccc4c7fff50e88361dbb2cd588d.tar.bz2 scummvm-rg350-d385c34dd0c52ccc4c7fff50e88361dbb2cd588d.zip |
InterfaceManager functionality translated into a Theme subclass "ThemeRenderer" to easen integration with the current GUI.
svn-id: r32876
Diffstat (limited to 'gui')
-rw-r--r-- | gui/ThemeDefaultXML.cpp | 4 | ||||
-rw-r--r-- | gui/ThemeParser.cpp | 13 | ||||
-rw-r--r-- | gui/ThemeParser.h | 8 | ||||
-rw-r--r-- | gui/ThemeRenderer.cpp (renamed from gui/InterfaceManager.cpp) | 175 | ||||
-rw-r--r-- | gui/ThemeRenderer.h (renamed from gui/InterfaceManager.h) | 119 | ||||
-rw-r--r-- | gui/object.h | 3 | ||||
-rw-r--r-- | gui/theme.h | 4 |
7 files changed, 86 insertions, 240 deletions
diff --git a/gui/ThemeDefaultXML.cpp b/gui/ThemeDefaultXML.cpp index cd571e680e..4b48e11991 100644 --- a/gui/ThemeDefaultXML.cpp +++ b/gui/ThemeDefaultXML.cpp @@ -24,11 +24,11 @@ */ #include "common/system.h" -#include "gui/InterfaceManager.h" +#include "gui/ThemeRenderer.h" namespace GUI { -bool InterfaceManager::loadDefaultXML() { +bool ThemeRenderer::loadDefaultXML() { const char *defaultXML = /** * Default theme description file. Work in progress. diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index 07789ebee3..eac8c20978 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -30,8 +30,9 @@ #include "common/hash-str.h" #include "common/xmlparser.h" -#include "gui/InterfaceManager.h" +#include "gui/ThemeRenderer.h" #include "gui/ThemeParser.h" +#include "gui/NewGui.h" #include "graphics/VectorRenderer.h" namespace GUI { @@ -39,7 +40,7 @@ namespace GUI { using namespace Graphics; using namespace Common; -ThemeParser::ThemeParser(InterfaceManager *parent) : XMLParser() { +ThemeParser::ThemeParser(ThemeRenderer *parent) : XMLParser() { _callbacks["drawstep"] = &ThemeParser::parserCallback_DRAWSTEP; _callbacks["drawdata"] = &ThemeParser::parserCallback_DRAWDATA; _callbacks["palette"] = &ThemeParser::parserCallback_palette; @@ -59,7 +60,7 @@ ThemeParser::ThemeParser(InterfaceManager *parent) : XMLParser() { _defaultStepGlobal = defaultDrawStep(); _defaultStepLocal = 0; - _GUI = parent; + _theme = parent; } bool ThemeParser::keyCallback(Common::String keyName) { @@ -213,7 +214,7 @@ bool ThemeParser::parserCallback_DRAWSTEP() { if (!parseDrawStep(stepNode, drawstep, true)) return false; - _GUI->addDrawStep(drawdataNode->values["id"], drawstep); + _theme->addDrawStep(drawdataNode->values["id"], drawstep); return true; } @@ -229,7 +230,7 @@ bool ThemeParser::parserCallback_DRAWDATA() { if (drawdataNode->values.contains("id") == false) return parserError("DrawData keys must contain an identifier."); - InterfaceManager::DrawData id = _GUI->getDrawDataId(drawdataNode->values["id"]); + ThemeRenderer::DrawData id = _theme->getDrawDataId(drawdataNode->values["id"]); if (id == -1) return parserError("%s is not a valid DrawData set identifier.", drawdataNode->values["id"].c_str()); @@ -252,7 +253,7 @@ bool ThemeParser::parserCallback_DRAWDATA() { } }*/ - if (_GUI->addDrawData(id, cached) == false) + if (_theme->addDrawData(id, cached) == false) return parserError("Repeated DrawData: Only one set of Drawing Data for a widget may be specified on each platform."); if (_defaultStepLocal) { diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h index 68e8272b80..56d45eb802 100644 --- a/gui/ThemeParser.h +++ b/gui/ThemeParser.h @@ -36,7 +36,7 @@ #include "common/xmlparser.h" #include "graphics/VectorRenderer.h" -#include "gui/InterfaceManager.h" +#include "gui/ThemeRenderer.h" /** ********************************************* @@ -308,7 +308,7 @@ namespace GUI { using namespace Graphics; using namespace Common; -class InterfaceManager; +class ThemeRenderer; class ThemeParser : public XMLParser { typedef void (VectorRenderer::*DrawingFunctionCallback)(const Common::Rect &, const DrawStep &); @@ -316,10 +316,10 @@ class ThemeParser : public XMLParser { typedef GUI::InterfaceManager InterfaceManager; public: - ThemeParser(InterfaceManager *parent); + ThemeParser(GUI::ThemeRenderer *parent); protected: - InterfaceManager *_GUI; + ThemeRenderer *_theme; bool keyCallback(Common::String keyName); bool parserCallback_DRAWSTEP(); diff --git a/gui/InterfaceManager.cpp b/gui/ThemeRenderer.cpp index 80fa0d33db..283860341b 100644 --- a/gui/InterfaceManager.cpp +++ b/gui/ThemeRenderer.cpp @@ -32,16 +32,14 @@ #include "gui/launcher.h" -#include "gui/InterfaceManager.h" +#include "gui/ThemeRenderer.h" #include "graphics/VectorRenderer.h" -DECLARE_SINGLETON(GUI::InterfaceManager); - namespace GUI { using namespace Graphics; -const char *InterfaceManager::kDrawDataStrings[] = { +const char *ThemeRenderer::kDrawDataStrings[] = { "mainmenu_bg", "special_bg", "plain_bg", @@ -70,7 +68,7 @@ const char *InterfaceManager::kDrawDataStrings[] = { "separator" }; -InterfaceManager::InterfaceManager() : +ThemeRenderer::ThemeRenderer() : _vectorRenderer(0), _system(0), _graphicsMode(kGfxDisabled), _screen(0), _bytesPerPixel(0), _initOk(false), _themeOk(false), _needThemeLoad(false), _enabled(false) { @@ -86,7 +84,7 @@ InterfaceManager::InterfaceManager() : } template<typename PixelType> -void InterfaceManager::screenInit() { +void ThemeRenderer::screenInit() { freeScreen(); _screen = new Surface; @@ -94,7 +92,7 @@ void InterfaceManager::screenInit() { _system->clearOverlay(); } -void InterfaceManager::setGraphicsMode(Graphics_Mode mode) { +void ThemeRenderer::setGraphicsMode(Graphics_Mode mode) { // FIXME: reload theme everytime we change resolution... // what if we change the renderer too? @@ -120,14 +118,14 @@ void InterfaceManager::setGraphicsMode(Graphics_Mode mode) { _vectorRenderer->setSurface(_screen); } -void InterfaceManager::addDrawStep(Common::String &drawDataId, Graphics::DrawStep *step) { +void ThemeRenderer::addDrawStep(Common::String &drawDataId, Graphics::DrawStep *step) { DrawData id = getDrawDataId(drawDataId); assert(_widgets[id] != 0); _widgets[id]->_steps.push_back(step); } -bool InterfaceManager::addDrawData(DrawData data_id, bool cached) { +bool ThemeRenderer::addDrawData(DrawData data_id, bool cached) { assert(data_id >= 0 && data_id < kDrawDataMAX); if (_widgets[data_id] != 0) @@ -139,7 +137,7 @@ bool InterfaceManager::addDrawData(DrawData data_id, bool cached) { return true; } -bool InterfaceManager::loadTheme(Common::String themeName) { +bool ThemeRenderer::loadTheme(Common::String themeName) { unloadTheme(); if (!loadThemeXML(themeName)) { @@ -165,7 +163,7 @@ bool InterfaceManager::loadTheme(Common::String themeName) { return true; } -bool InterfaceManager::loadThemeXML(Common::String themeName) { +bool ThemeRenderer::loadThemeXML(Common::String themeName) { assert(_parser); if (ConfMan.hasKey("themepath")) @@ -184,7 +182,7 @@ bool InterfaceManager::loadThemeXML(Common::String themeName) { return parser()->parse(); } -void InterfaceManager::init() { +bool ThemeRenderer::init() { if (!_screen || _system->getOverlayWidth() != _screen->w || _system->getOverlayHeight() != _screen->h ) setGraphicsMode(_graphicsMode); @@ -193,20 +191,21 @@ void InterfaceManager::init() { loadTheme(); _initOk = true; + return true; } -bool InterfaceManager::isWidgetCached(DrawData type, const Common::Rect &r) { +bool ThemeRenderer::isWidgetCached(DrawData type, const Common::Rect &r) { return _widgets[type] && _widgets[type]->_cached && _widgets[type]->_surfaceCache->w == r.width() && _widgets[type]->_surfaceCache->h == r.height(); } -void InterfaceManager::drawCached(DrawData type, const Common::Rect &r) { +void ThemeRenderer::drawCached(DrawData type, const Common::Rect &r) { assert(_widgets[type]->_surfaceCache->bytesPerPixel == _screen->bytesPerPixel); _vectorRenderer->blitSurface(_widgets[type]->_surfaceCache, r); } -void InterfaceManager::drawDD(DrawData type, const Common::Rect &r) { +void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r) { if (isWidgetCached(type, r)) { drawCached(type, r); } else { @@ -215,7 +214,7 @@ void InterfaceManager::drawDD(DrawData type, const Common::Rect &r) { } } -void InterfaceManager::drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints) { +void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints) { if (!ready()) return; @@ -229,7 +228,7 @@ void InterfaceManager::drawButton(const Common::Rect &r, const Common::String &s addDirtyRect(r); } -void InterfaceManager::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) { +void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) { if (!ready()) return; @@ -237,7 +236,7 @@ void InterfaceManager::drawLineSeparator(const Common::Rect &r, WidgetStateInfo addDirtyRect(r); } -void InterfaceManager::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) { +void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) { if (!ready()) return; @@ -252,7 +251,7 @@ void InterfaceManager::drawCheckbox(const Common::Rect &r, const Common::String addDirtyRect(r); } -void InterfaceManager::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) { +void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) { if (!ready()) return; @@ -266,140 +265,22 @@ void InterfaceManager::drawSlider(const Common::Rect &r, int width, WidgetStateI addDirtyRect(r); } -void InterfaceManager::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState sb_state, WidgetStateInfo state) { +void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState sb_state, WidgetStateInfo state) { if (!ready()) return; } -void InterfaceManager::redrawDialogStack() { - _vectorRenderer->clearSurface(); - - for (int i = 0; i < _dialogStack.size(); ++i) - _dialogStack[i]->draw(); -} - -void InterfaceManager::openDialog(Dialogs dname, Dialog *parent) { - Dialog *dlg = 0; - switch (dname) { - case kDialogLauncher: - dlg = new GUI::LauncherDialog; - break; - - default: - error("Unhandled dialog opening"); - break; - } - - if (dlg) - _dialogStack.push(dlg); -} - -int InterfaceManager::runGUI() { - init(); - - if (!ready()) - return 0; - - Common::EventManager *eventMan = _system->getEventManager(); - Dialog *activeDialog = getTopDialog(); - Dialog *lastDialog = 0; - - if (!activeDialog) - return 0; - - bool stackChange; - - int button; - uint32 time; - - _system->showOverlay(); - - while (activeDialog) { // draw!! - stackChange = (activeDialog != lastDialog); - lastDialog = activeDialog; - - if (stackChange || needRedraw()) - redrawDialogStack(); - - if (!_dirtyScreen.empty()) { - for (uint i = 0; i < _dirtyScreen.size(); ++i) - _vectorRenderer->copyFrame(_system, _dirtyScreen[i]); - _system->updateScreen(); - _dirtyScreen.clear(); - } - - Common::Event event; - - while (eventMan->pollEvent(event)) { - activeDialog->handleTickle(); - - Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y); - - switch (event.type) { - case Common::EVENT_KEYDOWN: - activeDialog->handleKeyDown(event.kbd); - break; - - case Common::EVENT_KEYUP: - activeDialog->handleKeyUp(event.kbd); - break; - - case Common::EVENT_MOUSEMOVE: - activeDialog->handleMouseMoved(mouse.x, mouse.y, 0); - break; - - case Common::EVENT_LBUTTONDOWN: - case Common::EVENT_RBUTTONDOWN: - button = (event.type == Common::EVENT_LBUTTONDOWN ? 1 : 2); - time = _system->getMillis(); - if (_lastClick.count && (time < _lastClick.time + kDoubleClickDelay) - && ABS(_lastClick.x - event.mouse.x) < 3 - && ABS(_lastClick.y - event.mouse.y) < 3) { - _lastClick.count++; - } else { - _lastClick.x = event.mouse.x; - _lastClick.y = event.mouse.y; - _lastClick.count = 1; - } - _lastClick.time = time; - activeDialog->handleMouseDown(mouse.x, mouse.y, button, _lastClick.count); - break; - - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONUP: - button = (event.type == Common::EVENT_LBUTTONUP ? 1 : 2); - activeDialog->handleMouseUp(mouse.x, mouse.y, button, _lastClick.count); - break; - - case Common::EVENT_WHEELUP: - activeDialog->handleMouseWheel(mouse.x, mouse.y, -1); - break; - - case Common::EVENT_WHEELDOWN: - activeDialog->handleMouseWheel(mouse.x, mouse.y, 1); - break; - - case Common::EVENT_QUIT: - _system->quit(); - return 1; - - case Common::EVENT_SCREEN_CHANGED: - screenChange(); - break; - - default: - break; - } - } +void ThemeRenderer::renderDirtyScreen() { + // TODO: This isn't really optimized. Check dirty squares for collisions + // and all that. + if (_dirtyScreen.empty()) + return; - activeDialog = getTopDialog(); - _system->delayMillis(10); - } + for (uint i = 0; i < _dirtyScreen.size(); ++i) + _vectorRenderer->copyFrame(_system, _dirtyScreen[i]); - _system->hideOverlay(); - return 1; + _system->updateScreen(); + _dirtyScreen.clear(); } - - } // end of namespace GUI. diff --git a/gui/InterfaceManager.h b/gui/ThemeRenderer.h index ac612e0c52..e9904d8ae3 100644 --- a/gui/InterfaceManager.h +++ b/gui/ThemeRenderer.h @@ -62,7 +62,7 @@ struct WidgetDrawData { } }; -class InterfaceManager { +class ThemeRenderer : public Theme { typedef Common::String String; typedef GUI::Dialog Dialog; @@ -79,16 +79,6 @@ public: kGfxStandard16bit, kGfxAntialias16bit }; - - enum Dialogs { - kDialogLauncher, - kDialogMAX - }; - - enum { - kDoubleClickDelay = 500, // milliseconds - kCursorAnimateDelay = 250 - }; enum DrawData { kDDMainDialogBackground, @@ -120,61 +110,9 @@ public: kDrawDataMAX }; - enum FontStyle { - kFontStyleBold = 0, //! A bold font. This is also the default font. - kFontStyleNormal = 1, //! A normal font. - kFontStyleItalic = 2, //! Italic styled font. - kFontStyleFixedNormal = 3, //! Fixed size font. - kFontStyleFixedBold = 4, //! Fixed size bold font. - kFontStyleFixedItalic = 5, //! Fixed size italic font. - kFontStyleMax - }; - - enum State { - kStateDisabled, //! Indicates that the widget is disabled, that does NOT include that it is invisible - kStateEnabled, //! Indicates that the widget is enabled - kStateHighlight //! Indicates that the widget is highlighted by the user - }; - - //! Widget background type - enum WidgetBackground { - kWidgetBackgroundNo, //! No background at all - kWidgetBackgroundPlain, //! Simple background, this may not include borders - kWidgetBackgroundBorder, //! Same as kWidgetBackgroundPlain just with a border - kWidgetBackgroundBorderSmall, //! Same as kWidgetBackgroundPlain just with a small border - kWidgetBackgroundEditText, //! Background used for edit text fields - kWidgetBackgroundSlider //! Background used for sliders - }; - - typedef State WidgetStateInfo; - - //! State of the scrollbar - enum ScrollbarState { - kScrollbarStateNo, - kScrollbarStateUp, - kScrollbarStateDown, - kScrollbarStateSlider, - kScrollbarStateSinglePage - }; - - //! Defined the align of the text - enum TextAlign { - kTextAlignLeft, //! Text should be aligned to the left - kTextAlignCenter, //! Text should be centered - kTextAlignRight //! Text should be aligned to the right - }; - - //! Function used to process areas other than the current dialog - enum ShadingStyle { - kShadingNone, //! No special post processing - kShadingDim, //! Dimming unused areas - kShadingLuminance //! Converting colors to luminance for unused areas - }; - + ThemeRenderer(); - InterfaceManager(); - - ~InterfaceManager() { + ~ThemeRenderer() { freeRenderer(); freeScreen(); unloadTheme(); @@ -184,10 +122,22 @@ public: delete _dialogStack.pop(); } - void setGraphicsMode(Graphics_Mode mode); - int runGUI(); - - void init(); + // virtual methods from Theme + bool init(); + void deinit() {} + void refresh() {} + void enable() {} + void disable() {} + void openDialog() {} + void closeAllDialogs() {} + void clearAll() {} + void updateScreen() {} + void resetDrawArea() {} + void openDialog(bool top) {} + + virtual bool isDynamic() { + return true; + } /** Font management */ const Graphics::Font *getFont(FontStyle font) const { return _font; } @@ -207,6 +157,16 @@ public: void drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state = kStateEnabled) {} void drawLineSeparator(const Common::Rect &r, WidgetStateInfo state = kStateEnabled); + void drawDialogBackground(const Common::Rect &r, uint16 hints, WidgetStateInfo state) {} + void drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, TextAlign align, bool inverted, int deltax, bool useEllipsis, FontStyle font) {} + void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state) {} + + bool addDirtyRect(Common::Rect r, bool backup = false, bool special = false) { + _dirtyScreen.push_back(r); + return true; + } + + // custom stuff - tanoku DrawData getDrawDataId(Common::String &name) { for (int i = 0; i < kDrawDataMAX; ++i) if (name.compareToIgnoreCase(kDrawDataStrings[i]) == 0) @@ -237,13 +197,14 @@ public: } bool loadTheme(Common::String themeName); - void openDialog(Dialogs dname, Dialog *parent); void closeTopDialog() { assert(_dialogStack.empty() == false); delete _dialogStack.pop(); } + void setGraphicsMode(Graphics_Mode mode); + protected: template<typename PixelType> void screenInit(); @@ -261,6 +222,7 @@ protected: } void screenChange() {} + void renderDirtyScreen(); void freeRenderer() { delete _vectorRenderer; @@ -296,8 +258,15 @@ protected: inline void drawDD(DrawData type, const Common::Rect &r); - void addDirtyRect(const Common::Rect &r) { - _dirtyScreen.push_back(r); + // TODO + void restoreBackground(Common::Rect r, bool special = false) {} + + int getTabSpacing() const { + return 0; + } + + int getTabPadding() const { + return 3; } OSystem *_system; @@ -321,12 +290,6 @@ protected: bool _caching; 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. diff --git a/gui/object.h b/gui/object.h index 2bdff3f76c..01046bd668 100644 --- a/gui/object.h +++ b/gui/object.h @@ -29,7 +29,6 @@ namespace GUI { class CommandReceiver; class CommandSender; -class InterfaceManager; class CommandReceiver { friend class CommandSender; @@ -66,7 +65,6 @@ protected: Common::String _name; Widget *_firstWidget; - InterfaceManager *_GUI; public: GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _name(""), _firstWidget(0) { } @@ -85,7 +83,6 @@ public: virtual void draw() = 0; virtual void reflowLayout(); - virtual void setInterfaceManager(InterfaceManager *manager) { _GUI = manager; } protected: virtual void releaseFocus() = 0; diff --git a/gui/theme.h b/gui/theme.h index 4f61609fbd..320d2544e0 100644 --- a/gui/theme.h +++ b/gui/theme.h @@ -348,6 +348,10 @@ public: const Common::String &getStylefileName() const { return _stylefile; } const Common::String &getThemeName() const { return _stylename; } + virtual bool isDynamic() { + return false; + } + /** * Checks if the theme renderer supports drawing of images. * |