Add ToastManager class for displaying notifications in the editor
- Implemented ToastManager to manage and display toast notifications with different types (info, success, warning, error). - Introduced a Toast struct to encapsulate message details and time-to-live (TTL) for each notification. - Integrated ImGui for rendering notifications on the screen, allowing for dynamic updates and automatic removal based on TTL.
This commit is contained in:
76
src/app/editor/system/toast_manager.h
Normal file
76
src/app/editor/system/toast_manager.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#ifndef YAZE_APP_EDITOR_SYSTEM_TOAST_MANAGER_H
|
||||||
|
#define YAZE_APP_EDITOR_SYSTEM_TOAST_MANAGER_H
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
|
namespace yaze {
|
||||||
|
namespace editor {
|
||||||
|
|
||||||
|
enum class ToastType { kInfo, kSuccess, kWarning, kError };
|
||||||
|
|
||||||
|
struct Toast {
|
||||||
|
std::string message;
|
||||||
|
ToastType type = ToastType::kInfo;
|
||||||
|
float ttl_seconds = 3.0f;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ToastManager {
|
||||||
|
public:
|
||||||
|
void Show(const std::string &message, ToastType type = ToastType::kInfo,
|
||||||
|
float ttl_seconds = 3.0f) {
|
||||||
|
toasts_.push_back({message, type, ttl_seconds});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Draw() {
|
||||||
|
if (toasts_.empty()) return;
|
||||||
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
|
ImVec2 pos(io.DisplaySize.x - 10.f, 40.f);
|
||||||
|
|
||||||
|
// Iterate copy so we can mutate ttl while drawing ordered from newest.
|
||||||
|
for (auto it = toasts_.begin(); it != toasts_.end();) {
|
||||||
|
Toast &t = *it;
|
||||||
|
ImVec4 bg;
|
||||||
|
switch (t.type) {
|
||||||
|
case ToastType::kInfo: bg = ImVec4(0.10f, 0.10f, 0.10f, 0.85f); break;
|
||||||
|
case ToastType::kSuccess: bg = ImVec4(0.10f, 0.30f, 0.10f, 0.85f); break;
|
||||||
|
case ToastType::kWarning: bg = ImVec4(0.30f, 0.25f, 0.05f, 0.90f); break;
|
||||||
|
case ToastType::kError: bg = ImVec4(0.40f, 0.10f, 0.10f, 0.90f); break;
|
||||||
|
}
|
||||||
|
ImGui::SetNextWindowBgAlpha(bg.w);
|
||||||
|
ImGui::SetNextWindowPos(pos, ImGuiCond_Always, ImVec2(1.f, 0.f));
|
||||||
|
ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration |
|
||||||
|
ImGuiWindowFlags_AlwaysAutoResize |
|
||||||
|
ImGuiWindowFlags_NoSavedSettings |
|
||||||
|
ImGuiWindowFlags_NoNav;
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, bg);
|
||||||
|
if (ImGui::Begin("##toast", nullptr, flags)) {
|
||||||
|
ImGui::TextUnformatted(t.message.c_str());
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
ImGui::PopStyleColor(1);
|
||||||
|
|
||||||
|
// Decrease TTL
|
||||||
|
t.ttl_seconds -= io.DeltaTime;
|
||||||
|
if (t.ttl_seconds <= 0.f) {
|
||||||
|
it = toasts_.erase(it);
|
||||||
|
} else {
|
||||||
|
// Next toast stacks below
|
||||||
|
pos.y += ImGui::GetItemRectSize().y + 6.f;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::deque<Toast> toasts_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace editor
|
||||||
|
} // namespace yaze
|
||||||
|
|
||||||
|
#endif // YAZE_APP_EDITOR_SYSTEM_TOAST_MANAGER_H
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user