2009-04-16 11:14:13 +00:00
#ifndef __ADVENTUREMAPBUTTON_H__
#define __ADVENTUREMAPBUTTON_H__
2009-05-20 10:08:56 +00:00
#include "FunctionList.h"
2009-04-16 11:14:13 +00:00
#include <boost/bind.hpp>
2009-05-20 10:08:56 +00:00
#include "GUIBase.h"
2009-04-16 11:14:13 +00:00
2009-04-15 14:03:31 +00: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 11:14:13 +00:00
*/
2009-08-06 22:36:51 +00:00
class CDefEssential ;
2009-04-16 11:14:13 +00:00
namespace config { struct ButtonInfo ;}
2009-08-17 08:50:31 +00: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 05:45:40 +00:00
//virtual void activate()=0;
//virtual void deactivate()=0;
2009-08-17 08:50:31 +00:00
CButtonBase (); //c-tor
virtual ~ CButtonBase (); //d-tor
};
2009-08-11 16:05:33 +00:00
class AdventureMapButton : public CButtonBase
2009-04-16 11:14:13 +00: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 08:50:31 +00: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 11:14:13 +00:00
ui8 blocked ;
2009-08-11 16:05:33 +00:00
void clickRight ( tribool down , bool previousState );
virtual void clickLeft ( tribool down , bool previousState );
2009-04-16 11:14:13 +00: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 05:45:40 +00:00
//void activate(); // makes button active
//void deactivate(); // makes button inactive (but doesn't delete)
2009-04-16 11:14:13 +00: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 08:50:31 +00:00
void setDef ( const std :: string & defName , bool playerColoredButton );
2009-04-16 11:14:13 +00:00
};
class CHighlightableButton
: public AdventureMapButton
{
public :
2009-05-06 10:14:48 +00: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 08:50:31 +00: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 08:04:32 +00: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 00:59:54 +00:00
bool onlyOn , selected ;
CFunctionList < void () > callback2 ; //when de-selecting
2009-04-16 11:14:13 +00:00
void select ( bool on );
2009-08-11 16:05:33 +00:00
void clickLeft ( tribool down , bool previousState );
2009-04-16 11:14:13 +00:00
};
2009-08-17 08:50:31 +00:00
class CHighlightableButtonsGroup : public CIntObject
2009-04-16 11:14:13 +00:00
{
public :
CFunctionList2 < void ( int ) > onChange ; //called when changing selected button with new button's id
std :: vector < CHighlightableButton *> buttons ;
2009-05-06 10:14:48 +00:00
bool musicLike ; //determines the behaviour of this group
2009-04-16 11:14:13 +00: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 10:14:48 +00:00
CHighlightableButtonsGroup ( const CFunctionList2 < void ( int ) > & OnChange , bool musicLikeButtons = false );
2009-04-16 11:14:13 +00: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 08:50:31 +00:00
void showAll ( SDL_Surface * to );
2009-08-27 08:04:32 +00:00
void block ( ui8 on );
2009-04-16 11:14:13 +00:00
};
2009-08-11 16:05:33 +00:00
class CSlider : public CIntObject
2009-04-16 11:14:13 +00:00
{
public :
2009-08-17 08:50:31 +00:00
AdventureMapButton * left , * right , * slider ; //if vertical then left=up
2009-04-16 11:14:13 +00:00
int capacity , //how many elements can be active at same time
amount , //how many elements
2009-08-17 08:50:31 +00:00
positions , //number of highest position (0 if there is only one)
2009-04-16 11:14:13 +00:00
value ; //first active element
2009-09-12 22:17:23 +00:00
bool horizontal ;
2009-04-16 11:14:13 +00:00
CDefEssential * imgs ;
boost :: function < void ( int ) > moved ;
//void(T::*moved)(int to);
//T* owner;
void redrawSlider ();
void sliderClicked ();
void moveLeft ();
2009-08-11 16:05:33 +00:00
void clickLeft ( tribool down , bool previousState );
2009-04-16 11:14:13 +00:00
void mouseMoved ( const SDL_MouseMotionEvent & sEvent );
void moveRight ();
void moveTo ( int to );
void block ( bool on );
2009-08-17 08:50:31 +00: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 11:14:13 +00:00
CSlider ( int x , int y , int totalw , boost :: function < void ( int ) > Moved , int Capacity , int Amount ,
2009-08-17 08:50:31 +00:00
int Value = 0 , bool Horizontal = true , int style = 0 ); //style 0 - brown, 1 - blue
2009-04-16 11:14:13 +00:00
~ CSlider ();
};
#endif // __ADVENTUREMAPBUTTON_H__