1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-13 11:40:38 +02:00

* further code reorganization

This commit is contained in:
mateuszb 2009-05-20 09:02:50 +00:00
parent 2ab691ef40
commit 4c0936a3dc
16 changed files with 601 additions and 483 deletions

View File

@ -10,6 +10,7 @@
#include "client/CConfigHandler.h"
#include "client/Graphics.h"
#include "CBattleInterface.h"
#include "CPlayerInterface.h"
/*
* AdevntureMapButton.cpp, part of VCMI engine
@ -59,7 +60,7 @@ AdventureMapButton::AdventureMapButton( const std::pair<std::string, std::string
pom[0] = help.first;
init(Callback, pom, help.second, playerColoredButton, defName, add, x, y, key);
}
void AdventureMapButton::clickLeft (tribool down)
void AdventureMapButton::clickLeft (boost::logic::tribool down)
{
if(blocked)
return;
@ -86,7 +87,7 @@ void AdventureMapButton::clickLeft (tribool down)
}
}
void AdventureMapButton::clickRight (tribool down)
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);

View File

@ -3,7 +3,7 @@
#include "client/FunctionList.h"
#include <boost/bind.hpp>
#include "client/GUIClasses.h"
#include "client/GUIBase.h"
/*
* AdventureMapButton.h, part of VCMI engine

View File

@ -5,6 +5,7 @@
#include "SDL.h"
#include <map>
#include "AdventureMapButton.h"
#include "client/GUIClasses.h"
class CDefHandler;
class CCallback;
struct CPath;

View File

@ -21,6 +21,7 @@
#include <sstream>
#include "lib/CondSh.h"
#include "lib/NetPacks.h"
#include "CPlayerInterface.h"
#include <boost/assign/list_of.hpp>
#ifndef __GNUC__
const double M_PI = 3.14159265358979323846;

View File

@ -2,9 +2,8 @@
#define __CBATTLEINTERFACE_H__
#include "global.h"
#include "CPlayerInterface.h"
#include <list>
#include "client/GUIClasses.h"
#include "client/GUIBase.h"
/*
* CBattleInterface.h, part of VCMI engine
@ -27,6 +26,8 @@ class CHighlightableButtonsGroup;
struct BattleResult;
struct SpellCast;
template <typename T> struct CondSh;
struct SetStackEffect;;
struct BattleAction;
class CBattleInterface;

View File

@ -1,8 +1,8 @@
#include "stdafx.h"
#include "CCastleInterface.h"
#include "AdventureMapButton.h"
#include "CAdvmapInterface.h"
#include "CCallback.h"
#include "CCastleInterface.h"
#include "CGameInfo.h"
#include "CHeroWindow.h"
#include "CMessage.h"
@ -1004,9 +1004,10 @@ CHallInterface::CBuildingBox::CBuildingBox(int id, int x, int y)
CHallInterface::CHallInterface(CCastleInterface * owner)
{
resdatabar = new CMinorResDataBar;
pos = owner->pos;
resdatabar.pos.x += pos.x;
resdatabar.pos.y += pos.y;
resdatabar->pos.x += pos.x;
resdatabar->pos.y += pos.y;
bg = BitmapHandler::loadBitmap(CGI->buildh->hall[owner->town->subID].first);
graphics->blueToPlayersAdv(bg,LOCPLINT->playerID);
exit = new AdventureMapButton
@ -1073,6 +1074,7 @@ CHallInterface::~CHallInterface()
for(size_t j=0;j<boxes[i].size();j++)
delete boxes[i][j]; //TODO whats wrong with smartpointers?
delete exit;
delete resdatabar;
}
void CHallInterface::close()
{
@ -1081,7 +1083,7 @@ void CHallInterface::close()
void CHallInterface::show(SDL_Surface * to)
{
blitAt(bg,pos,to);
resdatabar.show(to);
resdatabar->show(to);
exit->show(to);
for(int i=0; i<5; i++)
{
@ -1303,6 +1305,7 @@ CFortScreen::~CFortScreen()
delete recAreas[i];
SDL_FreeSurface(bg);
delete exit;
delete resdatabar;
}
void CFortScreen::show( SDL_Surface * to)
@ -1315,7 +1318,7 @@ void CFortScreen::show( SDL_Surface * to)
}
anim++;
exit->show(to);
resdatabar.show(to);
resdatabar->show(to);
LOCPLINT->statusbar->show(to);
}
@ -1345,6 +1348,7 @@ void CFortScreen::close()
CFortScreen::CFortScreen( CCastleInterface * owner )
{
resdatabar = new CMinorResDataBar;
pos = owner->pos;
bg = NULL;
exit = new AdventureMapButton(CGI->generaltexth->tcommands[8],"",boost::bind(&CFortScreen::close,this),pos.x+748,pos.y+556,"TPMAGE1.DEF",SDLK_RETURN);
@ -1353,7 +1357,7 @@ CFortScreen::CFortScreen( CCastleInterface * owner )
genRect(126,386,10,288),genRect(126,386,404,288),
genRect(126,386,206,421);
draw(owner,true);
resdatabar.pos += pos;
resdatabar->pos += pos;
}
void CFortScreen::draw( CCastleInterface * owner, bool first)
@ -1459,9 +1463,10 @@ void CFortScreen::RecArea::clickRight( tribool down )
}
CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner)
{
resdatabar = new CMinorResDataBar;
pos = owner->pos;
resdatabar.pos.x += pos.x;
resdatabar.pos.y += pos.y;
resdatabar->pos.x += pos.x;
resdatabar->pos.y += pos.y;
bg = BitmapHandler::loadBitmap("TPMAGE.bmp");
exit = new AdventureMapButton(CGI->generaltexth->tcommands[8],"",boost::bind(&CMageGuildScreen::close,this),pos.x+748,pos.y+556,"TPMAGE1.DEF",SDLK_RETURN);
exit->assignedKeys.insert(SDLK_ESCAPE);
@ -1505,6 +1510,7 @@ CMageGuildScreen::~CMageGuildScreen()
{
delete exit;
SDL_FreeSurface(bg);
delete resdatabar;
}
void CMageGuildScreen::close()
@ -1515,7 +1521,7 @@ void CMageGuildScreen::close()
void CMageGuildScreen::show(SDL_Surface * to)
{
blitAt(bg,pos,to);
resdatabar.show(to);
resdatabar->show(to);
LOCPLINT->statusbar->show(to);
exit->show(to);
}

View File

@ -5,7 +5,7 @@
#include "global.h"
#include <SDL.h>
#include "client/GUIClasses.h"
#include "client/GUIBase.h"
#include "hch/CMusicBase.h"
//#include "boost/tuple/tuple.hpp"
class CGTownInstance;
@ -15,6 +15,11 @@ struct Structure;
class CSpell;
class AdventureMapButton;
class CResDataBar;
class CStatusBar;
class CTownList;
class CRecruitmentWindow;
class CCreaturePic;
class CMinorResDataBar;
/*
* CCastleInterface.h, part of VCMI engine
@ -110,7 +115,7 @@ public:
class CHallInterface : public IShowActivable
{
public:
CMinorResDataBar resdatabar;
CMinorResDataBar * resdatabar;
SDL_Rect pos;
class CBuildingBox : public Hoverable, public ClickableL, public ClickableR
@ -177,7 +182,7 @@ class CFortScreen : public IShowActivable, public CIntObject
void deactivate();
};
public:
CMinorResDataBar resdatabar;
CMinorResDataBar * resdatabar;
AdventureMapButton *exit;
SDL_Surface * bg;
std::vector<Rect> positions;
@ -215,7 +220,7 @@ public:
CDefEssential *scrolls, *scrolls2;
AdventureMapButton *exit;
std::vector<Scroll> spells;
CMinorResDataBar resdatabar;
CMinorResDataBar * resdatabar;
CMageGuildScreen(CCastleInterface * owner); //c-tor

View File

@ -4,7 +4,7 @@
#include "../global.h"
#include "../hch/CDefHandler.h"
#include "GUIClasses.h"
#include "GUIBase.h"
/*
* CCreatureAnimation.h, part of VCMI engine

View File

@ -9,6 +9,7 @@
#include "../CGameInfo.h"
#include "../SDL_Extensions.h"
#include "../CMessage.h"
#include "../CPlayerInterface.h"
#include <boost/bind.hpp>
#include <sstream>

View File

@ -3,7 +3,8 @@
#include "../global.h"
#include "GUIClasses.h"
#include "GUIBase.h"
#include "boost/function.hpp"
/*
* CSpellWindow.h, part of VCMI engine
@ -19,6 +20,7 @@ struct SDL_Surface;
class CDefHandler;
struct SDL_Rect;
class CGHeroInstance;
class CStatusBar;
class SpellbookInteractiveArea : public ClickableL, public ClickableR, public Hoverable
{

168
client/GUIBase.cpp Normal file
View File

@ -0,0 +1,168 @@
#include "GUIBase.h"
#include "../SDL_extensions.h"
#include "../CPlayerInterface.h"
/*
* GUIBase.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
*
*/
void KeyShortcut::keyPressed(const SDL_KeyboardEvent & key)
{
if(vstd::contains(assignedKeys,key.keysym.sym))
{
if(key.state == SDL_PRESSED)
clickLeft(true);
else
clickLeft(false);
}
}
CButtonBase::CButtonBase()
{
bitmapOffset = 0;
curimg=0;
type=-1;
abs=false;
active=false;
notFreeButton = false;
ourObj=NULL;
state=0;
}
CButtonBase::~CButtonBase()
{
if(notFreeButton)
return;
for(int i =0; i<imgs.size();i++)
for(int j=0;j<imgs[i].size();j++)
SDL_FreeSurface(imgs[i][j]);
}
void CButtonBase::show(SDL_Surface * to)
{
int img = std::min(state+bitmapOffset,int(imgs[curimg].size()-1));
img = std::max(0, img);
if (abs)
{
blitAt(imgs[curimg][img],pos.x,pos.y,to);
}
else
{
blitAt(imgs[curimg][img],pos.x+ourObj->pos.x,pos.y+ourObj->pos.y,to);
}
}
ClickableL::ClickableL()
{
pressedL=false;
}
ClickableL::~ClickableL()
{
}
void ClickableL::clickLeft(boost::logic::tribool down)
{
if (down)
pressedL=true;
else
pressedL=false;
}
void ClickableL::activate()
{
LOCPLINT->lclickable.push_front(this);
}
void ClickableL::deactivate()
{
LOCPLINT->lclickable.erase
(std::find(LOCPLINT->lclickable.begin(),LOCPLINT->lclickable.end(),this));
}
ClickableR::ClickableR()
{
pressedR=false;
}
ClickableR::~ClickableR()
{}
void ClickableR::clickRight(boost::logic::tribool down)
{
if (down)
pressedR=true;
else
pressedR=false;
}
void ClickableR::activate()
{
LOCPLINT->rclickable.push_front(this);
}
void ClickableR::deactivate()
{
LOCPLINT->rclickable.erase(std::find(LOCPLINT->rclickable.begin(),LOCPLINT->rclickable.end(),this));
}
//ClickableR
Hoverable::~Hoverable()
{}
void Hoverable::activate()
{
LOCPLINT->hoverable.push_front(this);
}
void Hoverable::deactivate()
{
LOCPLINT->hoverable.erase(std::find(LOCPLINT->hoverable.begin(),LOCPLINT->hoverable.end(),this));
}
void Hoverable::hover(bool on)
{
hovered=on;
}
//Hoverable
KeyInterested::~KeyInterested()
{}
void KeyInterested::activate()
{
LOCPLINT->keyinterested.push_front(this);
}
void KeyInterested::deactivate()
{
LOCPLINT->
keyinterested.erase(std::find(LOCPLINT->keyinterested.begin(),LOCPLINT->keyinterested.end(),this));
}
//KeyInterested
void MotionInterested::activate()
{
LOCPLINT->motioninterested.push_front(this);
}
void MotionInterested::deactivate()
{
LOCPLINT->
motioninterested.erase(std::find(LOCPLINT->motioninterested.begin(),LOCPLINT->motioninterested.end(),this));
}
void TimeInterested::activate()
{
LOCPLINT->timeinterested.push_back(this);
}
void TimeInterested::deactivate()
{
LOCPLINT->
timeinterested.erase(std::find(LOCPLINT->timeinterested.begin(),LOCPLINT->timeinterested.end(),this));
}

368
client/GUIBase.h Normal file
View File

@ -0,0 +1,368 @@
#ifndef __GUIBASE_H__
#define __GUIBASE_H__
#include "../global.h"
#include "SDL.h"
#include <set>
#ifdef max
#undef max
#endif
#ifdef min
#undef min
#endif
/*
* GUIBase.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
*
*/
class CDefEssential;
class AdventureMapButton;
class CHighlightableButtonsGroup;
class CDefHandler;
struct HeroMoveDetails;
class CDefEssential;
class CGHeroInstance;
class CAdvMapInt;
class CCastleInterface;
class CBattleInterface;
class CStack;
class SComponent;
class CCreature;
struct SDL_Surface;
struct CPath;
class CCreatureAnimation;
class CSelectableComponent;
class CCreatureSet;
class CGObjectInstance;
class CSlider;
struct UpgradeInfo;
template <typename T> struct CondSh;
class CInGameConsole;
class CGarrisonInt;
class CInGameConsole;
class Component;
class CArmedInstance;
class CGTownInstance;
class StackState;
class CPlayerInterface;
struct Point
{
int x, y;
//constructors
Point(){};
Point(int X, int Y)
:x(X),y(Y)
{};
Point(const int3 &a)
:x(a.x),y(a.y)
{}
Point operator+(const Point &b) const
{
return Point(x+b.x,y+b.y);
}
Point& operator+=(const Point &b)
{
x += b.x;
y += b.y;
return *this;
}
Point operator-(const Point &b) const
{
return Point(x+b.x,y+b.y);
}
Point& operator-=(const Point &b)
{
x -= b.x;
y -= b.y;
return *this;
}
bool operator<(const Point &b) const //product order
{
return x < b.x && y < b.y;
}
};
struct Rect : public SDL_Rect
{
Rect()//default c-tor
{
x = y = w = h = -1;
}
Rect(int X, int Y, int W, int H) //c-tor
{
x = X;
y = Y;
w = W;
h = H;
}
Rect(const SDL_Rect & r) //c-tor
{
x = r.x;
y = r.y;
w = r.w;
h = r.h;
}
bool isIn(int qx, int qy) const //determines if given point lies inside rect
{
if (qx > x && qx<x+w && qy>y && qy<y+h)
return true;
return false;
}
bool isIn(const Point &q) const //determines if given point lies inside rect
{
return isIn(q.x,q.y);
}
Point topLeft() const //top left corner of this rect
{
return Point(x,y);
}
Point topRight() const //top right corner of this rect
{
return Point(x+w,y);
}
Point bottomLeft() const //bottom left corner of this rect
{
return Point(x,y+h);
}
Point bottomRight() const //bottom right corner of this rect
{
return Point(x+w,y+h);
}
Rect operator+(const Rect &p) const //moves this rect by p's rect position
{
return Rect(x+p.x,y+p.y,w,h);
}
Rect operator+(const Point &p) const //moves this rect by p's point position
{
return Rect(x+p.x,y+p.y,w,h);
}
Rect& operator=(const Rect &p) //assignment operator
{
x = p.x;
y = p.y;
w = p.w;
h = p.h;
return *this;
}
Rect& operator+=(const Rect &p) //works as operator+
{
x += p.x;
y += p.y;
return *this;
}
Rect operator&(const Rect &p) const //rect intersection
{
bool intersect = true;
if(p.topLeft().y < y && p.bottomLeft().y < y) //rect p is above *this
{
intersect = false;
}
else if(p.topLeft().y > y+h && p.bottomLeft().y > y+h) //rect p is below *this
{
intersect = false;
}
else if(p.topLeft().x > x+w && p.topRight().x > x+w) //rect p is on the right hand side of this
{
intersect = false;
}
else if(p.topLeft().x < x && p.topRight().x < x) //rect p is on the left hand side of this
{
intersect = false;
}
if(intersect)
{
Rect ret;
ret.x = std::max(this->x, p.x);
ret.y = std::max(this->y, p.y);
Point bR; //bottomRight point of returned rect
bR.x = std::min(this->w+this->x, p.w+p.x);
bR.y = std::min(this->h+this->y, p.h+p.y);
ret.w = bR.x - ret.x;
ret.h = bR.y - ret.y;
return ret;
}
else
{
return Rect();
}
}
};
class IShowable
{
public:
virtual void show(SDL_Surface * to)=0;
virtual void showAll(SDL_Surface * to)
{
show(to);
}
virtual ~IShowable(){}; //d-tor
};
class IStatusBar
{
public:
virtual ~IStatusBar(){}; //d-tor
virtual void print(const std::string & text)=0; //prints text and refreshes statusbar
virtual void clear()=0;//clears statusbar and refreshes
virtual void show(SDL_Surface * to)=0; //shows statusbar (with current text)
virtual std::string getCurrent()=0; //returns currently displayed text
};
class IActivable
{
public:
virtual void activate()=0;
virtual void deactivate()=0;
virtual ~IActivable(){}; //d-tor
};
class IShowActivable : public IShowable, public IActivable
{
public:
enum {WITH_GARRISON = 1};
int type; //bin flags using etype
IShowActivable();
virtual ~IShowActivable(){}; //d-tor
};
class CWindowWithGarrison : public IShowActivable
{
public:
CGarrisonInt *garr;
CWindowWithGarrison();
};
class CMainInterface : public IShowActivable
{
public:
IShowActivable *subInt;
};
class CIntObject //interface object
{
public:
Rect pos; //position of object on the screen
int ID; //object uniqe ID, rarely (if at all) used
//virtual bool isIn(int x, int y)
//{
// return pos.isIn(x,y);
//}
virtual ~CIntObject(){}; //d-tor
};
class CSimpleWindow : public IShowActivable, public virtual CIntObject
{
public:
SDL_Surface * bitmap; //background
CIntObject * owner; //who made this window
virtual void show(SDL_Surface * to);
CSimpleWindow():bitmap(NULL),owner(NULL){}; //c-tor
virtual ~CSimpleWindow(); //d-tor
void activate(){};
void deactivate(){};
};
class CButtonBase : public virtual CIntObject, public IShowable, public IActivable //basic buttton class
{
public:
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 activate()=0;
virtual void deactivate()=0;
CButtonBase(); //c-tor
virtual ~CButtonBase(); //d-tor
};
class ClickableL : public virtual CIntObject //for left-clicks
{
public:
bool pressedL; //for determining if object is L-pressed
ClickableL(); //c-tor
virtual ~ClickableL();//{};//d-tor
virtual void clickLeft (boost::logic::tribool down)=0;
virtual void activate();
virtual void deactivate();
};
class ClickableR : public virtual CIntObject //for right-clicks
{
public:
bool pressedR; //for determining if object is R-pressed
ClickableR(); //c-tor
virtual ~ClickableR();//{};//d-tor
virtual void clickRight (boost::logic::tribool down)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class Hoverable : public virtual CIntObject
{
public:
Hoverable() : hovered(false){} //c-tor
virtual ~Hoverable();//{}; //d-tor
bool hovered; //for determining if object is hovered
virtual void hover (bool on)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class KeyInterested : public virtual CIntObject
{
public:
bool captureAllKeys; //if true, only this object should get info about pressed keys
KeyInterested(): captureAllKeys(false){}
virtual ~KeyInterested();//{};//d-tor
virtual void keyPressed(const SDL_KeyboardEvent & key)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
//class for binding keys to left mouse button clicks
//classes wanting use it should have it as one of their base classes
class KeyShortcut : public KeyInterested, public ClickableL
{
public:
std::set<int> assignedKeys;
KeyShortcut(){}; //c-tor
KeyShortcut(int key){assignedKeys.insert(key);}; //c-tor
KeyShortcut(std::set<int> Keys):assignedKeys(Keys){}; //c-tor
virtual void keyPressed(const SDL_KeyboardEvent & key); //call-in
};
class MotionInterested: public virtual CIntObject
{
public:
bool strongInterest; //if true - report all mouse movements, if not - only when hovered
MotionInterested(){strongInterest=false;};
virtual ~MotionInterested(){};//d-tor
virtual void mouseMoved (const SDL_MouseMotionEvent & sEvent)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class TimeInterested: public virtual CIntObject
{
public:
virtual ~TimeInterested(){}; //d-tor
int toNextTick;
virtual void tick()=0;
virtual void activate();
virtual void deactivate();
};
#endif //__GUIBASE_H__

View File

@ -69,16 +69,6 @@ StackState* getStackState(const CGObjectInstance *obj, int pos, bool town)
return pom;
}
void KeyShortcut::keyPressed(const SDL_KeyboardEvent & key)
{
if(vstd::contains(assignedKeys,key.keysym.sym))
{
if(key.state == SDL_PRESSED)
clickLeft(true);
else
clickLeft(false);
}
}
void CGarrisonSlot::hover (bool on)
{
@ -949,143 +939,7 @@ void CSelWindow::madeChoice()
LOCPLINT->cb->selectionMade(ret+1,ID);
}
CButtonBase::CButtonBase()
{
bitmapOffset = 0;
curimg=0;
type=-1;
abs=false;
active=false;
notFreeButton = false;
ourObj=NULL;
state=0;
}
CButtonBase::~CButtonBase()
{
if(notFreeButton)
return;
for(int i =0; i<imgs.size();i++)
for(int j=0;j<imgs[i].size();j++)
SDL_FreeSurface(imgs[i][j]);
}
void CButtonBase::show(SDL_Surface * to)
{
int img = std::min(state+bitmapOffset,int(imgs[curimg].size()-1));
img = std::max(0, img);
if (abs)
{
blitAt(imgs[curimg][img],pos.x,pos.y,to);
}
else
{
blitAt(imgs[curimg][img],pos.x+ourObj->pos.x,pos.y+ourObj->pos.y,to);
}
}
ClickableL::ClickableL()
{
pressedL=false;
}
ClickableL::~ClickableL()
{
}
void ClickableL::clickLeft(tribool down)
{
if (down)
pressedL=true;
else
pressedL=false;
}
void ClickableL::activate()
{
LOCPLINT->lclickable.push_front(this);
}
void ClickableL::deactivate()
{
LOCPLINT->lclickable.erase
(std::find(LOCPLINT->lclickable.begin(),LOCPLINT->lclickable.end(),this));
}
ClickableR::ClickableR()
{
pressedR=false;
}
ClickableR::~ClickableR()
{}
void ClickableR::clickRight(tribool down)
{
if (down)
pressedR=true;
else
pressedR=false;
}
void ClickableR::activate()
{
LOCPLINT->rclickable.push_front(this);
}
void ClickableR::deactivate()
{
LOCPLINT->rclickable.erase(std::find(LOCPLINT->rclickable.begin(),LOCPLINT->rclickable.end(),this));
}
//ClickableR
Hoverable::~Hoverable()
{}
void Hoverable::activate()
{
LOCPLINT->hoverable.push_front(this);
}
void Hoverable::deactivate()
{
LOCPLINT->hoverable.erase(std::find(LOCPLINT->hoverable.begin(),LOCPLINT->hoverable.end(),this));
}
void Hoverable::hover(bool on)
{
hovered=on;
}
//Hoverable
KeyInterested::~KeyInterested()
{}
void KeyInterested::activate()
{
LOCPLINT->keyinterested.push_front(this);
}
void KeyInterested::deactivate()
{
LOCPLINT->
keyinterested.erase(std::find(LOCPLINT->keyinterested.begin(),LOCPLINT->keyinterested.end(),this));
}
//KeyInterested
void MotionInterested::activate()
{
LOCPLINT->motioninterested.push_front(this);
}
void MotionInterested::deactivate()
{
LOCPLINT->
motioninterested.erase(std::find(LOCPLINT->motioninterested.begin(),LOCPLINT->motioninterested.end(),this));
}
void TimeInterested::activate()
{
LOCPLINT->timeinterested.push_back(this);
}
void TimeInterested::deactivate()
{
LOCPLINT->
timeinterested.erase(std::find(LOCPLINT->timeinterested.begin(),LOCPLINT->timeinterested.end(),this));
}
CStatusBar::CStatusBar(int x, int y, std::string name, int maxw)
{

View File

@ -2,7 +2,8 @@
#define __GUICLASSES_H__
#include "../global.h"
#include "SDL_framerate.h"
#include "../SDL_framerate.h"
#include "GUIBase.h"
#include "FunctionList.h"
#include <set>
#include <list>
@ -55,315 +56,6 @@ class CGTownInstance;
class StackState;
class CPlayerInterface;
struct Point
{
int x, y;
//constructors
Point(){};
Point(int X, int Y)
:x(X),y(Y)
{};
Point(const int3 &a)
:x(a.x),y(a.y)
{}
Point operator+(const Point &b) const
{
return Point(x+b.x,y+b.y);
}
Point& operator+=(const Point &b)
{
x += b.x;
y += b.y;
return *this;
}
Point operator-(const Point &b) const
{
return Point(x+b.x,y+b.y);
}
Point& operator-=(const Point &b)
{
x -= b.x;
y -= b.y;
return *this;
}
bool operator<(const Point &b) const //product order
{
return x < b.x && y < b.y;
}
};
struct Rect : public SDL_Rect
{
Rect()//default c-tor
{
x = y = w = h = -1;
}
Rect(int X, int Y, int W, int H) //c-tor
{
x = X;
y = Y;
w = W;
h = H;
}
Rect(const SDL_Rect & r) //c-tor
{
x = r.x;
y = r.y;
w = r.w;
h = r.h;
}
bool isIn(int qx, int qy) const //determines if given point lies inside rect
{
if (qx > x && qx<x+w && qy>y && qy<y+h)
return true;
return false;
}
bool isIn(const Point &q) const //determines if given point lies inside rect
{
return isIn(q.x,q.y);
}
Point topLeft() const //top left corner of this rect
{
return Point(x,y);
}
Point topRight() const //top right corner of this rect
{
return Point(x+w,y);
}
Point bottomLeft() const //bottom left corner of this rect
{
return Point(x,y+h);
}
Point bottomRight() const //bottom right corner of this rect
{
return Point(x+w,y+h);
}
Rect operator+(const Rect &p) const //moves this rect by p's rect position
{
return Rect(x+p.x,y+p.y,w,h);
}
Rect operator+(const Point &p) const //moves this rect by p's point position
{
return Rect(x+p.x,y+p.y,w,h);
}
Rect& operator=(const Rect &p) //assignment operator
{
x = p.x;
y = p.y;
w = p.w;
h = p.h;
return *this;
}
Rect& operator+=(const Rect &p) //works as operator+
{
x += p.x;
y += p.y;
return *this;
}
Rect operator&(const Rect &p) const //rect intersection
{
bool intersect = true;
if(p.topLeft().y < y && p.bottomLeft().y < y) //rect p is above *this
{
intersect = false;
}
else if(p.topLeft().y > y+h && p.bottomLeft().y > y+h) //rect p is below *this
{
intersect = false;
}
else if(p.topLeft().x > x+w && p.topRight().x > x+w) //rect p is on the right hand side of this
{
intersect = false;
}
else if(p.topLeft().x < x && p.topRight().x < x) //rect p is on the left hand side of this
{
intersect = false;
}
if(intersect)
{
Rect ret;
ret.x = std::max(this->x, p.x);
ret.y = std::max(this->y, p.y);
Point bR; //bottomRight point of returned rect
bR.x = std::min(this->w+this->x, p.w+p.x);
bR.y = std::min(this->h+this->y, p.h+p.y);
ret.w = bR.x - ret.x;
ret.h = bR.y - ret.y;
return ret;
}
else
{
return Rect();
}
}
};
class IShowable
{
public:
virtual void show(SDL_Surface * to)=0;
virtual void showAll(SDL_Surface * to)
{
show(to);
}
virtual ~IShowable(){}; //d-tor
};
class IStatusBar
{
public:
virtual ~IStatusBar(){}; //d-tor
virtual void print(const std::string & text)=0; //prints text and refreshes statusbar
virtual void clear()=0;//clears statusbar and refreshes
virtual void show(SDL_Surface * to)=0; //shows statusbar (with current text)
virtual std::string getCurrent()=0; //returns currently displayed text
};
class IActivable
{
public:
virtual void activate()=0;
virtual void deactivate()=0;
virtual ~IActivable(){}; //d-tor
};
class IShowActivable : public IShowable, public IActivable
{
public:
enum {WITH_GARRISON = 1};
int type; //bin flags using etype
IShowActivable();
virtual ~IShowActivable(){}; //d-tor
};
class CWindowWithGarrison : public IShowActivable
{
public:
CGarrisonInt *garr;
CWindowWithGarrison();
};
class CMainInterface : public IShowActivable
{
public:
IShowActivable *subInt;
};
class CIntObject //interface object
{
public:
Rect pos; //position of object on the screen
int ID; //object uniqe ID, rarely (if at all) used
//virtual bool isIn(int x, int y)
//{
// return pos.isIn(x,y);
//}
virtual ~CIntObject(){}; //d-tor
};
class CSimpleWindow : public IShowActivable, public virtual CIntObject
{
public:
SDL_Surface * bitmap; //background
CIntObject * owner; //who made this window
virtual void show(SDL_Surface * to);
CSimpleWindow():bitmap(NULL),owner(NULL){}; //c-tor
virtual ~CSimpleWindow(); //d-tor
void activate(){};
void deactivate(){};
};
class CButtonBase : public virtual CIntObject, public IShowable, public IActivable //basic buttton class
{
public:
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 activate()=0;
virtual void deactivate()=0;
CButtonBase(); //c-tor
virtual ~CButtonBase(); //d-tor
};
class ClickableL : public virtual CIntObject //for left-clicks
{
public:
bool pressedL; //for determining if object is L-pressed
ClickableL(); //c-tor
virtual ~ClickableL();//{};//d-tor
virtual void clickLeft (boost::logic::tribool down)=0;
virtual void activate();
virtual void deactivate();
};
class ClickableR : public virtual CIntObject //for right-clicks
{
public:
bool pressedR; //for determining if object is R-pressed
ClickableR(); //c-tor
virtual ~ClickableR();//{};//d-tor
virtual void clickRight (boost::logic::tribool down)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class Hoverable : public virtual CIntObject
{
public:
Hoverable() : hovered(false){} //c-tor
virtual ~Hoverable();//{}; //d-tor
bool hovered; //for determining if object is hovered
virtual void hover (bool on)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class KeyInterested : public virtual CIntObject
{
public:
bool captureAllKeys; //if true, only this object should get info about pressed keys
KeyInterested(): captureAllKeys(false){}
virtual ~KeyInterested();//{};//d-tor
virtual void keyPressed(const SDL_KeyboardEvent & key)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
//class for binding keys to left mouse button clicks
//classes wanting use it should have it as one of their base classes
class KeyShortcut : public KeyInterested, public ClickableL
{
public:
std::set<int> assignedKeys;
KeyShortcut(){}; //c-tor
KeyShortcut(int key){assignedKeys.insert(key);}; //c-tor
KeyShortcut(std::set<int> Keys):assignedKeys(Keys){}; //c-tor
virtual void keyPressed(const SDL_KeyboardEvent & key); //call-in
};
class MotionInterested: public virtual CIntObject
{
public:
bool strongInterest; //if true - report all mouse movements, if not - only when hovered
MotionInterested(){strongInterest=false;};
virtual ~MotionInterested(){};//d-tor
virtual void mouseMoved (const SDL_MouseMotionEvent & sEvent)=0;
virtual void activate()=0;
virtual void deactivate()=0;
};
class TimeInterested: public virtual CIntObject
{
public:
virtual ~TimeInterested(){}; //d-tor
int toNextTick;
virtual void tick()=0;
virtual void activate();
virtual void deactivate();
};
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
{ //window able to delete its components when closed

View File

@ -1,6 +1,16 @@
#ifndef __CMUSICBASE_H__
#define __CMUSICBASE_H__
/*
* CMusicBase.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
*
*/
// Use some magic to keep the list of files and their code name in sync.
#define VCMI_MUSIC_LIST \

View File

@ -273,7 +273,8 @@ void CMusicHandler::freeMusics()
musicMutex.lock();
if (currentMusic) {
if (currentMusic)
{
Mix_HaltMusic();
Mix_FreeMusic(currentMusic);
}
@ -293,19 +294,23 @@ void CMusicHandler::playMusic(musicBase::musicID musicID, int loop)
musicMutex.lock();
if (nextMusic) {
if (nextMusic)
{
// There's already a music queued, so remove it
Mix_FreeMusic(nextMusic);
nextMusic = NULL;
}
if (currentMusic) {
if (currentMusic)
{
// A music is already playing. Stop it and the callback will
// start the new one
nextMusic = Mix_LoadMUS(filename.c_str());
nextMusicLoop = loop;
Mix_FadeOutMusic(1000);
} else {
}
else
{
currentMusic = Mix_LoadMUS(filename.c_str());
if (Mix_PlayMusic(currentMusic, loop) == -1)
tlog1 << "Unable to play sound file " << musicID << "(" << Mix_GetError() << ")" << std::endl;
@ -325,7 +330,8 @@ void CMusicHandler::stopMusic(int fade_ms)
{
musicMutex.lock();
if (currentMusic) {
if (currentMusic)
{
Mix_FadeOutMusic(fade_ms);
}
@ -353,12 +359,14 @@ void CMusicHandler::musicFinishedCallback(void)
{
musicMutex.lock();
if (currentMusic) {
if (currentMusic)
{
Mix_FreeMusic(currentMusic);
currentMusic = NULL;
}
if (nextMusic) {
if (nextMusic)
{
currentMusic = nextMusic;
nextMusic = NULL;
if (Mix_PlayMusic(currentMusic, nextMusicLoop) == -1)