aboutsummaryrefslogtreecommitdiff
path: root/gui/ThemeModern.h
diff options
context:
space:
mode:
Diffstat (limited to 'gui/ThemeModern.h')
-rw-r--r--gui/ThemeModern.h337
1 files changed, 337 insertions, 0 deletions
diff --git a/gui/ThemeModern.h b/gui/ThemeModern.h
new file mode 100644
index 0000000000..b83bec9425
--- /dev/null
+++ b/gui/ThemeModern.h
@@ -0,0 +1,337 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * 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() { return _useCursor; }
+
+ void enable();
+ void disable();
+
+ void openDialog(bool topDialog);
+ void closeDialog();
+
+ void clearAll();
+ void drawAll();
+
+ 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, State state);
+ void drawText(const Common::Rect &r, const Common::String &str, State state, TextAlign align, bool inverted, int deltax, bool useEllipsis, FontStyle font);
+ void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, State state);
+
+ void drawWidgetBackground(const Common::Rect &r, uint16 hints, WidgetBackground background, State state);
+ void drawButton(const Common::Rect &r, const Common::String &str, State state, uint16 hints);
+ void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, State state, int alpha, bool themeTrans);
+ void drawSlider(const Common::Rect &r, int width, State state);
+ void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, State state);
+ void drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, State state);
+ void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState, State state);
+ void drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, State state, TextAlign align);
+ void drawCaret(const Common::Rect &r, bool erase, State state);
+ void drawLineSeparator(const Common::Rect &r, State 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
+