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
*/
2009-08-07 01:36:51 +03:00
class CDefEssential ;
2009-04-16 14:14:13 +03:00
namespace config { struct ButtonInfo ; }
2009-08-17 11:50:31 +03:00
class CButtonBase : public KeyShortcut //basic buttton class
{
public :
struct TextOverlay
{
EFonts font ;
std : : string text ;
int x , y ;
} * text ;
void addTextOverlay ( const std : : string Text , EFonts font ) ;
int bitmapOffset ; //TODO: comment me
int type ; //advmapbutton=2 //TODO: comment me
bool abs ; //TODO: comment me
//bool active; //if true, this button is active and can be pressed
bool notFreeButton ; //TODO: comment me
CIntObject * ourObj ; // "owner"
int state ; //TODO: comment me
std : : vector < std : : vector < SDL_Surface * > > imgs ; //images for this button
int curimg ; //curently displayed image from imgs
virtual void show ( SDL_Surface * to ) ;
virtual void showAll ( SDL_Surface * to ) ;
2009-09-11 08:45:40 +03:00
//virtual void activate()=0;
//virtual void deactivate()=0;
2009-08-17 11:50:31 +03:00
CButtonBase ( ) ; //c-tor
virtual ~ CButtonBase ( ) ; //d-tor
} ;
2009-08-11 19:05:33 +03:00
class AdventureMapButton : public CButtonBase
2009-04-16 14:14:13 +03:00
{
public :
std : : map < int , std : : string > hoverTexts ; //state -> text for statusbar
std : : string helpBox ; //for right-click help
CFunctionList < void ( ) > callback ;
2009-08-17 11:50:31 +03:00
bool actOnDown , //runs when mouse is pressed down over it, not when up
hoverable ; //if true, button will be highlighted when hovered
2009-04-16 14:14:13 +03:00
ui8 blocked ;
2009-08-11 19:05:33 +03:00
void clickRight ( tribool down , bool previousState ) ;
virtual void clickLeft ( tribool down , bool previousState ) ;
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
2009-09-11 08:45:40 +03:00
//void activate(); // makes button active
//void deactivate(); // makes button inactive (but doesn't delete)
2009-04-16 14:14:13 +03:00
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 ) ;
2009-08-17 11:50:31 +03:00
void setDef ( const std : : string & defName , bool playerColoredButton ) ;
2009-04-16 14:14:13 +03:00
} ;
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-08-17 11:50:31 +03:00
CHighlightableButton ( const std : : pair < std : : string , std : : string > help , const CFunctionList < void ( ) > & onSelect , int x , int y , const std : : string & defName , int myid , int key = 0 , std : : vector < std : : string > * add = NULL , bool playerColoredButton = false ) ; //c-tor
2009-08-27 11:04:32 +03:00
CHighlightableButton ( const std : : string & Name , const std : : string & HelpBox , const CFunctionList < void ( ) > & onSelect , int x , int y , const std : : string & defName , int myid , int key = 0 , std : : vector < std : : string > * add = NULL , bool playerColoredButton = false ) ; //c-tor
2009-08-21 03:59:54 +03:00
bool onlyOn , selected ;
CFunctionList < void ( ) > callback2 ; //when de-selecting
2009-04-16 14:14:13 +03:00
void select ( bool on ) ;
2009-08-11 19:05:33 +03:00
void clickLeft ( tribool down , bool previousState ) ;
2009-04-16 14:14:13 +03:00
} ;
2009-08-17 11:50:31 +03:00
class CHighlightableButtonsGroup : public CIntObject
2009-04-16 14:14:13 +03:00
{
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 ) ;
2009-08-17 11:50:31 +03:00
void showAll ( SDL_Surface * to ) ;
2009-08-27 11:04:32 +03:00
void block ( ui8 on ) ;
2009-04-16 14:14:13 +03:00
} ;
2009-08-11 19:05:33 +03:00
class CSlider : public CIntObject
2009-04-16 14:14:13 +03:00
{
public :
2009-08-17 11:50:31 +03:00
AdventureMapButton * left , * right , * slider ; //if vertical then left=up
2009-04-16 14:14:13 +03:00
int capacity , //how many elements can be active at same time
amount , //how many elements
2009-08-17 11:50:31 +03:00
positions , //number of highest position (0 if there is only one)
2009-04-16 14:14:13 +03:00
value ; //first active element
2009-09-13 01:17:23 +03:00
bool horizontal ;
2009-04-16 14:14:13 +03:00
CDefEssential * imgs ;
boost : : function < void ( int ) > moved ;
//void(T::*moved)(int to);
//T* owner;
void redrawSlider ( ) ;
void sliderClicked ( ) ;
void moveLeft ( ) ;
2009-08-11 19:05:33 +03:00
void clickLeft ( tribool down , bool previousState ) ;
2009-04-16 14:14:13 +03:00
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
void moveRight ( ) ;
void moveTo ( int to ) ;
void block ( bool on ) ;
2009-08-17 11:50:31 +03:00
void setAmount ( int to ) ;
//void activate(); // makes button active
//void deactivate(); // makes button inactive (but doesn't delete)
//void show(SDL_Surface * to);
2009-04-16 14:14:13 +03:00
CSlider ( int x , int y , int totalw , boost : : function < void ( int ) > Moved , int Capacity , int Amount ,
2009-08-17 11:50:31 +03:00
int Value = 0 , bool Horizontal = true , int style = 0 ) ; //style 0 - brown, 1 - blue
2009-04-16 14:14:13 +03:00
~ CSlider ( ) ;
} ;
# endif // __ADVENTUREMAPBUTTON_H__