changes for ImGui
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#include <sophia/ui/panel_registry.hpp>
|
||||
#include <sophia/util/assert.hpp>
|
||||
|
||||
namespace sophia {
|
||||
|
||||
namespace {
|
||||
constexpr u32 GENERATION_MASK = (1u << 12) - 1;
|
||||
} // namespace
|
||||
|
||||
PanelHandle PanelRegistry::add(std::unique_ptr<Panel> panel) {
|
||||
if (!freeList.empty()) {
|
||||
u32 index = freeList.back();
|
||||
freeList.pop_back();
|
||||
slots[index].panel = std::move(panel);
|
||||
return PanelHandle{index, slots[index].generation};
|
||||
}
|
||||
|
||||
slots.push_back(Slot{std::move(panel), 0});
|
||||
return PanelHandle{static_cast<u32>(slots.size() - 1), 0};
|
||||
}
|
||||
|
||||
const Panel& PanelRegistry::get(PanelHandle handle) const {
|
||||
SOPHIA_ASSERT(handle.isValid(), "invalid PanelHandle");
|
||||
SOPHIA_ASSERT(handle.index < slots.size(),
|
||||
"PanelHandle index out of range:", handle.index);
|
||||
|
||||
const Slot& slot = slots[handle.index];
|
||||
SOPHIA_ASSERT(slot.generation == handle.generation,
|
||||
"stale PanelHandle (generation mismatch):", handle.index);
|
||||
SOPHIA_ASSERT(slot.panel != nullptr,
|
||||
"PanelHandle refers to a removed panel:", handle.index);
|
||||
return *slot.panel;
|
||||
}
|
||||
|
||||
void PanelRegistry::remove(PanelHandle handle) {
|
||||
SOPHIA_ASSERT(handle.isValid(), "invalid PanelHandle");
|
||||
SOPHIA_ASSERT(handle.index < slots.size(),
|
||||
"PanelHandle index out of range:", handle.index);
|
||||
|
||||
Slot& slot = slots[handle.index];
|
||||
SOPHIA_ASSERT(slot.generation == handle.generation,
|
||||
"stale PanelHandle (generation mismatch):", handle.index);
|
||||
SOPHIA_ASSERT(slot.panel != nullptr,
|
||||
"PanelHandle already removed:", handle.index);
|
||||
|
||||
slot.panel.reset();
|
||||
slot.generation = (slot.generation + 1) & GENERATION_MASK;
|
||||
freeList.push_back(handle.index);
|
||||
}
|
||||
|
||||
bool PanelRegistry::isValid(PanelHandle handle) const {
|
||||
if (!handle.isValid() || handle.index >= slots.size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const Slot& slot = slots[handle.index];
|
||||
return slot.generation == handle.generation && slot.panel != nullptr;
|
||||
}
|
||||
|
||||
u32 PanelRegistry::size() const {
|
||||
u32 count = 0;
|
||||
for (const Slot& slot : slots) {
|
||||
if (slot.panel) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
u32 PanelRegistry::visibleCount() const {
|
||||
u32 count = 0;
|
||||
for (const Slot& slot : slots) {
|
||||
if (slot.panel && slot.panel->isVisible()) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void PanelRegistry::update(const FrameInfo& frameInfo) {
|
||||
for (auto& slot : slots) {
|
||||
if (slot.panel && slot.panel->isVisible()) {
|
||||
slot.panel->onUpdate(frameInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace sophia
|
||||
Reference in New Issue
Block a user