ui anchoring
This commit is contained in:
parent
e94024de67
commit
a5cd0bed74
|
@ -33,8 +33,6 @@
|
||||||
#include "net/connections.h"
|
#include "net/connections.h"
|
||||||
#include "ui/uicontainer.h"
|
#include "ui/uicontainer.h"
|
||||||
|
|
||||||
#define MINIMUN_UPDATE_DELAY 50
|
|
||||||
|
|
||||||
Engine g_engine;
|
Engine g_engine;
|
||||||
|
|
||||||
void Engine::init()
|
void Engine::init()
|
||||||
|
@ -57,17 +55,11 @@ void Engine::terminate()
|
||||||
void Engine::run()
|
void Engine::run()
|
||||||
{
|
{
|
||||||
int ticks = Platform::getTicks();
|
int ticks = Platform::getTicks();
|
||||||
int lastUpdateTicks = ticks;
|
|
||||||
int lastFpsTicks = ticks;
|
int lastFpsTicks = ticks;
|
||||||
int updateElapsedTicks = ticks;
|
|
||||||
int frameCount = 0;
|
int frameCount = 0;
|
||||||
int fps = 0;
|
int fps = 0;
|
||||||
m_running = true;
|
m_running = true;
|
||||||
|
|
||||||
// before redering do the first update
|
|
||||||
update(ticks, 0);
|
|
||||||
lastUpdateTicks = ticks;
|
|
||||||
|
|
||||||
while(!m_stopping) {
|
while(!m_stopping) {
|
||||||
// poll platform events
|
// poll platform events
|
||||||
Platform::poll();
|
Platform::poll();
|
||||||
|
@ -75,18 +67,11 @@ void Engine::run()
|
||||||
// poll network events
|
// poll network events
|
||||||
g_connections.poll();
|
g_connections.poll();
|
||||||
|
|
||||||
// update before redering
|
|
||||||
ticks = Platform::getTicks();
|
ticks = Platform::getTicks();
|
||||||
|
|
||||||
// poll diaptcher tasks
|
// poll diaptcher tasks
|
||||||
g_dispatcher.poll(ticks);
|
g_dispatcher.poll(ticks);
|
||||||
|
|
||||||
updateElapsedTicks = ticks - lastUpdateTicks;
|
|
||||||
if(updateElapsedTicks >= MINIMUN_UPDATE_DELAY) {
|
|
||||||
update(ticks, updateElapsedTicks);
|
|
||||||
lastUpdateTicks = ticks;
|
|
||||||
}
|
|
||||||
|
|
||||||
// render only when visible
|
// render only when visible
|
||||||
if(Platform::isWindowVisible()) {
|
if(Platform::isWindowVisible()) {
|
||||||
// calculate and fps
|
// calculate and fps
|
||||||
|
@ -140,13 +125,6 @@ void Engine::render()
|
||||||
g_graphics.endRender();
|
g_graphics.endRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::update(int ticks, int elapsedTicks)
|
|
||||||
{
|
|
||||||
if(m_currentState)
|
|
||||||
m_currentState->update(ticks, elapsedTicks);
|
|
||||||
g_ui->update(ticks, elapsedTicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::onClose()
|
void Engine::onClose()
|
||||||
{
|
{
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
|
@ -156,7 +134,7 @@ void Engine::onClose()
|
||||||
void Engine::onResize(const Size& size)
|
void Engine::onResize(const Size& size)
|
||||||
{
|
{
|
||||||
g_graphics.resize(size);
|
g_graphics.resize(size);
|
||||||
g_ui->resize(size);
|
g_ui->setSize(size);
|
||||||
|
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
m_currentState->onResize(size);
|
m_currentState->onResize(size);
|
||||||
|
|
|
@ -68,8 +68,6 @@ public:
|
||||||
private:
|
private:
|
||||||
/// Called to render every frame
|
/// Called to render every frame
|
||||||
void render();
|
void render();
|
||||||
/// Called between renders
|
|
||||||
void update(int ticks, int elapsedTicks);
|
|
||||||
|
|
||||||
bool m_stopping;
|
bool m_stopping;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
|
|
@ -43,7 +43,6 @@ public:
|
||||||
virtual void onResize(const Size& size) = 0;
|
virtual void onResize(const Size& size) = 0;
|
||||||
|
|
||||||
virtual void render() = 0;
|
virtual void render() = 0;
|
||||||
virtual void update(int ticks, int elapsedTicks) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GAMESTATE_H
|
#endif // GAMESTATE_H
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace Platform
|
||||||
void swapBuffers();
|
void swapBuffers();
|
||||||
|
|
||||||
/// Get the app user directory, the place to save files configurations files
|
/// Get the app user directory, the place to save files configurations files
|
||||||
const char *getAppUserDir();
|
std::string getAppUserDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PLATFORM_H
|
#endif // PLATFORM_H
|
||||||
|
|
|
@ -54,6 +54,8 @@ public:
|
||||||
inline T top() const { return y1; }
|
inline T top() const { return y1; }
|
||||||
inline T right() const { return x2; }
|
inline T right() const { return x2; }
|
||||||
inline T bottom() const { return y2; }
|
inline T bottom() const { return y2; }
|
||||||
|
inline T horizontalCenter() const { return x1 + (x2 - x1)/2; }
|
||||||
|
inline T verticalCenter() const { return y1 + (y2 - y1)/2; }
|
||||||
inline T x() const { return x1; }
|
inline T x() const { return x1; }
|
||||||
inline T y() const { return y1; }
|
inline T y() const { return y1; }
|
||||||
inline TPoint<T> topLeft() const { return TPoint<T>(x1, y1); }
|
inline TPoint<T> topLeft() const { return TPoint<T>(x1, y1); }
|
||||||
|
@ -108,6 +110,16 @@ public:
|
||||||
x2 = x1 + w;
|
x2 = x1 + w;
|
||||||
y2 = y1 + h;
|
y2 = y1 + h;
|
||||||
}
|
}
|
||||||
|
inline void moveHorizontalCenter(T x) {
|
||||||
|
T w = x2 - x1;
|
||||||
|
x1 = x - w/2;
|
||||||
|
x2 = x1 + w;
|
||||||
|
}
|
||||||
|
inline void moveVerticalCenter(T y) {
|
||||||
|
T h = y2 - y1;
|
||||||
|
y1 = y - h/2;
|
||||||
|
y2 = y1 + h;
|
||||||
|
}
|
||||||
|
|
||||||
inline bool contains(const TPoint<T> &p, bool insideOnly = false) const {
|
inline bool contains(const TPoint<T> &p, bool insideOnly = false) const {
|
||||||
T l, r;
|
T l, r;
|
||||||
|
|
|
@ -30,11 +30,6 @@ void UIContainer::addChild(UIElementPtr child)
|
||||||
{
|
{
|
||||||
m_children.push_back(child);
|
m_children.push_back(child);
|
||||||
child->setParent(asUIContainer());
|
child->setParent(asUIContainer());
|
||||||
|
|
||||||
// adjust child rect
|
|
||||||
Rect childRect = child->getRect();
|
|
||||||
childRect.translate(m_rect.topLeft());
|
|
||||||
child->setRect(childRect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIContainer::removeChild(UIElementPtr child)
|
void UIContainer::removeChild(UIElementPtr child)
|
||||||
|
@ -42,12 +37,14 @@ void UIContainer::removeChild(UIElementPtr child)
|
||||||
if(m_activeElement == child)
|
if(m_activeElement == child)
|
||||||
setActiveElement(UIElementPtr());
|
setActiveElement(UIElementPtr());
|
||||||
m_children.remove(child);
|
m_children.remove(child);
|
||||||
|
if(child->getParent() == shared_from_this())
|
||||||
|
child->setParent(UIContainerPtr());
|
||||||
}
|
}
|
||||||
|
|
||||||
UIElementPtr UIContainer::getChildByName(const std::string& name) const
|
UIElementPtr UIContainer::getChildById(const std::string& id) const
|
||||||
{
|
{
|
||||||
for(auto it = m_children.begin(); it != m_children.end(); ++it) {
|
for(auto it = m_children.begin(); it != m_children.end(); ++it) {
|
||||||
if((*it)->getName() == name) {
|
if((*it)->getId() == id) {
|
||||||
return (*it);
|
return (*it);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -55,45 +52,6 @@ UIElementPtr UIContainer::getChildByName(const std::string& name) const
|
||||||
return UIElementPtr();
|
return UIElementPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void UIContainer::setRect(const Rect& rect)
|
|
||||||
{
|
|
||||||
// update children rect
|
|
||||||
for(auto it = m_children.begin(); it != m_children.end(); ++it) {
|
|
||||||
const UIElementPtr& child = (*it);
|
|
||||||
|
|
||||||
// transforme child rect
|
|
||||||
Rect childRect = child->getRect();
|
|
||||||
childRect.translate(-m_rect.topLeft());
|
|
||||||
childRect.translate(rect.topLeft());
|
|
||||||
child->setRect(childRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_rect = rect;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIContainer::resize(const Size& size)
|
|
||||||
{
|
|
||||||
Rect newRect = m_rect;
|
|
||||||
newRect.setSize(size);
|
|
||||||
setRect(newRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIContainer::move(const Point& trans)
|
|
||||||
{
|
|
||||||
Rect newRect = m_rect;
|
|
||||||
newRect.translate(trans);
|
|
||||||
setRect(newRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIContainer::moveTo(const Point& pos)
|
|
||||||
{
|
|
||||||
Rect newRect = m_rect;
|
|
||||||
newRect.moveTo(pos);
|
|
||||||
setRect(newRect);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIContainer::render()
|
void UIContainer::render()
|
||||||
{
|
{
|
||||||
UIElement::render();
|
UIElement::render();
|
||||||
|
@ -103,11 +61,6 @@ void UIContainer::render()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIContainer::update(int ticks, int elapsedTicks)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UIContainer::onInputEvent(InputEvent* event)
|
bool UIContainer::onInputEvent(InputEvent* event)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -36,20 +36,14 @@ public:
|
||||||
UIContainer(UI::EElementType type = UI::Container) : UIElement(type) { }
|
UIContainer(UI::EElementType type = UI::Container) : UIElement(type) { }
|
||||||
virtual ~UIContainer() { }
|
virtual ~UIContainer() { }
|
||||||
|
|
||||||
virtual void addChild(UIElementPtr child);
|
void addChild(UIElementPtr child);
|
||||||
virtual void removeChild(UIElementPtr child);
|
void removeChild(UIElementPtr child);
|
||||||
virtual UIElementPtr getChildByName(const std::string& name) const;
|
UIElementPtr getChildById(const std::string& id) const;
|
||||||
|
|
||||||
virtual void setRect(const Rect& rect);
|
|
||||||
virtual void resize(const Size& size);
|
|
||||||
virtual void move(const Point& trans);
|
|
||||||
virtual void moveTo(const Point& pos);
|
|
||||||
|
|
||||||
virtual void render();
|
virtual void render();
|
||||||
virtual void update(int ticks, int elapsedTicks);
|
|
||||||
virtual bool onInputEvent(InputEvent *event);
|
virtual bool onInputEvent(InputEvent *event);
|
||||||
|
|
||||||
virtual void setActiveElement(UIElementPtr activeElement);
|
void setActiveElement(UIElementPtr activeElement);
|
||||||
UIElementPtr getActiveElement() const { return m_activeElement; }
|
UIElementPtr getActiveElement() const { return m_activeElement; }
|
||||||
|
|
||||||
virtual UI::EElementType getElementType() const { return UI::Container; }
|
virtual UI::EElementType getElementType() const { return UI::Container; }
|
||||||
|
|
|
@ -24,9 +24,39 @@
|
||||||
|
|
||||||
#include "uielement.h"
|
#include "uielement.h"
|
||||||
#include "uiskins.h"
|
#include "uiskins.h"
|
||||||
|
#include "uielementskin.h"
|
||||||
|
|
||||||
|
int AnchorLine::getPos() const
|
||||||
|
{
|
||||||
|
UIElementPtr element = m_relativeElement.lock();
|
||||||
|
if(element) {
|
||||||
|
switch(m_anchorType) {
|
||||||
|
case ANCHOR_LEFT:
|
||||||
|
return element->getRect().left();
|
||||||
|
case ANCHOR_RIGHT:
|
||||||
|
return element->getRect().right();
|
||||||
|
case ANCHOR_TOP:
|
||||||
|
return element->getRect().top();
|
||||||
|
case ANCHOR_BOTTOM:
|
||||||
|
return element->getRect().bottom();
|
||||||
|
case ANCHOR_HORIZONTAL_CENTER:
|
||||||
|
return element->getRect().horizontalCenter();
|
||||||
|
case ANCHOR_VERTICAL_CENTER:
|
||||||
|
return element->getRect().verticalCenter();
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logError("anchor line of an element have expired");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
UIElement::UIElement(UI::EElementType type) :
|
UIElement::UIElement(UI::EElementType type) :
|
||||||
m_type(type)
|
m_type(type),
|
||||||
|
m_marginLeft(0),
|
||||||
|
m_marginRight(0),
|
||||||
|
m_marginTop(0),
|
||||||
|
m_marginBottom(0)
|
||||||
{
|
{
|
||||||
// set default skin
|
// set default skin
|
||||||
setSkin(g_uiSkins.getElementSkin(type));
|
setSkin(g_uiSkins.getElementSkin(type));
|
||||||
|
@ -42,7 +72,7 @@ bool UIElement::setSkin(const std::string& skinName)
|
||||||
void UIElement::setSkin(UIElementSkin* skin)
|
void UIElement::setSkin(UIElementSkin* skin)
|
||||||
{
|
{
|
||||||
if(skin && !m_rect.isValid()) {
|
if(skin && !m_rect.isValid()) {
|
||||||
m_rect.setSize(skin->getDefaultSize());
|
setSize(skin->getDefaultSize());
|
||||||
}
|
}
|
||||||
m_skin = skin;
|
m_skin = skin;
|
||||||
}
|
}
|
||||||
|
@ -53,3 +83,75 @@ void UIElement::render()
|
||||||
m_skin->draw(this);
|
m_skin->draw(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UIElement::setSize(const Size& size)
|
||||||
|
{
|
||||||
|
m_rect.setSize(size);
|
||||||
|
recalculateAnchors();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::setRect(const Rect& rect)
|
||||||
|
{
|
||||||
|
m_rect = rect;
|
||||||
|
recalculateAnchors();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::addAnchor(EAnchorType type, const AnchorLine& anchorLine)
|
||||||
|
{
|
||||||
|
if(!anchorLine.isValid()) {
|
||||||
|
logError("anchoring for an element has failed, got an invalid anchor line");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_anchors[type] = anchorLine;
|
||||||
|
anchorLine.getRelativeElement()->addAnchoredElement(asUIElement());
|
||||||
|
recalculateAnchors();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::addAnchoredElement(UIElementPtr anchoredElement)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
for(auto it = m_anchoredElements.begin(); it != m_anchoredElements.end(); ++it) {
|
||||||
|
if((*it).lock() == anchoredElement) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
m_anchoredElements.push_back(anchoredElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::recalculateAnchors()
|
||||||
|
{
|
||||||
|
// horizontal
|
||||||
|
if(m_anchors[ANCHOR_HORIZONTAL_CENTER].isValid()) {
|
||||||
|
m_rect.moveHorizontalCenter(m_anchors[ANCHOR_HORIZONTAL_CENTER].getPos() + m_marginLeft - m_marginRight);
|
||||||
|
} else {
|
||||||
|
if(m_anchors[ANCHOR_LEFT].isValid() && m_anchors[ANCHOR_RIGHT].isValid()) {
|
||||||
|
m_rect.setLeft(m_anchors[ANCHOR_LEFT].getPos() + m_marginLeft);
|
||||||
|
m_rect.setRight(m_anchors[ANCHOR_RIGHT].getPos() - m_marginRight);
|
||||||
|
} else if(m_anchors[ANCHOR_LEFT].isValid()) {
|
||||||
|
m_rect.moveLeft(m_anchors[ANCHOR_LEFT].getPos() + m_marginLeft);
|
||||||
|
} else if(m_anchors[ANCHOR_RIGHT].isValid()) {
|
||||||
|
m_rect.moveRight(m_anchors[ANCHOR_RIGHT].getPos() - m_marginRight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// vertical
|
||||||
|
if(m_anchors[ANCHOR_VERTICAL_CENTER].isValid()) {
|
||||||
|
m_rect.moveVerticalCenter(m_anchors[ANCHOR_VERTICAL_CENTER].getPos() + m_marginTop - m_marginBottom);
|
||||||
|
} else {
|
||||||
|
if(m_anchors[ANCHOR_TOP].isValid() && m_anchors[ANCHOR_BOTTOM].isValid()) {
|
||||||
|
m_rect.setLeft(m_anchors[ANCHOR_TOP].getPos() + m_marginTop);
|
||||||
|
m_rect.setRight(m_anchors[ANCHOR_BOTTOM].getPos() - m_marginBottom);
|
||||||
|
} else if(m_anchors[ANCHOR_TOP].isValid()) {
|
||||||
|
m_rect.moveTop(m_anchors[ANCHOR_TOP].getPos() + m_marginTop);
|
||||||
|
} else if(m_anchors[ANCHOR_BOTTOM].isValid()) {
|
||||||
|
m_rect.moveBottom(m_anchors[ANCHOR_BOTTOM].getPos() - m_marginBottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto it = m_anchoredElements.begin(); it != m_anchoredElements.end(); ++it) {
|
||||||
|
UIElementPtr element = (*it).lock();
|
||||||
|
if(element)
|
||||||
|
element->recalculateAnchors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -29,13 +29,45 @@
|
||||||
#include "../input.h"
|
#include "../input.h"
|
||||||
#include "../rect.h"
|
#include "../rect.h"
|
||||||
#include "uiconstants.h"
|
#include "uiconstants.h"
|
||||||
#include "uielementskin.h"
|
|
||||||
|
class UIElementSkin;
|
||||||
|
|
||||||
class UIContainer;
|
class UIContainer;
|
||||||
typedef std::shared_ptr<UIContainer> UIContainerPtr;
|
typedef std::shared_ptr<UIContainer> UIContainerPtr;
|
||||||
|
typedef std::weak_ptr<UIContainer> UIContainerWeakPtr;
|
||||||
|
|
||||||
class UIElement;
|
class UIElement;
|
||||||
typedef std::shared_ptr<UIElement> UIElementPtr;
|
typedef std::shared_ptr<UIElement> UIElementPtr;
|
||||||
|
typedef std::weak_ptr<UIElement> UIElementWeakPtr;
|
||||||
|
|
||||||
|
enum EAnchorType {
|
||||||
|
ANCHOR_LEFT = 0,
|
||||||
|
ANCHOR_RIGHT,
|
||||||
|
ANCHOR_TOP,
|
||||||
|
ANCHOR_BOTTOM,
|
||||||
|
ANCHOR_HORIZONTAL_CENTER,
|
||||||
|
ANCHOR_VERTICAL_CENTER,
|
||||||
|
ANCHOR_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
class AnchorLine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AnchorLine() : m_anchorType(ANCHOR_NONE) { }
|
||||||
|
AnchorLine(const AnchorLine& other) :
|
||||||
|
m_relativeElement(other.m_relativeElement), m_anchorType(other.m_anchorType) { }
|
||||||
|
AnchorLine(UIElementPtr relativeElement, EAnchorType anchorType) :
|
||||||
|
m_relativeElement(relativeElement), m_anchorType(anchorType) { }
|
||||||
|
bool isValid() const { return (m_anchorType != ANCHOR_NONE && !m_relativeElement.expired()); }
|
||||||
|
|
||||||
|
int getPos() const;
|
||||||
|
EAnchorType getAnchorType() const { return m_anchorType; }
|
||||||
|
UIElementPtr getRelativeElement() const { return m_relativeElement.lock(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
UIElementWeakPtr m_relativeElement;
|
||||||
|
EAnchorType m_anchorType;
|
||||||
|
};
|
||||||
|
|
||||||
class UIElement : public std::enable_shared_from_this<UIElement>
|
class UIElement : public std::enable_shared_from_this<UIElement>
|
||||||
{
|
{
|
||||||
|
@ -44,7 +76,6 @@ public:
|
||||||
virtual ~UIElement() { }
|
virtual ~UIElement() { }
|
||||||
|
|
||||||
virtual void render();
|
virtual void render();
|
||||||
virtual void update(int ticks, int elapsedTicks) { }
|
|
||||||
virtual bool onInputEvent(InputEvent *event) { return false; }
|
virtual bool onInputEvent(InputEvent *event) { return false; }
|
||||||
|
|
||||||
bool setSkin(const std::string& skinName);
|
bool setSkin(const std::string& skinName);
|
||||||
|
@ -52,32 +83,67 @@ public:
|
||||||
UIElementSkin *getSkin() { return m_skin; }
|
UIElementSkin *getSkin() { return m_skin; }
|
||||||
|
|
||||||
virtual void setParent(UIContainerPtr parent) { m_parent = parent; }
|
virtual void setParent(UIContainerPtr parent) { m_parent = parent; }
|
||||||
UIContainerPtr getParent() const { return m_parent; }
|
UIContainerPtr getParent() const { return m_parent.lock(); }
|
||||||
|
|
||||||
virtual void setName(const std::string& name) { m_name = name; }
|
void setId(const std::string& id) { m_id = id; }
|
||||||
const std::string& getName() const { return m_name; }
|
const std::string& getId() const { return m_id; }
|
||||||
|
|
||||||
virtual void setRect(const Rect& rect) { m_rect = rect; }
|
void setSize(const Size& size);
|
||||||
|
Size getSize() { return m_rect.size(); }
|
||||||
|
|
||||||
|
void setRect(const Rect& rect);
|
||||||
const Rect& getRect() const{ return m_rect; }
|
const Rect& getRect() const{ return m_rect; }
|
||||||
|
|
||||||
virtual void setActive(bool active) { m_active = active; }
|
void setActive(bool active) { m_active = active; }
|
||||||
bool isActive() const { return m_active; }
|
bool isActive() const { return m_active; }
|
||||||
|
|
||||||
virtual void setVisible(bool visible) { m_visible = visible; }
|
void setVisible(bool visible) { m_visible = visible; }
|
||||||
bool isVisible() const { return m_visible; }
|
bool isVisible() const { return m_visible; }
|
||||||
|
|
||||||
UI::EElementType getElementType() const { return m_type; }
|
UI::EElementType getElementType() const { return m_type; }
|
||||||
|
|
||||||
UIElementPtr asUIElement() { return shared_from_this(); }
|
UIElementPtr asUIElement() { return shared_from_this(); }
|
||||||
|
|
||||||
|
void recalculateAnchors();
|
||||||
|
|
||||||
|
void addAnchor(EAnchorType type, const AnchorLine& anchorLine);
|
||||||
|
void anchorLeft(const AnchorLine& anchorLine) { addAnchor(ANCHOR_LEFT, anchorLine); }
|
||||||
|
void anchorRight(const AnchorLine& anchorLine) { addAnchor(ANCHOR_RIGHT, anchorLine); }
|
||||||
|
void anchorTop(const AnchorLine& anchorLine) { addAnchor(ANCHOR_TOP, anchorLine); }
|
||||||
|
void anchorBottom(const AnchorLine& anchorLine) { addAnchor(ANCHOR_BOTTOM, anchorLine); }
|
||||||
|
void anchorHorizontalCenter(const AnchorLine& anchorLine) { addAnchor(ANCHOR_HORIZONTAL_CENTER, anchorLine); }
|
||||||
|
void anchorVerticalCenter(const AnchorLine& anchorLine) { addAnchor(ANCHOR_VERTICAL_CENTER, anchorLine); }
|
||||||
|
|
||||||
|
AnchorLine left() { return AnchorLine(asUIElement(), ANCHOR_LEFT); }
|
||||||
|
AnchorLine right() { return AnchorLine(asUIElement(), ANCHOR_RIGHT); }
|
||||||
|
AnchorLine top() { return AnchorLine(asUIElement(), ANCHOR_TOP); }
|
||||||
|
AnchorLine bottom() { return AnchorLine(asUIElement(), ANCHOR_BOTTOM); }
|
||||||
|
AnchorLine horizontalCenter() { return AnchorLine(asUIElement(), ANCHOR_HORIZONTAL_CENTER); }
|
||||||
|
AnchorLine verticalCenter() { return AnchorLine(asUIElement(), ANCHOR_VERTICAL_CENTER); }
|
||||||
|
|
||||||
|
void setMargin(int top, int left, int bottom, int right) { m_marginLeft = left; m_marginRight = right; m_marginTop = top; m_marginBottom = bottom; recalculateAnchors(); }
|
||||||
|
void setMargin(int horizontal, int vertical) { m_marginLeft = m_marginRight = horizontal; m_marginTop = m_marginBottom = vertical; recalculateAnchors(); }
|
||||||
|
void setMargin(int margin) { m_marginLeft = m_marginRight = m_marginTop = m_marginBottom = margin; recalculateAnchors(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void addAnchoredElement(UIElementPtr anchoredElement);
|
||||||
|
|
||||||
UI::EElementType m_type;
|
UI::EElementType m_type;
|
||||||
UIContainerPtr m_parent;
|
UIContainerWeakPtr m_parent;
|
||||||
UIElementSkin *m_skin;
|
UIElementSkin *m_skin;
|
||||||
Rect m_rect;
|
Rect m_rect;
|
||||||
std::string m_name;
|
std::string m_id;
|
||||||
bool m_visible;
|
bool m_visible;
|
||||||
bool m_active;
|
bool m_active;
|
||||||
|
|
||||||
|
private:
|
||||||
|
AnchorLine m_anchors[6];
|
||||||
|
|
||||||
|
int m_marginLeft;
|
||||||
|
int m_marginRight;
|
||||||
|
int m_marginTop;
|
||||||
|
int m_marginBottom;
|
||||||
|
std::list<UIElementWeakPtr> m_anchoredElements;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // UIELEMENT_H
|
#endif // UIELEMENT_H
|
||||||
|
|
|
@ -29,6 +29,12 @@
|
||||||
|
|
||||||
UISkins g_uiSkins;
|
UISkins g_uiSkins;
|
||||||
|
|
||||||
|
UISkins::~UISkins()
|
||||||
|
{
|
||||||
|
for(auto it = m_elementSkins.begin(); it != m_elementSkins.end(); ++it)
|
||||||
|
delete (*it);
|
||||||
|
}
|
||||||
|
|
||||||
bool UISkins::load(const std::string& file)
|
bool UISkins::load(const std::string& file)
|
||||||
{
|
{
|
||||||
std::string fileContents = g_resources.loadTextFile(file);
|
std::string fileContents = g_resources.loadTextFile(file);
|
||||||
|
|
|
@ -35,6 +35,7 @@ class UISkins
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UISkins() { }
|
UISkins() { }
|
||||||
|
~UISkins();
|
||||||
|
|
||||||
bool load(const std::string& file);
|
bool load(const std::string& file);
|
||||||
|
|
||||||
|
|
|
@ -351,13 +351,13 @@ bool Platform::isWindowMaximized()
|
||||||
return win32.maximized;
|
return win32.maximized;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *Platform::getAppUserDir()
|
std::string Platform::getAppUserDir()
|
||||||
{
|
{
|
||||||
std::stringstream sdir;
|
std::stringstream sdir;
|
||||||
sdir << PHYSFS_getUserDir() << "/." << win32.appName << "/";
|
sdir << PHYSFS_getUserDir() << "/." << win32.appName << "/";
|
||||||
if((mkdir(sdir.str().c_str()) != 0) && (errno != EEXIST))
|
if((mkdir(sdir.str().c_str()) != 0) && (errno != EEXIST))
|
||||||
logError("Couldn't create directory for saving configuration file. (%s)", sdir.str().c_str());
|
logError("Couldn't create directory for saving configuration file. (%s)", sdir.str().c_str());
|
||||||
return sdir.str().c_str();
|
return sdir.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
|
@ -826,11 +826,11 @@ bool Platform::isWindowMaximized()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *Platform::getAppUserDir()
|
std::string Platform::getAppUserDir()
|
||||||
{
|
{
|
||||||
std::stringstream sdir;
|
std::stringstream sdir;
|
||||||
sdir << PHYSFS_getUserDir() << "/." << x11.appName << "/";
|
sdir << PHYSFS_getUserDir() << "/." << x11.appName << "/";
|
||||||
if((mkdir(sdir.str().c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) && (errno != EEXIST))
|
if((mkdir(sdir.str().c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) && (errno != EEXIST))
|
||||||
logError("Couldn't create directory for saving configuration file. (%s)", sdir.str().c_str());
|
logError("Couldn't create directory for saving configuration file. (%s)", sdir.str().c_str());
|
||||||
return sdir.str().c_str();
|
return sdir.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ void MenuState::onInputEvent(InputEvent* event)
|
||||||
|
|
||||||
void MenuState::onResize(const Size& size)
|
void MenuState::onResize(const Size& size)
|
||||||
{
|
{
|
||||||
recalculateMenuPanelPosition();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuState::render()
|
void MenuState::render()
|
||||||
|
@ -80,55 +80,52 @@ void MenuState::render()
|
||||||
g_graphics.drawTexturedRect(Rect(0, 0, screenSize), m_background.get(), texCoords);
|
g_graphics.drawTexturedRect(Rect(0, 0, screenSize), m_background.get(), texCoords);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuState::update(int ticks, int elapsedTicks)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuState::createMainMenu()
|
void MenuState::createMainMenu()
|
||||||
{
|
{
|
||||||
UIButtonPtr button;
|
UIButtonPtr button;
|
||||||
int y = 16;
|
int y = 0;
|
||||||
|
|
||||||
m_menuPanel = UIPanelPtr(new UIPanel);
|
m_menuPanel = UIPanelPtr(new UIPanel);
|
||||||
m_menuPanel->setSkin("roundedGridPanel");
|
m_menuPanel->setSkin("roundedGridPanel");
|
||||||
recalculateMenuPanelPosition();
|
m_menuPanel->anchorLeft(g_ui->left());
|
||||||
|
m_menuPanel->anchorBottom(g_ui->bottom());
|
||||||
|
m_menuPanel->setSize(Size(118, 172));
|
||||||
|
m_menuPanel->setMargin(0, 60, 70, 0);
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Enter Game"));
|
button = UIButtonPtr(new UIButton("Enter Game"));
|
||||||
button->setRect(Rect(16, y, 86, 20));
|
button->anchorLeft(m_menuPanel->left());
|
||||||
|
button->anchorTop(m_menuPanel->top());
|
||||||
|
button->anchorHorizontalCenter(m_menuPanel->horizontalCenter());
|
||||||
|
button->setMargin(y += 16);
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Access Account"));
|
button = UIButtonPtr(new UIButton("Access Account"));
|
||||||
button->setRect(Rect(16, y, 86, 20));
|
button->anchorLeft(m_menuPanel->left());
|
||||||
|
button->anchorTop(m_menuPanel->top());
|
||||||
|
button->anchorHorizontalCenter(m_menuPanel->horizontalCenter());
|
||||||
|
button->setMargin(y += 30);
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Options"));
|
button = UIButtonPtr(new UIButton("Options"));
|
||||||
button->setRect(Rect(16, y, 86, 20));
|
button->anchorLeft(m_menuPanel->left());
|
||||||
|
button->anchorTop(m_menuPanel->top());
|
||||||
|
button->anchorHorizontalCenter(m_menuPanel->horizontalCenter());
|
||||||
|
button->setMargin(y += 30);
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Info"));
|
button = UIButtonPtr(new UIButton("Info"));
|
||||||
button->setRect(Rect(16, y, 86, 20));
|
button->anchorLeft(m_menuPanel->left());
|
||||||
|
button->anchorTop(m_menuPanel->top());
|
||||||
|
button->anchorHorizontalCenter(m_menuPanel->horizontalCenter());
|
||||||
|
button->setMargin(y += 30);
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Exit Game"));
|
button = UIButtonPtr(new UIButton("Exit Game"));
|
||||||
button->setRect(Rect(16, y, 86, 20));
|
button->anchorLeft(m_menuPanel->left());
|
||||||
|
button->anchorTop(m_menuPanel->top());
|
||||||
|
button->anchorHorizontalCenter(m_menuPanel->horizontalCenter());
|
||||||
|
button->setMargin(y += 30);
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
|
||||||
|
|
||||||
g_ui->addChild(m_menuPanel);
|
g_ui->addChild(m_menuPanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuState::recalculateMenuPanelPosition()
|
|
||||||
{
|
|
||||||
if(m_menuPanel) {
|
|
||||||
// calculate panel rect
|
|
||||||
Size panelSize = Size(117, 171);
|
|
||||||
Rect panelRect = Rect(0, 0, panelSize);
|
|
||||||
panelRect.moveBottomLeft(Point(60, g_graphics.getScreenSize().height() - 70));
|
|
||||||
m_menuPanel->setRect(panelRect);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -44,11 +44,9 @@ public:
|
||||||
void onResize(const Size& size);
|
void onResize(const Size& size);
|
||||||
|
|
||||||
void render();
|
void render();
|
||||||
void update(int ticks, int elapsedTicks);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createMainMenu();
|
void createMainMenu();
|
||||||
void recalculateMenuPanelPosition();
|
|
||||||
|
|
||||||
UIPanelPtr m_menuPanel;
|
UIPanelPtr m_menuPanel;
|
||||||
TexturePtr m_background;
|
TexturePtr m_background;
|
||||||
|
|
|
@ -57,9 +57,3 @@ void TestState::render()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestState::update(int ticks, int elapsedTicks)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ public:
|
||||||
void onResize(const Size& size);
|
void onResize(const Size& size);
|
||||||
|
|
||||||
void render();
|
void render();
|
||||||
void update(int ticks, int elapsedTicks);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TESTSTATE_H
|
#endif // TESTSTATE_H
|
||||||
|
|
Loading…
Reference in New Issue