| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460 | #include "AdventureMapButton.h"#include "CAdvmapInterface.h"#include "SDL_Extensions.h"#include "../hch/CDefHandler.h"#include "CGameInfo.h"#include "../hch/CLodHandler.h"#include "../hch/CGeneralTextHandler.h"#include "../hch/CTownHandler.h"#include "../CCallback.h"#include "CConfigHandler.h"#include "Graphics.h"#include "CBattleInterface.h"#include "CPlayerInterface.h"/* * AdevntureMapButton.cpp, 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 * */AdventureMapButton::AdventureMapButton (){	type=2;	abs=true;	active=false;	ourObj=NULL;	state=0;	blocked = actOnDown = false;}//AdventureMapButton::AdventureMapButton( std::string Name, std::string HelpBox, boost::function<void()> Callback, int x, int y, std::string defName, bool activ,  std::vector<std::string> * add, bool playerColoredButton)//{//	init(Callback, Name, HelpBox, playerColoredButton, defName, add, x, y, activ);//}AdventureMapButton::AdventureMapButton( const std::string &Name, const std::string &HelpBox, const CFunctionList<void()> &Callback, int x, int y,  const std::string &defName,int key, std::vector<std::string> * add, bool playerColoredButton ){	std::map<int,std::string> pom;	pom[0] = Name;	init(Callback, pom, HelpBox, playerColoredButton, defName, add, x, y, key);}AdventureMapButton::AdventureMapButton( const std::map<int,std::string> &Name, const std::string &HelpBox, const CFunctionList<void()> &Callback, int x, int y, const std::string &defName, int key, std::vector<std::string> * add /*= NULL*/, bool playerColoredButton /*= false */ ){	init(Callback, Name, HelpBox, playerColoredButton, defName, add, x, y, key);}AdventureMapButton::AdventureMapButton( const std::string &Name, const std::string &HelpBox, const CFunctionList<void()> &Callback, config::ButtonInfo *info, int key/*=0*/ ){	std::map<int,std::string> pom;	pom[0] = Name;	init(Callback, pom, HelpBox, info->playerColoured, info->defName, &info->additionalDefs, info->x, info->y, key);}AdventureMapButton::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 */ ){	std::map<int,std::string> pom;	pom[0] = help.first;	init(Callback, pom, help.second, playerColoredButton, defName, add, x, y, key);}void AdventureMapButton::clickLeft (boost::logic::tribool down){	if(blocked)		return;	if (down)		state=1;	else		state=0;	show(screenBuf);	if (actOnDown && down)	{		pressedL=state;		//if(!callback.empty())			callback();	}	else if (!actOnDown && pressedL && (down==false))	{		pressedL=state;		//if(!callback.empty())			callback();	}	else	{		pressedL=state;	}}void AdventureMapButton::clickRight (boost::logic::tribool down){	if(helpBox.size()) //there is no point to show window with nothing inside...		LOCPLINT->adventureInt->handleRightClick(helpBox,down,this);}void AdventureMapButton::hover (bool on){	Hoverable::hover(on);	std::string *name = (vstd::contains(hoverTexts,state)) 							? (&hoverTexts[state]) 							: (vstd::contains(hoverTexts,0) ? (&hoverTexts[0]) : NULL);	if(name && blocked!=1) //if there is no name, there is nohing to display also	{		if (LOCPLINT->battleInt) //for battle buttons		{			if(on && LOCPLINT->battleInt->console->alterTxt == "")			{				LOCPLINT->battleInt->console->alterTxt = *name;				LOCPLINT->battleInt->console->whoSetAlter = 1;			}			else if (LOCPLINT->battleInt->console->alterTxt == *name)			{				LOCPLINT->battleInt->console->alterTxt = "";				LOCPLINT->battleInt->console->whoSetAlter = 0;			}		}		else //for other buttons		{			if (on)				LOCPLINT->statusbar->print(*name);			else if ( LOCPLINT->statusbar->getCurrent()==(*name) )				LOCPLINT->statusbar->clear();		}	}}void AdventureMapButton::activate(){	if (active) return;	active=true;	ClickableL::activate();	ClickableR::activate();	Hoverable::activate();	KeyInterested::activate();}void AdventureMapButton::deactivate(){	if (!active) return;	active=false;	ClickableL::deactivate();	ClickableR::deactivate();	Hoverable::deactivate();	KeyInterested::deactivate();}void AdventureMapButton::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){	callback = Callback;	blocked = actOnDown = false;	type=2;	abs=true;	active=false;	ourObj=NULL;	assignedKeys.insert(key);	state=0;	hoverTexts = Name;	helpBox=HelpBox;	//int est = LOCPLINT->playerID; //TODO use me	CDefHandler * temp = CDefHandler::giveDef(defName); 	temp->notFreeImgs = true;	for (size_t i=0;i<temp->ourImages.size();i++)	{		imgs.resize(1);		imgs[0].push_back(temp->ourImages[i].bitmap);		if(playerColoredButton)		{			graphics->blueToPlayersAdv(imgs[curimg][i],LOCPLINT->playerID);		}	}	delete temp;	if (add && add->size())	{		imgs.resize(imgs.size()+add->size());		for (size_t i=0; i<add->size();i++)		{			temp = CDefHandler::giveDef((*add)[i]);			temp->notFreeImgs = true;			for (size_t j=0;j<temp->ourImages.size();j++)			{				imgs[i+1].push_back(temp->ourImages[j].bitmap);				if(playerColoredButton)				{					graphics->blueToPlayersAdv(imgs[1+i][j],LOCPLINT->playerID);				}			}			delete temp;		}		//delete add;	}	pos.x=x;	pos.y=y;	pos.w = imgs[curimg][0]->w;	pos.h = imgs[curimg][0]->h  -1;}void AdventureMapButton::block( ui8 on ){	blocked = on;	state = 0;	bitmapOffset = on ? 2 : 0;	show(screenBuf);}void CHighlightableButton::select(bool on){	selected = on;	state = selected ? 3 : 0;	if(selected)		callback();	else 		callback2();	if(hoverTexts.size()>1)	{		hover(false);		hover(true);	}}void CHighlightableButton::clickLeft( tribool down ){	if(blocked)		return;	if (down)		state=1;	else		state = selected ? 3 : 0;	show(screenBuf);	if (pressedL && (down==false))	{		pressedL=state;		if(!onlyOn || !selected)			select(!selected);	}	else	{		pressedL=state;	}}CHighlightableButton::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): onlyOn(false), selected(false), callback2(onDeselect){	init(onSelect,Name,HelpBox,playerColoredButton,defName,add,x,y,key);}void CHighlightableButtonsGroup::addButton(CHighlightableButton* bt){	bt->callback += boost::bind(&CHighlightableButtonsGroup::selectionChanged,this,bt->ID);	buttons.push_back(bt);}void CHighlightableButtonsGroup::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, int key){	CHighlightableButton *bt = new CHighlightableButton(OnSelect, 0, tooltip, HelpBox, false, defName, 0, x, y, key);	if(musicLike)	{		bt->bitmapOffset = buttons.size() - 3;	}	bt->ID = uid;	bt->callback += boost::bind(&CHighlightableButtonsGroup::selectionChanged,this,bt->ID);	bt->onlyOn = true;	buttons.push_back(bt);}	CHighlightableButtonsGroup::CHighlightableButtonsGroup(const CFunctionList2<void(int)> &OnChange, bool musicLikeButtons): musicLike(musicLikeButtons), onChange(OnChange){}CHighlightableButtonsGroup::~CHighlightableButtonsGroup(){	for(size_t i=0;i<buttons.size();i++)	{		delete buttons[i];	}}void CHighlightableButtonsGroup::activate(){	for(size_t i=0;i<buttons.size();i++)	{		buttons[i]->activate();	}}void CHighlightableButtonsGroup::deactivate(){	for(size_t i=0;i<buttons.size();i++)	{		buttons[i]->deactivate();	}}void CHighlightableButtonsGroup::select(int id, bool mode){	CHighlightableButton *bt = NULL;	if(mode)	{		for(size_t i=0;i<buttons.size() && !bt; ++i)			if (buttons[i]->ID == id)				bt = buttons[i];	}	else	{		bt = buttons[id];	}	bt->select(true);	selectionChanged(bt->ID);}void CHighlightableButtonsGroup::selectionChanged(int to){	for(size_t i=0;i<buttons.size(); ++i)		if(buttons[i]->ID!=to && buttons[i]->selected)			buttons[i]->select(false);	onChange(to);}void CHighlightableButtonsGroup::show(SDL_Surface * to ){	for(size_t i=0;i<buttons.size(); ++i) 	{		if(!musicLike || (musicLike && buttons[i]->selected)) //if musicLike, print only selected button			buttons[i]->show(to);	}}void CSlider::sliderClicked(){	if(!moving)	{		MotionInterested::activate();		moving = true;	}}void CSlider::mouseMoved (const SDL_MouseMotionEvent & sEvent){	if(	std::abs(sEvent.y-(pos.y+pos.h/2)) > pos.h/2+40  ||  std::abs(sEvent.x-(pos.x+pos.w/2)) > pos.w/2  ) 		return;	float v = sEvent.x - pos.x - 24;	v*=amount;	v/= (pos.w - 48);	v += 0.5f;	if(v!=value)	{		moveTo(v);		redrawSlider();	}}void CSlider::redrawSlider(){	slider.show(screenBuf);}void CSlider::moveLeft(){	moveTo(value-1);}void CSlider::moveRight(){	moveTo(value+1);}void CSlider::moveTo(int to){	if(to<0)		to=0;	else if(to>amount)		to=amount;	value = to;	if(amount)	{		float part = (float)to/amount;		part*=(pos.w-48);		slider.pos.x = part + pos.x + 16;	}	else		slider.pos.x = pos.x+16;	moved(to);}void CSlider::activate() // makes button active{	left.activate();	right.activate();	slider.activate();	ClickableL::activate();}void CSlider::deactivate() // makes button inactive (but doesn't delete){	left.deactivate();	right.deactivate();	slider.deactivate();	ClickableL::deactivate();}void CSlider::clickLeft (tribool down){	if(down)	{		float pw = GH.current->motion.x-pos.x-24;		float rw = pw / ((float)(pos.w-48));		if (rw>1) return;		if (rw<0) return;		moveTo(rw*amount+0.5f);		return;	}	if(moving)	{		MotionInterested::deactivate();		moving = false;	}}void CSlider::show(SDL_Surface * to){	left.show(to);	right.show(to);	slider.show(to);}CSlider::~CSlider(){	delete imgs;}CSlider::CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int Capacity, int Amount, int Value, bool Horizontal):capacity(Capacity),amount(Amount),value(Value),horizontal(Horizontal), moved(Moved){	moving = false;	strongInterest = true;	imgs = CDefHandler::giveDefEss("IGPCRDIV.DEF");	left.pos.y = slider.pos.y = right.pos.y = pos.y = y;	left.pos.x = pos.x = x;	right.pos.x = x + totalw - 16;	left.callback = boost::bind(&CSlider::moveLeft,this);	right.callback = boost::bind(&CSlider::moveRight,this);	slider.callback = boost::bind(&CSlider::sliderClicked,this);	left.pos.w = left.pos.h = right.pos.w = right.pos.h = slider.pos.w = slider.pos.h = pos.h = 16;	pos.w = totalw;	left.imgs.resize(1); right.imgs.resize(1); slider.imgs.resize(1);	left.imgs[0].push_back(imgs->ourImages[0].bitmap); left.imgs[0].push_back(imgs->ourImages[1].bitmap);	right.imgs[0].push_back(imgs->ourImages[2].bitmap); right.imgs[0].push_back(imgs->ourImages[3].bitmap);	slider.imgs[0].push_back(imgs->ourImages[4].bitmap);	left.notFreeButton = right.notFreeButton = slider.notFreeButton = true;	slider.actOnDown = true;	moveTo(value);}void CSlider::block( bool on ){	left.block(on);	right.block(on);	slider.block(on);}
 |