Skip to content

Commit f12f953

Browse files
authored
Merge pull request #110 from cschreib/strata
Strata improvement and fixes
2 parents d292da7 + b36bbc5 commit f12f953

22 files changed

+762
-504
lines changed

changelog.txt

+1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ Other changes:
211211
- gui: fixed frame not marked as "user placed" when moved or resized
212212
- gui: fixed missing 'const' for slider::are_clicks_outside_thumb_allowed()
213213
- gui: fixed missing 'const' for region::render()
214+
- gui: fixed status_bar not firing OnValueChanged
214215

215216
v1.2.0:
216217
- added support for MSVC 2010

include/lxgui/gui_frame.hpp

+49-28
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
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"
@@ -17,6 +18,8 @@
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;

include/lxgui/gui_frame_renderer.hpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
#include "lxgui/lxgui.hpp"
66
#include "lxgui/utils.hpp"
77
#include "lxgui/utils_observer.hpp"
8+
#include "lxgui/utils_sorted_vector.hpp"
89

910
#include <functional>
11+
#include <magic_enum.hpp>
1012

1113
namespace lxgui::gui {
1214

@@ -18,7 +20,7 @@ class color;
1820
class frame_renderer {
1921
public:
2022
/// Default constructor
21-
frame_renderer() = default;
23+
frame_renderer();
2224

2325
/// Destructor
2426
virtual ~frame_renderer() = default;
@@ -92,19 +94,27 @@ class frame_renderer {
9294
int get_highest_level(frame_strata strata_id) const;
9395

9496
protected:
95-
void add_to_strata_list_(strata& strata_obj, const utils::observer_ptr<frame>& obj);
96-
void remove_from_strata_list_(strata& strata_obj, const utils::observer_ptr<frame>& obj);
97-
void add_to_level_list_(level& level_obj, const utils::observer_ptr<frame>& obj);
98-
void remove_from_level_list_(level& level_obj, const utils::observer_ptr<frame>& obj);
9997
void clear_strata_list_();
10098
bool has_strata_list_changed_() const;
10199
void reset_strata_list_changed_flag_();
102100
void notify_strata_needs_redraw_(strata& strata_obj);
103101

104102
void render_strata_(const strata& strata_obj) const;
105103

106-
std::array<strata, 8> strata_list_;
107-
bool strata_list_updated_ = false;
104+
struct frame_comparator {
105+
bool operator()(const frame* f1, const frame* f2) const;
106+
};
107+
108+
using frame_list_type = utils::sorted_vector<frame*, frame_comparator>;
109+
using frame_list_iterator = frame_list_type::iterator;
110+
111+
std::pair<std::size_t, std::size_t> get_strata_range_(frame_strata strata_id) const;
112+
113+
static constexpr std::size_t num_strata = magic_enum::enum_count<frame_strata>();
114+
115+
std::array<strata, num_strata> strata_list_;
116+
frame_list_type sorted_frame_list_;
117+
bool frame_list_updated_ = false;
108118
};
109119

110120
} // namespace lxgui::gui

include/lxgui/gui_layered_region.hpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,7 @@
88
namespace lxgui::gui {
99

1010
/// ID of a layer for rendering inside a frame.
11-
enum class layer {
12-
background = 0,
13-
border = 1,
14-
artwork = 2,
15-
overlay = 3,
16-
highlight = 4,
17-
specialhigh = 5,
18-
enum_size
19-
};
11+
enum class layer { background, border, artwork, overlay, highlight, special_high };
2012

2113
/**
2214
* \brief A #region that can be rendered in a layer.

include/lxgui/gui_region.hpp

+4-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "lxgui/gui_color.hpp"
77
#include "lxgui/gui_exception.hpp"
88
#include "lxgui/gui_region_core_attributes.hpp"
9-
#include "lxgui/gui_strata.hpp"
109
#include "lxgui/gui_vector2.hpp"
1110
#include "lxgui/lxgui.hpp"
1211
#include "lxgui/utils.hpp"
@@ -594,16 +593,16 @@ class region : public utils::enable_observer_from_this<region> {
594593
* \return The renderer of this object or its parents
595594
* \note For more information, see frame::set_frame_renderer().
596595
*/
597-
virtual utils::observer_ptr<const frame_renderer> get_top_level_frame_renderer() const;
596+
virtual utils::observer_ptr<const frame_renderer> get_effective_frame_renderer() const;
598597

599598
/**
600599
* \brief Returns the renderer of this object or its parents, nullptr if none.
601600
* \return The renderer of this object or its parents, nullptr if none
602601
* \note For more information, see frame::set_frame_renderer().
603602
*/
604-
utils::observer_ptr<frame_renderer> get_top_level_frame_renderer() {
603+
utils::observer_ptr<frame_renderer> get_effective_frame_renderer() {
605604
return utils::const_pointer_cast<frame_renderer>(
606-
const_cast<const region*>(this)->get_top_level_frame_renderer());
605+
const_cast<const region*>(this)->get_effective_frame_renderer());
607606
}
608607

609608
/**
@@ -767,16 +766,7 @@ class region : public utils::enable_observer_from_this<region> {
767766
* \param parent The new parent
768767
* \note Default is nullptr.
769768
*/
770-
void set_parent_(utils::observer_ptr<frame> parent);
771-
772-
/**
773-
* \brief Sets this region's name and parent at once.
774-
* \param name This region's name
775-
* \param parent The new parent
776-
* \note The name can only be set once. If you need to just change the
777-
* parent, call set_parent_().
778-
*/
779-
void set_name_and_parent_(const std::string& name, utils::observer_ptr<frame> parent);
769+
virtual void set_parent_(utils::observer_ptr<frame> parent);
780770

781771
/**
782772
* \brief Set up function to call in all derived class constructors.

include/lxgui/gui_scroll_frame.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ class scroll_frame : public frame, public frame_renderer {
187187

188188
bool rebuild_scroll_render_target_flag_ = false;
189189
bool redraw_scroll_render_target_flag_ = false;
190-
bool update_scroll_range_flag_ = false;
191190
std::shared_ptr<render_target> scroll_render_target_;
192191

193192
utils::observer_ptr<texture> scroll_texture_ = nullptr;

include/lxgui/gui_status_bar.hpp

-11
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,6 @@ class status_bar : public frame {
174174
*/
175175
bool is_reversed() const;
176176

177-
/**
178-
* \brief Updates this region's logic.
179-
* \param delta Time spent since last update
180-
* \note Triggered callbacks could destroy the frame. If you need
181-
* to use the frame again after calling this function, use
182-
* the helper class alive_checker.
183-
*/
184-
void update(float delta) override;
185-
186177
/// Registers this region class to the provided Lua state
187178
static void register_on_lua(sol::state& lua);
188179

@@ -195,8 +186,6 @@ class status_bar : public frame {
195186
void parse_attributes_(const layout_node& node) override;
196187
void parse_all_nodes_before_children_(const layout_node& node) override;
197188

198-
bool update_bar_texture_flag_ = false;
199-
200189
orientation orientation_ = orientation::horizontal;
201190
bool is_reversed_ = false;
202191

include/lxgui/gui_strata.hpp

+7-14
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ namespace lxgui::gui {
1616
class frame;
1717

1818
enum class frame_strata {
19-
parent = -1,
20-
background = 0,
19+
background,
2120
low,
2221
medium,
2322
high,
@@ -27,19 +26,13 @@ enum class frame_strata {
2726
tooltip
2827
};
2928

30-
struct strata;
31-
32-
/// Contains gui::frame
33-
struct level {
34-
std::vector<utils::observer_ptr<frame>> frame_list;
35-
};
36-
37-
/// Contains gui::level
29+
/// Contains frames sorted by level
3830
struct strata {
39-
std::map<int, level> level_list;
40-
bool redraw_flag = true;
41-
std::shared_ptr<render_target> target;
42-
quad target_quad;
31+
frame_strata id;
32+
std::pair<std::size_t, std::size_t> range;
33+
bool redraw_flag = true;
34+
std::shared_ptr<render_target> target;
35+
quad target_quad;
4336
};
4437

4538
} // namespace lxgui::gui

include/lxgui/gui_texture.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace lxgui::gui {
1414

1515
class renderer;
16+
class render_target;
1617

1718
/**
1819
* \brief A layered_region that can draw images and colored rectangles.

0 commit comments

Comments
 (0)