Logo Search packages:      
Sourcecode: scummvm version File versions  Download package

ThemeModern.h

/* 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 GUI_THEMEMODERN_H
#define GUI_THEMEMODERN_H

#ifndef DISABLE_FANCY_THEMES

#include "gui/theme.h"

namespace GUI {

class ThemeModern : public Theme {
public:
      ThemeModern(OSystem *system, const Common::String &stylefile, const Common::ConfigFile *cfg = 0);
      virtual ~ThemeModern();

      bool init();
      void deinit();

      void refresh();

      bool ownCursor() const { return _useCursor; }

      void enable();
      void disable();
      
      void openDialog(bool topDialog);
      void closeAllDialogs();

      void clearAll();
      void updateScreen();
      
      void setDrawArea(const Common::Rect &r);
      void resetDrawArea();

      const Graphics::Font *getFont(FontStyle font = kFontStyleBold) const { return _fonts[font]; }
      int getFontHeight(FontStyle font = kFontStyleBold) const { if (_fonts[font]) return _fonts[font]->getFontHeight(); return 0; }
      int getStringWidth(const Common::String &str, FontStyle font = kFontStyleBold) const { if (_fonts[font]) return _fonts[font]->getStringWidth(str); return 0; }
      int getCharWidth(byte c, FontStyle font = kFontStyleBold) const { if (_fonts[font]) return _fonts[font]->getCharWidth(c); return 0; }

      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);

      void drawWidgetBackground(const Common::Rect &r, uint16 hints, WidgetBackground background, WidgetStateInfo state);
      void drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints);
      void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans);
      void drawSlider(const Common::Rect &r, int width, WidgetStateInfo state);
      void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state);
      void drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state);
      void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState, WidgetStateInfo state);
      void drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, WidgetStateInfo state, TextAlign align);
      void drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state);
      void drawLineSeparator(const Common::Rect &r, WidgetStateInfo state);

      void restoreBackground(Common::Rect r, bool special = false);
      bool addDirtyRect(Common::Rect r, bool backup = false, bool special = false);

      int getTabSpacing() const;
      int getTabPadding() const;

      bool supportsImages() const { return true; }
      const Graphics::Surface *getImageSurface(const kThemeImages n) const { return n == kImageLogo ? _images[kThemeLogo] : 0; }
private:
      void colorFade(const Common::Rect &r, OverlayColor start, OverlayColor end, uint factor = 1);
      void drawRect(const Common::Rect &r, const Graphics::Surface *corner, const Graphics::Surface *top,
                        const Graphics::Surface *left, const Graphics::Surface *fill, int alpha, bool skipLastRow = false);
      void drawRectMasked(const Common::Rect &r, const Graphics::Surface *corner, const Graphics::Surface *top,
                                    const Graphics::Surface *left, const Graphics::Surface *fill, int alpha,
                                    OverlayColor start, OverlayColor end, uint factor = 1, bool skipLastRow = false, bool skipTopRow = false);
      void drawSurface(const Common::Rect &r, const Graphics::Surface *surf, bool upDown, bool leftRight, int alpha);
      void drawSurfaceMasked(const Common::Rect &r, const Graphics::Surface *surf, bool upDown, bool leftRight, int alpha,
                                          OverlayColor start, OverlayColor end, uint factor = 1);

      enum ShadowStyles {
            kShadowFull = 0,
            kShadowSmall = 1,
            kShadowButton = 2,
            kShadowEmboss = 3,
            kShadowPopUp = 4
      };

      Common::Rect shadowRect(const Common::Rect &r, uint32 shadowStyle);
      void drawShadow(const Common::Rect &r, const Graphics::Surface *corner, const Graphics::Surface *top,
                              const Graphics::Surface *left, const Graphics::Surface *fill, uint32 shadowStyle, bool skipLastRow = false,
                              bool skipTopRow = false);
      void drawShadowRect(const Common::Rect &r, const Common::Rect &area, const Graphics::Surface *corner,
                                    const Graphics::Surface *top, const Graphics::Surface *left, const Graphics::Surface *fill,
                                    int alpha, bool skipLastRow = false, bool skipTopRow = false);

      int _shadowLeftWidth, _shadowRightWidth;
      int _shadowTopHeight, _shadowBottomHeight;

      OSystem *_system;
      Graphics::Surface _screen;
      Common::Rect _shadowDrawArea;

      bool _initOk;
      bool _forceRedraw;
      bool _enabled;

      int _lastUsedBitMask;
      void resetupGuiRenderer();
      void setupColors();

      OverlayColor getColor(State state);

      struct DialogState {
            Graphics::Surface screen;
      } *_dialog;

      void setupFonts();
      void deleteFonts();

      void setupFont(const Common::String &key, const Common::String &name, FontStyle style);

      const Graphics::Font *_fonts[kFontStyleMax];

private:
      void processExtraValues();

      enum ImageHandles {
            kDialogBkgdCorner = 0,
            kDialogBkgdTop = 1,
            kDialogBkgdLeft = 2,
            kDialogBkgd = 3,
            
            kWidgetBkgdCorner = 4,
            kWidgetBkgdTop = 5,
            kWidgetBkgdLeft = 6,
            kWidgetBkgd = 7,
            
            kCheckboxEmpty = 8,
            kCheckboxChecked = 9,
            
            kWidgetArrow = 10,
            
            kTabBkgdCorner = 11,
            kTabBkgdTop = 12,
            kTabBkgdLeft = 13,
            kTabBkgd = 14,
            
            kSliderBkgdCorner = 15,
            kSliderBkgdTop = 16,
            kSliderBkgdLeft = 17,
            kSliderBkgd = 18,
            
            kSliderCorner = 19,
            kSliderTop = 20,
            kSliderLeft = 21,
            kSlider = 22,
            
            kScrollbarBkgdCorner = 23,
            kScrollbarBkgdTop = 24,
            kScrollbarBkgdLeft = 25,
            kScrollbarBkgd = 26,
            
            kScrollbarCorner = 27,
            kScrollbarTop = 28,
            kScrollbarLeft = 29,
            kScrollbar = 30,
            
            kButtonBkgdCorner = 31,
            kButtonBkgdTop = 32,
            kButtonBkgdLeft = 33,
            kButtonBkgd = 34,
            
            kWidgetSmallBkgdCorner = 35,
            kWidgetSmallBkgdTop = 36,
            kWidgetSmallBkgdLeft = 37,
            kWidgetSmallBkgd = 38,

            kThemeLogo = 39,

            kPopUpWidgetBkgdCorner = 40,
            kPopUpWidgetBkgdTop = 41,
            kPopUpWidgetBkgdLeft = 42,
            kPopUpWidgetBkgd = 43,

            kEditTextBkgdCorner = 44,
            kEditTextBkgdTop = 45,
            kEditTextBkgdLeft = 46,
            kEditTextBkgd = 47,

            kGUICursor = 48,
      
            kImageHandlesMax
      };

private:
      int _dimPercentValue;
      typedef OverlayColor (ThemeModern::*InactiveDialogCallback)(OverlayColor col);      
      InactiveDialogCallback _dialogShadingCallback;
      
      OverlayColor calcLuminance(OverlayColor col);
      OverlayColor calcDimColor(OverlayColor col);

      bool _useCursor;
      void setUpCursor();
      void createCursor();
      int _cursorHotspotX, _cursorHotspotY;
      int _cursorTargetScale;
#define MAX_CURS_COLORS 255
      byte *_cursor;
      bool _needPaletteUpdates;
      uint _cursorWidth, _cursorHeight;
      byte _cursorPal[4*MAX_CURS_COLORS];

private:
      Common::String _imageHandles[kImageHandlesMax];
      const Graphics::Surface **_images;
      
      enum ColorHandles {
            kMainDialogStart = 0,
            kMainDialogEnd = 1,
            
            kDialogStart = 2,
            kDialogEnd = 3,
            
            kColorStateDisabled = 4,
            kColorStateHighlight = 5,
            kColorStateEnabled = 6,
            kColorTransparency = 7,
            
            kTextInvertedBackground = 8,
            kTextInvertedColor = 9,
            
            kWidgetBackgroundStart = 10,
            kWidgetBackgroundEnd = 11,
            kWidgetBackgroundSmallStart = 12,
            kWidgetBackgroundSmallEnd = 13,
            
            kButtonBackgroundStart = 14,
            kButtonBackgroundEnd = 15,
            kButtonTextEnabled = 16,
            kButtonTextDisabled = 17,
            kButtonTextHighlight = 18,
            
            kSliderBackgroundStart = 19,
            kSliderBackgroundEnd = 20,
            kSliderStart = 21,
            kSliderEnd = 22,
            
            kTabBackgroundStart = 23,
            kTabBackgroundEnd = 24,
            
            kScrollbarBackgroundStart = 25,
            kScrollbarBackgroundEnd = 26,
            kScrollbarButtonStart = 27,
            kScrollbarButtonEnd = 28,
            kScrollbarSliderStart = 29,
            kScrollbarSliderEnd = 30,
            
            kCaretColor = 31,
            
            kSliderHighStart = 32,
            kSliderHighEnd = 33,
            
            kButtonBackgroundHighlightStart = 34,
            kButtonBackgroundHighlightEnd = 35,
            
            kScrollbarButtonHighlightStart = 36,
            kScrollbarButtonHighlightEnd = 37,
            kScrollbarSliderHighlightStart = 38,
            kScrollbarSliderHighlightEnd = 39,

            kPopUpWidgetStart = 40,
            kPopUpWidgetEnd = 41,
            kPopUpWidgetHighlightStart = 42,
            kPopUpWidgetHighlightEnd = 43,
            
            kEditTextBackgroundStart = 44,
            kEditTextBackgroundEnd = 45,

            kTabActiveStart = 46,
            kTabActiveEnd = 47,
            kTabInactiveStart = 48,
            kTabInactiveEnd = 49,

            kColorHandlesMax
      };
      
      OverlayColor _colors[kColorHandlesMax];
      
      enum GradientFactors {
            kMainDialogFactor = 0,
            kDialogFactor = 1,
            kDialogSpecialFactor = 2,
            
            kWidgetSmallFactor = 3,
            kWidgetFactor = 4,
            
            kButtonFactor = 5,
            
            kSliderFactor = 6,
            kSliderBackground = 7,
            
            kTabFactor = 7,
            
            kScrollbarFactor = 8,
            kScrollbarBkgdFactor = 9,

            kPopUpWidgetFactor = 10,
            
            kEditTextFactor = 11,
            
            kMaxGradientFactors
      };
      
      uint _gradientFactors[kMaxGradientFactors];
};

} // end of namespace GUI

#endif

#endif


Generated by  Doxygen 1.6.0   Back to index