diff options
| author | Johannes Schickel | 2006-01-27 15:43:23 +0000 | 
|---|---|---|
| committer | Johannes Schickel | 2006-01-27 15:43:23 +0000 | 
| commit | 5051b080a2cfefef81907be0324e229f284ae355 (patch) | |
| tree | af2b67affe5aaf357c3278e3befdbd412dea5545 /gui/theme.h | |
| parent | 901645cb0f28ef0278e5b5e3a7347a85f9142b8b (diff) | |
| download | scummvm-rg350-5051b080a2cfefef81907be0324e229f284ae355.tar.gz scummvm-rg350-5051b080a2cfefef81907be0324e229f284ae355.tar.bz2 scummvm-rg350-5051b080a2cfefef81907be0324e229f284ae355.zip | |
 - adds the new gui renderer also a new implementation for the classic gui
 - adds a ImageMan and ImageDec class for loading and managing image files
 - adds a loader for zip files which is used by the new theme and the image manager
 - changes the widgets to use the new gui code
 - changes the scumm dialogs to use the new gui code
 - fixes a #include problem in the sky debugger with the new gui code
 To use the new gui copy gui/themes/default-theme.zip to your extrapath.
If the theme zip can not be found the gui will fallback to the classic theme.
If you want to change the gui styles use "gui_theme=classic" for the classic theme
and "gui_theme=default-theme" for the new theme.
Thanks to eriktorbjorn for testing and help with the new theme and to sev for
reviewing this patch.
svn-id: r20227
Diffstat (limited to 'gui/theme.h')
| -rw-r--r-- | gui/theme.h | 361 | 
1 files changed, 361 insertions, 0 deletions
| diff --git a/gui/theme.h b/gui/theme.h new file mode 100644 index 0000000000..b6730199ef --- /dev/null +++ b/gui/theme.h @@ -0,0 +1,361 @@ +/* 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. + * + * $Header $ + */ + +#ifndef GUI_THEME_H +#define GUI_THEME_H + +#include "common/stdafx.h" +#include "common/system.h" +#include "common/rect.h" +#include "common/str.h" +#include "common/config-file.h" + +#include "graphics/surface.h" +#include "graphics/fontman.h" + +namespace GUI { + +// Hints to the theme engine that the widget is used in a non-standard way. + +enum { +	// Indicates that this is the first time the widget is drawn. +	THEME_HINT_FIRST_DRAW = 1 << 0, + +	// Indicates that the widget will be redrawn often, e.g. list widgets. +	// It may therefore be a good idea to save the background so that it +	// can be redrawn quickly. +	THEME_HINT_SAVE_BACKGROUND = 1 << 1 +}; + +class Theme { +public: +	Theme() : _drawArea(), _configFile() {} +	virtual ~Theme() {} + +	enum kTextAlign { +		kTextAlignLeft, +		kTextAlignCenter, +		kTextAlignRight +	}; + +	enum kWidgetBackground { +		kWidgetBackgroundNo, +		kWidgetBackgroundPlain, +		kWidgetBackgroundBorder, +		kWidgetBackgroundBorderSmall +	}; + +	enum kState { +		kStateDisabled, +		kStateEnabled, +		kStateHighlight +	}; + +	enum kScrollbarState { +		kScrollbarStateNo, +		kScrollbarStateUp, +		kScrollbarStateDown, +		kScrollbarStateSlider, +		kScrollbarStateSinglePage +	}; + +	virtual bool init() = 0; +	virtual void deinit() = 0; + +	virtual void refresh() = 0; + +	virtual void enable() = 0; +	virtual void disable() = 0; + +	virtual void openDialog() = 0; +	virtual void closeDialog() = 0; + +	virtual void clearAll() = 0; +	virtual void drawAll() = 0; +	 +	virtual void setDrawArea(const Common::Rect &r) { _drawArea = r; } +	// resets the draw area to the screen size +	virtual void resetDrawArea() = 0; +	 +	virtual const Common::ConfigFile &getConfigFile() { return _configFile; } + +	virtual const Graphics::Font *getFont() const = 0; +	virtual int getFontHeight() const = 0; +	virtual int getStringWidth(const Common::String &str) const = 0; +	virtual int getCharWidth(byte c) const = 0; + +	virtual void drawDialogBackground(const Common::Rect &r, kState state = kStateEnabled, bool mainDialog = false) = 0; +	virtual void drawText(const Common::Rect &r, const Common::String &str, kState state = kStateEnabled, kTextAlign align = kTextAlignCenter, bool inverted = false, int deltax = 0, bool useEllipsis = true) = 0; +	// this should ONLY be used by the debugger until we get a nicer solution +	virtual void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, kState state = kStateEnabled) = 0; + +	virtual void drawWidgetBackground(const Common::Rect &r, uint16 hints, kWidgetBackground background = kWidgetBackgroundPlain, kState state = kStateEnabled) = 0; +	virtual void drawButton(const Common::Rect &r, const Common::String &str, kState state = kStateEnabled) = 0; +	virtual void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, kState state = kStateEnabled) = 0; +	virtual void drawSlider(const Common::Rect &r, int width, kState state = kStateEnabled) = 0; +	virtual void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, kState state = kStateEnabled) = 0; +	virtual void drawTab(const Common::Rect &r, const Common::String &str, bool active, kState state = kStateEnabled) = 0; +	virtual void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, kScrollbarState, kState state = kStateEnabled) = 0; +	virtual void drawCaret(const Common::Rect &r, bool erase, kState state = kStateEnabled) = 0; +	virtual void drawLineSeparator(const Common::Rect &r, kState state = kStateEnabled) = 0; + +	Graphics::TextAlignment convertAligment(kTextAlign align) const { +		switch (align) { +		case kTextAlignLeft: +			return Graphics::kTextAlignLeft; +			break; + +		case kTextAlignRight: +			return Graphics::kTextAlignRight; +			break; + +		default: +			break; +		}; +		return Graphics::kTextAlignCenter; +	}; +	 +	kTextAlign convertAligment(Graphics::TextAlignment align) const { +		switch (align) { +		case Graphics::kTextAlignLeft: +			return kTextAlignLeft; +			break; + +		case Graphics::kTextAlignRight: +			return kTextAlignRight; +			break; + +		default: +			break; +		} +		return kTextAlignCenter; +	} + +protected: +	Common::Rect _drawArea; +	Common::ConfigFile _configFile; +}; + +#define OLDGUI_TRANSPARENCY + +class ThemeClassic : public Theme { +public: +	ThemeClassic(OSystem *system); +	virtual ~ThemeClassic(); + +	bool init(); +	void deinit(); + +	void refresh(); + +	void enable(); +	void disable(); + +	void openDialog(); +	void closeDialog(); + +	void clearAll(); +	void drawAll(); +	 +	void resetDrawArea(); + +	const Graphics::Font *getFont() const { return _font; } +	int getFontHeight() const { if (_initOk) return _font->getFontHeight(); return 0; } +	int getStringWidth(const Common::String &str) const { if (_initOk) return _font->getStringWidth(str); return 0; } +	int getCharWidth(byte c) const { if (_initOk) return _font->getCharWidth(c); return 0; } + +	void drawDialogBackground(const Common::Rect &r, kState state, bool mainDialog); +	void drawText(const Common::Rect &r, const Common::String &str, kState state, kTextAlign align, bool inverted, int deltax, bool useEllipsis); +	void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, kState state); + +	void drawWidgetBackground(const Common::Rect &r, uint16 hints, kWidgetBackground background, kState state); +	void drawButton(const Common::Rect &r, const Common::String &str, kState state); +	void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, kState state); +	void drawSlider(const Common::Rect &r, int width, kState state); +	void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, kState state); +	void drawTab(const Common::Rect &r, const Common::String &str, bool active, kState state); +	void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, kScrollbarState, kState state); +	void drawCaret(const Common::Rect &r, bool erase, kState state); +	void drawLineSeparator(const Common::Rect &r, kState state); +private: +	void restoreBackground(Common::Rect r); +	bool addDirtyRect(Common::Rect r); + +	void box(int x, int y, int width, int height, OverlayColor colorA, OverlayColor colorB); +	void box(int x, int y, int width, int height); + +	OverlayColor getColor(kState state); + +	OSystem *_system; +	Graphics::Surface _screen; + +#ifdef OLDGUI_TRANSPARENCY +	struct DialogState { +		Graphics::Surface screen; +	} *_dialog; + +	void blendScreenToDialog(); +#endif + +	bool _initOk; + +	const Graphics::Font *_font; +	OverlayColor _color, _shadowcolor; +	OverlayColor _bgcolor; +	OverlayColor _textcolor; +	OverlayColor _textcolorhi; +}; + +class ThemeNew : public Theme { +public: +	ThemeNew(OSystem *system, Common::String stylefile); +	virtual ~ThemeNew(); + +	bool init(); +	void deinit(); + +	void refresh(); + +	void enable(); +	void disable(); + +	void openDialog(); +	void closeDialog(); + +	void clearAll(); +	void drawAll(); +	 +	void resetDrawArea(); + +	const Graphics::Font *getFont() const { return _font; } +	int getFontHeight() const { if (_font) return _font->getFontHeight(); return 0; } +	int getStringWidth(const Common::String &str) const { if (_font) return _font->getStringWidth(str); return 0; } +	int getCharWidth(byte c) const { if (_font) return _font->getCharWidth(c); return 0; } + +	void drawDialogBackground(const Common::Rect &r, kState state, bool mainDialog); +	void drawText(const Common::Rect &r, const Common::String &str, kState state, kTextAlign align, bool inverted, int deltax, bool useEllipsis); +	void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, kState state); + +	void drawWidgetBackground(const Common::Rect &r, uint16 hints, kWidgetBackground background, kState state); +	void drawButton(const Common::Rect &r, const Common::String &str, kState state); +	void drawSurface(const Common::Rect &r, const Graphics::Surface &surface, kState state); +	void drawSlider(const Common::Rect &r, int width, kState state); +	void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, kState state); +	void drawTab(const Common::Rect &r, const Common::String &str, bool active, kState state); +	void drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, kScrollbarState, kState state); +	void drawCaret(const Common::Rect &r, bool erase, kState state); +	void drawLineSeparator(const Common::Rect &r, kState state); +private: +	bool addDirtyRect(Common::Rect r, bool backup = false); + +	void colorFade(const Common::Rect &r, OverlayColor start, OverlayColor end); +	void drawRect(const Common::Rect &r, const Graphics::Surface *corner, +				const Graphics::Surface *top, const Graphics::Surface *left, const Graphics::Surface *fill, int alpha); +	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); +	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); + +	OSystem *_system; +	Graphics::Surface _screen; + +	bool _initOk; +	bool _forceRedraw; + +	void restoreBackground(Common::Rect r); +	OverlayColor getColor(kState state); + +	struct DialogState { +		Graphics::Surface screen; +	} *_dialog; + +	const Graphics::Font *_font; + +	enum kImageHandles { +		kDialogBkgdCorner = 0, +		kDialogBkgdTop = 1, +		kDialogBkgdLeft = 2, +		kDialogBkgd = 3, +		kWidgetBkgdCorner = 4, +		kWidgetBkgdTop = 5, +		kWidgetBkgdLeft = 6, +		kWidgetBkgd = 7, +		kCheckboxEmpty = 8, +		kCheckboxChecked = 9, +		kWidgetArrow = 10, +		kImageHandlesMax +	}; + +	const Common::String *_imageHandles; +	const Graphics::Surface **_images; +	 +	enum kColorHandles { +		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, +		 +		kColorHandlesMax +	}; +	 +	OverlayColor _colors[kColorHandlesMax]; +}; +} // end of namespace GUI + +#endif // GUI_THEME_H | 
