+47
-44
@@ -19,13 +19,14 @@
|
||||
#include <luma/render.hpp>
|
||||
#include <luma/theme.hpp>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class scope_exit {
|
||||
public:
|
||||
explicit scope_exit(std::function<void()> action);
|
||||
scope_exit(scope_exit const&) = delete;
|
||||
auto operator=(scope_exit const&) -> scope_exit& = delete;
|
||||
scope_exit(scope_exit const &) = delete;
|
||||
auto operator=(scope_exit const &) -> scope_exit & = delete;
|
||||
~scope_exit();
|
||||
private:
|
||||
std::function<void()> action_{};
|
||||
@@ -37,7 +38,7 @@ auto finite_rect(luma::rect value) -> std::bool_t {
|
||||
return std::isfinite(value.x) && std::isfinite(value.y) && std::isfinite(value.width) && std::isfinite(value.height) && value.width >= 0.0F && value.height >= 0.0F;
|
||||
}
|
||||
|
||||
auto title_height(luma::window_options const& options, std::float32_t line_height) -> std::float32_t {
|
||||
auto title_height(luma::window_options const &options, std::float32_t line_height) -> std::float32_t {
|
||||
if (!options.decorated) {
|
||||
return {};
|
||||
}
|
||||
@@ -45,7 +46,7 @@ auto title_height(luma::window_options const& options, std::float32_t line_heigh
|
||||
return std::min(desired, options.bounds.height);
|
||||
}
|
||||
|
||||
auto title_bounds(luma::window_options const& options, std::float32_t line_height) -> luma::rect {
|
||||
auto title_bounds(luma::window_options const &options, std::float32_t line_height) -> luma::rect {
|
||||
return {
|
||||
.x = options.bounds.x,
|
||||
.y = options.bounds.y,
|
||||
@@ -54,7 +55,7 @@ auto title_bounds(luma::window_options const& options, std::float32_t line_heigh
|
||||
};
|
||||
}
|
||||
|
||||
auto client_bounds(luma::window_options const& options, std::float32_t line_height) -> luma::rect {
|
||||
auto client_bounds(luma::window_options const &options, std::float32_t line_height) -> luma::rect {
|
||||
if (!options.decorated) {
|
||||
return options.bounds;
|
||||
}
|
||||
@@ -77,14 +78,15 @@ auto unavailable(std::string message) -> std::expected<VALUE, modulus::error> {
|
||||
return luma::detail::fail<VALUE>(luma::detail::error_unavailable, std::move(message));
|
||||
}
|
||||
|
||||
auto make_event(luma::touch_event const& event, luma::touch_point point) -> luma::touch_event {
|
||||
auto make_event(luma::touch_event const &event, luma::touch_point point) -> luma::touch_event {
|
||||
return {
|
||||
.points = {point},
|
||||
.time = event.time,
|
||||
};
|
||||
}
|
||||
|
||||
scope_exit::scope_exit(std::function<void()> action) : action_{std::move(action)} {}
|
||||
scope_exit::scope_exit(std::function<void()> action)
|
||||
: action_{std::move(action)} {}
|
||||
|
||||
scope_exit::~scope_exit() {
|
||||
if (action_) {
|
||||
@@ -94,7 +96,8 @@ scope_exit::~scope_exit() {
|
||||
|
||||
}
|
||||
|
||||
luma::window::window(std::uint64_t id, luma::window_options options, std::unique_ptr<luma::control> content) : id_{id}, options_{std::move(options)}, content_{std::move(content)} {
|
||||
luma::window::window(std::uint64_t id, luma::window_options options, std::unique_ptr<luma::control> content)
|
||||
: id_{id}, options_{std::move(options)}, content_{std::move(content)} {
|
||||
assert(id_ != 0);
|
||||
assert(finite_rect(options_.bounds));
|
||||
assert(content_ != nullptr);
|
||||
@@ -105,7 +108,7 @@ auto luma::window::id() const -> std::uint64_t {
|
||||
return id_;
|
||||
}
|
||||
|
||||
auto luma::window::options() const -> luma::window_options const& {
|
||||
auto luma::window::options() const -> luma::window_options const & {
|
||||
assert(finite_rect(options_.bounds));
|
||||
return options_;
|
||||
}
|
||||
@@ -126,12 +129,12 @@ auto luma::window::visible() const -> std::bool_t {
|
||||
return options_.visible;
|
||||
}
|
||||
|
||||
auto luma::window::content() -> luma::control* {
|
||||
auto luma::window::content() -> luma::control * {
|
||||
assert(content_ != nullptr);
|
||||
return content_.get();
|
||||
}
|
||||
|
||||
auto luma::window::content() const -> luma::control const* {
|
||||
auto luma::window::content() const -> luma::control const * {
|
||||
assert(content_ != nullptr);
|
||||
return content_.get();
|
||||
}
|
||||
@@ -246,11 +249,11 @@ auto luma::window_manager::set_visible(std::uint64_t id, std::bool_t visible) ->
|
||||
return {};
|
||||
}
|
||||
|
||||
auto luma::window_manager::find(std::uint64_t id) -> luma::window* {
|
||||
auto luma::window_manager::find(std::uint64_t id) -> luma::window * {
|
||||
if (id == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const& window) { return window && window->id() == id; });
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const &window) { return window && window->id() == id; });
|
||||
return found == windows_.end() ? nullptr : found->get();
|
||||
}
|
||||
|
||||
@@ -265,7 +268,7 @@ auto luma::window_manager::clear() -> void {
|
||||
active_touches_.clear();
|
||||
}
|
||||
|
||||
auto luma::window_manager::measure(luma::draw_context& context, luma::theme const& theme, luma::constraints limits) -> luma::size {
|
||||
auto luma::window_manager::measure(luma::draw_context &context, luma::theme const &theme, luma::constraints limits) -> luma::size {
|
||||
title_line_height_ = theme.body.line_height;
|
||||
++mutation_depth_;
|
||||
auto guard = scope_exit{[this] {
|
||||
@@ -273,7 +276,7 @@ auto luma::window_manager::measure(luma::draw_context& context, luma::theme cons
|
||||
--mutation_depth_;
|
||||
apply_pending_operations();
|
||||
}};
|
||||
for (auto& window : windows_) {
|
||||
for (auto &window : windows_) {
|
||||
assert(window != nullptr);
|
||||
if (!window->visible()) {
|
||||
continue;
|
||||
@@ -281,12 +284,12 @@ auto luma::window_manager::measure(luma::draw_context& context, luma::theme cons
|
||||
assert(window->content() != nullptr);
|
||||
auto client = client_bounds(window->options(), title_line_height_);
|
||||
window->content()->measure(context, theme, {
|
||||
.min = {},
|
||||
.max = {
|
||||
.width = client.width,
|
||||
.height = client.height,
|
||||
},
|
||||
});
|
||||
.min = {},
|
||||
.max = {
|
||||
.width = client.width,
|
||||
.height = client.height,
|
||||
},
|
||||
});
|
||||
}
|
||||
return luma::clamp(limits.max, limits);
|
||||
}
|
||||
@@ -300,7 +303,7 @@ auto luma::window_manager::arrange(luma::rect bounds) -> void {
|
||||
apply_pending_operations();
|
||||
}};
|
||||
luma::control::arrange(bounds);
|
||||
for (auto& window : windows_) {
|
||||
for (auto &window : windows_) {
|
||||
assert(window != nullptr);
|
||||
if (window->visible()) {
|
||||
assert(window->content() != nullptr);
|
||||
@@ -309,7 +312,7 @@ auto luma::window_manager::arrange(luma::rect bounds) -> void {
|
||||
}
|
||||
}
|
||||
|
||||
auto luma::window_manager::draw(luma::draw_context& context, luma::theme const& theme) const -> void {
|
||||
auto luma::window_manager::draw(luma::draw_context &context, luma::theme const &theme) const -> void {
|
||||
title_line_height_ = theme.body.line_height;
|
||||
++mutation_depth_;
|
||||
auto guard = scope_exit{[this] {
|
||||
@@ -317,7 +320,7 @@ auto luma::window_manager::draw(luma::draw_context& context, luma::theme const&
|
||||
--mutation_depth_;
|
||||
apply_pending_operations();
|
||||
}};
|
||||
for (auto const& window : windows_) {
|
||||
for (auto const &window : windows_) {
|
||||
assert(window != nullptr);
|
||||
if (!window->visible()) {
|
||||
continue;
|
||||
@@ -333,15 +336,16 @@ auto luma::window_manager::draw(luma::draw_context& context, luma::theme const&
|
||||
auto title = title_bounds(window->options(), title_line_height_);
|
||||
context.fill_rect(title, theme.surface_active);
|
||||
context.draw_text(window->options().title, {
|
||||
.x = title.x + 8.0F,
|
||||
.y = title.y + window_title_vertical_padding,
|
||||
}, theme.body, theme.text);
|
||||
.x = title.x + 8.0F,
|
||||
.y = title.y + window_title_vertical_padding,
|
||||
},
|
||||
theme.body, theme.text);
|
||||
}
|
||||
context.stroke_rect(bounds, 1.0F, theme.border);
|
||||
}
|
||||
}
|
||||
|
||||
auto luma::window_manager::handle_touch(luma::touch_event const& event) -> std::bool_t {
|
||||
auto luma::window_manager::handle_touch(luma::touch_event const &event) -> std::bool_t {
|
||||
if (event.points.empty()) {
|
||||
return false;
|
||||
}
|
||||
@@ -352,10 +356,10 @@ auto luma::window_manager::handle_touch(luma::touch_event const& event) -> std::
|
||||
apply_pending_operations();
|
||||
}};
|
||||
auto handled = false;
|
||||
for (auto const& point : event.points) {
|
||||
for (auto const &point : event.points) {
|
||||
if (auto captured = active_touches_.find(point.id); captured != active_touches_.end()) {
|
||||
auto const window_id = captured->second;
|
||||
auto* captured_window = find(window_id);
|
||||
auto *captured_window = find(window_id);
|
||||
auto const captured_visible = captured_window != nullptr && captured_window->visible();
|
||||
if (captured_visible) {
|
||||
assert(captured_window->content() != nullptr);
|
||||
@@ -368,7 +372,6 @@ auto luma::window_manager::handle_touch(luma::touch_event const& event) -> std::
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
for (auto current = windows_.rbegin(); current != windows_.rend(); ++current) {
|
||||
assert(*current != nullptr);
|
||||
if (!(*current)->visible()) {
|
||||
@@ -400,8 +403,8 @@ auto luma::window_manager::contains_effective(std::uint64_t id) const -> std::bo
|
||||
if (id == 0) {
|
||||
return false;
|
||||
}
|
||||
auto exists = std::find_if(windows_.begin(), windows_.end(), [id](auto const& window) { return window && window->id() == id; }) != windows_.end();
|
||||
for (auto const& operation : pending_operations_) {
|
||||
auto exists = std::find_if(windows_.begin(), windows_.end(), [id](auto const &window) { return window && window->id() == id; }) != windows_.end();
|
||||
for (auto const &operation : pending_operations_) {
|
||||
switch (operation.kind) {
|
||||
case luma::window_manager::pending_kind::OPEN:
|
||||
if (operation.id == id) {
|
||||
@@ -426,7 +429,7 @@ auto luma::window_manager::contains_effective(std::uint64_t id) const -> std::bo
|
||||
}
|
||||
|
||||
auto luma::window_manager::close_now(std::uint64_t id) const -> void {
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const& window) { return window && window->id() == id; });
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const &window) { return window && window->id() == id; });
|
||||
if (found == windows_.end()) {
|
||||
return;
|
||||
}
|
||||
@@ -442,7 +445,7 @@ auto luma::window_manager::close_now(std::uint64_t id) const -> void {
|
||||
}
|
||||
|
||||
auto luma::window_manager::bring_to_front_now(std::uint64_t id) const -> void {
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const& window) { return window && window->id() == id; });
|
||||
auto found = std::find_if(windows_.begin(), windows_.end(), [id](auto const &window) { return window && window->id() == id; });
|
||||
if (found == windows_.end()) {
|
||||
return;
|
||||
}
|
||||
@@ -452,14 +455,14 @@ auto luma::window_manager::bring_to_front_now(std::uint64_t id) const -> void {
|
||||
}
|
||||
|
||||
auto luma::window_manager::set_bounds_now(std::uint64_t id, luma::rect bounds) const -> void {
|
||||
auto* window = const_cast<luma::window_manager*>(this)->find(id);
|
||||
auto *window = const_cast<luma::window_manager *>(this)->find(id);
|
||||
if (window != nullptr) {
|
||||
static_cast<void>(window->set_bounds(bounds));
|
||||
}
|
||||
}
|
||||
|
||||
auto luma::window_manager::set_visible_now(std::uint64_t id, std::bool_t visible) const -> void {
|
||||
auto* window = const_cast<luma::window_manager*>(this)->find(id);
|
||||
auto *window = const_cast<luma::window_manager *>(this)->find(id);
|
||||
if (window != nullptr) {
|
||||
window->set_visible(visible);
|
||||
}
|
||||
@@ -471,7 +474,7 @@ auto luma::window_manager::apply_pending_operations() const -> void {
|
||||
}
|
||||
auto pending = std::vector<luma::window_manager::pending_operation>{};
|
||||
pending.swap(pending_operations_);
|
||||
for (auto& operation : pending) {
|
||||
for (auto &operation : pending) {
|
||||
switch (operation.kind) {
|
||||
case luma::window_manager::pending_kind::OPEN:
|
||||
if (operation.window) {
|
||||
@@ -505,20 +508,20 @@ auto luma::window_manager::invalidate_layout() -> void {
|
||||
--mutation_depth_;
|
||||
apply_pending_operations();
|
||||
}};
|
||||
auto controls = std::vector<luma::control*>{};
|
||||
auto controls = std::vector<luma::control *>{};
|
||||
controls.reserve(windows_.size() + pending_operations_.size());
|
||||
for (auto& window : windows_) {
|
||||
for (auto &window : windows_) {
|
||||
assert(window != nullptr);
|
||||
assert(window->content() != nullptr);
|
||||
controls.push_back(window->content());
|
||||
}
|
||||
for (auto& operation : pending_operations_) {
|
||||
for (auto &operation : pending_operations_) {
|
||||
if (operation.window) {
|
||||
assert(operation.window->content() != nullptr);
|
||||
controls.push_back(operation.window->content());
|
||||
}
|
||||
}
|
||||
for (auto* control : controls) {
|
||||
for (auto *control : controls) {
|
||||
assert(control != nullptr);
|
||||
control->invalidate_layout();
|
||||
}
|
||||
@@ -526,12 +529,12 @@ auto luma::window_manager::invalidate_layout() -> void {
|
||||
|
||||
auto luma::window_manager::bind_layout_invalidator(std::function<void()> invalidator) -> void {
|
||||
luma::control::bind_layout_invalidator(invalidator);
|
||||
for (auto& window : windows_) {
|
||||
for (auto &window : windows_) {
|
||||
assert(window != nullptr);
|
||||
assert(window->content() != nullptr);
|
||||
window->content()->bind_layout_invalidator(invalidator);
|
||||
}
|
||||
for (auto& operation : pending_operations_) {
|
||||
for (auto &operation : pending_operations_) {
|
||||
if (operation.window) {
|
||||
assert(operation.window->content() != nullptr);
|
||||
operation.window->content()->bind_layout_invalidator(invalidator);
|
||||
|
||||
Reference in New Issue
Block a user