123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #pragma once
- #include "IReferenceCounted.h"
- #include "EGUIAlignment.h"
- #include "SColor.h"
- #include "rect.h"
- namespace irr
- {
- namespace gui
- {
- class IGUIFont;
- class IGUISpriteBank;
- class IGUIElement;
- //! Enumeration of available default skins.
- /** To set one of the skins, use the following code, for example to set
- the Windows classic skin:
- \code
- gui::IGUISkin* newskin = environment->createSkin(gui::EGST_WINDOWS_CLASSIC);
- environment->setSkin(newskin);
- newskin->drop();
- \endcode
- */
- enum EGUI_SKIN_TYPE
- {
- //! Default windows look and feel
- EGST_WINDOWS_CLASSIC = 0,
- //! Like EGST_WINDOWS_CLASSIC, but with metallic shaded windows and buttons
- EGST_WINDOWS_METALLIC,
- //! Burning's skin
- EGST_BURNING_SKIN,
- //! An unknown skin, not serializable at present
- EGST_UNKNOWN,
- //! this value is not used, it only specifies the number of skin types
- EGST_COUNT
- };
- //! Names for gui element types
- const c8 *const GUISkinTypeNames[EGST_COUNT + 1] = {
- "windowsClassic",
- "windowsMetallic",
- "burning",
- "unknown",
- 0,
- };
- //! Enumeration for skin colors
- enum EGUI_DEFAULT_COLOR
- {
- //! Dark shadow for three-dimensional display elements.
- EGDC_3D_DARK_SHADOW = 0,
- //! Shadow color for three-dimensional display elements (for edges facing away from the light source).
- EGDC_3D_SHADOW,
- //! Face color for three-dimensional display elements and for dialog box backgrounds.
- EGDC_3D_FACE,
- //! Highlight color for three-dimensional display elements (for edges facing the light source.)
- EGDC_3D_HIGH_LIGHT,
- //! Light color for three-dimensional display elements (for edges facing the light source.)
- EGDC_3D_LIGHT,
- //! Active window border.
- EGDC_ACTIVE_BORDER,
- //! Active window title bar text.
- EGDC_ACTIVE_CAPTION,
- //! Background color of multiple document interface (MDI) applications.
- EGDC_APP_WORKSPACE,
- //! Text on a button
- EGDC_BUTTON_TEXT,
- //! Grayed (disabled) text.
- EGDC_GRAY_TEXT,
- //! Item(s) selected in a control.
- EGDC_HIGH_LIGHT,
- //! Text of item(s) selected in a control.
- EGDC_HIGH_LIGHT_TEXT,
- //! Inactive window border.
- EGDC_INACTIVE_BORDER,
- //! Inactive window caption.
- EGDC_INACTIVE_CAPTION,
- //! Tool tip text color
- EGDC_TOOLTIP,
- //! Tool tip background color
- EGDC_TOOLTIP_BACKGROUND,
- //! Scrollbar gray area
- EGDC_SCROLLBAR,
- //! Window background
- EGDC_WINDOW,
- //! Window symbols like on close buttons, scroll bars and check boxes
- EGDC_WINDOW_SYMBOL,
- //! Icons in a list or tree
- EGDC_ICON,
- //! Selected icons in a list or tree
- EGDC_ICON_HIGH_LIGHT,
- //! Grayed (disabled) window symbols like on close buttons, scroll bars and check boxes
- EGDC_GRAY_WINDOW_SYMBOL,
- //! Window background for editable field (editbox, checkbox-field)
- EGDC_EDITABLE,
- //! Grayed (disabled) window background for editable field (editbox, checkbox-field)
- EGDC_GRAY_EDITABLE,
- //! Show focus of window background for editable field (editbox or when checkbox-field is pressed)
- EGDC_FOCUSED_EDITABLE,
- //! this value is not used, it only specifies the amount of default colors
- //! available.
- EGDC_COUNT
- };
- //! Names for default skin colors
- const c8 *const GUISkinColorNames[EGDC_COUNT + 1] = {
- "3DDarkShadow",
- "3DShadow",
- "3DFace",
- "3DHighlight",
- "3DLight",
- "ActiveBorder",
- "ActiveCaption",
- "AppWorkspace",
- "ButtonText",
- "GrayText",
- "Highlight",
- "HighlightText",
- "InactiveBorder",
- "InactiveCaption",
- "ToolTip",
- "ToolTipBackground",
- "ScrollBar",
- "Window",
- "WindowSymbol",
- "Icon",
- "IconHighlight",
- "GrayWindowSymbol",
- "Editable",
- "GrayEditable",
- "FocusedEditable",
- 0,
- };
- //! Enumeration for default sizes.
- enum EGUI_DEFAULT_SIZE
- {
- //! default with / height of scrollbar. Also width of drop-down button in comboboxes.
- EGDS_SCROLLBAR_SIZE = 0,
- //! height of menu
- EGDS_MENU_HEIGHT,
- //! width and height of a window titlebar button (like minimize/maximize/close buttons). The titlebar height is also calculated from that.
- EGDS_WINDOW_BUTTON_WIDTH,
- //! width of a checkbox check
- EGDS_CHECK_BOX_WIDTH,
- //! \deprecated This may be removed by Irrlicht 1.9
- EGDS_MESSAGE_BOX_WIDTH,
- //! \deprecated This may be removed by Irrlicht 1.9
- EGDS_MESSAGE_BOX_HEIGHT,
- //! width of a default button
- EGDS_BUTTON_WIDTH,
- //! height of a default button (OK and cancel buttons)
- EGDS_BUTTON_HEIGHT,
- //! distance for text from background
- EGDS_TEXT_DISTANCE_X,
- //! distance for text from background
- EGDS_TEXT_DISTANCE_Y,
- //! distance for text in the title bar, from the left of the window rect
- EGDS_TITLEBARTEXT_DISTANCE_X,
- //! distance for text in the title bar, from the top of the window rect
- EGDS_TITLEBARTEXT_DISTANCE_Y,
- //! free space in a messagebox between borders and contents on all sides
- EGDS_MESSAGE_BOX_GAP_SPACE,
- //! minimal space to reserve for messagebox text-width
- EGDS_MESSAGE_BOX_MIN_TEXT_WIDTH,
- //! maximal space to reserve for messagebox text-width
- EGDS_MESSAGE_BOX_MAX_TEXT_WIDTH,
- //! minimal space to reserve for messagebox text-height
- EGDS_MESSAGE_BOX_MIN_TEXT_HEIGHT,
- //! maximal space to reserve for messagebox text-height
- EGDS_MESSAGE_BOX_MAX_TEXT_HEIGHT,
- //! pixels to move an unscaled button image to the right when a button is pressed and the unpressed image looks identical
- EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X,
- //! pixels to move an unscaled button image down when a button is pressed and the unpressed image looks identical
- EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y,
- //! pixels to move the button text to the right when a button is pressed
- EGDS_BUTTON_PRESSED_TEXT_OFFSET_X,
- //! pixels to move the button text down when a button is pressed
- EGDS_BUTTON_PRESSED_TEXT_OFFSET_Y,
- //! pixels to move an unscaled button sprite to the right when a button is pressed
- EGDS_BUTTON_PRESSED_SPRITE_OFFSET_X,
- //! pixels to move an unscaled button sprite down when a button is pressed
- EGDS_BUTTON_PRESSED_SPRITE_OFFSET_Y,
- //! this value is not used, it only specifies the amount of default sizes
- //! available.
- EGDS_COUNT
- };
- //! Names for default skin sizes
- const c8 *const GUISkinSizeNames[EGDS_COUNT + 1] = {
- "ScrollBarSize",
- "MenuHeight",
- "WindowButtonWidth",
- "CheckBoxWidth",
- "MessageBoxWidth",
- "MessageBoxHeight",
- "ButtonWidth",
- "ButtonHeight",
- "TextDistanceX",
- "TextDistanceY",
- "TitleBarTextX",
- "TitleBarTextY",
- "MessageBoxGapSpace",
- "MessageBoxMinTextWidth",
- "MessageBoxMaxTextWidth",
- "MessageBoxMinTextHeight",
- "MessageBoxMaxTextHeight",
- "ButtonPressedImageOffsetX",
- "ButtonPressedImageOffsetY",
- "ButtonPressedTextOffsetX",
- "ButtonPressedTextOffsetY",
- "ButtonPressedSpriteOffsetX",
- "ButtonPressedSpriteOffsetY",
- 0,
- };
- enum EGUI_DEFAULT_TEXT
- {
- //! Text for the OK button on a message box
- EGDT_MSG_BOX_OK = 0,
- //! Text for the Cancel button on a message box
- EGDT_MSG_BOX_CANCEL,
- //! Text for the Yes button on a message box
- EGDT_MSG_BOX_YES,
- //! Text for the No button on a message box
- EGDT_MSG_BOX_NO,
- //! Tooltip text for window close button
- EGDT_WINDOW_CLOSE,
- //! Tooltip text for window maximize button
- EGDT_WINDOW_MAXIMIZE,
- //! Tooltip text for window minimize button
- EGDT_WINDOW_MINIMIZE,
- //! Tooltip text for window restore button
- EGDT_WINDOW_RESTORE,
- //! this value is not used, it only specifies the number of default texts
- EGDT_COUNT
- };
- //! Names for default skin sizes
- const c8 *const GUISkinTextNames[EGDT_COUNT + 1] = {
- "MessageBoxOkay",
- "MessageBoxCancel",
- "MessageBoxYes",
- "MessageBoxNo",
- "WindowButtonClose",
- "WindowButtonMaximize",
- "WindowButtonMinimize",
- "WindowButtonRestore",
- 0,
- };
- //! Customizable symbols for GUI
- enum EGUI_DEFAULT_ICON
- {
- //! maximize window button
- EGDI_WINDOW_MAXIMIZE = 0,
- //! restore window button
- EGDI_WINDOW_RESTORE,
- //! close window button
- EGDI_WINDOW_CLOSE,
- //! minimize window button
- EGDI_WINDOW_MINIMIZE,
- //! resize icon for bottom right corner of a window
- EGDI_WINDOW_RESIZE,
- //! scroll bar up button
- EGDI_CURSOR_UP,
- //! scroll bar down button
- EGDI_CURSOR_DOWN,
- //! scroll bar left button
- EGDI_CURSOR_LEFT,
- //! scroll bar right button
- EGDI_CURSOR_RIGHT,
- //! icon for menu children
- EGDI_MENU_MORE,
- //! tick for checkbox
- EGDI_CHECK_BOX_CHECKED,
- //! down arrow for dropdown menus
- EGDI_DROP_DOWN,
- //! smaller up arrow
- EGDI_SMALL_CURSOR_UP,
- //! smaller down arrow
- EGDI_SMALL_CURSOR_DOWN,
- //! selection dot in a radio button
- EGDI_RADIO_BUTTON_CHECKED,
- //! << icon indicating there is more content to the left
- EGDI_MORE_LEFT,
- //! >> icon indicating that there is more content to the right
- EGDI_MORE_RIGHT,
- //! icon indicating that there is more content above
- EGDI_MORE_UP,
- //! icon indicating that there is more content below
- EGDI_MORE_DOWN,
- //! plus icon for trees
- EGDI_EXPAND,
- //! minus icon for trees
- EGDI_COLLAPSE,
- //! file icon for file selection
- EGDI_FILE,
- //! folder icon for file selection
- EGDI_DIRECTORY,
- //! value not used, it only specifies the number of icons
- EGDI_COUNT
- };
- const c8 *const GUISkinIconNames[EGDI_COUNT + 1] = {
- "windowMaximize",
- "windowRestore",
- "windowClose",
- "windowMinimize",
- "windowResize",
- "cursorUp",
- "cursorDown",
- "cursorLeft",
- "cursorRight",
- "menuMore",
- "checkBoxChecked",
- "dropDown",
- "smallCursorUp",
- "smallCursorDown",
- "radioButtonChecked",
- "moreLeft",
- "moreRight",
- "moreUp",
- "moreDown",
- "expand",
- "collapse",
- "file",
- "directory",
- 0,
- };
- // Customizable fonts
- enum EGUI_DEFAULT_FONT
- {
- //! For static text, edit boxes, lists and most other places
- EGDF_DEFAULT = 0,
- //! Font for buttons
- EGDF_BUTTON,
- //! Font for window title bars
- EGDF_WINDOW,
- //! Font for menu items
- EGDF_MENU,
- //! Font for tooltips
- EGDF_TOOLTIP,
- //! this value is not used, it only specifies the amount of default fonts
- //! available.
- EGDF_COUNT
- };
- const c8 *const GUISkinFontNames[EGDF_COUNT + 1] = {
- "defaultFont",
- "buttonFont",
- "windowFont",
- "menuFont",
- "tooltipFont",
- 0,
- };
- //! A skin modifies the look of the GUI elements.
- class IGUISkin : virtual public IReferenceCounted
- {
- public:
- //! returns default color
- virtual video::SColor getColor(EGUI_DEFAULT_COLOR color) const = 0;
- //! sets a default color
- virtual void setColor(EGUI_DEFAULT_COLOR which, video::SColor newColor) = 0;
- //! returns size for the given size type
- virtual s32 getSize(EGUI_DEFAULT_SIZE size) const = 0;
- //! Returns a default text.
- /** For example for Message box button captions:
- "OK", "Cancel", "Yes", "No" and so on. */
- virtual const wchar_t *getDefaultText(EGUI_DEFAULT_TEXT text) const = 0;
- //! Sets a default text.
- /** For example for Message box button captions:
- "OK", "Cancel", "Yes", "No" and so on. */
- virtual void setDefaultText(EGUI_DEFAULT_TEXT which, const wchar_t *newText) = 0;
- //! sets a default size
- virtual void setSize(EGUI_DEFAULT_SIZE which, s32 size) = 0;
- //! returns the default font
- virtual IGUIFont *getFont(EGUI_DEFAULT_FONT which = EGDF_DEFAULT) const = 0;
- //! sets a default font
- virtual void setFont(IGUIFont *font, EGUI_DEFAULT_FONT which = EGDF_DEFAULT) = 0;
- //! returns the sprite bank
- virtual IGUISpriteBank *getSpriteBank() const = 0;
- //! sets the sprite bank
- virtual void setSpriteBank(IGUISpriteBank *bank) = 0;
- //! Returns a default icon
- /** Returns the sprite index within the sprite bank */
- virtual u32 getIcon(EGUI_DEFAULT_ICON icon) const = 0;
- //! Sets a default icon
- /** Sets the sprite index used for drawing icons like arrows,
- close buttons and ticks in checkboxes
- \param icon: Enum specifying which icon to change
- \param index: The sprite index used to draw this icon */
- virtual void setIcon(EGUI_DEFAULT_ICON icon, u32 index) = 0;
- //! draws a standard 3d button pane
- /** Used for drawing for example buttons in normal state.
- It uses the colors EGDC_3D_DARK_SHADOW, EGDC_3D_HIGH_LIGHT, EGDC_3D_SHADOW and
- EGDC_3D_FACE for this. See EGUI_DEFAULT_COLOR for details.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param rect: Defining area where to draw.
- \param clip: Clip area. */
- virtual void draw3DButtonPaneStandard(IGUIElement *element,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0) = 0;
- //! draws a pressed 3d button pane
- /** Used for drawing for example buttons in pressed state.
- It uses the colors EGDC_3D_DARK_SHADOW, EGDC_3D_HIGH_LIGHT, EGDC_3D_SHADOW and
- EGDC_3D_FACE for this. See EGUI_DEFAULT_COLOR for details.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param rect: Defining area where to draw.
- \param clip: Clip area. */
- virtual void draw3DButtonPanePressed(IGUIElement *element,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0) = 0;
- //! draws a sunken 3d pane
- /** Used for drawing the background of edit, combo or check boxes.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param bgcolor: Background color.
- \param flat: Specifies if the sunken pane should be flat or displayed as sunken
- deep into the ground.
- \param fillBackGround: Specifies if the background should be filled with the background
- color or not be drawn at all.
- \param rect: Defining area where to draw.
- \param clip: Clip area. */
- virtual void draw3DSunkenPane(IGUIElement *element,
- video::SColor bgcolor, bool flat, bool fillBackGround,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0) = 0;
- //! draws a window background
- /** Used for drawing the background of dialogs and windows.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param titleBarColor: Title color.
- \param drawTitleBar: True to enable title drawing.
- \param rect: Defining area where to draw.
- \param clip: Clip area.
- \param checkClientArea: When set to non-null the function will not draw anything,
- but will instead return the clientArea which can be used for drawing by the calling window.
- That is the area without borders and without titlebar.
- \return Returns rect where it would be good to draw title bar text. This will
- work even when checkClientArea is set to a non-null value.*/
- virtual core::rect<s32> draw3DWindowBackground(IGUIElement *element,
- bool drawTitleBar, video::SColor titleBarColor,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0,
- core::rect<s32> *checkClientArea = 0) = 0;
- //! draws a standard 3d menu pane
- /** Used for drawing for menus and context menus.
- It uses the colors EGDC_3D_DARK_SHADOW, EGDC_3D_HIGH_LIGHT, EGDC_3D_SHADOW and
- EGDC_3D_FACE for this. See EGUI_DEFAULT_COLOR for details.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param rect: Defining area where to draw.
- \param clip: Clip area. */
- virtual void draw3DMenuPane(IGUIElement *element,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0) = 0;
- //! draws a standard 3d tool bar
- /** Used for drawing for toolbars and menus.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param rect: Defining area where to draw.
- \param clip: Clip area. */
- virtual void draw3DToolBar(IGUIElement *element,
- const core::rect<s32> &rect,
- const core::rect<s32> *clip = 0) = 0;
- //! draws a tab button
- /** Used for drawing for tab buttons on top of tabs.
- \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param active: Specifies if the tab is currently active.
- \param rect: Defining area where to draw.
- \param clip: Clip area.
- \param alignment Alignment of GUI element. */
- virtual void draw3DTabButton(IGUIElement *element, bool active,
- const core::rect<s32> &rect, const core::rect<s32> *clip = 0, gui::EGUI_ALIGNMENT alignment = EGUIA_UPPERLEFT) = 0;
- //! draws a tab control body
- /** \param element: Pointer to the element which wishes to draw this. This parameter
- is usually not used by IGUISkin, but can be used for example by more complex
- implementations to find out how to draw the part exactly.
- \param border: Specifies if the border should be drawn.
- \param background: Specifies if the background should be drawn.
- \param rect: Defining area where to draw.
- \param clip: Clip area.
- \param tabHeight Height of tab.
- \param alignment Alignment of GUI element. */
- virtual void draw3DTabBody(IGUIElement *element, bool border, bool background,
- const core::rect<s32> &rect, const core::rect<s32> *clip = 0, s32 tabHeight = -1, gui::EGUI_ALIGNMENT alignment = EGUIA_UPPERLEFT) = 0;
- //! draws an icon, usually from the skin's sprite bank
- /** \param element: Pointer to the element which wishes to draw this icon.
- This parameter is usually not used by IGUISkin, but can be used for example
- by more complex implementations to find out how to draw the part exactly.
- \param icon: Specifies the icon to be drawn.
- \param position: The position to draw the icon
- \param starttime: The time at the start of the animation
- \param currenttime: The present time, used to calculate the frame number
- \param loop: Whether the animation should loop or not
- \param clip: Clip area. */
- virtual void drawIcon(IGUIElement *element, EGUI_DEFAULT_ICON icon,
- const core::position2di position, u32 starttime = 0, u32 currenttime = 0,
- bool loop = false, const core::rect<s32> *clip = 0) = 0;
- //! draws a 2d rectangle.
- /** \param element: Pointer to the element which wishes to draw this icon.
- This parameter is usually not used by IGUISkin, but can be used for example
- by more complex implementations to find out how to draw the part exactly.
- \param color: Color of the rectangle to draw. The alpha component specifies how
- transparent the rectangle will be.
- \param pos: Position of the rectangle.
- \param clip: Pointer to rectangle against which the rectangle will be clipped.
- If the pointer is null, no clipping will be performed. */
- virtual void draw2DRectangle(IGUIElement *element, const video::SColor &color,
- const core::rect<s32> &pos, const core::rect<s32> *clip = 0) = 0;
- //! get the type of this skin
- virtual EGUI_SKIN_TYPE getType() const { return EGST_UNKNOWN; }
- };
- } // end namespace gui
- } // end namespace irr
|