ui skinning
This commit is contained in:
parent
f54ef6401d
commit
e94024de67
|
@ -74,7 +74,9 @@ SET(SOURCES
|
||||||
|
|
||||||
# ui
|
# ui
|
||||||
src/framework/ui/uielement.cpp
|
src/framework/ui/uielement.cpp
|
||||||
|
src/framework/ui/uielementskin.cpp
|
||||||
src/framework/ui/uicontainer.cpp
|
src/framework/ui/uicontainer.cpp
|
||||||
|
src/framework/ui/uiskins.cpp
|
||||||
src/framework/ui/uipanel.cpp
|
src/framework/ui/uipanel.cpp
|
||||||
src/framework/ui/uibutton.cpp
|
src/framework/ui/uibutton.cpp
|
||||||
src/framework/ui/uilabel.cpp
|
src/framework/ui/uilabel.cpp
|
||||||
|
|
|
@ -136,7 +136,7 @@ void Engine::render()
|
||||||
g_graphics.beginRender();
|
g_graphics.beginRender();
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
m_currentState->render();
|
m_currentState->render();
|
||||||
g_gui->render();
|
g_ui->render();
|
||||||
g_graphics.endRender();
|
g_graphics.endRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ void Engine::update(int ticks, int elapsedTicks)
|
||||||
{
|
{
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
m_currentState->update(ticks, elapsedTicks);
|
m_currentState->update(ticks, elapsedTicks);
|
||||||
g_gui->update(ticks, elapsedTicks);
|
g_ui->update(ticks, elapsedTicks);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::onClose()
|
void Engine::onClose()
|
||||||
|
@ -156,7 +156,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_gui->resize(size);
|
g_ui->resize(size);
|
||||||
|
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
m_currentState->onResize(size);
|
m_currentState->onResize(size);
|
||||||
|
@ -165,7 +165,7 @@ void Engine::onResize(const Size& size)
|
||||||
void Engine::onInputEvent(InputEvent *event)
|
void Engine::onInputEvent(InputEvent *event)
|
||||||
{
|
{
|
||||||
// inputs goest to gui first
|
// inputs goest to gui first
|
||||||
if(!g_gui->onInputEvent(event)) {
|
if(!g_ui->onInputEvent(event)) {
|
||||||
// if gui didnt capture the input then goes to the state
|
// if gui didnt capture the input then goes to the state
|
||||||
if(m_currentState)
|
if(m_currentState)
|
||||||
m_currentState->onInputEvent(event);
|
m_currentState->onInputEvent(event);
|
||||||
|
|
|
@ -36,11 +36,6 @@ Font::Font() :
|
||||||
|
|
||||||
bool Font::load(const std::string& file)
|
bool Font::load(const std::string& file)
|
||||||
{
|
{
|
||||||
if(!g_resources.fileExists(file)) {
|
|
||||||
logError("Font file %s does not exists", file.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string fileContents = g_resources.loadTextFile(file);
|
std::string fileContents = g_resources.loadTextFile(file);
|
||||||
if(!fileContents.size()) {
|
if(!fileContents.size()) {
|
||||||
logError("Empty font file \"%s", file.c_str());
|
logError("Empty font file \"%s", file.c_str());
|
||||||
|
|
|
@ -29,9 +29,11 @@
|
||||||
|
|
||||||
#include "uiconstants.h"
|
#include "uiconstants.h"
|
||||||
#include "uielement.h"
|
#include "uielement.h"
|
||||||
|
#include "uielementskin.h"
|
||||||
#include "uicontainer.h"
|
#include "uicontainer.h"
|
||||||
#include "uipanel.h"
|
#include "uipanel.h"
|
||||||
#include "uibutton.h"
|
#include "uibutton.h"
|
||||||
#include "uilabel.h"
|
#include "uilabel.h"
|
||||||
|
#include "uiskins.h"
|
||||||
|
|
||||||
#endif // UI_H
|
#endif // UI_H
|
||||||
|
|
|
@ -26,25 +26,9 @@
|
||||||
#include "../fonts.h"
|
#include "../fonts.h"
|
||||||
#include "../font.h"
|
#include "../font.h"
|
||||||
|
|
||||||
UIButton::UIButton(const std::string& text) :
|
|
||||||
m_text(text),
|
|
||||||
m_state(UI::ButtonUp)
|
|
||||||
{
|
|
||||||
m_imageButtonUp = ImagePtr(new BorderedImage("ui.png",
|
|
||||||
Rect(45,139,1,18),
|
|
||||||
Rect(130,139,1,18),
|
|
||||||
Rect(46,138,84,1),
|
|
||||||
Rect(46,157,84,1),
|
|
||||||
Rect(45,138,1,1),
|
|
||||||
Rect(130,138,1,1),
|
|
||||||
Rect(45,157,1,1),
|
|
||||||
Rect(130,157,1,1),
|
|
||||||
Rect(46,139,84,18)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIButton::render()
|
void UIButton::render()
|
||||||
{
|
{
|
||||||
m_imageButtonUp->draw(m_rect);
|
UIElement::render();
|
||||||
|
|
||||||
g_fonts.get("tibia-8px-antialised")->renderText(m_text, m_rect, ALIGN_CENTER);
|
g_fonts.get("tibia-8px-antialised")->renderText(m_text, m_rect, ALIGN_CENTER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,19 +32,17 @@
|
||||||
class UIButton : public UIElement
|
class UIButton : public UIElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UIButton(const std::string& text);
|
UIButton(const std::string& text) : UIElement(UI::Button),
|
||||||
|
m_text(text),
|
||||||
|
m_state(UI::ButtonUp) {
|
||||||
|
UIElement();
|
||||||
|
}
|
||||||
|
|
||||||
void render();
|
virtual void render();
|
||||||
|
|
||||||
virtual UI::EControlType getControlType() const { return UI::Button; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_text;
|
std::string m_text;
|
||||||
UI::EButtonState m_state;
|
UI::EButtonState m_state;
|
||||||
|
|
||||||
ImagePtr m_imageButtonUp;
|
|
||||||
ImagePtr m_imageButtonDown;
|
|
||||||
ImagePtr m_imageButtonOver;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<UIButton> UIButtonPtr;
|
typedef std::shared_ptr<UIButton> UIButtonPtr;
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace UI {
|
||||||
MessageBoxYesNo = MessageBoxYes | MessageBoxNo
|
MessageBoxYesNo = MessageBoxYes | MessageBoxNo
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EControlType
|
enum EElementType
|
||||||
{
|
{
|
||||||
Element,
|
Element,
|
||||||
Container,
|
Container,
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include "uicontainer.h"
|
#include "uicontainer.h"
|
||||||
|
|
||||||
UIContainerPtr g_gui(new UIContainer);
|
UIContainerPtr g_ui(new UIContainer);
|
||||||
|
|
||||||
void UIContainer::addChild(UIElementPtr child)
|
void UIContainer::addChild(UIElementPtr child)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,7 @@ void UIContainer::moveTo(const Point& pos)
|
||||||
|
|
||||||
void UIContainer::render()
|
void UIContainer::render()
|
||||||
{
|
{
|
||||||
|
UIElement::render();
|
||||||
for(auto it = m_children.begin(); it != m_children.end(); ++it) {
|
for(auto it = m_children.begin(); it != m_children.end(); ++it) {
|
||||||
const UIElementPtr& child = (*it);
|
const UIElementPtr& child = (*it);
|
||||||
child->render();
|
child->render();
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
class UIContainer : public UIElement
|
class UIContainer : public UIElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UIContainer() : UIElement() { }
|
UIContainer(UI::EElementType type = UI::Container) : UIElement(type) { }
|
||||||
virtual ~UIContainer() { }
|
virtual ~UIContainer() { }
|
||||||
|
|
||||||
virtual void addChild(UIElementPtr child);
|
virtual void addChild(UIElementPtr child);
|
||||||
|
@ -52,7 +52,7 @@ public:
|
||||||
virtual void setActiveElement(UIElementPtr activeElement);
|
virtual void setActiveElement(UIElementPtr activeElement);
|
||||||
UIElementPtr getActiveElement() const { return m_activeElement; }
|
UIElementPtr getActiveElement() const { return m_activeElement; }
|
||||||
|
|
||||||
virtual UI::EControlType getControlType() const { return UI::Container; }
|
virtual UI::EElementType getElementType() const { return UI::Container; }
|
||||||
|
|
||||||
UIContainerPtr asUIContainer() { return std::static_pointer_cast<UIContainer>(shared_from_this()); }
|
UIContainerPtr asUIContainer() { return std::static_pointer_cast<UIContainer>(shared_from_this()); }
|
||||||
|
|
||||||
|
@ -64,6 +64,6 @@ private:
|
||||||
void onMove(const Point& pos);
|
void onMove(const Point& pos);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern UIContainerPtr g_gui;
|
extern UIContainerPtr g_ui;
|
||||||
|
|
||||||
#endif // UICONTAINER_H
|
#endif // UICONTAINER_H
|
||||||
|
|
|
@ -23,3 +23,33 @@
|
||||||
|
|
||||||
|
|
||||||
#include "uielement.h"
|
#include "uielement.h"
|
||||||
|
#include "uiskins.h"
|
||||||
|
|
||||||
|
UIElement::UIElement(UI::EElementType type) :
|
||||||
|
m_type(type)
|
||||||
|
{
|
||||||
|
// set default skin
|
||||||
|
setSkin(g_uiSkins.getElementSkin(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool UIElement::setSkin(const std::string& skinName)
|
||||||
|
{
|
||||||
|
setSkin(g_uiSkins.getElementSkin(m_type, skinName));
|
||||||
|
return m_skin != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::setSkin(UIElementSkin* skin)
|
||||||
|
{
|
||||||
|
if(skin && !m_rect.isValid()) {
|
||||||
|
m_rect.setSize(skin->getDefaultSize());
|
||||||
|
}
|
||||||
|
m_skin = skin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElement::render()
|
||||||
|
{
|
||||||
|
if(m_skin)
|
||||||
|
m_skin->draw(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "../input.h"
|
#include "../input.h"
|
||||||
#include "../rect.h"
|
#include "../rect.h"
|
||||||
#include "uiconstants.h"
|
#include "uiconstants.h"
|
||||||
|
#include "uielementskin.h"
|
||||||
|
|
||||||
class UIContainer;
|
class UIContainer;
|
||||||
typedef std::shared_ptr<UIContainer> UIContainerPtr;
|
typedef std::shared_ptr<UIContainer> UIContainerPtr;
|
||||||
|
@ -39,13 +40,17 @@ typedef std::shared_ptr<UIElement> UIElementPtr;
|
||||||
class UIElement : public std::enable_shared_from_this<UIElement>
|
class UIElement : public std::enable_shared_from_this<UIElement>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UIElement() { }
|
UIElement(UI::EElementType type = UI::Element);
|
||||||
virtual ~UIElement() { }
|
virtual ~UIElement() { }
|
||||||
|
|
||||||
virtual void render() { }
|
virtual void render();
|
||||||
virtual void update(int ticks, int elapsedTicks) { }
|
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);
|
||||||
|
void setSkin(UIElementSkin *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; }
|
||||||
|
|
||||||
|
@ -61,13 +66,14 @@ public:
|
||||||
virtual void setVisible(bool visible) { m_visible = visible; }
|
virtual void setVisible(bool visible) { m_visible = visible; }
|
||||||
bool isVisible() const { return m_visible; }
|
bool isVisible() const { return m_visible; }
|
||||||
|
|
||||||
virtual UI::EControlType getControlType() const { return UI::Element; }
|
UI::EElementType getElementType() const { return m_type; }
|
||||||
|
|
||||||
UIElementPtr asUIElement() { return shared_from_this(); }
|
UIElementPtr asUIElement() { return shared_from_this(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
UI::EControlType m_type;
|
UI::EElementType m_type;
|
||||||
UIContainerPtr m_parent;
|
UIContainerPtr m_parent;
|
||||||
|
UIElementSkin *m_skin;
|
||||||
Rect m_rect;
|
Rect m_rect;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
bool m_visible;
|
bool m_visible;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 OTClient, https://github.com/edubart/otclient
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "uielementskin.h"
|
||||||
|
#include "uielement.h"
|
||||||
|
#include "../borderedimage.h"
|
||||||
|
#include "../textures.h"
|
||||||
|
#include "uiskins.h"
|
||||||
|
|
||||||
|
void UIElementSkin::draw(UIElement *element)
|
||||||
|
{
|
||||||
|
const ImagePtr& image = m_stateImages.front();
|
||||||
|
if(image) {
|
||||||
|
image->draw(element->getRect());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIElementSkin::load(const YAML::Node& node)
|
||||||
|
{
|
||||||
|
if(node.FindValue("default size"))
|
||||||
|
node["default size"] >> m_defaultSize;
|
||||||
|
|
||||||
|
if(node.FindValue("bordered image")) {
|
||||||
|
const YAML::Node& child = node["bordered image"];
|
||||||
|
Rect left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight, center;
|
||||||
|
child["left border"] >> left;
|
||||||
|
child["right border"] >> right;
|
||||||
|
child["top border"] >> top;
|
||||||
|
child["bottom border"] >> bottom;
|
||||||
|
child["top left corner"] >> topLeft;
|
||||||
|
child["top right corner"] >> topRight;
|
||||||
|
child["bottom left corner"] >> bottomLeft;
|
||||||
|
child["bottom right corner"] >> bottomRight;
|
||||||
|
child["center"] >> center;
|
||||||
|
|
||||||
|
TexturePtr texture;
|
||||||
|
if(child.FindValue("image")) {
|
||||||
|
std::string textureName;
|
||||||
|
child["image"] >> textureName;
|
||||||
|
texture = g_textures.get(textureName);
|
||||||
|
} else {
|
||||||
|
texture = g_uiSkins.getDefaultTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImagePtr image = ImagePtr(new BorderedImage(texture,
|
||||||
|
left,
|
||||||
|
right,
|
||||||
|
top,
|
||||||
|
bottom,
|
||||||
|
topLeft,
|
||||||
|
topRight,
|
||||||
|
bottomLeft,
|
||||||
|
bottomRight,
|
||||||
|
center));
|
||||||
|
m_stateImages.push_back(image);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 OTClient, https://github.com/edubart/otclient
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef UIELEMENTSKIN_H
|
||||||
|
#define UIELEMENTSKIN_H
|
||||||
|
|
||||||
|
#include "../prerequisites.h"
|
||||||
|
#include "uiconstants.h"
|
||||||
|
#include "../image.h"
|
||||||
|
#include "../rect.h"
|
||||||
|
|
||||||
|
class UIElement;
|
||||||
|
|
||||||
|
class UIElementSkin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UIElementSkin(const std::string& name, UI::EElementType elementType) :
|
||||||
|
m_name(name),
|
||||||
|
m_elementType(elementType) { }
|
||||||
|
|
||||||
|
void load(const YAML::Node& node);
|
||||||
|
void draw(UIElement *element);
|
||||||
|
|
||||||
|
const std::string& getName() const { return m_name; }
|
||||||
|
const Size& getDefaultSize() const { return m_defaultSize; }
|
||||||
|
UI::EElementType getElementType() const { return m_elementType; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
UI::EElementType m_elementType;
|
||||||
|
Size m_defaultSize;
|
||||||
|
std::vector<ImagePtr> m_stateImages;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // UIELEMENTSKIN_H
|
|
@ -31,9 +31,7 @@
|
||||||
class UILabel : public UIElement
|
class UILabel : public UIElement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UILabel() { }
|
UILabel() : UIElement(UI::Label) { }
|
||||||
|
|
||||||
virtual UI::EControlType getControlType() const { return UI::Label; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // UILABEL_H
|
#endif // UILABEL_H
|
||||||
|
|
|
@ -23,24 +23,3 @@
|
||||||
|
|
||||||
|
|
||||||
#include "uipanel.h"
|
#include "uipanel.h"
|
||||||
|
|
||||||
|
|
||||||
UIPanel::UIPanel()
|
|
||||||
{
|
|
||||||
m_boderedImage = BorderedImagePtr(new BorderedImage("ui.png",
|
|
||||||
Rect(0,214,5,32),
|
|
||||||
Rect(6,214,5,32),
|
|
||||||
Rect(43,214,32,5),
|
|
||||||
Rect(43,220,32,5),
|
|
||||||
Rect(43,225,5,5),
|
|
||||||
Rect(49,225,5,5),
|
|
||||||
Rect(43,230,5,5),
|
|
||||||
Rect(48,231,5,5),
|
|
||||||
Rect(11,214,32,32)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UIPanel::render()
|
|
||||||
{
|
|
||||||
m_boderedImage->draw(m_rect);
|
|
||||||
UIContainer::render();
|
|
||||||
}
|
|
||||||
|
|
|
@ -32,14 +32,7 @@
|
||||||
class UIPanel : public UIContainer
|
class UIPanel : public UIContainer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UIPanel();
|
UIPanel() : UIContainer(UI::Panel) { }
|
||||||
|
|
||||||
void render();
|
|
||||||
|
|
||||||
virtual UI::EControlType getControlType() const { return UI::Panel; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
BorderedImagePtr m_boderedImage;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<UIPanel> UIPanelPtr;
|
typedef std::shared_ptr<UIPanel> UIPanelPtr;
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
/* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 OTClient, https://github.com/edubart/otclient
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "uiskins.h"
|
||||||
|
#include "../resources.h"
|
||||||
|
#include "../textures.h"
|
||||||
|
#include "uielementskin.h"
|
||||||
|
|
||||||
|
UISkins g_uiSkins;
|
||||||
|
|
||||||
|
bool UISkins::load(const std::string& file)
|
||||||
|
{
|
||||||
|
std::string fileContents = g_resources.loadTextFile(file);
|
||||||
|
if(!fileContents.size()) {
|
||||||
|
logFatal("Could not load skin file \"%s", file.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::istringstream fin(fileContents);
|
||||||
|
|
||||||
|
try {
|
||||||
|
YAML::Parser parser(fin);
|
||||||
|
|
||||||
|
YAML::Node doc;
|
||||||
|
parser.GetNextDocument(doc);
|
||||||
|
|
||||||
|
std::string defaultTexture;
|
||||||
|
doc["default skin image"] >> defaultTexture;
|
||||||
|
m_defaultTexture = g_textures.get("skins/" + defaultTexture);
|
||||||
|
|
||||||
|
{
|
||||||
|
const YAML::Node& node = doc["buttons"];
|
||||||
|
for(auto it = node.begin(); it != node.end(); ++it) {
|
||||||
|
std::string name;
|
||||||
|
it.first() >> name;
|
||||||
|
|
||||||
|
UIElementSkin *elementSkin = new UIElementSkin(name, UI::Button);
|
||||||
|
elementSkin->load(it.second());
|
||||||
|
m_elementSkins.push_back(elementSkin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const YAML::Node& node = doc["panels"];
|
||||||
|
for(auto it = node.begin(); it != node.end(); ++it) {
|
||||||
|
std::string name;
|
||||||
|
it.first() >> name;
|
||||||
|
|
||||||
|
UIElementSkin *elementSkin = new UIElementSkin(name, UI::Panel);
|
||||||
|
elementSkin->load(it.second());
|
||||||
|
m_elementSkins.push_back(elementSkin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (YAML::ParserException& e) {
|
||||||
|
logError("Malformed font file \"%s\"", file.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
UIElementSkin* UISkins::getElementSkin(UI::EElementType elementType, const std::string& name)
|
||||||
|
{
|
||||||
|
for(auto it = m_elementSkins.begin(); it != m_elementSkins.end(); ++it) {
|
||||||
|
UIElementSkin *skin = (*it);
|
||||||
|
if(elementType == skin->getElementType() && name == skin->getName()) {
|
||||||
|
return skin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logWarning("Element skin '%s' not found", name.c_str());
|
||||||
|
return NULL;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* The MIT License
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 OTClient, https://github.com/edubart/otclient
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef UISKIN_H
|
||||||
|
#define UISKIN_H
|
||||||
|
|
||||||
|
#include "../prerequisites.h"
|
||||||
|
#include "uicontainer.h"
|
||||||
|
#include "../texture.h"
|
||||||
|
|
||||||
|
class UIElementSkin;
|
||||||
|
|
||||||
|
class UISkins
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UISkins() { }
|
||||||
|
|
||||||
|
bool load(const std::string& file);
|
||||||
|
|
||||||
|
UIElementSkin *getElementSkin(UI::EElementType elementType, const std::string& name = "default");
|
||||||
|
TexturePtr getDefaultTexture() { return m_defaultTexture; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
TexturePtr m_defaultTexture;
|
||||||
|
|
||||||
|
std::vector<UIElementSkin *> m_elementSkins;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern UISkins g_uiSkins;
|
||||||
|
|
||||||
|
#endif // UISKIN_H
|
|
@ -29,6 +29,7 @@
|
||||||
#include "menustate.h"
|
#include "menustate.h"
|
||||||
#include "teststate.h"
|
#include "teststate.h"
|
||||||
#include "framework/dispatcher.h"
|
#include "framework/dispatcher.h"
|
||||||
|
#include "framework/ui/uiskins.h"
|
||||||
|
|
||||||
/// Catches signals so we can exit nicely
|
/// Catches signals so we can exit nicely
|
||||||
void signal_handler(int sig)
|
void signal_handler(int sig)
|
||||||
|
@ -108,6 +109,9 @@ int main(int argc, const char *argv[])
|
||||||
// init engine
|
// init engine
|
||||||
g_engine.init();
|
g_engine.init();
|
||||||
|
|
||||||
|
// load UI skin
|
||||||
|
g_uiSkins.load("skins/tibiaskin.yml");
|
||||||
|
|
||||||
// state scope
|
// state scope
|
||||||
{
|
{
|
||||||
std::shared_ptr<MenuState> initialState(new MenuState);
|
std::shared_ptr<MenuState> initialState(new MenuState);
|
||||||
|
|
|
@ -91,6 +91,7 @@ void MenuState::createMainMenu()
|
||||||
int y = 16;
|
int y = 16;
|
||||||
|
|
||||||
m_menuPanel = UIPanelPtr(new UIPanel);
|
m_menuPanel = UIPanelPtr(new UIPanel);
|
||||||
|
m_menuPanel->setSkin("roundedGridPanel");
|
||||||
recalculateMenuPanelPosition();
|
recalculateMenuPanelPosition();
|
||||||
|
|
||||||
button = UIButtonPtr(new UIButton("Enter Game"));
|
button = UIButtonPtr(new UIButton("Enter Game"));
|
||||||
|
@ -118,7 +119,7 @@ void MenuState::createMainMenu()
|
||||||
m_menuPanel->addChild(button);
|
m_menuPanel->addChild(button);
|
||||||
y += 30;
|
y += 30;
|
||||||
|
|
||||||
g_gui->addChild(m_menuPanel);
|
g_ui->addChild(m_menuPanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuState::recalculateMenuPanelPosition()
|
void MenuState::recalculateMenuPanelPosition()
|
||||||
|
|
Loading…
Reference in New Issue