2019-12-12 17:32:41 +01:00
// 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
2021-08-27 17:55:04 +02:00
# ifndef IRR_C_GUI_LIST_BOX_H_INCLUDED
# define IRR_C_GUI_LIST_BOX_H_INCLUDED
2019-12-12 17:32:41 +01:00
# include "IrrCompileConfig.h"
# ifdef _IRR_COMPILE_WITH_GUI_
# include "IGUIListBox.h"
# include "irrArray.h"
namespace irr
{
namespace gui
{
class IGUIFont ;
class IGUIScrollBar ;
class CGUIListBox : public IGUIListBox
{
public :
//! constructor
CGUIListBox ( IGUIEnvironment * environment , IGUIElement * parent ,
s32 id , core : : rect < s32 > rectangle , bool clip = true ,
bool drawBack = false , bool moveOverSelect = false ) ;
//! destructor
virtual ~ CGUIListBox ( ) ;
//! returns amount of list items
2021-08-27 14:55:10 +02:00
virtual u32 getItemCount ( ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! returns string of a list item. the id may be a value from 0 to itemCount-1
2021-08-27 14:55:10 +02:00
virtual const wchar_t * getListItem ( u32 id ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! clears the list
2021-08-27 14:55:10 +02:00
virtual void clear ( ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! returns id of selected item. returns -1 if no item is selected.
2021-08-27 14:55:10 +02:00
virtual s32 getSelected ( ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! sets the selected item. Set this to -1 if no item should be selected
2021-08-27 14:55:10 +02:00
virtual void setSelected ( s32 id ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! sets the selected item. Set this to -1 if no item should be selected
2021-08-27 14:55:10 +02:00
virtual void setSelected ( const wchar_t * item ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! called if an event happened.
2021-08-27 14:55:10 +02:00
virtual bool OnEvent ( const SEvent & event ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! draws the element and its children
2021-08-27 14:55:10 +02:00
virtual void draw ( ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! adds an list item with an icon
//! \param text Text of list entry
//! \param icon Sprite index of the Icon within the current sprite bank. Set it to -1 if you want no icon
//! \return
//! returns the id of the new created item
2022-05-05 17:19:35 +02:00
virtual u32 addItem ( const wchar_t * text , s32 icon = - 1 ) IRR_OVERRIDE ;
//! Insert the item at the given index
//! Return the index on success or -1 on failure.
virtual s32 insertItem ( u32 index , const wchar_t * text , s32 icon = - 1 ) IRR_OVERRIDE ;
//! set the item at the given index
virtual void setItem ( u32 index , const wchar_t * text , s32 icon = - 1 ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Returns the icon of an item
2021-08-27 14:55:10 +02:00
virtual s32 getIcon ( u32 id ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! removes an item from the list
2021-08-27 14:55:10 +02:00
virtual void removeItem ( u32 id ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! get the the id of the item at the given absolute coordinates
2021-08-27 14:55:10 +02:00
virtual s32 getItemAt ( s32 xpos , s32 ypos ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Sets the sprite bank which should be used to draw list icons. This font is set to the sprite bank of
//! the built-in-font by default. A sprite can be displayed in front of every list item.
//! An icon is an index within the icon sprite bank. Several default icons are available in the
//! skin through getIcon
2021-08-27 14:55:10 +02:00
virtual void setSpriteBank ( IGUISpriteBank * bank ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! set whether the listbox should scroll to newly selected items
2021-08-27 14:55:10 +02:00
virtual void setAutoScrollEnabled ( bool scroll ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! returns true if automatic scrolling is enabled, false if not.
2021-08-27 14:55:10 +02:00
virtual bool isAutoScrollEnabled ( ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Update the position and size of the listbox, and update the scrollbar
2021-08-27 14:55:10 +02:00
virtual void updateAbsolutePosition ( ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Writes attributes of the element.
2021-08-27 14:55:10 +02:00
virtual void serializeAttributes ( io : : IAttributes * out , io : : SAttributeReadWriteOptions * options ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Reads attributes of the element
2021-08-27 14:55:10 +02:00
virtual void deserializeAttributes ( io : : IAttributes * in , io : : SAttributeReadWriteOptions * options ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! set all item colors at given index to color
2021-08-27 14:55:10 +02:00
virtual void setItemOverrideColor ( u32 index , video : : SColor color ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! set all item colors of specified type at given index to color
2021-08-27 14:55:10 +02:00
virtual void setItemOverrideColor ( u32 index , EGUI_LISTBOX_COLOR colorType , video : : SColor color ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! clear all item colors at index
2021-08-27 14:55:10 +02:00
virtual void clearItemOverrideColor ( u32 index ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! clear item color at index for given colortype
2021-08-27 14:55:10 +02:00
virtual void clearItemOverrideColor ( u32 index , EGUI_LISTBOX_COLOR colorType ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! has the item at index its color overwritten?
2021-08-27 14:55:10 +02:00
virtual bool hasItemOverrideColor ( u32 index , EGUI_LISTBOX_COLOR colorType ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! return the overwrite color at given item index.
2021-08-27 14:55:10 +02:00
virtual video : : SColor getItemOverrideColor ( u32 index , EGUI_LISTBOX_COLOR colorType ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! return the default color which is used for the given colorType
2021-08-27 14:55:10 +02:00
virtual video : : SColor getItemDefaultColor ( EGUI_LISTBOX_COLOR colorType ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Swap the items at the given indices
2021-08-27 14:55:10 +02:00
virtual void swapItems ( u32 index1 , u32 index2 ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! set global itemHeight
2021-08-27 14:55:10 +02:00
virtual void setItemHeight ( s32 height ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Sets whether to draw the background
2021-08-27 14:55:10 +02:00
virtual void setDrawBackground ( bool draw ) IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
//! Access the vertical scrollbar
2021-08-27 14:55:10 +02:00
virtual IGUIScrollBar * getVerticalScrollBar ( ) const IRR_OVERRIDE ;
2019-12-12 17:32:41 +01:00
private :
struct ListItem
{
ListItem ( ) : Icon ( - 1 )
{ }
core : : stringw Text ;
s32 Icon ;
// A multicolor extension
struct ListItemOverrideColor
{
ListItemOverrideColor ( ) : Use ( false ) { }
bool Use ;
video : : SColor Color ;
} ;
ListItemOverrideColor OverrideColors [ EGUI_LBC_COUNT ] ;
} ;
void recalculateItemHeight ( ) ;
void selectNew ( s32 ypos , bool onlyHover = false ) ;
void recalculateScrollPos ( ) ;
void updateScrollBarSize ( s32 size ) ;
// extracted that function to avoid copy&paste code
void recalculateItemWidth ( s32 icon ) ;
// get labels used for serialization
bool getSerializationLabels ( EGUI_LISTBOX_COLOR colorType , core : : stringc & useColorLabel , core : : stringc & colorLabel ) const ;
core : : array < ListItem > Items ;
s32 Selected ;
2023-03-06 15:34:16 +01:00
s32 HoverSelected ; // When >= 0 we're in the middle of changing selection while mouse is pressed. We need to know so selected again isn't called too often.
2019-12-12 17:32:41 +01:00
s32 ItemHeight ;
s32 ItemHeightOverride ;
s32 TotalItemHeight ;
s32 ItemsIconWidth ;
gui : : IGUIFont * Font ;
gui : : IGUISpriteBank * IconBank ;
gui : : IGUIScrollBar * ScrollBar ;
2023-03-06 15:34:16 +01:00
u32 SelectTime ;
2019-12-12 17:32:41 +01:00
u32 LastKeyTime ;
core : : stringw KeyBuffer ;
bool Selecting ;
bool DrawBack ;
bool MoveOverSelect ;
bool AutoScroll ;
bool HighlightWhenNotFocused ;
} ;
} // end namespace gui
} // end namespace irr
# endif // _IRR_COMPILE_WITH_GUI_
# endif