66#include " lxgui/gui_frame_core_attributes.hpp"
77#include " lxgui/gui_layered_region.hpp"
88#include " lxgui/gui_region.hpp"
9+ #include " lxgui/gui_strata.hpp"
910#include " lxgui/input_keys.hpp"
1011#include " lxgui/lxgui.hpp"
1112#include " lxgui/utils.hpp"
1718#include < limits>
1819#include < list>
1920#include < lxgui/extern_sol2_protected_function.hpp>
21+ #include < magic_enum.hpp>
22+ #include < optional>
2023#include < set>
2124#include < unordered_map>
2225#include < vector>
@@ -105,7 +108,7 @@ using script_list_view = script_signal::slot_list_view;
105108 * explicit key capture (@ref frame::enable_key_capture).
106109 * - Events related to mouse click input (`OnDragStart`, `OnDragStop`,
107110 * `OnMouseUp`, `OnMouseDown`) require frame::enable_mouse_click.
108- * - Events related to mouse move input (`OnEnter`, `OnLeave`)
111+ * - Events related to mouse move input (`OnEnter`, `OnLeave`, `OnMouseMove` )
109112 * require frame::enable_mouse_move.
110113 * - Events related to mouse wheel input (`OnMouseWheel`) require
111114 * frame::enable_mouse_wheel.
@@ -188,6 +191,11 @@ using script_list_view = script_signal::slot_list_view;
188191 * the registered callback: a number identifying the mouse button, a string
189192 * containing the human-readable name of this button (`"LeftButton"`,
190193 * `"RightButton"`, or `"MiddleButton"`), and the mouse X and Y position.
194+ * - `OnMouseMove`: Triggered when the mouse moves over this frame, after
195+ * `OnEnter` and until `OnLeave`. This event provides four argument to
196+ * the registered callback: the amount of mouse movement in X and Y since the
197+ * last call to `OnMouseMove` (or since the last position before the mouse
198+ * entered this frame), and the mouse X and Y position.
191199 * - `OnMouseUp`: Similar to `OnMouseDown`, but triggered when the mouse button
192200 * is released.
193201 * - `OnMouseWheel`: Triggered when the mouse wheel is moved and this frame is
@@ -726,12 +734,6 @@ class frame : public region {
726734 return down_cast<RegionType>(get_region (name));
727735 }
728736
729- /* *
730- * \brief Calculates effective alpha.
731- * \return Effective alpha (alpha*parent->alpha)
732- */
733- float get_effective_alpha () const ;
734-
735737 /* *
736738 * \brief Calculates effective scale.
737739 * \return Effective scale (scale*parent->scale)
@@ -746,9 +748,16 @@ class frame : public region {
746748
747749 /* *
748750 * \brief Returns this frame's strata.
749- * \return This frame's strata
751+ * \return This frame's strata, or nullopt if the strata is inherited from the parent.
752+ * \note See get_effective_frame_strata() to obtain the actual strata of this frame.
750753 */
751- frame_strata get_frame_strata () const ;
754+ std::optional<frame_strata> get_frame_strata () const ;
755+
756+ /* *
757+ * \brief Returns this frame's effective strata.
758+ * \return This frame's strata, or its parent's effective strata if frame_strata::parent.
759+ */
760+ frame_strata get_effective_frame_strata () const ;
752761
753762 /* *
754763 * \brief Returns this frame's top-level parent.
@@ -1257,15 +1266,9 @@ class frame : public region {
12571266
12581267 /* *
12591268 * \brief Sets this frame's strata.
1260- * \param strata_id The new strata
1261- */
1262- void set_frame_strata (frame_strata strata_id);
1263-
1264- /* *
1265- * \brief Sets this frame's strata.
1266- * \param strata_name The new strata
1269+ * \param strata_id The new strata, or nullopt to inherit strata from parent
12671270 */
1268- void set_frame_strata (const std::string& strata_name );
1271+ void set_frame_strata (std::optional<frame_strata> strata_id );
12691272
12701273 /* *
12711274 * \brief Sets this frames' backdrop.
@@ -1465,16 +1468,16 @@ class frame : public region {
14651468 * \return The renderer of this object or its parents, nullptr if none
14661469 * \note For more information, see @ref set_frame_renderer().
14671470 */
1468- utils::observer_ptr<const frame_renderer> get_top_level_frame_renderer () const final ;
1471+ utils::observer_ptr<const frame_renderer> get_effective_frame_renderer () const final ;
14691472
14701473 /* *
14711474 * \brief Returns the renderer of this object or its parents, nullptr if none.
14721475 * \return The renderer of this object or its parents, nullptr if none
14731476 * \note For more information, see @ref set_frame_renderer().
14741477 */
1475- utils::observer_ptr<frame_renderer> get_top_level_frame_renderer () {
1478+ utils::observer_ptr<frame_renderer> get_effective_frame_renderer () {
14761479 return utils::const_pointer_cast<frame_renderer>(
1477- const_cast <const frame*>(this )->get_top_level_frame_renderer ());
1480+ const_cast <const frame*>(this )->get_effective_frame_renderer ());
14781481 }
14791482
14801483 /* *
@@ -1580,10 +1583,28 @@ class frame : public region {
15801583
15811584 void add_level_ (int amount);
15821585
1583- void propagate_renderer_ (bool rendered);
1586+ utils::observer_ptr<const frame_renderer> compute_top_level_frame_renderer_ () const ;
1587+
1588+ utils::observer_ptr<frame_renderer> compute_top_level_frame_renderer_ () {
1589+ return utils::const_pointer_cast<frame_renderer>(
1590+ const_cast <const frame*>(this )->compute_top_level_frame_renderer_ ());
1591+ }
1592+
1593+ frame_strata compute_effective_frame_strata_ () const ;
1594+
1595+ void notify_frame_strata_changed_ (frame_strata new_strata_id);
1596+
1597+ void notify_frame_renderer_changed_ (const utils::observer_ptr<frame_renderer>& new_renderer);
15841598
15851599 void update_borders_ () override ;
15861600
1601+ /* *
1602+ * \brief Changes this region's parent.
1603+ * \param parent The new parent
1604+ * \note Default is nullptr.
1605+ */
1606+ void set_parent_ (utils::observer_ptr<frame> parent) override ;
1607+
15871608 utils::connection define_script_ (
15881609 const std::string& script_name,
15891610 const std::string& content,
@@ -1607,7 +1628,7 @@ class frame : public region {
16071628 child_list child_list_;
16081629 region_list region_list_;
16091630
1610- static constexpr std::size_t num_layers = static_cast <std:: size_t >(layer::enum_size );
1631+ static constexpr std::size_t num_layers = magic_enum::enum_count<layer>( );
16111632
16121633 std::array<layer_container, num_layers> layer_list_;
16131634
@@ -1617,11 +1638,13 @@ class frame : public region {
16171638 std::set<std::string> reg_drag_list_;
16181639 std::set<std::string> reg_key_list_;
16191640
1620- int level_ = 0 ;
1621- frame_strata strata_ = frame_strata::medium;
1622- bool is_top_level_ = false ;
1641+ int level_ = 0 ;
1642+ std::optional<frame_strata> strata_;
1643+ frame_strata effective_strata_ = frame_strata::medium;
1644+ bool is_top_level_ = false ;
16231645
1624- utils::observer_ptr<frame_renderer> frame_renderer_ = nullptr ;
1646+ utils::observer_ptr<frame_renderer> frame_renderer_ = nullptr ;
1647+ utils::observer_ptr<frame_renderer> effective_frame_renderer_ = nullptr ;
16251648
16261649 std::unique_ptr<backdrop> backdrop_;
16271650
@@ -1644,8 +1667,6 @@ class frame : public region {
16441667 float min_height_ = 0 .0f ;
16451668 float max_height_ = std::numeric_limits<float >::infinity();
16461669
1647- vector2f old_size_;
1648-
16491670 float scale_ = 1 .0f ;
16501671
16511672 bool is_mouse_in_frame_ = false ;
0 commit comments