Commit current work

Former-commit-id: 79be9d4e937a73626cd5ec02c1d2e2fcbd440d18
This commit is contained in:
Lynix 2016-05-13 13:00:52 +02:00
parent c15dd5221d
commit 5588a573a6
6 changed files with 280 additions and 0 deletions

View File

@ -0,0 +1,76 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#pragma once
#ifndef NDK_BASEWIDGET_HPP
#define NDK_BASEWIDGET_HPP
#include <NDK/Prerequesites.hpp>
#include <NDK/Entity.hpp>
#include <NDK/EntityOwner.hpp>
#include <NDK/World.hpp>
#include <Nazara/Graphics/Sprite.hpp>
#include <Nazara/Utility/Node.hpp>
namespace Ndk
{
class NDK_API BaseWidget : public Nz::Node
{
public:
struct Padding;
inline BaseWidget(WorldHandle world, BaseWidget* parent = nullptr);
BaseWidget(const BaseWidget&) = delete;
BaseWidget(BaseWidget&&) = default;
virtual ~BaseWidget();
inline void AddChild(std::unique_ptr<BaseWidget>&& widget);
void EnableBackground(bool enable);
//virtual BaseWidget* Clone() const = 0;
inline const Padding& GetPadding() const;
inline Nz::Vector2f GetSize() const;
virtual void ResizeToContent() = 0;
inline void SetContentSize(const Nz::Vector2f& size);
inline void SetPadding(float left, float top, float right, float bottom);
void SetSize(const Nz::Vector2f& size);
BaseWidget& operator=(const BaseWidget&) = delete;
BaseWidget& operator=(BaseWidget&&) = default;
struct Padding
{
float left;
float top;
float right;
float bottom;
};
protected:
EntityHandle CreateEntity();
void DestroyEntity(Entity* entity);
private:
void UpdateBackground();
std::vector<EntityOwner> m_entities;
std::vector<BaseWidget*> m_children;
EntityOwner m_backgroundEntity;
Padding m_padding;
WorldHandle m_world;
Nz::Color m_backgroundColor;
Nz::SpriteRef m_backgroundSprite;
Nz::Vector2f m_contentSize;
BaseWidget* m_widgetParent;
};
}
#include <NDK/BaseWidget.inl>
#endif // NDK_BASEWIDGET_HPP

View File

@ -0,0 +1,50 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <NDK/BaseWidget.hpp>
#include <Nazara/Core/Error.hpp>
#include <Nazara/Math/Algorithm.hpp>
namespace Ndk
{
inline BaseWidget::BaseWidget(WorldHandle world, BaseWidget* parent) :
m_world(std::move(world)),
m_backgroundColor(Nz::Color(230, 230, 230, 255)),
m_contentSize(50.f, 50.f),
m_widgetParent(parent)
{
SetPadding(5.f, 5.f, 5.f, 5.f);
}
inline void BaseWidget::AddChild(std::unique_ptr<BaseWidget>&& widget)
{
m_children.push_back(widget.release());
}
inline const BaseWidget::Padding& BaseWidget::GetPadding() const
{
return m_padding;
}
inline Nz::Vector2f BaseWidget::GetSize() const
{
return Nz::Vector2f(m_contentSize.x + m_padding.left + m_padding.right, m_contentSize.y + m_padding.top + m_padding.bottom);
}
inline void BaseWidget::SetContentSize(const Nz::Vector2f& size)
{
m_contentSize = size;
UpdateBackground();
}
inline void BaseWidget::SetPadding(float left, float top, float right, float bottom)
{
m_padding.left = left;
m_padding.top = top;
m_padding.bottom = bottom;
m_padding.right = right;
UpdateBackground();
}
}

View File

@ -0,0 +1,44 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#pragma once
#ifndef NDK_WIDGETS_LABELWIDGET_HPP
#define NDK_WIDGETS_LABELWIDGET_HPP
#include <NDK/Prerequesites.hpp>
#include <NDK/BaseWidget.hpp>
#include <Nazara/Utility/AbstractTextDrawer.hpp>
#include <Nazara/Graphics/TextSprite.hpp>
namespace Ndk
{
class World;
class NDK_API LabelWidget : public BaseWidget
{
public:
LabelWidget(const WorldHandle& world, BaseWidget* parent = nullptr);
LabelWidget(const LabelWidget&) = delete;
LabelWidget(LabelWidget&&) = default;
~LabelWidget() = default;
//virtual LabelWidget* Clone() const = 0;
void ResizeToContent();
inline void UpdateText(const Nz::AbstractTextDrawer& drawer);
LabelWidget& operator=(const LabelWidget&) = delete;
LabelWidget& operator=(LabelWidget&&) = default;
private:
EntityHandle m_textEntity;
Nz::TextSpriteRef m_textSprite;
};
}
#include <NDK/Widgets/LabelWidget.inl>
#endif // NDK_WIDGETS_LABELWIDGET_HPP

View File

@ -0,0 +1,13 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <NDK/Widgets/LabelWidget.hpp>
namespace Ndk
{
inline void LabelWidget::UpdateText(const Nz::AbstractTextDrawer& drawer)
{
m_textSprite->Update(drawer);
}
}

View File

@ -0,0 +1,71 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <NDK/BaseWidget.hpp>
#include <NDK/Components/GraphicsComponent.hpp>
#include <NDK/Components/NodeComponent.hpp>
#include <NDK/World.hpp>
namespace Ndk
{
BaseWidget::~BaseWidget()
{
for (BaseWidget* child : m_children)
delete child;
}
inline void Ndk::BaseWidget::EnableBackground(bool enable)
{
if (m_backgroundEntity.IsValid() == enable)
return;
if (enable)
{
m_backgroundSprite = Nz::Sprite::New();
m_backgroundSprite->SetColor(m_backgroundColor);
m_backgroundSprite->SetMaterial(Nz::MaterialLibrary::Get((m_backgroundColor.IsOpaque()) ? "Basic2D" : "Translucent2D"));
m_backgroundEntity = m_world->CreateEntity();
m_backgroundEntity->AddComponent<GraphicsComponent>().Attach(m_backgroundSprite, -1);
m_backgroundEntity->AddComponent<NodeComponent>().SetParent(this);
UpdateBackground();
}
else
{
m_backgroundEntity->Kill();
m_backgroundSprite.Reset();
}
}
void BaseWidget::SetSize(const Nz::Vector2f& size)
{
SetContentSize({std::max(size.x - m_padding.left - m_padding.right, 0.f), std::max(size.y - m_padding.top - m_padding.bottom, 0.f)});
}
EntityHandle BaseWidget::CreateEntity()
{
m_entities.emplace_back(m_world->CreateEntity());
return m_entities.back();
}
void BaseWidget::DestroyEntity(Entity* entity)
{
auto it = std::find(m_entities.begin(), m_entities.end(), entity);
NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget");
m_entities.erase(it);
}
void BaseWidget::UpdateBackground()
{
if (m_backgroundEntity)
{
NodeComponent& node = m_backgroundEntity->GetComponent<NodeComponent>();
node.SetPosition(-m_padding.left, -m_padding.top);
m_backgroundSprite->SetSize(m_contentSize.x + m_padding.left + m_padding.right, m_contentSize.y + m_padding.top + m_padding.bottom);
}
}
}

View File

@ -0,0 +1,26 @@
// Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Development Kit"
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <NDK/Widgets/LabelWidget.hpp>
#include <NDK/Components/GraphicsComponent.hpp>
#include <NDK/Components/NodeComponent.hpp>
#include <NDK/World.hpp>
namespace Ndk
{
LabelWidget::LabelWidget(const WorldHandle& world, BaseWidget* parent) :
BaseWidget(world, parent)
{
m_textSprite = Nz::TextSprite::New();
m_textEntity = CreateEntity();
m_textEntity->AddComponent<GraphicsComponent>().Attach(m_textSprite);
m_textEntity->AddComponent<NodeComponent>().SetParent(this);
}
void LabelWidget::ResizeToContent()
{
SetContentSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths()));
}
}