6
6
#include " lxgui/gui_frame_core_attributes.hpp"
7
7
#include " lxgui/gui_layered_region.hpp"
8
8
#include " lxgui/gui_region.hpp"
9
+ #include " lxgui/gui_strata.hpp"
9
10
#include " lxgui/input_keys.hpp"
10
11
#include " lxgui/lxgui.hpp"
11
12
#include " lxgui/utils.hpp"
17
18
#include < limits>
18
19
#include < list>
19
20
#include < lxgui/extern_sol2_protected_function.hpp>
21
+ #include < magic_enum.hpp>
22
+ #include < optional>
20
23
#include < set>
21
24
#include < unordered_map>
22
25
#include < vector>
@@ -105,7 +108,7 @@ using script_list_view = script_signal::slot_list_view;
105
108
* explicit key capture (@ref frame::enable_key_capture).
106
109
* - Events related to mouse click input (`OnDragStart`, `OnDragStop`,
107
110
* `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` )
109
112
* require frame::enable_mouse_move.
110
113
* - Events related to mouse wheel input (`OnMouseWheel`) require
111
114
* frame::enable_mouse_wheel.
@@ -188,6 +191,11 @@ using script_list_view = script_signal::slot_list_view;
188
191
* the registered callback: a number identifying the mouse button, a string
189
192
* containing the human-readable name of this button (`"LeftButton"`,
190
193
* `"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.
191
199
* - `OnMouseUp`: Similar to `OnMouseDown`, but triggered when the mouse button
192
200
* is released.
193
201
* - `OnMouseWheel`: Triggered when the mouse wheel is moved and this frame is
@@ -726,12 +734,6 @@ class frame : public region {
726
734
return down_cast<RegionType>(get_region (name));
727
735
}
728
736
729
- /* *
730
- * \brief Calculates effective alpha.
731
- * \return Effective alpha (alpha*parent->alpha)
732
- */
733
- float get_effective_alpha () const ;
734
-
735
737
/* *
736
738
* \brief Calculates effective scale.
737
739
* \return Effective scale (scale*parent->scale)
@@ -746,9 +748,16 @@ class frame : public region {
746
748
747
749
/* *
748
750
* \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.
750
753
*/
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 ;
752
761
753
762
/* *
754
763
* \brief Returns this frame's top-level parent.
@@ -1257,15 +1266,9 @@ class frame : public region {
1257
1266
1258
1267
/* *
1259
1268
* \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
1267
1270
*/
1268
- void set_frame_strata (const std::string& strata_name );
1271
+ void set_frame_strata (std::optional<frame_strata> strata_id );
1269
1272
1270
1273
/* *
1271
1274
* \brief Sets this frames' backdrop.
@@ -1465,16 +1468,16 @@ class frame : public region {
1465
1468
* \return The renderer of this object or its parents, nullptr if none
1466
1469
* \note For more information, see @ref set_frame_renderer().
1467
1470
*/
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 ;
1469
1472
1470
1473
/* *
1471
1474
* \brief Returns the renderer of this object or its parents, nullptr if none.
1472
1475
* \return The renderer of this object or its parents, nullptr if none
1473
1476
* \note For more information, see @ref set_frame_renderer().
1474
1477
*/
1475
- utils::observer_ptr<frame_renderer> get_top_level_frame_renderer () {
1478
+ utils::observer_ptr<frame_renderer> get_effective_frame_renderer () {
1476
1479
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 ());
1478
1481
}
1479
1482
1480
1483
/* *
@@ -1580,10 +1583,28 @@ class frame : public region {
1580
1583
1581
1584
void add_level_ (int amount);
1582
1585
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);
1584
1598
1585
1599
void update_borders_ () override ;
1586
1600
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
+
1587
1608
utils::connection define_script_ (
1588
1609
const std::string& script_name,
1589
1610
const std::string& content,
@@ -1607,7 +1628,7 @@ class frame : public region {
1607
1628
child_list child_list_;
1608
1629
region_list region_list_;
1609
1630
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>( );
1611
1632
1612
1633
std::array<layer_container, num_layers> layer_list_;
1613
1634
@@ -1617,11 +1638,13 @@ class frame : public region {
1617
1638
std::set<std::string> reg_drag_list_;
1618
1639
std::set<std::string> reg_key_list_;
1619
1640
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 ;
1623
1645
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 ;
1625
1648
1626
1649
std::unique_ptr<backdrop> backdrop_;
1627
1650
@@ -1644,8 +1667,6 @@ class frame : public region {
1644
1667
float min_height_ = 0 .0f ;
1645
1668
float max_height_ = std::numeric_limits<float >::infinity();
1646
1669
1647
- vector2f old_size_;
1648
-
1649
1670
float scale_ = 1 .0f ;
1650
1671
1651
1672
bool is_mouse_in_frame_ = false ;
0 commit comments