refactor(surface): adjusted to new changes
This commit is contained in:
parent
e77a42cf7f
commit
d66ef55cc8
3 changed files with 45 additions and 19 deletions
|
@ -44,13 +44,13 @@ System::System(Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
||||||
);
|
);
|
||||||
|
|
||||||
m_registry->connect_on_construct<SurfaceComponent>(
|
m_registry->connect_on_construct<SurfaceComponent>(
|
||||||
[this](ecs::Registry ®istry, ecs::Entity entity) {
|
[this](ecs::Registry ®istry, ecs::EntityId entity) {
|
||||||
on_surface_construct(registry, entity);
|
on_surface_construct(registry, entity);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
m_registry->connect_on_destruct<SurfaceComponent>(
|
m_registry->connect_on_destruct<SurfaceComponent>(
|
||||||
[this](ecs::Registry ®istry, ecs::Entity entity) {
|
[this](ecs::Registry ®istry, ecs::EntityId entity) {
|
||||||
on_surface_destruct(registry, entity);
|
on_surface_destruct(registry, entity);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -58,10 +58,15 @@ System::System(Ref<ecs::Registry> registry): m_registry(std::move(registry))
|
||||||
|
|
||||||
System::~System()
|
System::~System()
|
||||||
{
|
{
|
||||||
|
if (!m_registry)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// TODO(Light): make registry.remove not validate iterators
|
// TODO(Light): make registry.remove not validate iterators
|
||||||
auto entities_to_remove = std::vector<ecs::Entity> {};
|
auto entities_to_remove = std::vector<ecs::EntityId> {};
|
||||||
for (auto &[entity, surface] : m_registry->view<SurfaceComponent>())
|
for (auto &[entity, surface] : m_registry->view<SurfaceComponent>())
|
||||||
{
|
{
|
||||||
entities_to_remove.emplace_back(entity);
|
entities_to_remove.emplace_back(entity);
|
||||||
|
@ -90,7 +95,7 @@ void System::on_unregister()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::on_surface_construct(ecs::Registry ®istry, ecs::Entity entity)
|
void System::on_surface_construct(ecs::Registry ®istry, ecs::EntityId entity)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -182,7 +187,7 @@ void System::on_surface_construct(ecs::Registry ®istry, ecs::Entity entity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::on_surface_destruct(ecs::Registry ®istry, ecs::Entity entity)
|
void System::on_surface_destruct(ecs::Registry ®istry, ecs::EntityId entity)
|
||||||
{
|
{
|
||||||
const auto &[display, window, _] = registry.get<SurfaceComponent>(entity).get_native_data();
|
const auto &[display, window, _] = registry.get<SurfaceComponent>(entity).get_native_data();
|
||||||
if (!display)
|
if (!display)
|
||||||
|
@ -355,7 +360,7 @@ void System::modify_visiblity(SurfaceComponent &surface, const ModifyVisibilityR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto System::tick() -> bool
|
void System::tick(app::TickInfo tick)
|
||||||
{
|
{
|
||||||
for (auto &dense : m_registry->view<SurfaceComponent>())
|
for (auto &dense : m_registry->view<SurfaceComponent>())
|
||||||
{
|
{
|
||||||
|
@ -364,7 +369,12 @@ auto System::tick() -> bool
|
||||||
handle_events(surface);
|
handle_events(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
const auto now = std::chrono::steady_clock::now();
|
||||||
|
m_last_tick_result = app::TickResult {
|
||||||
|
.info = tick,
|
||||||
|
.duration = now - tick.start_time,
|
||||||
|
.end_time = now,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ensure_component_sanity(const SurfaceComponent &component)
|
void ensure_component_sanity(const SurfaceComponent &component)
|
||||||
|
|
|
@ -16,6 +16,15 @@ using test::expect_not_nullptr;
|
||||||
using test::expect_throw;
|
using test::expect_throw;
|
||||||
using test::Suite;
|
using test::Suite;
|
||||||
|
|
||||||
|
[[nodiscard]] auto tick_info() -> app::TickInfo
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
.delta_time = std::chrono::milliseconds { 16 },
|
||||||
|
.budget = std::chrono::milliseconds { 10 },
|
||||||
|
.start_time = std::chrono::steady_clock::now(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
constexpr auto title = "TestWindow";
|
constexpr auto title = "TestWindow";
|
||||||
constexpr auto width = 800u;
|
constexpr auto width = 800u;
|
||||||
constexpr auto height = 600u;
|
constexpr auto height = 600u;
|
||||||
|
@ -188,7 +197,7 @@ Suite registry_events = [] {
|
||||||
Suite tick = [] {
|
Suite tick = [] {
|
||||||
Case { "ticking on empty registry won't throw" } = [] {
|
Case { "ticking on empty registry won't throw" } = [] {
|
||||||
auto fixture = Fixture {};
|
auto fixture = Fixture {};
|
||||||
System { fixture.registry() }.tick();
|
System { fixture.registry() }.tick(tick_info());
|
||||||
};
|
};
|
||||||
|
|
||||||
Case { "ticking on non-empty registry won't throw" } = [] {
|
Case { "ticking on non-empty registry won't throw" } = [] {
|
||||||
|
@ -196,7 +205,7 @@ Suite tick = [] {
|
||||||
auto system = System { fixture.registry() };
|
auto system = System { fixture.registry() };
|
||||||
|
|
||||||
fixture.add_surface_component();
|
fixture.add_surface_component();
|
||||||
system.tick();
|
system.tick(tick_info());
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -207,7 +216,7 @@ Suite tick_handles_events = [] {
|
||||||
auto &surface = fixture.add_surface_component();
|
auto &surface = fixture.add_surface_component();
|
||||||
|
|
||||||
// flush window-creation events
|
// flush window-creation events
|
||||||
system.tick();
|
system.tick(tick_info());
|
||||||
expect_eq(surface.peek_events().size(), 0);
|
expect_eq(surface.peek_events().size(), 0);
|
||||||
|
|
||||||
surface.push_event(surface::MovedEvent({}, {}));
|
surface.push_event(surface::MovedEvent({}, {}));
|
||||||
|
@ -216,7 +225,7 @@ Suite tick_handles_events = [] {
|
||||||
surface.push_event(surface::ButtonPressedEvent({}));
|
surface.push_event(surface::ButtonPressedEvent({}));
|
||||||
expect_eq(surface.peek_events().size(), 2);
|
expect_eq(surface.peek_events().size(), 2);
|
||||||
|
|
||||||
system.tick();
|
system.tick(tick_info());
|
||||||
expect_eq(surface.peek_events().size(), 0);
|
expect_eq(surface.peek_events().size(), 0);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -235,7 +244,7 @@ Suite tick_handles_requests = [] {
|
||||||
|
|
||||||
surface.push_request(surface::ModifyVisibilityRequest(true));
|
surface.push_request(surface::ModifyVisibilityRequest(true));
|
||||||
expect_eq(surface.peek_requests().size(), 1);
|
expect_eq(surface.peek_requests().size(), 1);
|
||||||
system.tick();
|
system.tick(tick_info());
|
||||||
expect_eq(surface.peek_requests().size(), 0);
|
expect_eq(surface.peek_requests().size(), 0);
|
||||||
|
|
||||||
surface.push_request(surface::ModifyTitleRequest(title));
|
surface.push_request(surface::ModifyTitleRequest(title));
|
||||||
|
@ -250,7 +259,7 @@ Suite tick_handles_requests = [] {
|
||||||
surface.push_request(surface::ModifyVisibilityRequest(false));
|
surface.push_request(surface::ModifyVisibilityRequest(false));
|
||||||
expect_eq(surface.peek_requests().size(), 1 + 2 + 3);
|
expect_eq(surface.peek_requests().size(), 1 + 2 + 3);
|
||||||
|
|
||||||
system.tick();
|
system.tick(tick_info());
|
||||||
expect_eq(surface.peek_requests().size(), 0);
|
expect_eq(surface.peek_requests().size(), 0);
|
||||||
|
|
||||||
expect_eq(surface.get_title(), title);
|
expect_eq(surface.get_title(), title);
|
||||||
|
|
|
@ -25,12 +25,17 @@ public:
|
||||||
|
|
||||||
void on_unregister() override;
|
void on_unregister() override;
|
||||||
|
|
||||||
auto tick() -> bool override;
|
void tick(app::TickInfo tick) override;
|
||||||
|
|
||||||
|
[[nodiscard]] auto get_last_tick_result() const -> const app::TickResult & override
|
||||||
|
{
|
||||||
|
return m_last_tick_result;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void on_surface_construct(ecs::Registry ®istry, ecs::Entity entity);
|
void on_surface_construct(ecs::Registry ®istry, ecs::EntityId entity);
|
||||||
|
|
||||||
void on_surface_destruct(ecs::Registry ®istry, ecs::Entity entity);
|
void on_surface_destruct(ecs::Registry ®istry, ecs::EntityId entity);
|
||||||
|
|
||||||
void handle_requests(struct SurfaceComponent &surface);
|
void handle_requests(struct SurfaceComponent &surface);
|
||||||
|
|
||||||
|
@ -53,13 +58,15 @@ private:
|
||||||
const struct ModifyVisibilityRequest &request
|
const struct ModifyVisibilityRequest &request
|
||||||
);
|
);
|
||||||
|
|
||||||
void modify_position(ecs::Entity surface_entity, const math::ivec2 &new_size);
|
void modify_position(ecs::EntityId surface_entity, const math::ivec2 &new_size);
|
||||||
|
|
||||||
void modify_position(ecs::Entity surface_entity, const math::uvec2 &new_size);
|
void modify_position(ecs::EntityId surface_entity, const math::uvec2 &new_size);
|
||||||
|
|
||||||
void set_visibility(ecs::Entity surface_entity, bool visible);
|
void set_visibility(ecs::EntityId surface_entity, bool visible);
|
||||||
|
|
||||||
Ref<ecs::Registry> m_registry;
|
Ref<ecs::Registry> m_registry;
|
||||||
|
|
||||||
|
app::TickResult m_last_tick_result;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace lt::surface
|
} // namespace lt::surface
|
||||||
|
|
Loading…
Add table
Reference in a new issue