Basic GuiComponent refactor complete.

This commit is contained in:
Aloshi 2013-06-02 10:08:32 -05:00
parent 4d31aac85e
commit 424fcb0329
30 changed files with 767 additions and 644 deletions

View file

@ -112,12 +112,13 @@ endif()
#define basic sources and headers #define basic sources and headers
set(ES_HEADERS set(ES_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/AudioManager.h ${CMAKE_CURRENT_SOURCE_DIR}/src/AudioManager.h
${CMAKE_CURRENT_SOURCE_DIR}/src/ComponentContainer.h
${CMAKE_CURRENT_SOURCE_DIR}/src/EmulationStation.h ${CMAKE_CURRENT_SOURCE_DIR}/src/EmulationStation.h
${CMAKE_CURRENT_SOURCE_DIR}/src/FileData.h ${CMAKE_CURRENT_SOURCE_DIR}/src/FileData.h
${CMAKE_CURRENT_SOURCE_DIR}/src/FolderData.h ${CMAKE_CURRENT_SOURCE_DIR}/src/FolderData.h
${CMAKE_CURRENT_SOURCE_DIR}/src/Font.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Font.h
${CMAKE_CURRENT_SOURCE_DIR}/src/GameData.h ${CMAKE_CURRENT_SOURCE_DIR}/src/GameData.h
${CMAKE_CURRENT_SOURCE_DIR}/src/Gui.h ${CMAKE_CURRENT_SOURCE_DIR}/src/GuiComponent.h
${CMAKE_CURRENT_SOURCE_DIR}/src/ImageIO.h ${CMAKE_CURRENT_SOURCE_DIR}/src/ImageIO.h
${CMAKE_CURRENT_SOURCE_DIR}/src/InputConfig.h ${CMAKE_CURRENT_SOURCE_DIR}/src/InputConfig.h
${CMAKE_CURRENT_SOURCE_DIR}/src/InputManager.h ${CMAKE_CURRENT_SOURCE_DIR}/src/InputManager.h
@ -131,26 +132,27 @@ set(ES_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/VolumeControl.h ${CMAKE_CURRENT_SOURCE_DIR}/src/VolumeControl.h
${CMAKE_CURRENT_SOURCE_DIR}/src/Window.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Window.h
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.h ${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiAnimation.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/TextListComponent.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ThemeComponent.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiBox.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiBox.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiDetectDevice.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiDetectDevice.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiFastSelect.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiFastSelect.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiGameList.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiGameList.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiImage.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiInputConfig.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiInputConfig.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiList.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiMenu.h ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiMenu.h
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiTheme.h
${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugiconfig.hpp ${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugiconfig.hpp
${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugixml.hpp ${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugixml.hpp
${CMAKE_CURRENT_SOURCE_DIR}/data/Resources.h ${CMAKE_CURRENT_SOURCE_DIR}/data/Resources.h
) )
set(ES_SOURCES set(ES_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/AudioManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/AudioManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ComponentContainer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/FolderData.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/FolderData.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/Font.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Font.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/GameData.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GameData.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/Gui.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/GuiComponent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ImageIO.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/ImageIO.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/InputConfig.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/InputConfig.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/InputManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/InputManager.cpp
@ -165,15 +167,15 @@ set(ES_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/VolumeControl.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/VolumeControl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/Window.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Window.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/XMLReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiAnimation.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/AnimationComponent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ImageComponent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/ThemeComponent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiBox.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiBox.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiDetectDevice.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiDetectDevice.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiFastSelect.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiFastSelect.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiGameList.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiGameList.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiInputConfig.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiInputConfig.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiMenu.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiMenu.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/components/GuiTheme.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugixml.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/pugiXML/pugixml.cpp
${CMAKE_CURRENT_SOURCE_DIR}/data/logo/ES_logo_16.cpp ${CMAKE_CURRENT_SOURCE_DIR}/data/logo/ES_logo_16.cpp
${CMAKE_CURRENT_SOURCE_DIR}/data/logo/ES_logo_32.cpp ${CMAKE_CURRENT_SOURCE_DIR}/data/logo/ES_logo_32.cpp

View file

@ -0,0 +1,34 @@
#include "ComponentContainer.h"
#include "GuiComponent.h"
void ComponentContainer::addChild(GuiComponent* cmp)
{
mChildren.push_back(cmp);
}
void ComponentContainer::removeChild(GuiComponent* cmp)
{
for(auto i = mChildren.begin(); i != mChildren.end(); i++)
{
if(*i == cmp)
{
mChildren.erase(i);
return;
}
}
}
void ComponentContainer::clearChildren()
{
mChildren.clear();
}
unsigned int ComponentContainer::getChildCount()
{
return mChildren.size();
}
GuiComponent* ComponentContainer::getChild(unsigned int i)
{
return mChildren.at(i);
}

25
src/ComponentContainer.h Normal file
View file

@ -0,0 +1,25 @@
#ifndef _COMPONENTCONTAINER_H_
#define _COMPONENTCONTAINER_H_
#include <vector>
class GuiComponent;
/**
Generic container for Components.
**/
class ComponentContainer
{
public:
void addChild(GuiComponent* cmp);
void removeChild(GuiComponent* cmp);
void clearChildren();
unsigned int getChildCount();
GuiComponent* getChild(unsigned int i);
private:
std::vector<GuiComponent*> mChildren;
};
#endif

View file

@ -1,17 +0,0 @@
#include "Gui.h"
#include "Window.h"
Gui::Gui(Window* window) : mWindow(window)
{
}
Gui::~Gui()
{
mWindow->removeGui(this);
}
void Gui::setOffset(int x, int y) { mOffsetX = x; mOffsetY = y; }
void Gui::setOffsetX(int x) { mOffsetX = x; }
void Gui::setOffsetY(int y) { mOffsetY = y; }
int Gui::getOffsetX() { return mOffsetX; }
int Gui::getOffsetY() { return mOffsetY; }

View file

@ -1,33 +0,0 @@
#ifndef _GUI_H_
#define _GUI_H_
#include "InputConfig.h"
class Window;
class Gui
{
public:
Gui(Window* window);
virtual ~Gui();
virtual void input(InputConfig* config, Input input) { };
virtual void update(int deltaTime) { };
virtual void render() { };
virtual void init() { };
virtual void deinit() { };
void setOffsetX(int x);
void setOffsetY(int y);
void setOffset(int x, int y);
int getOffsetX();
int getOffsetY();
protected:
int mOffsetX;
int mOffsetY;
Window* mWindow;
};
#endif

91
src/GuiComponent.cpp Normal file
View file

@ -0,0 +1,91 @@
#include "GuiComponent.h"
#include "Window.h"
GuiComponent::GuiComponent(Window* window) : mWindow(window), mParent(NULL)
{
}
GuiComponent::~GuiComponent()
{
mWindow->removeGui(this);
if(mParent)
mParent->removeChild(this);
}
bool GuiComponent::input(InputConfig* config, Input input)
{
for(unsigned int i = 0; i < getChildCount(); i++)
{
if(getChild(i)->input(config, input))
return true;
}
return false;
}
void GuiComponent::update(int deltaTime)
{
for(unsigned int i = 0; i < getChildCount(); i++)
{
getChild(i)->update(deltaTime);
}
}
void GuiComponent::render()
{
for(unsigned int i = 0; i < getChildCount(); i++)
{
getChild(i)->render();
}
}
void GuiComponent::init()
{
for(unsigned int i = 0; i < getChildCount(); i++)
{
getChild(i)->init();
}
}
void GuiComponent::deinit()
{
for(unsigned int i = 0; i < getChildCount(); i++)
{
getChild(i)->deinit();
}
}
void GuiComponent::setParent(GuiComponent* parent)
{
mParent = parent;
}
GuiComponent* GuiComponent::getParent()
{
return mParent;
}
Vector2i GuiComponent::getGlobalOffset()
{
if(mParent)
return mParent->getGlobalOffset() + mOffset;
else
return mOffset;
}
Vector2i GuiComponent::getOffset()
{
return mOffset;
}
void GuiComponent::setOffset(Vector2i offset)
{
mOffset = offset;
}
void GuiComponent::setOffset(int x, int y)
{
mOffset.x = x;
mOffset.y = y;
}

37
src/GuiComponent.h Normal file
View file

@ -0,0 +1,37 @@
#ifndef _GUICOMPONENT_H_
#define _GUICOMPONENT_H_
#include "InputConfig.h"
#include "Vector2.h"
#include "ComponentContainer.h"
class Window;
class GuiComponent : public ComponentContainer
{
public:
GuiComponent(Window* window);
virtual ~GuiComponent();
//Return true if the input is consumed, false if it should continue to be passed to other children.
virtual bool input(InputConfig* config, Input input);
virtual void update(int deltaTime);
virtual void render();
virtual void init();
virtual void deinit();
Vector2i getGlobalOffset();
Vector2i getOffset();
void setOffset(Vector2i offset);
void setOffset(int x, int y);
void setParent(GuiComponent* parent);
GuiComponent* getParent();
protected:
Window* mWindow;
GuiComponent* mParent;
Vector2i mOffset;
};
#endif

View file

@ -14,24 +14,24 @@ Window::~Window()
delete mInputManager; delete mInputManager;
} }
void Window::pushGui(Gui* gui) void Window::pushGui(GuiComponent* gui)
{ {
mGuiStack.push_back(gui); mGuiStack.push_back(gui);
} }
void Window::removeGui(Gui* gui) void Window::removeGui(GuiComponent* gui)
{ {
for(unsigned int i = 0; i < mGuiStack.size(); i++) for(auto i = mGuiStack.begin(); i != mGuiStack.end(); i++)
{ {
if(mGuiStack.at(i) == gui) if(*i == gui)
{ {
mGuiStack.erase(mGuiStack.begin() + i); mGuiStack.erase(i);
break; return;
} }
} }
} }
Gui* Window::peekGui() GuiComponent* Window::peekGui()
{ {
if(mGuiStack.size() == 0) if(mGuiStack.size() == 0)
return NULL; return NULL;
@ -41,6 +41,7 @@ Gui* Window::peekGui()
void Window::render() void Window::render()
{ {
//there's nothing to render, which should pretty much never happen
if(mGuiStack.size() == 0) if(mGuiStack.size() == 0)
std::cout << "guistack empty\n"; std::cout << "guistack empty\n";

View file

@ -1,7 +1,7 @@
#ifndef _WINDOW_H_ #ifndef _WINDOW_H_
#define _WINDOW_H_ #define _WINDOW_H_
#include "Gui.h" #include "GuiComponent.h"
#include "InputManager.h" #include "InputManager.h"
#include <vector> #include <vector>
@ -11,9 +11,9 @@ public:
Window(); Window();
~Window(); ~Window();
void pushGui(Gui* gui); void pushGui(GuiComponent* gui);
void removeGui(Gui* gui); void removeGui(GuiComponent* gui);
Gui* peekGui(); GuiComponent* peekGui();
void input(InputConfig* config, Input input); void input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
@ -26,7 +26,7 @@ public:
private: private:
InputManager* mInputManager; InputManager* mInputManager;
std::vector<Gui*> mGuiStack; std::vector<GuiComponent*> mGuiStack;
}; };
#endif #endif

View file

@ -1,6 +1,6 @@
#include "GuiAnimation.h" #include "AnimationComponent.h"
GuiAnimation::GuiAnimation() AnimationComponent::AnimationComponent()
{ {
mMoveX = 0; mMoveX = 0;
mMoveY = 0; mMoveY = 0;
@ -8,14 +8,14 @@ GuiAnimation::GuiAnimation()
mFadeRate = 0; mFadeRate = 0;
} }
void GuiAnimation::move(int x, int y, int speed) void AnimationComponent::move(int x, int y, int speed)
{ {
mMoveX = x; mMoveX = x;
mMoveY = y; mMoveY = y;
mMoveSpeed = speed; mMoveSpeed = speed;
} }
void GuiAnimation::fadeIn(int time) void AnimationComponent::fadeIn(int time)
{ {
mOpacity = 0; mOpacity = 0;
setChildrenOpacity(0); setChildrenOpacity(0);
@ -23,7 +23,7 @@ void GuiAnimation::fadeIn(int time)
mFadeRate = time; mFadeRate = time;
} }
void GuiAnimation::fadeOut(int time) void AnimationComponent::fadeOut(int time)
{ {
mOpacity = 255; mOpacity = 255;
setChildrenOpacity(255); setChildrenOpacity(255);
@ -31,7 +31,7 @@ void GuiAnimation::fadeOut(int time)
mFadeRate = -time; mFadeRate = -time;
} }
void GuiAnimation::update(int deltaTime) void AnimationComponent::update(int deltaTime)
{ {
float mult = deltaTime * 0.05f; float mult = deltaTime * 0.05f;
@ -69,21 +69,22 @@ void GuiAnimation::update(int deltaTime)
} }
} }
void GuiAnimation::addChild(GuiImage* gui) void AnimationComponent::addChild(ImageComponent* gui)
{ {
mChildren.push_back(gui); mChildren.push_back(gui);
} }
void GuiAnimation::moveChildren(int offsetx, int offsety) void AnimationComponent::moveChildren(int offsetx, int offsety)
{ {
Vector2i move(offsetx, offsety);
for(unsigned int i = 0; i < mChildren.size(); i++) for(unsigned int i = 0; i < mChildren.size(); i++)
{ {
GuiImage* comp = mChildren.at(i); ImageComponent* comp = mChildren.at(i);
comp->setOffset(comp->getOffsetX() + offsetx, comp->getOffsetY() + offsety); comp->setOffset(comp->getOffset() + move);
} }
} }
void GuiAnimation::setChildrenOpacity(unsigned char opacity) void AnimationComponent::setChildrenOpacity(unsigned char opacity)
{ {
for(unsigned int i = 0; i < mChildren.size(); i++) for(unsigned int i = 0; i < mChildren.size(); i++)
{ {

View file

@ -1,14 +1,14 @@
#ifndef _GUIANIMATION_H_ #ifndef _ANIMATIONCOMPONENT_H_
#define _GUIANIMATION_H_ #define _ANIMATIONCOMPONENT_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include "GuiImage.h" #include "ImageComponent.h"
#include <vector> #include <vector>
class GuiAnimation class AnimationComponent
{ {
public: public:
GuiAnimation(); AnimationComponent();
void move(int x, int y, int speed); void move(int x, int y, int speed);
void fadeIn(int time); void fadeIn(int time);
@ -16,12 +16,12 @@ public:
void update(int deltaTime); void update(int deltaTime);
void addChild(GuiImage* gui); void addChild(ImageComponent* gui);
private: private:
unsigned char mOpacity; unsigned char mOpacity;
std::vector<GuiImage*> mChildren; std::vector<ImageComponent*> mChildren;
void moveChildren(int offsetx, int offsety); void moveChildren(int offsetx, int offsety);
void setChildrenOpacity(unsigned char opacity); void setChildrenOpacity(unsigned char opacity);

View file

@ -1,11 +1,10 @@
#include "GuiBox.h" #include "GuiBox.h"
GuiBox::GuiBox(Window* window, int offsetX, int offsetY, unsigned int width, unsigned int height) : Gui(window), mBackgroundImage(window), GuiBox::GuiBox(Window* window, int offsetX, int offsetY, unsigned int width, unsigned int height) : GuiComponent(window), mBackgroundImage(window),
mHorizontalImage(window), mVerticalImage(window), mCornerImage(window) mHorizontalImage(window), mVerticalImage(window), mCornerImage(window)
{ {
setOffsetX(offsetX); setOffset(Vector2i(offsetX, offsetY));
setOffsetY(offsetY);
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
} }
@ -41,8 +40,7 @@ void GuiBox::setBackgroundImage(std::string path, bool tiled)
mBackgroundImage.setOrigin(0, 0); mBackgroundImage.setOrigin(0, 0);
mBackgroundImage.setResize(mWidth, mHeight, true); mBackgroundImage.setResize(mWidth, mHeight, true);
mBackgroundImage.setTiling(tiled); mBackgroundImage.setTiling(tiled);
mBackgroundImage.setOffsetX(getOffsetX()); mBackgroundImage.setOffset(getOffset());
mBackgroundImage.setOffsetY(getOffsetY());
mBackgroundImage.setImage(path); mBackgroundImage.setImage(path);
} }
@ -60,53 +58,44 @@ void GuiBox::render()
mBackgroundImage.render(); mBackgroundImage.render();
//left border //left border
mHorizontalImage.setOffsetX(getOffsetX() - getHorizontalBorderWidth()); mHorizontalImage.setOffset(getOffset().x - getHorizontalBorderWidth(), getOffset().y);
mHorizontalImage.setOffsetY(getOffsetY());
mHorizontalImage.setFlipX(false); mHorizontalImage.setFlipX(false);
mHorizontalImage.render(); mHorizontalImage.render();
//Renderer::drawRect(getOffsetX() - getHorizontalBorderWidth(), getOffsetY(), getHorizontalBorderWidth(), mHeight, 0xFF0000);
//right border //right border
mHorizontalImage.setOffsetX(getOffsetX() + mWidth); mHorizontalImage.setOffset(getOffset().x + mWidth, getOffset().y);
//same Y
mHorizontalImage.setFlipX(true); mHorizontalImage.setFlipX(true);
mHorizontalImage.render(); mHorizontalImage.render();
//Renderer::drawRect(getOffsetX() + mWidth, getOffsetY(), getHorizontalBorderWidth(), mHeight, 0xFF0000);
//top border //top border
mVerticalImage.setOffsetX(getOffsetX()); mVerticalImage.setOffset(getOffset().x, getOffset().y - getVerticalBorderWidth());
mVerticalImage.setOffsetY(getOffsetY() - getVerticalBorderWidth());
mVerticalImage.setFlipY(false); mVerticalImage.setFlipY(false);
mVerticalImage.render(); mVerticalImage.render();
//Renderer::drawRect(getOffsetX(), getOffsetY() - getVerticalBorderWidth(), mWidth, getVerticalBorderWidth(), 0x00FF00);
//bottom border //bottom border
//same X mVerticalImage.setOffset(getOffset().x, getOffset().y + mHeight);
mVerticalImage.setOffsetY(getOffsetY() + mHeight);
mVerticalImage.setFlipY(true); mVerticalImage.setFlipY(true);
mVerticalImage.render(); mVerticalImage.render();
//Renderer::drawRect(getOffsetX(), getOffsetY() + mHeight, mWidth, getVerticalBorderWidth(), 0x00FF00);
//corner top left //corner top left
mCornerImage.setOffsetX(getOffsetX() - getHorizontalBorderWidth()); mCornerImage.setOffset(getOffset().x - getHorizontalBorderWidth(), getOffset().y - getVerticalBorderWidth());
mCornerImage.setOffsetY(getOffsetY() - getVerticalBorderWidth());
mCornerImage.setFlipX(false); mCornerImage.setFlipX(false);
mCornerImage.setFlipY(false); mCornerImage.setFlipY(false);
mCornerImage.render(); mCornerImage.render();
//top right //top right
mCornerImage.setOffsetX(getOffsetX() + mWidth); mCornerImage.setOffset(getOffset().x + mWidth, mCornerImage.getOffset().y);
mCornerImage.setFlipX(true); mCornerImage.setFlipX(true);
mCornerImage.render(); mCornerImage.render();
//bottom right //bottom right
mCornerImage.setOffsetY(getOffsetY() + mHeight); mCornerImage.setOffset(mCornerImage.getOffset().x, getOffset().y + mHeight);
mCornerImage.setFlipY(true); mCornerImage.setFlipY(true);
mCornerImage.render(); mCornerImage.render();
//bottom left //bottom left
mCornerImage.setOffsetX(getOffsetX() - getHorizontalBorderWidth()); mCornerImage.setOffset(getOffset().x - getHorizontalBorderWidth(), mCornerImage.getOffset().y);
mCornerImage.setFlipX(false); mCornerImage.setFlipX(false);
mCornerImage.render(); mCornerImage.render();
} }

View file

@ -1,8 +1,8 @@
#ifndef _GUIBOX_H_ #ifndef _GUIBOX_H_
#define _GUIBOX_H_ #define _GUIBOX_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include "GuiImage.h" #include "ImageComponent.h"
#include <string> #include <string>
struct GuiBoxData struct GuiBoxData
@ -16,7 +16,7 @@ struct GuiBoxData
std::string cornerPath; std::string cornerPath;
}; };
class GuiBox : public Gui class GuiBox : public GuiComponent
{ {
public: public:
GuiBox(Window* window, int offsetX, int offsetY, unsigned int width, unsigned int height); GuiBox(Window* window, int offsetX, int offsetY, unsigned int width, unsigned int height);
@ -34,8 +34,9 @@ public:
void init(); void init();
void deinit(); void deinit();
private: private:
GuiImage mBackgroundImage, mHorizontalImage, mVerticalImage, mCornerImage; ImageComponent mBackgroundImage, mHorizontalImage, mVerticalImage, mCornerImage;
int getHorizontalBorderWidth(); int getHorizontalBorderWidth();
int getVerticalBorderWidth(); int getVerticalBorderWidth();

View file

@ -7,7 +7,7 @@
#include <string> #include <string>
#include <sstream> #include <sstream>
GuiDetectDevice::GuiDetectDevice(Window* window) : Gui(window) GuiDetectDevice::GuiDetectDevice(Window* window) : GuiComponent(window)
{ {
//clear any player information from the InputManager //clear any player information from the InputManager
for(int i = 0; i < mWindow->getInputManager()->getNumPlayers(); i++) for(int i = 0; i < mWindow->getInputManager()->getNumPlayers(); i++)
@ -22,7 +22,7 @@ GuiDetectDevice::GuiDetectDevice(Window* window) : Gui(window)
mHoldingFinish = false; mHoldingFinish = false;
} }
void GuiDetectDevice::input(InputConfig* config, Input input) bool GuiDetectDevice::input(InputConfig* config, Input input)
{ {
if((input.type == TYPE_BUTTON || input.type == TYPE_KEY)) if((input.type == TYPE_BUTTON || input.type == TYPE_KEY))
{ {
@ -38,11 +38,11 @@ void GuiDetectDevice::input(InputConfig* config, Input input)
mHoldingFinish = false; mHoldingFinish = false;
} }
} }
return; return true;
} }
if(!input.value) if(!input.value)
return; return false;
config->setPlayerNum(mCurrentPlayer); config->setPlayerNum(mCurrentPlayer);
mWindow->getInputManager()->setNumPlayers(mWindow->getInputManager()->getNumPlayers() + 1); //inc total number of players mWindow->getInputManager()->setNumPlayers(mWindow->getInputManager()->getNumPlayers() + 1); //inc total number of players
@ -53,7 +53,11 @@ void GuiDetectDevice::input(InputConfig* config, Input input)
{ {
done(); done();
} }
return true;
} }
return false;
} }
void GuiDetectDevice::done() void GuiDetectDevice::done()

View file

@ -1,14 +1,14 @@
#ifndef _GUIDETECTDEVICE_H_ #ifndef _GUIDETECTDEVICE_H_
#define _GUIDETECTDEVICE_H_ #define _GUIDETECTDEVICE_H_
#include "../Gui.h" #include "../GuiComponent.h"
class GuiDetectDevice : public Gui class GuiDetectDevice : public GuiComponent
{ {
public: public:
GuiDetectDevice(Window* window); GuiDetectDevice(Window* window);
void input(InputConfig* config, Input input); bool input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();

View file

@ -7,8 +7,8 @@ const std::string GuiFastSelect::LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int GuiFastSelect::SCROLLSPEED = 100; const int GuiFastSelect::SCROLLSPEED = 100;
const int GuiFastSelect::SCROLLDELAY = 507; const int GuiFastSelect::SCROLLDELAY = 507;
GuiFastSelect::GuiFastSelect(Window* window, GuiGameList* parent, GuiList<FileData*>* list, char startLetter, GuiBoxData data, GuiFastSelect::GuiFastSelect(Window* window, GuiGameList* parent, TextListComponent<FileData*>* list, char startLetter, GuiBoxData data,
int textcolor, std::shared_ptr<Sound> & scrollsound, Font* font) : Gui(window) int textcolor, std::shared_ptr<Sound> & scrollsound, Font* font) : GuiComponent(window)
{ {
mLetterID = LETTERS.find(toupper(startLetter)); mLetterID = LETTERS.find(toupper(startLetter));
if(mLetterID == std::string::npos) if(mLetterID == std::string::npos)
@ -48,18 +48,20 @@ void GuiFastSelect::render()
Renderer::drawCenteredText(LETTERS.substr(mLetterID, 1), 0, (int)(sh * 0.5f - (mFont->getHeight() * 0.5f)), mTextColor, mFont); Renderer::drawCenteredText(LETTERS.substr(mLetterID, 1), 0, (int)(sh * 0.5f - (mFont->getHeight() * 0.5f)), mTextColor, mFont);
} }
void GuiFastSelect::input(InputConfig* config, Input input) bool GuiFastSelect::input(InputConfig* config, Input input)
{ {
if(config->isMappedTo("up", input) && input.value != 0) if(config->isMappedTo("up", input) && input.value != 0)
{ {
mScrollOffset = -1; mScrollOffset = -1;
scroll(); scroll();
return true;
} }
if(config->isMappedTo("down", input) && input.value != 0) if(config->isMappedTo("down", input) && input.value != 0)
{ {
mScrollOffset = 1; mScrollOffset = 1;
scroll(); scroll();
return true;
} }
if((config->isMappedTo("up", input) || config->isMappedTo("down", input)) && input.value == 0) if((config->isMappedTo("up", input) || config->isMappedTo("down", input)) && input.value == 0)
@ -67,14 +69,17 @@ void GuiFastSelect::input(InputConfig* config, Input input)
mScrolling = false; mScrolling = false;
mScrollTimer = 0; mScrollTimer = 0;
mScrollOffset = 0; mScrollOffset = 0;
return true;
} }
if(config->isMappedTo("select", input) && input.value == 0) if(config->isMappedTo("select", input) && input.value == 0)
{ {
setListPos(); setListPos();
delete this; delete this;
return; return true;
} }
return false;
} }
void GuiFastSelect::update(int deltaTime) void GuiFastSelect::update(int deltaTime)

View file

@ -1,22 +1,23 @@
#ifndef _GUIFASTSELECT_H_ #ifndef _GUIFASTSELECT_H_
#define _GUIFASTSELECT_H_ #define _GUIFASTSELECT_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include "../SystemData.h" #include "../SystemData.h"
#include "../FolderData.h" #include "../FolderData.h"
#include "../Sound.h" #include "../Sound.h"
#include "GuiList.h" #include "TextListComponent.h"
#include "GuiBox.h" #include "GuiBox.h"
class GuiGameList; class GuiGameList;
class GuiFastSelect : public Gui class GuiFastSelect : public GuiComponent
{ {
public: public:
GuiFastSelect(Window* window, GuiGameList* parent, GuiList<FileData*>* list, char startLetter, GuiBoxData data, int textcolor, std::shared_ptr<Sound> & scrollsound, Font* font); GuiFastSelect(Window* window, GuiGameList* parent, TextListComponent<FileData*>* list, char startLetter, GuiBoxData data,
int textcolor, std::shared_ptr<Sound> & scrollsound, Font* font);
~GuiFastSelect(); ~GuiFastSelect();
void input(InputConfig* config, Input input); bool input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();
private: private:
@ -28,7 +29,7 @@ private:
void scroll(); void scroll();
void setLetterID(int id); void setLetterID(int id);
GuiList<FileData*>* mList; TextListComponent<FileData*>* mList;
size_t mLetterID; size_t mLetterID;
GuiGameList* mParent; GuiGameList* mParent;

View file

@ -6,26 +6,26 @@
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include "../Log.h" #include "../Log.h"
GuiGameList::GuiGameList(Window* window, bool useDetail) : Gui(window) GuiGameList::GuiGameList(Window* window, bool useDetail) : GuiComponent(window)
{ {
mDetailed = useDetail; mDetailed = useDetail;
mTheme = new GuiTheme(mWindow, mDetailed); mTheme = new ThemeComponent(mWindow, mDetailed);
//The GuiGameList can use the older, simple game list if so desired. //The GuiGameList can use the older, simple game list if so desired.
//The old view only shows a list in the center of the screen; the new view can display an image and description. //The old view only shows a list in the center of the screen; the new view can display an image and description.
//Those with smaller displays may prefer the older view. //Those with smaller displays may prefer the older view.
if(mDetailed) if(mDetailed)
{ {
mList = new GuiList<FileData*>(mWindow, (int)(Renderer::getScreenWidth() * mTheme->getFloat("listOffsetX")), Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::MEDIUM)); mList = new TextListComponent<FileData*>(mWindow, (int)(Renderer::getScreenWidth() * mTheme->getFloat("listOffsetX")), Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::MEDIUM));
mScreenshot = new GuiImage(mWindow, (int)(Renderer::getScreenWidth() * mTheme->getFloat("gameImageOffsetX")), (int)(Renderer::getScreenHeight() * mTheme->getFloat("gameImageOffsetY")), "", (unsigned int)mTheme->getFloat("gameImageWidth"), (unsigned int)mTheme->getFloat("gameImageHeight"), false); mScreenshot = new ImageComponent(mWindow, (int)(Renderer::getScreenWidth() * mTheme->getFloat("gameImageOffsetX")), (int)(Renderer::getScreenHeight() * mTheme->getFloat("gameImageOffsetY")), "", (unsigned int)mTheme->getFloat("gameImageWidth"), (unsigned int)mTheme->getFloat("gameImageHeight"), false);
mScreenshot->setOrigin(mTheme->getFloat("gameImageOriginX"), mTheme->getFloat("gameImageOriginY")); mScreenshot->setOrigin(mTheme->getFloat("gameImageOriginX"), mTheme->getFloat("gameImageOriginY"));
mImageAnimation = new GuiAnimation(); mImageAnimation = new AnimationComponent();
mImageAnimation->addChild(mScreenshot); mImageAnimation->addChild(mScreenshot);
}else{ }else{
mList = new GuiList<FileData*>(mWindow, 0, Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::MEDIUM)); mList = new TextListComponent<FileData*>(mWindow, 0, Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::MEDIUM));
mScreenshot = NULL; mScreenshot = NULL;
mImageAnimation = NULL; mImageAnimation = NULL;
} }
@ -94,7 +94,7 @@ void GuiGameList::render()
std::string desc = game->getDescription(); std::string desc = game->getDescription();
if(!desc.empty()) if(!desc.empty())
Renderer::drawWrappedText(desc, (int)(Renderer::getScreenWidth() * 0.03), mScreenshot->getOffsetY() + mScreenshot->getHeight() + 12, (int)(Renderer::getScreenWidth() * (mTheme->getFloat("listOffsetX") - 0.03)), mTheme->getColor("description"), mTheme->getDescriptionFont()); Renderer::drawWrappedText(desc, (int)(Renderer::getScreenWidth() * 0.03), mScreenshot->getOffset().y + mScreenshot->getHeight() + 12, (int)(Renderer::getScreenWidth() * (mTheme->getFloat("listOffsetX") - 0.03)), mTheme->getColor("description"), mTheme->getDescriptionFont());
} }
mScreenshot->render(); mScreenshot->render();
@ -103,7 +103,7 @@ void GuiGameList::render()
mList->render(); mList->render();
} }
void GuiGameList::input(InputConfig* config, Input input) bool GuiGameList::input(InputConfig* config, Input input)
{ {
mList->input(config, input); mList->input(config, input);
@ -118,6 +118,7 @@ void GuiGameList::input(InputConfig* config, Input input)
mFolderStack.push(mFolder); mFolderStack.push(mFolder);
mFolder = (FolderData*)file; mFolder = (FolderData*)file;
updateList(); updateList();
return true;
}else{ }else{
mList->stopScrolling(); mList->stopScrolling();
@ -125,7 +126,7 @@ void GuiGameList::input(InputConfig* config, Input input)
while(mTheme->getSound("menuSelect")->isPlaying()); while(mTheme->getSound("menuSelect")->isPlaying());
mSystem->launchGame(mWindow, (GameData*)file); mSystem->launchGame(mWindow, (GameData*)file);
return; return true;
} }
} }
@ -139,6 +140,8 @@ void GuiGameList::input(InputConfig* config, Input input)
//play the back sound //play the back sound
mTheme->getSound("menuBack")->play(); mTheme->getSound("menuBack")->play();
return true;
} }
//only allow switching systems if more than one exists (otherwise it'll reset your position when you switch and it's annoying) //only allow switching systems if more than one exists (otherwise it'll reset your position when you switch and it's annoying)
@ -147,10 +150,12 @@ void GuiGameList::input(InputConfig* config, Input input)
if(config->isMappedTo("right", input)) if(config->isMappedTo("right", input))
{ {
setSystemId(mSystemId + 1); setSystemId(mSystemId + 1);
return true;
} }
if(config->isMappedTo("left", input)) if(config->isMappedTo("left", input))
{ {
setSystemId(mSystemId - 1); setSystemId(mSystemId - 1);
return true;
} }
} }
@ -158,12 +163,14 @@ void GuiGameList::input(InputConfig* config, Input input)
if(config->isMappedTo("menu", input) && input.value != 0) if(config->isMappedTo("menu", input) && input.value != 0)
{ {
mWindow->pushGui(new GuiMenu(mWindow, this)); mWindow->pushGui(new GuiMenu(mWindow, this));
return true;
} }
//open the fast select menu //open the fast select menu
if(config->isMappedTo("select", input) && input.value != 0) if(config->isMappedTo("select", input) && input.value != 0)
{ {
mWindow->pushGui(new GuiFastSelect(mWindow, this, mList, mList->getSelectedObject()->getName()[0], mTheme->getBoxData(), mTheme->getColor("fastSelect"), mTheme->getSound("menuScroll"), mTheme->getFastSelectFont())); mWindow->pushGui(new GuiFastSelect(mWindow, this, mList, mList->getSelectedObject()->getName()[0], mTheme->getBoxData(), mTheme->getColor("fastSelect"), mTheme->getSound("menuScroll"), mTheme->getFastSelectFont()));
return true;
} }
if(mDetailed) if(mDetailed)
@ -175,7 +182,10 @@ void GuiGameList::input(InputConfig* config, Input input)
else else
clearDetailData(); clearDetailData();
} }
return true;
} }
return false;
} }
void GuiGameList::updateList() void GuiGameList::updateList()
@ -235,11 +245,10 @@ void GuiGameList::updateTheme()
{ {
mList->setCentered(mTheme->getBool("listCentered")); mList->setCentered(mTheme->getBool("listCentered"));
mList->setOffsetX((int)(mTheme->getFloat("listOffsetX") * Renderer::getScreenWidth())); mList->setOffset((int)(mTheme->getFloat("listOffsetX") * Renderer::getScreenWidth()), mList->getOffset().y);
mList->setTextOffsetX((int)(mTheme->getFloat("listTextOffsetX") * Renderer::getScreenWidth())); mList->setTextOffsetX((int)(mTheme->getFloat("listTextOffsetX") * Renderer::getScreenWidth()));
mScreenshot->setOffsetX((int)(mTheme->getFloat("gameImageOffsetX") * Renderer::getScreenWidth())); mScreenshot->setOffset((int)(mTheme->getFloat("gameImageOffsetX") * Renderer::getScreenWidth()), (int)(mTheme->getFloat("gameImageOffsetY") * Renderer::getScreenHeight()));
mScreenshot->setOffsetY((int)(mTheme->getFloat("gameImageOffsetY") * Renderer::getScreenHeight()));
mScreenshot->setOrigin(mTheme->getFloat("gameImageOriginX"), mTheme->getFloat("gameImageOriginY")); mScreenshot->setOrigin(mTheme->getFloat("gameImageOriginX"), mTheme->getFloat("gameImageOriginY"));
mScreenshot->setResize((int)mTheme->getFloat("gameImageWidth"), (int)mTheme->getFloat("gameImageHeight"), false); mScreenshot->setResize((int)mTheme->getFloat("gameImageWidth"), (int)mTheme->getFloat("gameImageHeight"), false);
} }

View file

@ -1,11 +1,11 @@
#ifndef _GUIGAMELIST_H_ #ifndef _GUIGAMELIST_H_
#define _GUIGAMELIST_H_ #define _GUIGAMELIST_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include "GuiList.h" #include "TextListComponent.h"
#include "GuiImage.h" #include "ImageComponent.h"
#include "GuiTheme.h" #include "ThemeComponent.h"
#include "GuiAnimation.h" #include "AnimationComponent.h"
#include <string> #include <string>
#include <stack> #include <stack>
#include "../SystemData.h" #include "../SystemData.h"
@ -14,15 +14,15 @@
//This is where the magic happens - GuiGameList is the parent of almost every graphical element in ES at the moment. //This is where the magic happens - GuiGameList is the parent of almost every graphical element in ES at the moment.
//It has a GuiList child that handles the game list, a GuiTheme that handles the theming system, and a GuiImage for game images. //It has a GuiList child that handles the game list, a GuiTheme that handles the theming system, and a GuiImage for game images.
class GuiGameList : public Gui class GuiGameList : public GuiComponent
{ {
public: public:
GuiGameList(Window* window, bool useDetail = false); GuiGameList(Window* window, bool useDetail = false);
~GuiGameList(); virtual ~GuiGameList();
void setSystemId(int id); void setSystemId(int id);
void input(InputConfig* config, Input input); bool input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();
@ -46,10 +46,10 @@ private:
int mSystemId; int mSystemId;
bool mDetailed; bool mDetailed;
GuiList<FileData*>* mList; TextListComponent<FileData*>* mList;
GuiImage* mScreenshot; ImageComponent* mScreenshot;
GuiAnimation* mImageAnimation; AnimationComponent* mImageAnimation;
GuiTheme* mTheme; ThemeComponent* mTheme;
}; };
#endif #endif

View file

@ -9,7 +9,7 @@ static int inputCount = 12;
static std::string inputName[12] = { "Up", "Down", "Left", "Right", "A", "B", "Menu", "Select", "PageUp", "PageDown", "MasterVolUp", "MasterVolDown" }; static std::string inputName[12] = { "Up", "Down", "Left", "Right", "A", "B", "Menu", "Select", "PageUp", "PageDown", "MasterVolUp", "MasterVolDown" };
static std::string inputDispName[12] = { "Up", "Down", "Left", "Right", "Accept", "Back", "Menu", "Jump to Letter", "Page Up", "Page Down", "Master volume up", "Master volume down" }; static std::string inputDispName[12] = { "Up", "Down", "Left", "Right", "Accept", "Back", "Menu", "Jump to Letter", "Page Up", "Page Down", "Master volume up", "Master volume down" };
GuiInputConfig::GuiInputConfig(Window* window, InputConfig* target) : Gui(window), mTargetConfig(target) GuiInputConfig::GuiInputConfig(Window* window, InputConfig* target) : GuiComponent(window), mTargetConfig(target)
{ {
mCurInputId = 0; mCurInputId = 0;
LOG(LogInfo) << "Configuring device " << target->getDeviceId(); LOG(LogInfo) << "Configuring device " << target->getDeviceId();
@ -20,10 +20,10 @@ void GuiInputConfig::update(int deltaTime)
} }
void GuiInputConfig::input(InputConfig* config, Input input) bool GuiInputConfig::input(InputConfig* config, Input input)
{ {
if(config != mTargetConfig || input.value == 0) if(config != mTargetConfig || input.value == 0)
return; return false;
if(mCurInputId >= inputCount) if(mCurInputId >= inputCount)
{ {
@ -43,7 +43,7 @@ void GuiInputConfig::input(InputConfig* config, Input input)
if(config->getMappedTo(input).size() > 0) if(config->getMappedTo(input).size() > 0)
{ {
mErrorMsg = "Already mapped!"; mErrorMsg = "Already mapped!";
return; return true;
} }
input.configured = true; input.configured = true;
@ -59,6 +59,8 @@ void GuiInputConfig::input(InputConfig* config, Input input)
mCurInputId = inputCount; mCurInputId = inputCount;
} }
} }
return true;
} }
void GuiInputConfig::render() void GuiInputConfig::render()

View file

@ -1,15 +1,15 @@
#ifndef _GUIINPUTCONFIG_H_ #ifndef _GUIINPUTCONFIG_H_
#define _GUIINPUTCONFIG_H_ #define _GUIINPUTCONFIG_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include <string> #include <string>
class GuiInputConfig : public Gui class GuiInputConfig : public GuiComponent
{ {
public: public:
GuiInputConfig(Window* window, InputConfig* target); GuiInputConfig(Window* window, InputConfig* target);
void input(InputConfig* config, Input input); bool input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();

View file

@ -1,293 +0,0 @@
//This is *actually* part of the GuiList header and not meant to be compiled.
#include "GuiList.h"
#include <iostream>
template <typename listType>
GuiList<listType>::GuiList(Window* window, int offsetX, int offsetY, Font* font) : Gui(window)
{
mSelection = 0;
mScrollDir = 0;
mScrolling = 0;
mScrollAccumulator = 0;
mOffsetX = offsetX;
mOffsetY = offsetY;
mTextOffsetX = 0;
mFont = font;
mSelectorColor = 0x000000FF;
mSelectedTextColorOverride = 0;
mScrollSound = NULL;
mDrawCentered = true;
}
template <typename listType>
GuiList<listType>::~GuiList()
{
}
template <typename listType>
void GuiList<listType>::render()
{
const int cutoff = getOffsetY();
const int entrySize = mFont->getHeight() + 5;
int startEntry = 0;
//number of entries that can fit on the screen simultaniously
int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize;
//screenCount -= 1;
if((int)mRowVector.size() >= screenCount)
{
startEntry = mSelection - (int)(screenCount * 0.5);
if(startEntry < 0)
startEntry = 0;
if(startEntry >= (int)mRowVector.size() - screenCount)
startEntry = mRowVector.size() - screenCount;
}
int y = cutoff;
if(mRowVector.size() == 0)
{
Renderer::drawCenteredText("The list is empty.", 0, y, 0xFF0000FF, mFont);
return;
}
int listCutoff = startEntry + screenCount;
if(listCutoff > (int)mRowVector.size())
listCutoff = mRowVector.size();
for(int i = startEntry; i < listCutoff; i++)
{
//draw selector bar
if(mSelection == i)
{
Renderer::drawRect(getOffsetX(), y, Renderer::getScreenWidth(), mFont->getHeight(), mSelectorColor);
}
ListRow row = mRowVector.at((unsigned int)i);
if(mDrawCentered)
Renderer::drawCenteredText(row.name, getOffsetX(), y, (mSelection == i && mSelectedTextColorOverride != 0) ? mSelectedTextColorOverride : row.color, mFont);
else
Renderer::drawText(row.name, getOffsetX() + mTextOffsetX, y, (mSelection == i && mSelectedTextColorOverride != 0) ? mSelectedTextColorOverride : row.color, mFont);
y += entrySize;
}
}
template <typename listType>
void GuiList<listType>::input(InputConfig* config, Input input)
{
if(mRowVector.size() > 0)
{
if(input.value != 0)
{
if(config->isMappedTo("down", input))
{
mScrollDir = 1;
scroll();
}
if(config->isMappedTo("up", input))
{
mScrollDir = -1;
scroll();
}
if(config->isMappedTo("pagedown", input))
{
mScrollDir = 10;
scroll();
}
if(config->isMappedTo("pageup", input))
{
mScrollDir = -10;
scroll();
}
}else{
//if((button == InputManager::DOWN && mScrollDir > 0) || (button == InputManager::PAGEDOWN && mScrollDir > 0) || (button == InputManager::UP && mScrollDir < 0) || (button == InputManager::PAGEUP && mScrollDir < 0))
if(config->isMappedTo("down", input) || config->isMappedTo("up", input) || config->isMappedTo("pagedown", input) || config->isMappedTo("pageup", input))
{
stopScrolling();
}
}
}
}
template <typename listType>
void GuiList<listType>::stopScrolling()
{
mScrollAccumulator = 0;
mScrolling = false;
mScrollDir = 0;
}
template <typename listType>
void GuiList<listType>::update(int deltaTime)
{
if(mScrollDir != 0)
{
mScrollAccumulator += deltaTime;
if(!mScrolling)
{
if(mScrollAccumulator >= SCROLLDELAY)
{
mScrollAccumulator = SCROLLTIME;
mScrolling = true;
}
}
if(mScrolling)
{
mScrollAccumulator += deltaTime;
while(mScrollAccumulator >= SCROLLTIME)
{
mScrollAccumulator -= SCROLLTIME;
scroll();
}
}
}
}
template <typename listType>
void GuiList<listType>::scroll()
{
mSelection += mScrollDir;
if(mSelection < 0)
{
if(mScrollDir < -1)
mSelection = 0;
else
mSelection += mRowVector.size();
}
if(mSelection >= (int)mRowVector.size())
{
if(mScrollDir > 1)
mSelection = (int)mRowVector.size() - 1;
else
mSelection -= mRowVector.size();
}
if(mScrollSound)
mScrollSound->play();
}
//list management stuff
template <typename listType>
void GuiList<listType>::addObject(std::string name, listType obj, unsigned int color)
{
ListRow row = {name, obj, color};
mRowVector.push_back(row);
}
template <typename listType>
void GuiList<listType>::clear()
{
mRowVector.clear();
mSelection = 0;
}
template <typename listType>
std::string GuiList<listType>::getSelectedName()
{
if((int)mRowVector.size() > mSelection)
return mRowVector.at(mSelection).name;
else
return "";
}
template <typename listType>
listType GuiList<listType>::getSelectedObject()
{
if((int)mRowVector.size() > mSelection)
return mRowVector.at(mSelection).object;
else
return NULL;
}
template <typename listType>
int GuiList<listType>::getSelection()
{
return mSelection;
}
template <typename listType>
bool GuiList<listType>::isScrolling()
{
return mScrollDir != 0;
}
template <typename listType>
void GuiList<listType>::setSelectorColor(unsigned int selectorColor)
{
mSelectorColor = selectorColor;
}
template <typename listType>
void GuiList<listType>::setSelectedTextColor(unsigned int selectedColor)
{
mSelectedTextColorOverride = selectedColor;
}
template<typename listType>
void GuiList<listType>::setCentered(bool centered)
{
mDrawCentered = centered;
}
template<typename listType>
void GuiList<listType>::setTextOffsetX(int textoffsetx)
{
mTextOffsetX = textoffsetx;
}
template <typename listType>
int GuiList<listType>::getObjectCount()
{
return mRowVector.size();
}
template <typename listType>
listType GuiList<listType>::getObject(int i)
{
return mRowVector.at(i).object;
}
template <typename listType>
void GuiList<listType>::setSelection(int i)
{
mSelection = i;
}
template <typename listType>
void GuiList<listType>::setScrollSound(std::shared_ptr<Sound> & sound)
{
mScrollSound = sound;
}
template <typename listType>
void GuiList<listType>::setFont(Font* font)
{
mFont = font;
}
template <typename listType>
int GuiList<listType>::getOffsetX()
{
return mOffsetX;
}
template <typename listType>
int GuiList<listType>::getOffsetY()
{
return mOffsetY;
}

View file

@ -1,80 +0,0 @@
#ifndef _GUILIST_H_
#define _GUILIST_H_
#include "../Renderer.h"
#include "../Font.h"
#include "../Gui.h"
#include "../InputManager.h"
#include <vector>
#include <string>
#include <memory>
#include "../Sound.h"
//A graphical list. Supports multiple colors for rows and scrolling.
//TODO - add truncation to text rendering if name exceeds a maximum width (a trailing elipses, perhaps).
template <typename listType>
class GuiList : public Gui
{
public:
GuiList(Window* window, int offsetX, int offsetY, Font* font);
~GuiList();
void input(InputConfig* config, Input input);
void update(int deltaTime);
void render();
void addObject(std::string name, listType obj, unsigned int color = 0xFF0000);
void clear();
std::string getSelectedName();
listType getSelectedObject();
int getSelection();
void stopScrolling();
bool isScrolling();
void setSelectorColor(unsigned int selectorColor);
void setSelectedTextColor(unsigned int selectedColor);
void setCentered(bool centered);
void setScrollSound(std::shared_ptr<Sound> & sound);
void setTextOffsetX(int textoffsetx);
int getObjectCount();
listType getObject(int i);
void setSelection(int i);
void setFont(Font* f);
int getOffsetX();
int getOffsetY();
private:
static const int SCROLLDELAY = 507;
static const int SCROLLTIME = 200;
int mOffsetX, mOffsetY;
void scroll(); //helper method, scrolls in whatever direction scrollDir is
int mScrollDir, mScrollAccumulator;
bool mScrolling;
Font* mFont;
unsigned int mSelectorColor, mSelectedTextColorOverride;
bool mDrawCentered;
int mTextOffsetX;
struct ListRow
{
std::string name;
listType object;
unsigned int color;
};
std::vector<ListRow> mRowVector;
int mSelection;
std::shared_ptr<Sound> mScrollSound;
};
#include "GuiList.cpp"
#endif

View file

@ -8,11 +8,11 @@
//defined in main.cpp //defined in main.cpp
extern bool DONTSHOWEXIT; extern bool DONTSHOWEXIT;
GuiMenu::GuiMenu(Window* window, GuiGameList* parent) : Gui(window) GuiMenu::GuiMenu(Window* window, GuiGameList* parent) : GuiComponent(window)
{ {
mParent = parent; mParent = parent;
mList = new GuiList<std::string>(mWindow, 0, Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::LARGE)); mList = new TextListComponent<std::string>(mWindow, 0, Renderer::getDefaultFont(Renderer::LARGE)->getHeight() + 2, Renderer::getDefaultFont(Renderer::LARGE));
mList->setSelectedTextColor(0x0000FFFF); mList->setSelectedTextColor(0x0000FFFF);
populateList(); populateList();
} }
@ -22,20 +22,23 @@ GuiMenu::~GuiMenu()
delete mList; delete mList;
} }
void GuiMenu::input(InputConfig* config, Input input) bool GuiMenu::input(InputConfig* config, Input input)
{ {
mList->input(config, input); mList->input(config, input);
if(config->isMappedTo("menu", input) && input.value != 0) if(config->isMappedTo("menu", input) && input.value != 0)
{ {
delete this; delete this;
return; return true;
} }
if(config->isMappedTo("a", input) && input.value != 0) if(config->isMappedTo("a", input) && input.value != 0)
{ {
executeCommand(mList->getSelectedObject()); executeCommand(mList->getSelectedObject());
return true;
} }
return false;
} }
void GuiMenu::executeCommand(std::string command) void GuiMenu::executeCommand(std::string command)

View file

@ -1,24 +1,24 @@
#ifndef _GUIMENU_H_ #ifndef _GUIMENU_H_
#define _GUIMENU_H_ #define _GUIMENU_H_
#include "../Gui.h" #include "../GuiComponent.h"
#include "GuiList.h" #include "TextListComponent.h"
class GuiGameList; class GuiGameList;
class GuiMenu : public Gui class GuiMenu : public GuiComponent
{ {
public: public:
GuiMenu(Window* window, GuiGameList* parent); GuiMenu(Window* window, GuiGameList* parent);
~GuiMenu(); virtual ~GuiMenu();
void input(InputConfig* config, Input input); bool input(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();
private: private:
GuiGameList* mParent; GuiGameList* mParent;
GuiList<std::string>* mList; TextListComponent<std::string>* mList;
void populateList(); void populateList();
void executeCommand(std::string command); void executeCommand(std::string command);

View file

@ -1,18 +1,18 @@
#include "GuiImage.h" #include "ImageComponent.h"
#include <iostream> #include <iostream>
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <math.h> #include <math.h>
#include "../Log.h" #include "../Log.h"
#include "../Renderer.h" #include "../Renderer.h"
unsigned int GuiImage::getWidth() { return mDrawWidth; } unsigned int ImageComponent::getWidth() { return mDrawWidth; }
unsigned int GuiImage::getHeight() { return mDrawHeight; } unsigned int ImageComponent::getHeight() { return mDrawHeight; }
GuiImage::GuiImage(Window* window, int offsetX, int offsetY, std::string path, unsigned int resizeWidth, unsigned int resizeHeight, bool resizeExact) : Gui(window) ImageComponent::ImageComponent(Window* window, int offsetX, int offsetY, std::string path, unsigned int resizeWidth, unsigned int resizeHeight, bool resizeExact) : GuiComponent(window)
{ {
mTextureID = 0; mTextureID = 0;
setOffset(offsetX, offsetY); setOffset(Vector2i(offsetX, offsetY));
//default origin is the center of image //default origin is the center of image
mOriginX = 0.5; mOriginX = 0.5;
@ -36,12 +36,12 @@ GuiImage::GuiImage(Window* window, int offsetX, int offsetY, std::string path, u
setImage(path); setImage(path);
} }
GuiImage::~GuiImage() ImageComponent::~ImageComponent()
{ {
unloadImage(); unloadImage();
} }
void GuiImage::loadImage(std::string path) void ImageComponent::loadImage(std::string path)
{ {
//make sure the file *exists* //make sure the file *exists*
if(!boost::filesystem::exists(path)) if(!boost::filesystem::exists(path))
@ -171,7 +171,7 @@ void GuiImage::loadImage(std::string path)
resize(); resize();
} }
void GuiImage::resize() void ImageComponent::resize()
{ {
mDrawWidth = mWidth; mDrawWidth = mWidth;
mDrawHeight = mHeight; mDrawHeight = mHeight;
@ -206,7 +206,7 @@ void GuiImage::resize()
} }
} }
void GuiImage::unloadImage() void ImageComponent::unloadImage()
{ {
if(mTextureID) if(mTextureID)
{ {
@ -216,7 +216,7 @@ void GuiImage::unloadImage()
} }
} }
void GuiImage::setImage(std::string path) void ImageComponent::setImage(std::string path)
{ {
if(mPath == path) if(mPath == path)
return; return;
@ -229,13 +229,13 @@ void GuiImage::setImage(std::string path)
} }
void GuiImage::setOrigin(float originX, float originY) void ImageComponent::setOrigin(float originX, float originY)
{ {
mOriginX = originX; mOriginX = originX;
mOriginY = originY; mOriginY = originY;
} }
void GuiImage::setTiling(bool tile) void ImageComponent::setTiling(bool tile)
{ {
mTiled = tile; mTiled = tile;
@ -243,7 +243,7 @@ void GuiImage::setTiling(bool tile)
mResizeExact = false; mResizeExact = false;
} }
void GuiImage::setResize(unsigned int width, unsigned int height, bool resizeExact) void ImageComponent::setResize(unsigned int width, unsigned int height, bool resizeExact)
{ {
mResizeWidth = width; mResizeWidth = width;
mResizeHeight = height; mResizeHeight = height;
@ -251,17 +251,17 @@ void GuiImage::setResize(unsigned int width, unsigned int height, bool resizeExa
resize(); resize();
} }
void GuiImage::setFlipX(bool flip) void ImageComponent::setFlipX(bool flip)
{ {
mFlipX = flip; mFlipX = flip;
} }
void GuiImage::setFlipY(bool flip) void ImageComponent::setFlipY(bool flip)
{ {
mFlipY = flip; mFlipY = flip;
} }
void GuiImage::render() void ImageComponent::render()
{ {
if(mTextureID && getOpacity() > 0) if(mTextureID && getOpacity() > 0)
{ {
@ -274,17 +274,17 @@ void GuiImage::render()
float yCount = ((float)mResizeHeight/mHeight); float yCount = ((float)mResizeHeight/mHeight);
Renderer::buildGLColorArray(colors, 0xFFFFFF00 | (getOpacity()), 6); Renderer::buildGLColorArray(colors, 0xFFFFFF00 | (getOpacity()), 6);
buildImageArray(getOffsetX(), getOffsetY(), points, texs, xCount, yCount); buildImageArray(getOffset().x, getOffset().y, points, texs, xCount, yCount);
}else{ }else{
Renderer::buildGLColorArray(colors, 0xFFFFFF00 | (getOpacity()), 6); Renderer::buildGLColorArray(colors, 0xFFFFFF00 | (getOpacity()), 6);
buildImageArray(getOffsetX(), getOffsetY(), points, texs); buildImageArray(getOffset().x, getOffset().y, points, texs);
} }
drawImageArray(points, texs, colors, 6); drawImageArray(points, texs, colors, 6);
} }
} }
void GuiImage::buildImageArray(int posX, int posY, GLfloat* points, GLfloat* texs, float px, float py) void ImageComponent::buildImageArray(int posX, int posY, GLfloat* points, GLfloat* texs, float px, float py)
{ {
points[0] = posX - (mDrawWidth * mOriginX) * px; points[1] = posY - (mDrawHeight * mOriginY) * py; points[0] = posX - (mDrawWidth * mOriginX) * px; points[1] = posY - (mDrawHeight * mOriginY) * py;
points[2] = posX - (mDrawWidth * mOriginX) * px; points[3] = posY + (mDrawHeight * (1 - mOriginY)) * py; points[2] = posX - (mDrawWidth * mOriginX) * px; points[3] = posY + (mDrawHeight * (1 - mOriginY)) * py;
@ -322,14 +322,13 @@ void GuiImage::buildImageArray(int posX, int posY, GLfloat* points, GLfloat* tex
} }
} }
void GuiImage::drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, unsigned int numArrays) void ImageComponent::drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, unsigned int numArrays)
{ {
glBindTexture(GL_TEXTURE_2D, mTextureID); glBindTexture(GL_TEXTURE_2D, mTextureID);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@ -354,21 +353,21 @@ void GuiImage::drawImageArray(GLfloat* points, GLfloat* texs, GLubyte* colors, u
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
void GuiImage::init() void ImageComponent::init()
{ {
if(!mPath.empty()) if(!mPath.empty())
loadImage(mPath); loadImage(mPath);
} }
void GuiImage::deinit() void ImageComponent::deinit()
{ {
unloadImage(); unloadImage();
} }
bool GuiImage::hasImage() bool ImageComponent::hasImage()
{ {
return !mPath.empty(); return !mPath.empty();
} }
unsigned char GuiImage::getOpacity() { return mOpacity; } unsigned char ImageComponent::getOpacity() { return mOpacity; }
void GuiImage::setOpacity(unsigned char opacity) { mOpacity = opacity; } void ImageComponent::setOpacity(unsigned char opacity) { mOpacity = opacity; }

View file

@ -1,22 +1,22 @@
#ifndef _GUIIMAGE_H_ #ifndef _IMAGECOMPONENT_H_
#define _GUIIMAGE_H_ #define _IMAGECOMPONENT_H_
#include "../platform.h" #include "../platform.h"
#include GLHEADER #include GLHEADER
#include "../Gui.h" #include "../GuiComponent.h"
#include <string> #include <string>
#include <FreeImage.h> #include <FreeImage.h>
class GuiImage : public Gui class ImageComponent : public GuiComponent
{ {
public: public:
//Creates a new GuiImage at the given location. If given an image, it will be loaded. If maxWidth and/or maxHeight are nonzero, the image will be //Creates a new GuiImage at the given location. If given an image, it will be loaded. If maxWidth and/or maxHeight are nonzero, the image will be
//resized to fix. If only one axis is specified, the other will be resized in accordance with the image's aspect ratio. If resizeExact is false, //resized to fix. If only one axis is specified, the other will be resized in accordance with the image's aspect ratio. If resizeExact is false,
//the image will only be downscaled, never upscaled (the image's size must surpass at least one nonzero bound). //the image will only be downscaled, never upscaled (the image's size must surpass at least one nonzero bound).
GuiImage(Window* window, int offsetX = 0, int offsetY = 0, std::string path = "", unsigned int maxWidth = 0, unsigned int maxHeight = 0, bool resizeExact = false); ImageComponent(Window* window, int offsetX = 0, int offsetY = 0, std::string path = "", unsigned int maxWidth = 0, unsigned int maxHeight = 0, bool resizeExact = false);
~GuiImage(); virtual ~ImageComponent();
void setImage(std::string path); //Loads the image at the given filepath. void setImage(std::string path); //Loads the image at the given filepath.
void setOrigin(float originX, float originY); //Sets the origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center) void setOrigin(float originX, float originY); //Sets the origin as a percentage of this image (e.g. (0, 0) is top left, (0.5, 0.5) is the center)
@ -39,12 +39,12 @@ public:
unsigned char getOpacity(); unsigned char getOpacity();
void setOpacity(unsigned char opacity); void setOpacity(unsigned char opacity);
private: private:
unsigned int mResizeWidth, mResizeHeight; unsigned int mResizeWidth, mResizeHeight;
float mOriginX, mOriginY; float mOriginX, mOriginY;
bool mResizeExact, mTiled, mFlipX, mFlipY; bool mResizeExact, mTiled, mFlipX, mFlipY;
int mOffsetX, mOffsetY;
unsigned char mOpacity; unsigned char mOpacity;
void loadImage(std::string path); void loadImage(std::string path);

View file

@ -0,0 +1,356 @@
#ifndef _TEXTLISTCOMPONENT_H_
#define _TEXTLISTCOMPONENT_H_
#include "../Renderer.h"
#include "../Font.h"
#include "../GuiComponent.h"
#include "../InputManager.h"
#include <vector>
#include <string>
#include <memory>
#include "../Sound.h"
//A graphical list. Supports multiple colors for rows and scrolling.
//TODO - add truncation to text rendering if name exceeds a maximum width (a trailing elipses, perhaps).
template <typename T>
class TextListComponent : public GuiComponent
{
public:
TextListComponent(Window* window, int offsetX, int offsetY, Font* font);
virtual ~TextListComponent();
bool input(InputConfig* config, Input input);
void update(int deltaTime);
void render();
void addObject(std::string name, T obj, unsigned int color = 0xFF0000);
void clear();
std::string getSelectedName();
T getSelectedObject();
int getSelection();
void stopScrolling();
bool isScrolling();
void setSelectorColor(unsigned int selectorColor);
void setSelectedTextColor(unsigned int selectedColor);
void setCentered(bool centered);
void setScrollSound(std::shared_ptr<Sound> & sound);
void setTextOffsetX(int textoffsetx);
int getObjectCount();
T getObject(int i);
void setSelection(int i);
void setFont(Font* f);
private:
static const int SCROLLDELAY = 507;
static const int SCROLLTIME = 200;
void scroll(); //helper method, scrolls in whatever direction scrollDir is
int mScrollDir, mScrollAccumulator;
bool mScrolling;
Font* mFont;
unsigned int mSelectorColor, mSelectedTextColorOverride;
bool mDrawCentered;
int mTextOffsetX;
struct ListRow
{
std::string name;
T object;
unsigned int color;
};
std::vector<ListRow> mRowVector;
int mSelection;
std::shared_ptr<Sound> mScrollSound;
};
template <typename T>
TextListComponent<T>::TextListComponent(Window* window, int offsetX, int offsetY, Font* font) : GuiComponent(window)
{
mSelection = 0;
mScrollDir = 0;
mScrolling = 0;
mScrollAccumulator = 0;
setOffset(Vector2i(offsetX, offsetY));
mTextOffsetX = 0;
mFont = font;
mSelectorColor = 0x000000FF;
mSelectedTextColorOverride = 0;
mScrollSound = NULL;
mDrawCentered = true;
}
template <typename T>
TextListComponent<T>::~TextListComponent()
{
}
template <typename T>
void TextListComponent<T>::render()
{
const int cutoff = getOffset().y;
const int entrySize = mFont->getHeight() + 5;
int startEntry = 0;
//number of entries that can fit on the screen simultaniously
int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize;
//screenCount -= 1;
if((int)mRowVector.size() >= screenCount)
{
startEntry = mSelection - (int)(screenCount * 0.5);
if(startEntry < 0)
startEntry = 0;
if(startEntry >= (int)mRowVector.size() - screenCount)
startEntry = mRowVector.size() - screenCount;
}
int y = cutoff;
if(mRowVector.size() == 0)
{
Renderer::drawCenteredText("The list is empty.", 0, y, 0xFF0000FF, mFont);
return;
}
int listCutoff = startEntry + screenCount;
if(listCutoff > (int)mRowVector.size())
listCutoff = mRowVector.size();
for(int i = startEntry; i < listCutoff; i++)
{
//draw selector bar
if(mSelection == i)
{
Renderer::drawRect(getOffset().x, y, Renderer::getScreenWidth(), mFont->getHeight(), mSelectorColor);
}
ListRow row = mRowVector.at((unsigned int)i);
if(mDrawCentered)
Renderer::drawCenteredText(row.name, getOffset().x + mTextOffsetX, y, (mSelection == i && mSelectedTextColorOverride != 0) ? mSelectedTextColorOverride : row.color, mFont);
else
Renderer::drawText(row.name, getOffset().x + mTextOffsetX, y, (mSelection == i && mSelectedTextColorOverride != 0) ? mSelectedTextColorOverride : row.color, mFont);
y += entrySize;
}
}
template <typename T>
bool TextListComponent<T>::input(InputConfig* config, Input input)
{
if(mRowVector.size() > 0)
{
if(input.value != 0)
{
if(config->isMappedTo("down", input))
{
mScrollDir = 1;
scroll();
return true;
}
if(config->isMappedTo("up", input))
{
mScrollDir = -1;
scroll();
return true;
}
if(config->isMappedTo("pagedown", input))
{
mScrollDir = 10;
scroll();
return true;
}
if(config->isMappedTo("pageup", input))
{
mScrollDir = -10;
scroll();
return true;
}
}else{
//if((button == InputManager::DOWN && mScrollDir > 0) || (button == InputManager::PAGEDOWN && mScrollDir > 0) || (button == InputManager::UP && mScrollDir < 0) || (button == InputManager::PAGEUP && mScrollDir < 0))
if(config->isMappedTo("down", input) || config->isMappedTo("up", input) || config->isMappedTo("pagedown", input) || config->isMappedTo("pageup", input))
{
stopScrolling();
}
}
}
return false;
}
template <typename T>
void TextListComponent<T>::stopScrolling()
{
mScrollAccumulator = 0;
mScrolling = false;
mScrollDir = 0;
}
template <typename T>
void TextListComponent<T>::update(int deltaTime)
{
if(mScrollDir != 0)
{
mScrollAccumulator += deltaTime;
if(!mScrolling)
{
if(mScrollAccumulator >= SCROLLDELAY)
{
mScrollAccumulator = SCROLLTIME;
mScrolling = true;
}
}
if(mScrolling)
{
mScrollAccumulator += deltaTime;
while(mScrollAccumulator >= SCROLLTIME)
{
mScrollAccumulator -= SCROLLTIME;
scroll();
}
}
}
}
template <typename T>
void TextListComponent<T>::scroll()
{
mSelection += mScrollDir;
if(mSelection < 0)
{
if(mScrollDir < -1)
mSelection = 0;
else
mSelection += mRowVector.size();
}
if(mSelection >= (int)mRowVector.size())
{
if(mScrollDir > 1)
mSelection = (int)mRowVector.size() - 1;
else
mSelection -= mRowVector.size();
}
if(mScrollSound)
mScrollSound->play();
}
//list management stuff
template <typename T>
void TextListComponent<T>::addObject(std::string name, T obj, unsigned int color)
{
ListRow row = {name, obj, color};
mRowVector.push_back(row);
}
template <typename T>
void TextListComponent<T>::clear()
{
mRowVector.clear();
mSelection = 0;
}
template <typename T>
std::string TextListComponent<T>::getSelectedName()
{
if((int)mRowVector.size() > mSelection)
return mRowVector.at(mSelection).name;
else
return "";
}
template <typename T>
T TextListComponent<T>::getSelectedObject()
{
if((int)mRowVector.size() > mSelection)
return mRowVector.at(mSelection).object;
else
return NULL;
}
template <typename T>
int TextListComponent<T>::getSelection()
{
return mSelection;
}
template <typename T>
bool TextListComponent<T>::isScrolling()
{
return mScrollDir != 0;
}
template <typename T>
void TextListComponent<T>::setSelectorColor(unsigned int selectorColor)
{
mSelectorColor = selectorColor;
}
template <typename T>
void TextListComponent<T>::setSelectedTextColor(unsigned int selectedColor)
{
mSelectedTextColorOverride = selectedColor;
}
template<typename T>
void TextListComponent<T>::setCentered(bool centered)
{
mDrawCentered = centered;
}
template<typename T>
void TextListComponent<T>::setTextOffsetX(int textoffsetx)
{
mTextOffsetX = textoffsetx;
}
template <typename T>
int TextListComponent<T>::getObjectCount()
{
return mRowVector.size();
}
template <typename T>
T TextListComponent<T>::getObject(int i)
{
return mRowVector.at(i).object;
}
template <typename T>
void TextListComponent<T>::setSelection(int i)
{
mSelection = i;
}
template <typename T>
void TextListComponent<T>::setScrollSound(std::shared_ptr<Sound> & sound)
{
mScrollSound = sound;
}
template <typename T>
void TextListComponent<T>::setFont(Font* font)
{
mFont = font;
}
#endif

View file

@ -1,41 +1,41 @@
#include "GuiTheme.h" #include "ThemeComponent.h"
#include "../MathExp.h" #include "../MathExp.h"
#include <iostream> #include <iostream>
#include "GuiGameList.h" #include "GuiGameList.h"
#include "GuiImage.h" #include "ImageComponent.h"
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <sstream> #include <sstream>
#include "../Renderer.h" #include "../Renderer.h"
#include "../Log.h" #include "../Log.h"
unsigned int GuiTheme::getColor(std::string name) unsigned int ThemeComponent::getColor(std::string name)
{ {
return mColorMap[name]; return mColorMap[name];
} }
bool GuiTheme::getBool(std::string name) bool ThemeComponent::getBool(std::string name)
{ {
return mBoolMap[name]; return mBoolMap[name];
} }
float GuiTheme::getFloat(std::string name) float ThemeComponent::getFloat(std::string name)
{ {
return mFloatMap[name]; return mFloatMap[name];
} }
std::shared_ptr<Sound> & GuiTheme::getSound(std::string name) std::shared_ptr<Sound> & ThemeComponent::getSound(std::string name)
{ {
return mSoundMap[name]; return mSoundMap[name];
} }
std::string GuiTheme::getString(std::string name) std::string ThemeComponent::getString(std::string name)
{ {
return mStringMap[name]; return mStringMap[name];
} }
GuiBoxData GuiTheme::getBoxData() { return mBoxData; } GuiBoxData ThemeComponent::getBoxData() { return mBoxData; }
Font* GuiTheme::getListFont() Font* ThemeComponent::getListFont()
{ {
if(mListFont == NULL) if(mListFont == NULL)
return Renderer::getDefaultFont(Renderer::MEDIUM); return Renderer::getDefaultFont(Renderer::MEDIUM);
@ -43,7 +43,7 @@ Font* GuiTheme::getListFont()
return mListFont; return mListFont;
} }
Font* GuiTheme::getDescriptionFont() Font* ThemeComponent::getDescriptionFont()
{ {
if(mDescFont == NULL) if(mDescFont == NULL)
return Renderer::getDefaultFont(Renderer::SMALL); return Renderer::getDefaultFont(Renderer::SMALL);
@ -51,7 +51,7 @@ Font* GuiTheme::getDescriptionFont()
return mDescFont; return mDescFont;
} }
Font* GuiTheme::getFastSelectFont() Font* ThemeComponent::getFastSelectFont()
{ {
if(mFastSelectFont == NULL) if(mFastSelectFont == NULL)
return Renderer::getDefaultFont(Renderer::LARGE); return Renderer::getDefaultFont(Renderer::LARGE);
@ -59,7 +59,7 @@ Font* GuiTheme::getFastSelectFont()
return mFastSelectFont; return mFastSelectFont;
} }
GuiTheme::GuiTheme(Window* window, bool detailed, std::string path) : Gui(window) ThemeComponent::ThemeComponent(Window* window, bool detailed, std::string path) : GuiComponent(window)
{ {
mDetailed = detailed; mDetailed = detailed;
@ -84,12 +84,12 @@ GuiTheme::GuiTheme(Window* window, bool detailed, std::string path) : Gui(window
readXML(path); readXML(path);
} }
GuiTheme::~GuiTheme() ThemeComponent::~ThemeComponent()
{ {
deleteComponents(); deleteComponents();
} }
void GuiTheme::setDefaults() void ThemeComponent::setDefaults()
{ {
mColorMap["primary"] = 0x0000FFFF; mColorMap["primary"] = 0x0000FFFF;
mColorMap["secondary"] = 0x00FF00FF; mColorMap["secondary"] = 0x00FF00FF;
@ -144,14 +144,14 @@ void GuiTheme::setDefaults()
} }
} }
void GuiTheme::deleteComponents() void ThemeComponent::deleteComponents()
{ {
for(unsigned int i = 0; i < mComponentVector.size(); i++) for(unsigned int i = 0; i < getChildCount(); i++)
{ {
delete mComponentVector.at(i); delete getChild(i);
} }
mComponentVector.clear(); clearChildren();
//deletes fonts if any were created //deletes fonts if any were created
setDefaults(); setDefaults();
@ -159,7 +159,7 @@ void GuiTheme::deleteComponents()
void GuiTheme::readXML(std::string path) void ThemeComponent::readXML(std::string path)
{ {
if(mPath == path) if(mPath == path)
return; return;
@ -264,11 +264,11 @@ void GuiTheme::readXML(std::string path)
} }
//recursively creates components //recursively creates components
void GuiTheme::createComponentChildren(pugi::xml_node node, Gui* parent) void ThemeComponent::createComponentChildren(pugi::xml_node node, GuiComponent* parent)
{ {
for(pugi::xml_node data = node.child("component"); data; data = data.next_sibling("component")) for(pugi::xml_node data = node.child("component"); data; data = data.next_sibling("component"))
{ {
Gui* nextComp = createElement(data, parent); GuiComponent* nextComp = createElement(data, parent);
if(nextComp) if(nextComp)
createComponentChildren(data, nextComp); createComponentChildren(data, nextComp);
@ -276,7 +276,7 @@ void GuiTheme::createComponentChildren(pugi::xml_node node, Gui* parent)
} }
//takes an XML element definition and creates an object from it //takes an XML element definition and creates an object from it
Gui* GuiTheme::createElement(pugi::xml_node data, Gui* parent) GuiComponent* ThemeComponent::createElement(pugi::xml_node data, GuiComponent* parent)
{ {
std::string type = data.child("type").text().get(); std::string type = data.child("type").text().get();
@ -315,12 +315,12 @@ Gui* GuiTheme::createElement(pugi::xml_node data, Gui* parent)
float ox = strToFloat(originX); float ox = strToFloat(originX);
float oy = strToFloat(originY); float oy = strToFloat(originY);
GuiImage* comp = new GuiImage(mWindow, x, y, "", w, h, true); ImageComponent* comp = new ImageComponent(mWindow, x, y, "", w, h, true);
comp->setOrigin(ox, oy); comp->setOrigin(ox, oy);
comp->setTiling(tiled); comp->setTiling(tiled);
comp->setImage(path); comp->setImage(path);
mComponentVector.push_back(comp); addChild(comp);
return comp; return comp;
} }
@ -330,7 +330,7 @@ Gui* GuiTheme::createElement(pugi::xml_node data, Gui* parent)
} }
//expands a file path (./ becomes the directory of this theme file, ~/ becomes $HOME/) //expands a file path (./ becomes the directory of this theme file, ~/ becomes $HOME/)
std::string GuiTheme::expandPath(std::string path) std::string ThemeComponent::expandPath(std::string path)
{ {
if(path.empty()) if(path.empty())
return ""; return "";
@ -344,7 +344,7 @@ std::string GuiTheme::expandPath(std::string path)
} }
//takes a string containing a mathematical expression (possibly including variables) and resolves it to a float value //takes a string containing a mathematical expression (possibly including variables) and resolves it to a float value
float GuiTheme::resolveExp(std::string str, float defaultVal) float ThemeComponent::resolveExp(std::string str, float defaultVal)
{ {
if(str.empty()) if(str.empty())
return defaultVal; return defaultVal;
@ -360,7 +360,7 @@ float GuiTheme::resolveExp(std::string str, float defaultVal)
} }
//takes a string of hex and resolves it to an integer //takes a string of hex and resolves it to an integer
unsigned int GuiTheme::resolveColor(std::string str, unsigned int defaultColor) unsigned int ThemeComponent::resolveColor(std::string str, unsigned int defaultColor)
{ {
if(str.empty()) if(str.empty())
return defaultColor; return defaultColor;
@ -384,7 +384,7 @@ unsigned int GuiTheme::resolveColor(std::string str, unsigned int defaultColor)
} }
//splits a string in two at the first instance of the delimiter //splits a string in two at the first instance of the delimiter
void GuiTheme::splitString(std::string str, char delim, std::string* before, std::string* after) void ThemeComponent::splitString(std::string str, char delim, std::string* before, std::string* after)
{ {
if(str.empty()) if(str.empty())
return; return;
@ -400,7 +400,7 @@ void GuiTheme::splitString(std::string str, char delim, std::string* before, std
} }
//converts a string to a float //converts a string to a float
float GuiTheme::strToFloat(std::string str, float defaultVal) float ThemeComponent::strToFloat(std::string str, float defaultVal)
{ {
if(str.empty()) if(str.empty())
return defaultVal; return defaultVal;
@ -412,7 +412,7 @@ float GuiTheme::strToFloat(std::string str, float defaultVal)
return ret; return ret;
} }
Font* GuiTheme::resolveFont(pugi::xml_node node, std::string defaultPath, unsigned int defaultSize) Font* ThemeComponent::resolveFont(pugi::xml_node node, std::string defaultPath, unsigned int defaultSize)
{ {
if(!node) if(!node)
return NULL; return NULL;
@ -433,34 +433,21 @@ Font* GuiTheme::resolveFont(pugi::xml_node node, std::string defaultPath, unsign
return new Font(path, size); return new Font(path, size);
} }
void GuiTheme::render() void ThemeComponent::init()
{ {
for(unsigned int i = 0; i < mComponentVector.size(); i++)
{
mComponentVector.at(i)->render();
}
}
void GuiTheme::init()
{
for(unsigned int i = 0; i < mComponentVector.size(); i++)
{
mComponentVector.at(i)->init();
}
//fonts are special //fonts are special
if(mListFont) mListFont->init(); if(mListFont) mListFont->init();
if(mDescFont) mDescFont->init(); if(mDescFont) mDescFont->init();
if(mFastSelectFont) mFastSelectFont->init(); if(mFastSelectFont) mFastSelectFont->init();
GuiComponent::init();
} }
void GuiTheme::deinit() void ThemeComponent::deinit()
{ {
for(unsigned int i = 0; i < mComponentVector.size(); i++) GuiComponent::deinit();
{
mComponentVector.at(i)->deinit();
}
//fonts are special
if(mListFont) mListFont->deinit(); if(mListFont) mListFont->deinit();
if(mDescFont) mDescFont->deinit(); if(mDescFont) mDescFont->deinit();
if(mFastSelectFont) mFastSelectFont->deinit(); if(mFastSelectFont) mFastSelectFont->deinit();

View file

@ -1,27 +1,25 @@
#ifndef _GUITHEME_H_ #ifndef _THEMECOMPONENT_H_
#define _GUITHEME_H_ #define _THEMECOMPONENT_H_
#include <memory> #include <memory>
#include "../Gui.h" #include "../GuiComponent.h"
#include "../pugiXML/pugixml.hpp" #include "../pugiXML/pugixml.hpp"
#include "GuiBox.h" #include "GuiBox.h"
#include "../AudioManager.h" #include "../AudioManager.h"
#include "../Font.h" #include "../Font.h"
//This class loads an XML-defined list of Guis. //This class loads an XML-defined list of Guis.
class GuiTheme : public Gui class ThemeComponent : public GuiComponent
{ {
public: public:
GuiTheme(Window* window, bool detailed, std::string path = ""); ThemeComponent(Window* window, bool detailed, std::string path = "");
~GuiTheme(); virtual ~ThemeComponent();
void readXML(std::string path); void readXML(std::string path);
GuiBoxData getBoxData(); GuiBoxData getBoxData();
void render();
void init(); void init();
void deinit(); void deinit();
@ -34,11 +32,12 @@ public:
Font* getListFont(); Font* getListFont();
Font* getDescriptionFont(); Font* getDescriptionFont();
Font* getFastSelectFont(); Font* getFastSelectFont();
private: private:
void setDefaults(); void setDefaults();
void deleteComponents(); void deleteComponents();
void createComponentChildren(pugi::xml_node node, Gui* parent); void createComponentChildren(pugi::xml_node node, GuiComponent* parent);
Gui* createElement(pugi::xml_node data, Gui* parent); GuiComponent* createElement(pugi::xml_node data, GuiComponent* parent);
//utility functions //utility functions
std::string expandPath(std::string path); std::string expandPath(std::string path);
@ -48,7 +47,6 @@ private:
float strToFloat(std::string str, float defaultVal = 0.0f); float strToFloat(std::string str, float defaultVal = 0.0f);
Font* resolveFont(pugi::xml_node node, std::string defaultPath, unsigned int defaultSize); Font* resolveFont(pugi::xml_node node, std::string defaultPath, unsigned int defaultSize);
std::vector<Gui*> mComponentVector;
std::string mPath; std::string mPath;
bool mDetailed; bool mDetailed;
@ -59,6 +57,7 @@ private:
std::map<std::string, std::string> mStringMap; std::map<std::string, std::string> mStringMap;
GuiBoxData mBoxData; GuiBoxData mBoxData;
Font* mListFont; Font* mListFont;
Font* mDescFont; Font* mDescFont;
Font* mFastSelectFont; Font* mFastSelectFont;