2009-04-16 14:14:13 +03:00
# ifndef __ADVENTUREMAPBUTTON_H__
# define __ADVENTUREMAPBUTTON_H__
2009-05-20 13:08:56 +03:00
# include "FunctionList.h"
2009-04-16 14:14:13 +03:00
# include <boost/bind.hpp>
2009-05-20 13:08:56 +03:00
# include "GUIBase.h"
2009-04-16 14:14:13 +03:00
2009-04-15 17:03:31 +03:00
/*
* AdventureMapButton . h , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
2009-04-16 14:14:13 +03:00
*/
namespace config { struct ButtonInfo ; }
class AdventureMapButton
: public ClickableR , public Hoverable , public KeyShortcut , public CButtonBase
{
public :
std : : map < int , std : : string > hoverTexts ; //state -> text for statusbar
std : : string helpBox ; //for right-click help
CFunctionList < void ( ) > callback ;
bool colorChange ,
actOnDown ; //runs when mouse is pressed down over it, not when up
ui8 blocked ;
2009-05-19 21:23:04 +03:00
void clickRight ( boost : : logic : : tribool down ) ;
virtual void clickLeft ( boost : : logic : : tribool down ) ;
2009-04-16 14:14:13 +03:00
void hover ( bool on ) ;
void block ( ui8 on ) ; //if button is blocked then it'll change it's graphic to inactive (offset==2) and won't react on l-clicks
void activate ( ) ; // makes button active
void deactivate ( ) ; // makes button inactive (but doesn't delete)
AdventureMapButton ( ) ; //c-tor
AdventureMapButton ( const std : : map < int , std : : string > & , const std : : string & HelpBox , const CFunctionList < void ( ) > & Callback , int x , int y , const std : : string & defName , int key = 0 , std : : vector < std : : string > * add = NULL , bool playerColoredButton = false ) ; //c-tor
AdventureMapButton ( const std : : string & Name , const std : : string & HelpBox , const CFunctionList < void ( ) > & Callback , int x , int y , const std : : string & defName , int key = 0 , std : : vector < std : : string > * add = NULL , bool playerColoredButton = false ) ; //c-tor
AdventureMapButton ( const std : : pair < std : : string , std : : string > help , const CFunctionList < void ( ) > & Callback , int x , int y , const std : : string & defName , int key = 0 , std : : vector < std : : string > * add = NULL , bool playerColoredButton = false ) ; //c-tor
AdventureMapButton ( const std : : string & Name , const std : : string & HelpBox , const CFunctionList < void ( ) > & Callback , config : : ButtonInfo * info , int key = 0 ) ; //c-tor
//AdventureMapButton( std::string Name, std::string HelpBox, boost::function<void()> Callback, int x, int y, std::string defName, bool activ=false, std::vector<std::string> * add = NULL, bool playerColoredButton = false );//c-tor
void init ( const CFunctionList < void ( ) > & Callback , const std : : map < int , std : : string > & Name , const std : : string & HelpBox , bool playerColoredButton , const std : : string & defName , std : : vector < std : : string > * add , int x , int y , int key ) ;
} ;
class CHighlightableButton
: public AdventureMapButton
{
public :
2009-05-06 13:14:48 +03:00
CHighlightableButton ( const CFunctionList < void ( ) > & onSelect , const CFunctionList < void ( ) > & onDeselect , const std : : map < int , std : : string > & Name , const std : : string & HelpBox , bool playerColoredButton , const std : : string & defName , std : : vector < std : : string > * add , int x , int y , int key = 0 ) ;
2009-04-16 14:14:13 +03:00
bool selected , onlyOn ;
CFunctionList < void ( ) > callback2 ; //when disselecting
void select ( bool on ) ;
2009-05-19 21:23:04 +03:00
void clickLeft ( boost : : logic : : tribool down ) ;
2009-04-16 14:14:13 +03:00
} ;
class CHighlightableButtonsGroup
{
public :
CFunctionList2 < void ( int ) > onChange ; //called when changing selected button with new button's id
std : : vector < CHighlightableButton * > buttons ;
2009-05-06 13:14:48 +03:00
bool musicLike ; //determines the behaviour of this group
2009-04-16 14:14:13 +03:00
//void addButton(const std::map<int,std::string> &tooltip, const std::string &HelpBox, const std::string &defName, int x, int y, int uid);
void addButton ( CHighlightableButton * bt ) ; //add existing button, it'll be deleted by CHighlightableButtonsGroup destructor
void addButton ( const std : : map < int , std : : string > & tooltip , const std : : string & HelpBox , const std : : string & defName , int x , int y , int uid , const CFunctionList < void ( ) > & OnSelect = 0 , int key = 0 ) ; //creates new button
2009-05-06 13:14:48 +03:00
CHighlightableButtonsGroup ( const CFunctionList2 < void ( int ) > & OnChange , bool musicLikeButtons = false ) ;
2009-04-16 14:14:13 +03:00
~ CHighlightableButtonsGroup ( ) ;
void activate ( ) ;
void deactivate ( ) ;
void select ( int id , bool mode ) ; //mode==0: id is serial; mode==1: id is unique button id
void selectionChanged ( int to ) ;
void show ( SDL_Surface * to ) ;
} ;
class CSlider : public IShowable , public MotionInterested , public ClickableL
{
public :
AdventureMapButton left , right , slider ; //if vertical then left=up
int capacity , //how many elements can be active at same time
amount , //how many elements
value ; //first active element
bool horizontal , moving ;
CDefEssential * imgs ;
boost : : function < void ( int ) > moved ;
//void(T::*moved)(int to);
//T* owner;
void redrawSlider ( ) ;
void sliderClicked ( ) ;
void moveLeft ( ) ;
2009-05-19 21:23:04 +03:00
void clickLeft ( boost : : logic : : tribool down ) ;
2009-04-16 14:14:13 +03:00
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
void moveRight ( ) ;
void moveTo ( int to ) ;
void block ( bool on ) ;
void activate ( ) ; // makes button active
void deactivate ( ) ; // makes button inactive (but doesn't delete)
void show ( SDL_Surface * to ) ;
CSlider ( int x , int y , int totalw , boost : : function < void ( int ) > Moved , int Capacity , int Amount ,
int Value = 0 , bool Horizontal = true ) ;
~ CSlider ( ) ;
} ;
# endif // __ADVENTUREMAPBUTTON_H__