Files
ox/src/nostalgia/studio/lib/popup.hpp
T
2023-05-30 20:44:22 -05:00

63 lines
1.3 KiB
C++

/*
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <ox/event/signal.hpp>
#include <ox/std/string.hpp>
#include <ox/std/vec.hpp>
#include <nostalgia/core/context.hpp>
#include "imguiuitl.hpp"
namespace nostalgia::studio {
class Popup {
private:
ox::Vec2 m_size;
ox::String m_title;
public:
// emits path parameter
ox::Signal<ox::Error(const ox::String&)> finished;
virtual ~Popup() noexcept = default;
virtual void open() noexcept = 0;
virtual void close() noexcept = 0;
[[nodiscard]]
virtual bool isOpen() const noexcept = 0;
virtual void draw(core::Context *ctx) noexcept = 0;
protected:
constexpr void setSize(ox::Size sz) noexcept {
m_size = {static_cast<float>(sz.width), static_cast<float>(sz.height)};
}
constexpr void setTitle(ox::String title) noexcept {
m_title = std::move(title);
}
constexpr const ox::String &title() const noexcept {
return m_title;
}
void drawWindow(core::Context *ctx, bool *open, auto drawContents) {
studio::ig::centerNextWindow(ctx);
ImGui::SetNextWindowSize(static_cast<ImVec2>(m_size));
constexpr auto modalFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
if (ImGui::BeginPopupModal(m_title.c_str(), open, modalFlags)) {
drawContents();
}
}
};
}