From 7ca439f410ac1c46a387567b30271ae4e4a2ed30 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 20 Apr 2008 14:47:37 +0000 Subject: Initial import of the work in progress M4 engine svn-id: r31600 --- engines/m4/gui.h | 446 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 engines/m4/gui.h (limited to 'engines/m4/gui.h') diff --git a/engines/m4/gui.h b/engines/m4/gui.h new file mode 100644 index 0000000000..3f7e6f20c3 --- /dev/null +++ b/engines/m4/gui.h @@ -0,0 +1,446 @@ +/* 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 M4_GUI_H +#define M4_GUI_H + +#include "common/list.h" +#include "common/rect.h" + +#include "m4/viewmgr.h" +#include "m4/events.h" +#include "m4/globals.h" +#include "m4/graphics.h" +#include "m4/saveload.h" +#include "m4/sprite.h" +#include "m4/assets.h" + +namespace M4 { + +class GUIObject; +class MenuObject; +class GUIObjectButton; +class SpriteAsset; +class View; + +enum MenuType {GAME_MENU, OPTIONS_MENU, SAVE_MENU, LOAD_MENU, MAIN_MENU}; + +enum { + BTNID_QUIT = 1, + BTNID_OPTIONS = 2, + BTNID_RESUME = 3, + BTNID_SAVE = 4, + BTNID_LOAD = 5, + BTNID_MAIN = 6, + + OPTIONID_DONE = 1, + OPTIONID_CANCEL = 2, + OPTIONID_HSLIDER_DIGI = 3, + OPTIONID_HSLIDER_MIDI = 4, + + SAVELOADID_SAVE = 1, + SAVELOADID_CANCELSAVE = 2, + SAVELOADID_LOAD = 3, + SAVELOADID_CANCELLOAD = 4, + + SLTAG_SAVELOAD = 100, + SLTAG_SAVELOAD_LABEL = 101, + SLTAG_CANCEL = 102, + SLTAG_VSLIDER = 103, + SLTAG_THUMBNAIL = 104, + + SLTAG_SLOTS_START = 1001, + SLTAG_TEXTFIELD = 2000 +}; + +enum ObjectType { + OBJTYPE_BUTTON, + + OBJTYPE_SLIDER, + OBJTYPE_OM_SWITCH_ON, + OBJTYPE_OM_SWITCH_OFF, + OBJTYPE_OM_DONE, + OBJTYPE_OM_CANCEL, + + OBJTYPE_SL_SAVE, + OBJTYPE_SL_LOAD, + OBJTYPE_SL_CANCEL, + OBJTYPE_SL_TEXT +}; + +enum GameMenuSpriteType { + GM_DIALOG_BOX, + + GM_BUTTON_GREYED, + GM_BUTTON_NORMAL, + GM_BUTTON_MOUSEOVER, + GM_BUTTON_PRESSED +}; + +enum OptionMenuSpriteType { + OM_DIALOG_BOX, + + OM_SLIDER_BTN_NORMAL, + OM_SLIDER_BTN_MOUSEOVER, + OM_SLIDER_BTN_PRESSED, + OM_SLIDER_BAR, + OM_DONE_BTN_GREYED, + OM_DONE_BTN_NORMAL, + OM_DONE_BTN_MOUSEOVER, + OM_DONE_BTN_PRESSED, + OM_CANCEL_BTN_NORMAL, + OM_CANCEL_BTN_MOUSEOVER, + OM_CANCEL_BTN_PRESSED +}; + + +enum SaveLoadSpriteType { + SL_DIALOG_BOX, + SL_EMPTY_THUMBNAIL, + + SL_SAVE_BTN_GREYED, + SL_SAVE_BTN_NORMAL, + SL_SAVE_BTN_MOUSEOVER, + SL_SAVE_BTN_PRESSED, + + SL_LOAD_BTN_GREYED, + SL_LOAD_BTN_NORMAL, + SL_LOAD_BTN_MOUSEOVER, + SL_LOAD_BTN_PRESSED, + + SL_CANCEL_BTN_NORMAL, + SL_CANCEL_BTN_MOUSEOVER, + SL_CANCEL_BTN_PRESSED, + + SL_UP_BTN_GREYED, + SL_UP_BTN_NORMAL, + SL_UP_BTN_MOUSEOVER, + SL_UP_BTN_PRESSED, + + SL_DOWN_BTN_GREYED, + SL_DOWN_BTN_NORMAL, + SL_DOWN_BTN_MOUSEOVER, + SL_DOWN_BTN_PRESSED, + + SL_SAVE_LABEL, + SL_LOAD_LABEL, + + SL_SLIDER_BTN_NORMAL, + SL_SLIDER_BTN_MOUSEOVER, + SL_SLIDER_BTN_PRESSED, + + SL_LINE_NORMAL, + SL_LINE_MOUSEOVER, + SL_LINE_PRESSED, + + SL_SCROLLBAR +}; + +enum TextColors { + TEXT_COLOR_NORMAL = 1, + TEXT_COLOR_GREYED = 1, + TEXT_COLOR_MOUSEOVER = 2, + TEXT_COLOR_PRESSED = 2, + + TEXT_COLOR_GREYED_HILIGHT = 236, + TEXT_COLOR_GREYED_FOREGROUND = 131, + TEXT_COLOR_GREYED_SHADOW = 186, + + TEXT_COLOR_NORMAL_HILIGHT = 129, + TEXT_COLOR_NORMAL_FOREGROUND = 130, + TEXT_COLOR_NORMAL_SHADOW = 236, + + TEXT_COLOR_MOUSEOVER_HILIGHT = 129, + TEXT_COLOR_MOUSEOVER_FOREGROUND = 130, + TEXT_COLOR_MOUSEOVER_SHADOW = 236, + + TEXT_COLOR_PRESSED_HILIGHT = 236, + TEXT_COLOR_PRESSED_FOREGROUND = 130, + TEXT_COLOR_PRESSED_SHADOW = 129 +}; + +#define MENU_SS_FIELD_NORMAL 5 +#define MENU_SS_FIELD_MOUSEOVER 6 + +#define MENU_SS_H_SLIDER_NORMAL 5 +#define MENU_SS_H_SLIDER_MOUSE_OVER 6 +#define MENU_SS_H_SLIDER_PRESSED 7 + +#define MENU_SS_SWITCH_ON_NORMAL 8 +#define MENU_SS_SWITCH_ON_MOUSEOVER 9 +#define MENU_SS_SWITCH_ON_PRESSED 13 + +#define MENU_SS_SWITCH_OFF_PRESSED 10 +#define MENU_SS_SWITCH_OFF_NORMAL 11 +#define MENU_SS_SWITCH_OFF_MOUSEOVER 12 + +#define MENU_GUI "gui menu" +#define MENU_GAME "gamemenu" +#define MENU_OPTIONS "opmenu" +#define MENU_ERROR "errmenu" +#define MENU_SAVELOAD "slmenu" +#define MENU_BURGMAIN "903menu" +#define MENU_BURGDEMOMAIN "901menu" + +#define SL_NUM_VISIBLE_SLOTS 8 +#define SL_THUMBNAIL_WIDTH 215 +#define SL_THUMBNAIL_HEIGHT 162 + +enum MenuObjectState {OS_GREYED = 0, OS_NORMAL = 1, OS_MOUSEOVER = 2, OS_PRESSED = 3}; + +class DialogView: public View { +public: + DialogView(M4Engine *Vm, const Common::Rect &viewBounds, bool transparent = false): + View(Vm, viewBounds, transparent) {}; + DialogView(M4Engine *Vm, int x = 0, int y = 0, bool transparent = false): + View(Vm, x, y, transparent) {}; + + M4Engine *vm() { return _vm; } + virtual SpriteAsset *sprites() = 0; + virtual MenuType getMenuType() = 0; + virtual MenuObject *getItem(int objectId) { return NULL; } + virtual void refresh(const Common::Rect &areaRect) {} + virtual void close(); + + int _topSaveSlotIndex, _selectedSlot; + int _highlightedSlot; + bool _deleteSaveDesc; + M4Surface *_savegameThumbnail; +}; + +class GUIObject { +protected: + View *_parent; + Common::Rect _bounds; + M4Surface *_background; +public: + GUIObject(View *owner, const Common::Rect &bounds); + virtual ~GUIObject() {} + + bool isInside(int x, int y) { return _bounds.contains(x, y); } + Common::Rect getBounds() const { return _bounds; } + + virtual void onRefresh() {} +}; + +class MenuObject: public GUIObject { +public: + typedef void (*Callback)(DialogView *view, MenuObject *item); +protected: + MenuObject::Callback _callback; + ObjectType _objectType; + MenuObjectState _objectState; + bool _transparent; + int _objectId; +public: + MenuObject(DialogView *owner, int objectId, int xs, int ys, int width, int height, + bool greyed = false, bool transparent = false); + ~MenuObject(); + + DialogView *parent() { return (DialogView *)_parent; } + MenuObjectState getState() { return _objectState; } + virtual void setState(MenuObjectState state) { + _objectState = state; + onRefresh(); + } + int getObjectId() { return _objectId; } + + void onExecute(); + virtual bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem) { return false; } +}; + +class MenuButton: public MenuObject { +public: + MenuButton(DialogView *owner, int buttonId, int xs, int ys, int width, int height, + Callback callbackFn = NULL, bool greyed = false, bool transparent = false, + ObjectType buttonType = OBJTYPE_BUTTON); + + void onRefresh(); + bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem); + bool getToggled() { return _objectType == OBJTYPE_OM_SWITCH_ON; } +}; + +enum MenuHorizSliderState {HSLIDER_THUMB_NORMAL = 0, HSLIDER_THUMB_MOUSEOVER = 1, HSLIDER_THUMB_PRESSED = 2}; +#define SLIDER_BAR_COLOR 129 + +class MenuHorizSlider: public MenuObject { +protected: + MenuHorizSliderState _sliderState; + Common::Point _thumbSize; + int _maxThumbX; + int _percent; + int _thumbX; +public: + MenuHorizSlider(DialogView *owner, int sliderId, int xs, int ys, int width, int height, + int initialPercentage, Callback callbackFn = NULL, bool transparent = false); + + void onRefresh(); + bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem); + int percent() { return _percent; } +}; + +enum MenuVertSliderState { + VSLIDER_NONE = 0x0000, + VSLIDER_UP = 0x0010, + VSLIDER_PAGE_UP = 0x0020, + VSLIDER_THUMBNAIL = 0x0030, + VSLIDER_PAGE_DOWN = 0x0040, + VSLIDER_DOWN = 0x0050 +}; + +class MenuVertSlider: public MenuObject { +protected: + MenuVertSliderState _sliderState; + Common::Point _thumbSize; + int _percent; + int _thumbY; + int _minThumbY; + int _maxThumbY; + + MenuVertSliderState getSliderArea(int y); + void updateThumbnails() {} +public: + MenuVertSlider(DialogView *owner, int sliderId, int xs, int ys, int width, int height, + int initialPercentage, Callback callbackFn = NULL, bool transparent = false); + + void onRefresh(); + bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem); + MenuVertSliderState sliderState() { return _sliderState; } + int percent() { return _percent; } + void setPercentage(int value); +}; + +class MenuMessage: public MenuObject { +public: + MenuMessage(DialogView *owner, int objectId, int x, int y, int w, int h, bool transparent = false); + + void onRefresh(); +}; + +class MenuImage: public MenuObject { +private: + M4Surface *_sprite; +public: + MenuImage(DialogView *owner, int objectId, int xs, int ys, int width, int height, + M4Surface *image, bool transparent = false); + + void onRefresh(); + const M4Surface *sprite() { return _sprite; } + void setSprite(M4Surface *v) { + _sprite = v; + onRefresh(); + } +}; + +class MenuSaveLoadText: public MenuButton { +private: + bool _loadFlag; + const char *_displayText; + int _displayValue; + int _index; + bool _visible; +public: + MenuSaveLoadText(DialogView *owner, int textId, int xs, int ys, int width, int height, + Callback callbackFn = NULL, bool greyed = false, bool transparent = false, + bool loadFlag = false, const char *displayText = NULL, int displayValue = 0); + + void onRefresh(); + bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem); + void setDisplay(int value, const char *text) { _displayValue = value; _displayText = text; } + int getIndex() { return _index; } + const char *getText() { return _displayText; } + bool getVisible() const { return _visible; } + void setVisible(bool value); +}; + +class MenuTextField: public MenuObject { +private: + int _displayValue; + char _displayText[MAX_SAVEGAME_NAME]; + int _pixelWidth; + char *_promptEnd; + char *_cursor; +public: + MenuTextField(DialogView *owner, int fieldId, int xs, int ys, int width, int height, + bool greyed, Callback callbackFn = NULL, const char *displayText = NULL, + int displayValue = 0, bool transparent = true); + + void onRefresh(); + bool onEvent(M4EventType event, int param, int x, int y, MenuObject *¤tItem); + + const char *getText() { return _displayText; } + int getDisplayValue() { return _displayValue; } + +}; + +class GUIRect: public GUIObject { +private: + int _tag; +public: + GUIRect(View *owner, const Common::Rect &bounds, int tag): GUIObject(owner, bounds) { _tag = tag; }; + + virtual bool onEvent(M4EventType eventType, int param, int x, int y, GUIObject *¤tItem) { return false; } + int getTag() const { return _tag; } +}; + +enum GUIButtonState {BUTTON_NORMAL, BUTTON_MOUSEOVER, BUTTON_PRESSED}; + +class GUIButton: public GUIRect { +protected: + M4Surface *_normalSprite, *_mouseOverSprite, *_pressedSprite; + GUIButtonState _buttonState; + bool _visible; + bool _tracking; +public: + GUIButton(View *owner, const Common::Rect &bounds, int tag, + M4Surface *normalSprite, M4Surface *mouseOverSprite, M4Surface *pressedSprite); + + void onRefresh(); + bool onEvent(M4EventType eventType, int param, int x, int y, GUIObject *¤tItem); + GUIButtonState getState() const { return _buttonState; } +}; + +class GUITextField: public GUIRect { +private: + Common::String _text; +public: + GUITextField(View *owner, const Common::Rect &bounds); + void setText(const char *value) { + _text = value; + onRefresh(); + } + + void onRefresh(); +}; + + +class Dialogs { +public: + void keyMouseCollision() {} +}; + +} + +#endif -- cgit v1.2.3