lxgui
gui_region.hpp
1 #ifndef LXGUI_GUI_REGION_HPP
2 #define LXGUI_GUI_REGION_HPP
3 
4 #include "lxgui/gui_anchor.hpp"
5 #include "lxgui/gui_bounds2.hpp"
6 #include "lxgui/gui_color.hpp"
7 #include "lxgui/gui_exception.hpp"
8 #include "lxgui/gui_region_core_attributes.hpp"
9 #include "lxgui/gui_vector2.hpp"
10 #include "lxgui/lxgui.hpp"
11 #include "lxgui/utils.hpp"
12 #include "lxgui/utils_maths.hpp"
13 #include "lxgui/utils_observer.hpp"
14 
15 #include <array>
16 #include <lxgui/extern_sol2_object.hpp>
17 #include <optional>
18 #include <unordered_map>
19 #include <vector>
20 
23 namespace sol {
24 
25 class state;
26 
27 }
31 namespace lxgui::gui {
32 
33 struct addon;
34 class manager;
35 class registry;
36 class factory;
37 class layout_node;
38 
39 class frame;
40 class frame_renderer;
41 
161 class region : public utils::enable_observer_from_this<region> {
162  friend factory;
163  friend frame;
164 
165 public:
167  explicit region(utils::control_block& block, manager& mgr, const region_core_attributes& attr);
168 
170  ~region() override;
171 
173  region(const region&) = delete;
174 
176  region(region&&) = delete;
177 
179  region& operator=(const region&) = delete;
180 
182  region& operator=(region&&) = delete;
183 
185  virtual void render() const;
186 
191  virtual void update(float delta);
192 
198  virtual std::string serialize(const std::string& tab) const;
199 
204  virtual void copy_from(const region& obj);
205 
207  virtual void notify_borders_need_update();
208 
210  virtual void notify_scaling_factor_updated();
211 
216  const std::string& get_name() const;
217 
223  const std::string& get_raw_name() const;
224 
229  utils::observer_ptr<const frame> get_parent() const {
230  return parent_;
231  }
232 
237  const utils::observer_ptr<frame>& get_parent() {
238  return parent_;
239  }
240 
246 
253  void destroy();
254 
260  void set_alpha(float alpha);
261 
266  float get_alpha() const;
267 
273  float get_effective_alpha() const;
274 
280  void show();
281 
287  void hide();
288 
294  void set_shown(bool is_shown);
295 
300  bool is_shown() const;
301 
306  bool is_visible() const;
307 
317  bool is_valid() const;
318 
323  virtual void set_dimensions(const vector2f& dimensions);
324 
329  virtual void set_width(float abs_width);
330 
335  virtual void set_height(float abs_height);
336 
341  void set_relative_dimensions(const vector2f& dimensions);
342 
347  void set_relative_width(float rel_width);
348 
353  void set_relative_height(float rel_height);
354 
364  const vector2f& get_dimensions() const;
365 
375 
385  bool is_apparent_width_defined() const;
386 
396  bool is_apparent_height_defined() const;
397 
403  virtual bool is_in_region(const vector2f& position) const;
404 
409  const std::string& get_region_type() const;
410 
416  bool is_region_type(const std::string& type_name) const;
417 
422  template<typename ObjectType>
423  bool is_region_type() const {
424  return is_region_type(ObjectType::class_name);
425  }
426 
431  bool is_region_type(const region& obj) const {
432  return is_region_type(obj.get_region_type());
433  }
434 
439  float get_bottom() const;
440 
445  vector2f get_center() const;
446 
451  float get_left() const;
452 
457  float get_right() const;
458 
463  float get_top() const;
464 
469  const bounds2f& get_borders() const;
470 
476  void clear_all_anchors();
477 
483  void set_all_anchors(const utils::observer_ptr<region>& obj);
484 
490  void set_all_anchors(const std::string& obj_name);
491 
496  void set_anchor(const anchor_data& a);
497 
502  template<typename... Args>
503  void set_anchor(Args&&... args) {
504  constexpr auto set_anchor_overload =
505  static_cast<void (region::*)(const anchor_data&)>(&region::set_anchor);
506  (this->*set_anchor_overload)(anchor_data{std::forward<Args>(args)...});
507  }
508 
514  bool depends_on(const region& obj) const;
515 
520  std::size_t get_anchor_count() const;
521 
530 
536  const anchor& get_anchor(point p) const;
537 
542  const std::array<std::optional<anchor>, 9>& get_anchors() const;
543 
550  float round_to_pixel(
551  float value, utils::rounding_method method = utils::rounding_method::nearest) const;
552 
560  const vector2f& position,
562 
569  void add_anchored_object(region& obj);
570 
576  void remove_anchored_object(region& obj);
577 
585  bool is_virtual() const;
586 
594  void set_manually_inherited(bool manually_inherited);
595 
601  bool is_manually_inherited() const;
602 
608  virtual utils::observer_ptr<const frame_renderer> get_effective_frame_renderer() const;
609 
615  utils::observer_ptr<frame_renderer> get_effective_frame_renderer() {
616  return utils::const_pointer_cast<frame_renderer>(
617  const_cast<const region*>(this)->get_effective_frame_renderer());
618  }
619 
624  virtual void notify_renderer_need_redraw();
625 
630  const std::vector<utils::observer_ptr<region>>& get_anchored_objects() const;
631 
636  virtual void notify_loaded();
637 
648  bool is_loaded() const;
649 
654  virtual void notify_visible();
655 
660  virtual void notify_invisible();
661 
666  void set_addon(const addon* a);
667 
674  const addon* get_addon() const;
675 
687  std::string parse_file_name(const std::string& file_name) const;
688 
694  return manager_;
695  }
696 
701  const manager& get_manager() const {
702  return manager_;
703  }
704 
710 
715  const registry& get_registry() const;
716 
718  void remove_glue();
719 
724  virtual void parse_layout(const layout_node& node);
725 
727  static void register_on_lua(sol::state& lua);
728 
729  template<typename ObjectType>
730  friend const ObjectType* down_cast(const region* self);
731 
732  template<typename ObjectType>
733  friend ObjectType* down_cast(region* self);
734 
735  static constexpr const char* class_name = "Region";
736 
737 protected:
738  // Layout parsing
739  virtual void parse_attributes_(const layout_node& node);
740  virtual void parse_size_node_(const layout_node& node);
741  virtual void parse_anchor_node_(const layout_node& node);
742  color parse_color_node_(const layout_node& node);
744  vector2<float> parse_offset_node_or_(const layout_node& node, float fallback);
745 
746  std::pair<anchor_type, vector2<std::optional<float>>>
747  parse_dimension_node_(const layout_node& node);
748 
749  void read_anchors_(
750  float& left, float& right, float& top, float& bottom, float& x_center, float& y_center)
751  const;
752 
753  bool make_borders_(float& min, float& max, float center, float size) const;
754 
755  virtual void update_borders_();
756 
757  sol::state& get_lua_();
758  const sol::state& get_lua_() const;
759 
760  template<typename T>
761  void create_glue_(T& self);
762 
763  template<typename T>
764  static const std::vector<std::string>& get_type_list_impl_();
765 
766  virtual const std::vector<std::string>& get_type_list_() const;
767 
768  void set_lua_member_(std::string key, sol::stack_object value);
769  sol::object get_lua_member_(const std::string& key) const;
770 
775  void set_virtual_();
776 
783  void set_name_(const std::string& name);
784 
790  virtual void set_parent_(utils::observer_ptr<frame> parent);
791 
797  template<typename T>
798  void initialize_(T& self, const region_core_attributes& attr);
799 
801 
802  const addon* addon_ = nullptr;
803 
804  std::string name_;
805  std::string raw_name_;
806 
807  utils::observer_ptr<frame> parent_ = nullptr;
808 
810  bool is_virtual_ = false;
811  bool is_loaded_ = false;
812  bool is_valid_ = true;
813 
814  std::array<std::optional<anchor>, 9> anchor_list_;
817 
818  float alpha_ = 1.0f;
819  bool is_shown_ = true;
820  bool is_visible_ = true;
821 
823 
824  std::vector<utils::observer_ptr<region>> anchored_object_list_;
825 };
826 
836 template<typename ObjectType>
837 const ObjectType* down_cast(const region* self) {
838  const ObjectType* object = dynamic_cast<const ObjectType*>(self);
839  if (self && !object && self->is_region_type(ObjectType::class_name)) {
840  throw gui::exception(
841  self->get_region_type(), "cannot use down_cast() to " +
842  std::string(ObjectType::class_name) +
843  " as object is being destroyed");
844  }
845  return object;
846 }
847 
857 template<typename ObjectType>
858 const ObjectType& down_cast(const region& self) {
859  const ObjectType* object = dynamic_cast<const ObjectType*>(self);
860  if (self && !object) {
861  if (self.is_region_type(ObjectType::class_name)) {
862  throw gui::exception(
863  self.get_region_type(), "cannot use down_cast() to " +
864  std::string(ObjectType::class_name) +
865  " as object is being destroyed");
866  } else {
867  throw gui::exception(
868  self.get_region_type(), "cannot use down_cast() to " +
869  std::string(ObjectType::class_name) +
870  " as object is not of the right type");
871  }
872  }
873  return *object;
874 }
875 
885 template<typename ObjectType>
886 ObjectType* down_cast(region* self) {
887  return const_cast<ObjectType*>(down_cast<ObjectType>(const_cast<const region*>(self)));
888 }
889 
899 template<typename ObjectType>
900 ObjectType& down_cast(region& self) {
901  return const_cast<ObjectType&>(down_cast<ObjectType>(const_cast<const region&>(self)));
902 }
903 
910 template<typename ObjectType>
912  return utils::owner_ptr<ObjectType>(std::move(object), down_cast<ObjectType>(object.get()));
913 }
914 
921 template<typename ObjectType>
922 utils::observer_ptr<ObjectType> down_cast(const utils::observer_ptr<region>& object) {
923  return utils::observer_ptr<ObjectType>(object, down_cast<ObjectType>(object.get()));
924 }
925 
932 template<typename ObjectType>
933 utils::observer_ptr<ObjectType> down_cast(utils::observer_ptr<region>&& object) {
934  return utils::observer_ptr<ObjectType>(std::move(object), down_cast<ObjectType>(object.get()));
935 }
936 
945 template<typename ObjectType>
946 utils::observer_ptr<ObjectType> observer_from(ObjectType* self) {
947  if (self)
948  return utils::static_pointer_cast<ObjectType>(self->region::observer_from_this());
949  else
950  return nullptr;
951 }
952 
953 } // namespace lxgui::gui
954 
955 #endif
Stores a position for a UI region.
Definition: gui_anchor.hpp:97
Holds a single color (float RGBA, 128 bits)
Definition: gui_color.hpp:12
Exception to be thrown by GUI code.
Handles the creation of new UI objects.
Definition: gui_factory.hpp:39
A region that can contain other regions and react to events.
Definition: gui_frame.hpp:255
An node in a layout file.
Manages the user interface.
Definition: gui_manager.hpp:44
The base class of all elements in the GUI.
Definition: gui_region.hpp:161
void set_shown(bool is_shown)
shows/hides this region.
Definition: gui_region.cpp:196
virtual void set_width(float abs_width)
Changes this region's absolute width (in pixels).
Definition: gui_region.cpp:227
void set_all_anchors(const utils::observer_ptr< region > &obj)
Adjusts this regions anchors to fit the provided region.
Definition: gui_region.cpp:437
bool is_region_type() const
Checks if this region is of the provided type.
Definition: gui_region.hpp:423
bool is_valid() const
Checks if this region has all its borders correctly defined.
Definition: gui_region.cpp:211
const std::vector< utils::observer_ptr< region > > & get_anchored_objects() const
Returns the list of all objects that are anchored to this one.
Definition: gui_region.cpp:790
void set_lua_member_(std::string key, sol::stack_object value)
const anchor & get_anchor(point p) const
Returns one of this region's anchor.
Definition: gui_region.cpp:539
virtual void set_parent_(utils::observer_ptr< frame > parent)
Changes this region's parent.
Definition: gui_region.cpp:312
const std::string & get_region_type() const
Returns the type of this region.
Definition: gui_region.cpp:148
void set_anchor(const anchor_data &a)
Adds/replaces an anchor.
Definition: gui_region.cpp:473
virtual utils::observer_ptr< const frame_renderer > get_effective_frame_renderer() const
Returns the renderer of this object or its parents.
Definition: gui_region.cpp:802
void create_glue_(T &self)
color parse_color_node_(const layout_node &node)
virtual void parse_layout(const layout_node &node)
Parses data from a layout_node.
const bounds2f & get_borders() const
Returns this region's borders.
Definition: gui_region.cpp:361
~region() override
Destructor.
Definition: gui_region.cpp:35
void initialize_(T &self, const region_core_attributes &attr)
Set up function to call in all derived class constructors.
bool is_virtual() const
Checks if this region is virtual.
Definition: gui_region.cpp:553
float get_effective_alpha() const
Returns this region's effective alpha (opacity).
Definition: gui_region.cpp:161
bool is_apparent_width_defined() const
Checks if this region's apparent width is defined.
Definition: gui_region.cpp:280
registry & get_registry()
Returns the UI object registry, which keeps track of all objects in the UI.
Definition: gui_region.cpp:850
region & operator=(region &&)=delete
Non-movable.
virtual void parse_size_node_(const layout_node &node)
std::pair< anchor_type, vector2< std::optional< float > > > parse_dimension_node_(const layout_node &node)
bool is_visible() const
Checks if this region can be seen on the screen.
Definition: gui_region.cpp:207
utils::observer_ptr< frame > parent_
Definition: gui_region.hpp:807
friend const ObjectType * down_cast(const region *self)
Obtain a pointer to a derived class.
Definition: gui_region.hpp:837
virtual utils::owner_ptr< region > release_from_parent()
Removes this region from its parent and return an owning pointer.
Definition: gui_region.cpp:329
const utils::observer_ptr< frame > & get_parent()
Returns this region's parent.
Definition: gui_region.hpp:237
manager & get_manager()
Returns this region's manager.
Definition: gui_region.hpp:693
virtual void notify_loaded()
Notifies this region that it has been fully loaded.
Definition: gui_region.cpp:794
void hide()
hides this region.
Definition: gui_region.cpp:186
virtual void notify_renderer_need_redraw()
Notifies the renderer of this region that it needs to be redrawn.
Definition: gui_region.cpp:788
float round_to_pixel(float value, utils::rounding_method method=utils::rounding_method::nearest) const
Round an absolute position on screen to the nearest physical pixel.
Definition: gui_region.cpp:573
static void register_on_lua(sol::state &lua)
Registers this region class to the provided Lua state.
vector2f get_apparent_dimensions() const
Returns this region's apparent width and height (in pixels).
Definition: gui_region.cpp:276
void read_anchors_(float &left, float &right, float &top, float &bottom, float &x_center, float &y_center) const
Definition: gui_region.cpp:614
virtual void notify_visible()
Notifies this region that it is now visible on screen.
Definition: gui_region.cpp:808
void set_manually_inherited(bool manually_inherited)
Flags this region as manually inherited or not.
Definition: gui_region.cpp:780
const addon * addon_
Definition: gui_region.hpp:802
virtual void render() const
Renders this region on the current render target.
Definition: gui_region.cpp:765
virtual void set_height(float abs_height)
Changes this region's absolute height (in pixels).
Definition: gui_region.cpp:239
void show()
shows this region.
Definition: gui_region.cpp:176
void set_relative_height(float rel_height)
Changes this region's height (relative to its parent).
Definition: gui_region.cpp:265
const vector2f & get_dimensions() const
Returns this region's explicitly-defined width and height (in pixels).
Definition: gui_region.cpp:272
bool depends_on(const region &obj) const
Checks if this region depends on another.
Definition: gui_region.cpp:503
void set_alpha(float alpha)
Changes this region's alpha (opacity).
Definition: gui_region.cpp:169
vector2f get_center() const
Returns the position of this region's center.
Definition: gui_region.cpp:341
const std::string & get_name() const
Returns this region's name.
Definition: gui_region.cpp:140
bool is_shown() const
Checks if this region is shown.
Definition: gui_region.cpp:203
virtual void parse_attributes_(const layout_node &node)
void destroy()
Forcefully removes this region from the GUI.
Definition: gui_region.cpp:333
float get_right() const
Returns the horizontal position of this region's right border.
Definition: gui_region.cpp:349
vector2< std::optional< float > > parse_offset_node_(const layout_node &node)
float get_left() const
Returns the horizontal position of this region's left border.
Definition: gui_region.cpp:345
virtual void notify_invisible()
Notifies this region that it is no longer visible on screen.
Definition: gui_region.cpp:813
void add_anchored_object(region &obj)
Notifies this region that another one is anchored to it.
Definition: gui_region.cpp:561
static const std::vector< std::string > & get_type_list_impl_()
std::string name_
Definition: gui_region.hpp:804
const std::string & get_raw_name() const
Returns this region's raw name.
Definition: gui_region.cpp:144
void set_addon(const addon *a)
Sets the addon this frame belongs to.
Definition: gui_region.cpp:833
std::array< std::optional< anchor >, 9 > anchor_list_
Definition: gui_region.hpp:814
region(region &&)=delete
Non-movable.
void set_virtual_()
Makes this region virtual.
Definition: gui_region.cpp:557
anchor & modify_anchor(point p)
Returns one of this region's anchor to modify it.
Definition: gui_region.cpp:529
bool is_manually_inherited() const
Checks if this object is manually inherited.
Definition: gui_region.cpp:784
static constexpr const char * class_name
Definition: gui_region.hpp:735
virtual bool is_in_region(const vector2f &position) const
Checks if the provided coordinates are inside this region.
Definition: gui_region.cpp:288
const manager & get_manager() const
Returns this region's manager.
Definition: gui_region.hpp:701
virtual void set_dimensions(const vector2f &dimensions)
Changes this region's absolute dimensions (in pixels).
Definition: gui_region.cpp:215
utils::observer_ptr< frame_renderer > get_effective_frame_renderer()
Returns the renderer of this object or its parents, nullptr if none.
Definition: gui_region.hpp:615
float get_bottom() const
Returns the vertical position of this region's bottom border.
Definition: gui_region.cpp:357
virtual void update(float delta)
Updates this region's logic.
Definition: gui_region.cpp:763
void set_relative_width(float rel_width)
Changes this region's width (relative to its parent).
Definition: gui_region.cpp:258
void clear_all_anchors()
Removes all anchors.
Definition: gui_region.cpp:365
virtual const std::vector< std::string > & get_type_list_() const
Definition: gui_region.cpp:860
utils::observer_ptr< const frame > get_parent() const
Returns this region's parent.
Definition: gui_region.hpp:229
region & operator=(const region &)=delete
Non-copiable.
bool is_loaded() const
Checks if this region has been fully loaded.
Definition: gui_region.cpp:798
region(utils::control_block &block, manager &mgr, const region_core_attributes &attr)
Contructor.
Definition: gui_region.cpp:21
virtual void notify_borders_need_update()
Tells this region that its borders need updating.
Definition: gui_region.cpp:744
bounds2< bool > defined_borders_
Definition: gui_region.hpp:815
bool is_region_type(const region &obj) const
Checks if this region is of a type equal or derived from the supplied region.
Definition: gui_region.hpp:431
void set_anchor(Args &&... args)
Adds/replaces an anchor.
Definition: gui_region.hpp:503
bool make_borders_(float &min, float &max, float center, float size) const
Definition: gui_region.cpp:585
void set_relative_dimensions(const vector2f &dimensions)
Changes this region's dimensions (relative to its parent).
Definition: gui_region.cpp:251
vector2< float > parse_offset_node_or_(const layout_node &node, float fallback)
float get_top() const
Returns the vertical position of this region's top border.
Definition: gui_region.cpp:353
std::string raw_name_
Definition: gui_region.hpp:805
bool is_apparent_height_defined() const
Checks if this region's apparent height is defined.
Definition: gui_region.cpp:284
const std::array< std::optional< anchor >, 9 > & get_anchors() const
Returns all of this region's anchors.
Definition: gui_region.cpp:549
virtual void copy_from(const region &obj)
Copies a region's parameters into this region (inheritance).
Definition: gui_region.cpp:128
const addon * get_addon() const
Returns this frame's addon.
Definition: gui_region.cpp:843
sol::object get_lua_member_(const std::string &key) const
virtual void parse_anchor_node_(const layout_node &node)
std::string parse_file_name(const std::string &file_name) const
Convert an addon-relative file path to a application-relative path.
Definition: gui_region.cpp:818
region(const region &)=delete
Non-copiable.
float get_alpha() const
Returns this region's alpha (opacity).
Definition: gui_region.cpp:157
sol::state & get_lua_()
Definition: gui_region.cpp:767
std::vector< utils::observer_ptr< region > > anchored_object_list_
Definition: gui_region.hpp:824
virtual std::string serialize(const std::string &tab) const
Prints all relevant information about this region in a string.
Definition: gui_region.cpp:91
void remove_anchored_object(region &obj)
Notifies this region that another one is no longer anchored to it.
Definition: gui_region.cpp:565
virtual void notify_scaling_factor_updated()
Tells this region that the global interface scaling factor has changed.
Definition: gui_region.cpp:759
std::size_t get_anchor_count() const
Returns the number of defined anchors.
Definition: gui_region.cpp:519
virtual void update_borders_()
Definition: gui_region.cpp:669
void set_name_(const std::string &name)
Sets this region's name.
Definition: gui_region.cpp:294
void remove_glue()
Removes the Lua glue.
Definition: gui_region.cpp:775
Keeps track of created UI objects and records their names for lookup.
const ObjectType * down_cast(const region *self)
Obtain a pointer to a derived class.
Definition: gui_region.hpp:837
utils::observer_ptr< ObjectType > observer_from(ObjectType *self)
Obtain an observer pointer from a raw pointer (typically 'this')
Definition: gui_region.hpp:946
oup::enable_observer_from_this_sealed< T > enable_observer_from_this
rounding_method
Rounding method for points to pixels conversions.
Definition: utils_maths.hpp:10
@ nearest
Equivalent to round()
oup::observable_sealed_ptr< T > owner_ptr
A piece of the user interface.
Definition: gui_addon.hpp:12
Raw data of an anchor (value type)
Definition: gui_anchor.hpp:32
Struct holding all the core information about a region necessary for its creation.