scummvm/engines/sci/gfx/menubar.h

228 lines
6.5 KiB
C++

/* 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$
*
*/
/* Header for SCI0 menu bar management */
#ifndef SCI_GFX_SCI_MENUBAR_H
#define SCI_GFX_SCI_MENUBAR_H
#include "sci/engine/vm_types.h"
#include "sci/gfx/operations.h"
#include "common/array.h"
#include "common/rect.h"
namespace Sci {
struct EngineState;
#define MENU_HBAR_STRING_1 "--!"
#define MENU_HBAR_STRING_2 "-!"
#define MENU_HBAR_STRING_3 "!--"
/* These strings are used in SCI to determine an empty menu line */
#define MENU_BORDER_SIZE 0
/* The number of pixels added to the left and right to the text of a menu on the menu bar */
#define MENU_LEFT_BORDER 5
/* The number of pixels added to the left of the first menu */
#define MENU_BOX_CENTER_PADDING 10
/* Number of pixels to leave in between the left and the right centered text content in boxes that use right centered content */
#define MENU_BOX_LEFT_PADDING 0
/* Number of pixels to pad to the left */
#define MENU_BOX_RIGHT_PADDING 2
/* Number of pixels to pad to the right */
#define MENU_BAR_HEIGHT 10
/* Special characters used while building the menu bar */
#define SCI_SPECIAL_CHAR_FUNCTION 'F'
#define SCI_SPECIAL_CHAR_CTRL 3
#define SCI_SPECIAL_CHAR_ALT 2
/* Maximum number of bytes per SAID spec */
#define MENU_SAID_SPEC_SIZE 64
#define MENU_ATTRIBUTE_SAID 0x6d
#define MENU_ATTRIBUTE_TEXT 0x6e
#define MENU_ATTRIBUTE_KEY 0x6f
#define MENU_ATTRIBUTE_ENABLED 0x70
#define MENU_ATTRIBUTE_TAG 0x71
/* Those flags determine whether the corresponding MenuItem entries are valid */
#define MENU_ATTRIBUTE_FLAGS_KEY 0x01
#define MENU_ATTRIBUTE_FLAGS_SAID 0x02
enum MenuType {
MENU_TYPE_NORMAL = 0,
MENU_TYPE_HBAR = 1 /* Horizontal bar */
};
class MenuItem : public Common::Serializable {
public:
MenuType _type; /**< Normal or hbar */
Common::String _keytext; /**< right-centered part of the text (the key) */
int _flags;
byte _said[MENU_SAID_SPEC_SIZE]; /**< Said spec for this item */
reg_t _saidPos;
Common::String _text;
reg_t _textPos;
int _modifiers; /**< Hotkey for this item */
int _key; /**< Hotkey for this item */
int _enabled;
int _tag;
public:
MenuItem();
virtual void saveLoadWithSerializer(Common::Serializer &ser);
/**
* Determines whether a message/modifiers key pair matches a menu item's key parameters.
*
* @param[in] message The message to match
* @param[in] modifiers The modifier flags to match
* @return true on match, false otherwise
*/
bool matchKey(int message, int modifiers);
};
class Menu : public Common::Serializable {
public:
Common::String _title;
/** Width of the title in pixels */
int _titleWidth;
/** Pixel width of the menu window */
int _width;
/**
* Actual entries into the menu.
* Window height equals to number of items times 10.
*/
Common::Array<MenuItem> _items;
public:
Menu();
virtual void saveLoadWithSerializer(Common::Serializer &ser);
//protected:
// FIXME: This should be (partially) turned into a MenuItem constructor
int addMenuItem(GfxState *state, MenuType type, const char *left, const char *right,
int font, int key, int modifiers, int tag, reg_t text_pos);
};
class Menubar : public Common::Serializable {
public:
/** The actual menus. */
Common::Array<Menu> _menus;
public:
virtual void saveLoadWithSerializer(Common::Serializer &ser);
/**
* Adds a menu to the menubar.
*
* The menu entries use the following special characters:
* '`' : Right justify the following part
* ':' : End of this entry
* '#' : Function key (replaced by 'F')
* '^' : Control key (replaced by \002, which looks like "CTRL")
* '=' : Initial tag value
* and the special string "--!", which represents a horizontal bar in the
* menu.
*
* @param[in] state The state the fonts are stored in
* @param[in] title The menu title
* @param[in] entries A string of menu entries
* @param[in] font The font which is to be used for drawing
* @param[in] entries_base Segmented VM address of the entries string
*/
void addMenu(GfxState *state, const Common::String &title, const Common::String &entries, int font, reg_t entries_base);
/**
* Sets the attributes for a menu item.
*
* @param[in] s The current state
* @param[in] menu The menu number to edit
* @param[in] item The menu item to change
* @param[in] attribute The attribute to modify
* @param[in] value The value the attribute should be set to
* @return 0 on success, 1 if either menu or item were invalid
*/
int setAttribute(EngineState *s, int menu, int item, int attribute, reg_t value);
/**
* Gets an attribute for a menuitem.
*
* @param[in] menu The menu number
* @param[in] item The menu item to read
* @param[in] attribute The attribute to read from
* @return The attribute value, or -1 on error
*/
reg_t getAttribute(int menu, int item, int attribute) const;
/**
* Determines whether the specified menu entry may be activated.
*
* @return true if the menu item may be selected, false otherwise
*/
bool itemValid(int menu, int item) const;
/**
* Maps the pointer position to a (menu,item) tuple.
*
* @param[in] pointerPos the current pointer position
* @param[in] menu_nr the current menu (updated by this function if
* necessary)
* @param[in] item_nr the current menu item (updated by this function
* if necessary)
* @param[in] portBounds the port bounds of the currently active menu (if any)
* @return true if the pointer is outside a valid port,
* false otherwise.
*/
bool mapPointer(const Common::Point &pointerPos, int &menu_nr, int &item_nr, Common::Rect portBounds) const;
};
} // End of namespace Sci
#endif // SCI_GFX_SCI_MENUBAR_H