From 4d5d708d6d8fa2e6896aac9092135c38151cbbab Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sat, 21 Sep 2024 15:13:03 +0200 Subject: [PATCH] improve stream manager ui --- src/object_store_ui.cpp | 2 +- src/stream_manager_ui.cpp | 331 ++++++++++++++++++++------------------ src/stream_manager_ui.hpp | 2 + 3 files changed, 180 insertions(+), 155 deletions(-) diff --git a/src/object_store_ui.cpp b/src/object_store_ui.cpp index 677e052..eeb895a 100644 --- a/src/object_store_ui.cpp +++ b/src/object_store_ui.cpp @@ -90,7 +90,7 @@ template<> void ComponentEditorWidget(e ObjectStoreUI::ObjectStoreUI( ObjectStore2& os ) : _os(os) { - _ee.show_window = true; + _ee.show_window = false; _ee.registerComponent("ID"); _ee.registerComponent("DataCompressionType"); diff --git a/src/stream_manager_ui.cpp b/src/stream_manager_ui.cpp index c674de5..9b47341 100644 --- a/src/stream_manager_ui.cpp +++ b/src/stream_manager_ui.cpp @@ -13,188 +13,211 @@ StreamManagerUI::StreamManagerUI(ObjectStore2& os, StreamManager& sm) : _os(os), } void StreamManagerUI::render(void) { - if (ImGui::Begin("StreamManagerUI")) { - // TODO: node canvas? + { // main window menubar injection + // assumes the window "tomato" was rendered already by cg + if (ImGui::Begin("tomato")) { + if (ImGui::BeginMenuBar()) { + // TODO: drop all menu sep? + //ImGui::Separator(); // os already exists (very hacky) + if (ImGui::BeginMenu("ObjectStore")) { + if (ImGui::MenuItem("Stream Manger", nullptr, _show_window)) { + _show_window = !_show_window; + } + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + } + ImGui::End(); + } + + + if (!_show_window) { + return; + } + + if (ImGui::Begin("StreamManagerUI", &_show_window)) { + // TODO: node canvas // by fametype ?? - ImGui::SeparatorText("Sources"); + if (ImGui::CollapsingHeader("Sources")) { + // list sources + if (ImGui::BeginTable("sources_and_sinks", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { + ImGui::TableSetupColumn("id"); + ImGui::TableSetupColumn("name"); + ImGui::TableSetupColumn("##conn"); + ImGui::TableSetupColumn("type"); - // list sources - if (ImGui::BeginTable("sources_and_sinks", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { - ImGui::TableSetupColumn("id"); - ImGui::TableSetupColumn("name"); - ImGui::TableSetupColumn("##conn"); - ImGui::TableSetupColumn("type"); + ImGui::TableHeadersRow(); - ImGui::TableHeadersRow(); + for (const auto& [oc, ss] : _os.registry().view().each()) { + //ImGui::Text("src %d (%s)[%s]", entt::to_integral(entt::to_entity(oc)), ss.name.c_str(), ss.frame_type_name.c_str()); + ImGui::PushID(entt::to_integral(oc)); - for (const auto& [oc, ss] : _os.registry().view().each()) { - //ImGui::Text("src %d (%s)[%s]", entt::to_integral(entt::to_entity(oc)), ss.name.c_str(), ss.frame_type_name.c_str()); - ImGui::PushID(entt::to_integral(oc)); + ImGui::TableNextColumn(); + ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); - ImGui::TableNextColumn(); - ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); + const auto *ssrc = _os.registry().try_get(oc); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none"); - const auto *ssrc = _os.registry().try_get(oc); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none"); - - ImGui::TableNextColumn(); - if (ImGui::SmallButton("->")) { - // TODO: list type sinks - } - - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssrc!=nullptr?ssrc->frame_type_name.c_str():"???"); - - ImGui::PopID(); - } - - ImGui::EndTable(); - } - - ImGui::SeparatorText("Sinks"); - - // list sinks - if (ImGui::BeginTable("sources_and_sinks", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { - ImGui::TableSetupColumn("id"); - ImGui::TableSetupColumn("name"); - ImGui::TableSetupColumn("##conn"); - ImGui::TableSetupColumn("type"); - - ImGui::TableHeadersRow(); - - for (const auto& [oc, ss] : _os.registry().view().each()) { - //ImGui::Text("sink %d (%s)[%s]", entt::to_integral(entt::to_entity(oc)), ss.name.c_str(), ss.frame_type_name.c_str()); - - ImGui::PushID(entt::to_integral(oc)); - - ImGui::TableNextColumn(); - ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); - - const auto *ssink = _os.registry().try_get(oc); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssink!=nullptr?ssink->name.c_str():"none"); - - ImGui::TableNextColumn(); - if (ImGui::SmallButton("->")) { - // TODO: list type sinks - } - if (ImGui::BeginPopupContextItem("sink_connect")) { - if (ImGui::BeginMenu("connect video", ss.frame_type_name == entt::type_name::value())) { - for (const auto& [oc_src, s_src] : _os.registry().view().each()) { - if (s_src.frame_type_name != ss.frame_type_name) { - continue; - } - - ImGui::PushID(entt::to_integral(oc_src)); - - std::string source_label {"src "}; - source_label += std::to_string(entt::to_integral(entt::to_entity(oc_src))); - source_label += " ("; - source_label += s_src.name; - source_label += ")["; - source_label += s_src.frame_type_name; - source_label += "]"; - if (ImGui::MenuItem(source_label.c_str())) { - _sm.connect(oc_src, oc); - } - - ImGui::PopID(); - } - - ImGui::EndMenu(); + ImGui::TableNextColumn(); + if (ImGui::SmallButton("->")) { + // TODO: list type sinks } - if (ImGui::BeginMenu("connect audio", ss.frame_type_name == entt::type_name::value())) { - for (const auto& [oc_src, s_src] : _os.registry().view().each()) { - if (s_src.frame_type_name != ss.frame_type_name) { - continue; + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssrc!=nullptr?ssrc->frame_type_name.c_str():"???"); + + ImGui::PopID(); + } + + ImGui::EndTable(); + } + } // sources header + + if (ImGui::CollapsingHeader("Sinks")) { + // list sinks + if (ImGui::BeginTable("sources_and_sinks", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { + ImGui::TableSetupColumn("id"); + ImGui::TableSetupColumn("name"); + ImGui::TableSetupColumn("##conn"); + ImGui::TableSetupColumn("type"); + + ImGui::TableHeadersRow(); + + for (const auto& [oc, ss] : _os.registry().view().each()) { + //ImGui::Text("sink %d (%s)[%s]", entt::to_integral(entt::to_entity(oc)), ss.name.c_str(), ss.frame_type_name.c_str()); + + ImGui::PushID(entt::to_integral(oc)); + + ImGui::TableNextColumn(); + ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); + + const auto *ssink = _os.registry().try_get(oc); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssink!=nullptr?ssink->name.c_str():"none"); + + ImGui::TableNextColumn(); + if (ImGui::SmallButton("->")) { + // TODO: list type sinks + } + if (ImGui::BeginPopupContextItem("sink_connect")) { + if (ImGui::BeginMenu("connect video", ss.frame_type_name == entt::type_name::value())) { + for (const auto& [oc_src, s_src] : _os.registry().view().each()) { + if (s_src.frame_type_name != ss.frame_type_name) { + continue; + } + + ImGui::PushID(entt::to_integral(oc_src)); + + std::string source_label {"src "}; + source_label += std::to_string(entt::to_integral(entt::to_entity(oc_src))); + source_label += " ("; + source_label += s_src.name; + source_label += ")["; + source_label += s_src.frame_type_name; + source_label += "]"; + if (ImGui::MenuItem(source_label.c_str())) { + _sm.connect(oc_src, oc); + } + + ImGui::PopID(); } - ImGui::PushID(entt::to_integral(oc_src)); - - std::string source_label {"src "}; - source_label += std::to_string(entt::to_integral(entt::to_entity(oc_src))); - source_label += " ("; - source_label += s_src.name; - source_label += ")["; - source_label += s_src.frame_type_name; - source_label += "]"; - if (ImGui::MenuItem(source_label.c_str())) { - _sm.connect(oc_src, oc); - } - - ImGui::PopID(); + ImGui::EndMenu(); } - ImGui::EndMenu(); + if (ImGui::BeginMenu("connect audio", ss.frame_type_name == entt::type_name::value())) { + for (const auto& [oc_src, s_src] : _os.registry().view().each()) { + if (s_src.frame_type_name != ss.frame_type_name) { + continue; + } + + ImGui::PushID(entt::to_integral(oc_src)); + + std::string source_label {"src "}; + source_label += std::to_string(entt::to_integral(entt::to_entity(oc_src))); + source_label += " ("; + source_label += s_src.name; + source_label += ")["; + source_label += s_src.frame_type_name; + source_label += "]"; + if (ImGui::MenuItem(source_label.c_str())) { + _sm.connect(oc_src, oc); + } + + ImGui::PopID(); + } + + ImGui::EndMenu(); + } + ImGui::EndPopup(); } - ImGui::EndPopup(); + + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssink!=nullptr?ssink->frame_type_name.c_str():"???"); + + ImGui::PopID(); } - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssink!=nullptr?ssink->frame_type_name.c_str():"???"); - - ImGui::PopID(); + ImGui::EndTable(); } + } // sink header - ImGui::EndTable(); - } + if (ImGui::CollapsingHeader("Connections", ImGuiTreeNodeFlags_DefaultOpen)) { + // list connections + if (ImGui::BeginTable("connections", 6, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { + ImGui::TableSetupColumn("##id"); // TODO: remove? + ImGui::TableSetupColumn("##disco"); + ImGui::TableSetupColumn("##qdesc"); + ImGui::TableSetupColumn("from"); + ImGui::TableSetupColumn("to"); + ImGui::TableSetupColumn("type"); - ImGui::SeparatorText("Connections"); + ImGui::TableHeadersRow(); - // list connections - if (ImGui::BeginTable("connections", 6, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) { - ImGui::TableSetupColumn("##id"); // TODO: remove? - ImGui::TableSetupColumn("##disco"); - ImGui::TableSetupColumn("##qdesc"); - ImGui::TableSetupColumn("from"); - ImGui::TableSetupColumn("to"); - ImGui::TableSetupColumn("type"); + for (size_t i = 0; i < _sm._connections.size(); i++) { + const auto& con = _sm._connections[i]; + //ImGui::Text("con %d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity()))); - ImGui::TableHeadersRow(); + ImGui::PushID(i); - //for (const auto& con : _sm._connections) { - for (size_t i = 0; i < _sm._connections.size(); i++) { - const auto& con = _sm._connections[i]; - //ImGui::Text("con %d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity()))); + ImGui::TableNextColumn(); + ImGui::Text("%zu", i); // do connections have ids? - ImGui::PushID(i); + ImGui::TableNextColumn(); + if (ImGui::SmallButton("X")) { + con->stop = true; + } - ImGui::TableNextColumn(); - ImGui::Text("%zu", i); // do connections have ids? + ImGui::TableNextColumn(); + ImGui::Text("%d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity()))); - ImGui::TableNextColumn(); - if (ImGui::SmallButton("X")) { - con->stop = true; + const auto *ssrc = con->src.try_get(); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none"); + + const auto *ssink = con->sink.try_get(); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(ssink!=nullptr?ssink->name.c_str():"none"); + + ImGui::TableNextColumn(); + ImGui::TextUnformatted( + (ssrc!=nullptr)? + ssrc->frame_type_name.c_str(): + (ssink!=nullptr)? + ssink->frame_type_name.c_str() + :"???" + ); + + ImGui::PopID(); } - - ImGui::TableNextColumn(); - ImGui::Text("%d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity()))); - - const auto *ssrc = con->src.try_get(); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none"); - - const auto *ssink = con->sink.try_get(); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(ssink!=nullptr?ssink->name.c_str():"none"); - - ImGui::TableNextColumn(); - ImGui::TextUnformatted( - (ssrc!=nullptr)? - ssrc->frame_type_name.c_str(): - (ssink!=nullptr)? - ssink->frame_type_name.c_str() - :"???" - ); - - ImGui::PopID(); + ImGui::EndTable(); } - ImGui::EndTable(); - } + } // con header } ImGui::End(); } diff --git a/src/stream_manager_ui.hpp b/src/stream_manager_ui.hpp index de30af0..ba32030 100644 --- a/src/stream_manager_ui.hpp +++ b/src/stream_manager_ui.hpp @@ -7,6 +7,8 @@ class StreamManagerUI { ObjectStore2& _os; StreamManager& _sm; + bool _show_window {true}; + public: StreamManagerUI(ObjectStore2& os, StreamManager& sm);