NasNas
An intuitive and beginner friendly 2D game framework for C++
Container.hpp
1 // Created by Modar Nasser on 10/10/2021.
2 
3 #pragma once
4 
5 #include <memory>
6 #include <vector>
7 
8 #include <SFML/Graphics/Rect.hpp>
9 #include <SFML/Graphics/RenderTexture.hpp>
10 #include <SFML/Graphics/View.hpp>
11 #include <SFML/System/Vector2.hpp>
12 #include <SFML/Window/Event.hpp>
13 
14 #include <NasNas/core/data/ShaderHolder.hpp>
15 #include <NasNas/core/graphics/Renderable.hpp>
16 #include <NasNas/ui/Style.hpp>
17 #include <NasNas/ui/Widget.hpp>
18 
19 namespace ns::ui {
20  class Container : public StyledWidget<style::Basic>, public Renderable, public ShaderHolder {
21  public:
22  Container();
23 
24  template <typename T>
25  auto addWidget() -> T&;
26 
27  void setSize(float x, float y);
28  void setSize(const sf::Vector2f& size);
29  auto getSize() const -> sf::Vector2f;
30 
31  auto getGlobalBounds() const -> sf::FloatRect override;
32  auto contains(const sf::Vector2f& pos) const -> bool override;
33 
34  void onEvent(const sf::Event& event);
35  void render() override;
36 
37  private:
38  auto transformPosition(const sf::Vector2f& position) const -> sf::Vector2f;
39  auto getWidgetUnder(const sf::Vector2f& position) const -> Widget*;
40  void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
41 
42  std::vector<std::unique_ptr<Widget>> m_widgets;
43  Widget* m_hovered_widget = nullptr;
44  std::vector<Widget*> m_touched_widgets;
45 
46  sf::View m_view;
47  sf::RenderTexture m_render_texture;
48  };
49 
50  template <typename T>
51  auto Container::addWidget() -> T& {
52  auto* new_widget = new T();
53  new_widget->m_root = m_root;
54  new_widget->m_parent = this;
55  m_widgets.emplace_back(new_widget);
56  return *new_widget;
57  }
58 }