improve stream manager ui
This commit is contained in:
parent
9b7ba5875c
commit
4d5d708d6d
@ -90,7 +90,7 @@ template<> void ComponentEditorWidget<ObjComp::Ephemeral::File::TransferStats>(e
|
|||||||
ObjectStoreUI::ObjectStoreUI(
|
ObjectStoreUI::ObjectStoreUI(
|
||||||
ObjectStore2& os
|
ObjectStore2& os
|
||||||
) : _os(os) {
|
) : _os(os) {
|
||||||
_ee.show_window = true;
|
_ee.show_window = false;
|
||||||
|
|
||||||
_ee.registerComponent<ObjectStore::Components::ID>("ID");
|
_ee.registerComponent<ObjectStore::Components::ID>("ID");
|
||||||
_ee.registerComponent<ObjectStore::Components::DataCompressionType>("DataCompressionType");
|
_ee.registerComponent<ObjectStore::Components::DataCompressionType>("DataCompressionType");
|
||||||
|
@ -13,188 +13,211 @@ StreamManagerUI::StreamManagerUI(ObjectStore2& os, StreamManager& sm) : _os(os),
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StreamManagerUI::render(void) {
|
void StreamManagerUI::render(void) {
|
||||||
if (ImGui::Begin("StreamManagerUI")) {
|
{ // main window menubar injection
|
||||||
// TODO: node canvas?
|
// 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 ??
|
// 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
|
ImGui::TableHeadersRow();
|
||||||
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<Components::StreamSource>().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<Components::StreamSource>().each()) {
|
ImGui::TableNextColumn();
|
||||||
//ImGui::Text("src %d (%s)[%s]", entt::to_integral(entt::to_entity(oc)), ss.name.c_str(), ss.frame_type_name.c_str());
|
ImGui::Text("%d", entt::to_integral(entt::to_entity(oc)));
|
||||||
ImGui::PushID(entt::to_integral(oc));
|
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
const auto *ssrc = _os.registry().try_get<Components::StreamSource>(oc);
|
||||||
ImGui::Text("%d", entt::to_integral(entt::to_entity(oc)));
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none");
|
||||||
|
|
||||||
const auto *ssrc = _os.registry().try_get<Components::StreamSource>(oc);
|
ImGui::TableNextColumn();
|
||||||
ImGui::TableNextColumn();
|
if (ImGui::SmallButton("->")) {
|
||||||
ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none");
|
// TODO: list type sinks
|
||||||
|
|
||||||
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<Components::StreamSink>().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<Components::StreamSink>(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<SDLVideoFrame>::value())) {
|
|
||||||
for (const auto& [oc_src, s_src] : _os.registry().view<Components::StreamSource>().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<SDLVideoFrame>(oc_src, oc);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::PopID();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::EndMenu();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::BeginMenu("connect audio", ss.frame_type_name == entt::type_name<AudioFrame>::value())) {
|
ImGui::TableNextColumn();
|
||||||
for (const auto& [oc_src, s_src] : _os.registry().view<Components::StreamSource>().each()) {
|
ImGui::TextUnformatted(ssrc!=nullptr?ssrc->frame_type_name.c_str():"???");
|
||||||
if (s_src.frame_type_name != ss.frame_type_name) {
|
|
||||||
continue;
|
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<Components::StreamSink>().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<Components::StreamSink>(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<SDLVideoFrame>::value())) {
|
||||||
|
for (const auto& [oc_src, s_src] : _os.registry().view<Components::StreamSource>().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<SDLVideoFrame>(oc_src, oc);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PushID(entt::to_integral(oc_src));
|
ImGui::EndMenu();
|
||||||
|
|
||||||
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<AudioFrame>(oc_src, oc);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::PopID();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::EndMenu();
|
if (ImGui::BeginMenu("connect audio", ss.frame_type_name == entt::type_name<AudioFrame>::value())) {
|
||||||
|
for (const auto& [oc_src, s_src] : _os.registry().view<Components::StreamSource>().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<AudioFrame>(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::EndTable();
|
||||||
ImGui::TextUnformatted(ssink!=nullptr?ssink->frame_type_name.c_str():"???");
|
|
||||||
|
|
||||||
ImGui::PopID();
|
|
||||||
}
|
}
|
||||||
|
} // 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
|
for (size_t i = 0; i < _sm._connections.size(); i++) {
|
||||||
if (ImGui::BeginTable("connections", 6, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_BordersInnerV)) {
|
const auto& con = _sm._connections[i];
|
||||||
ImGui::TableSetupColumn("##id"); // TODO: remove?
|
//ImGui::Text("con %d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity())));
|
||||||
ImGui::TableSetupColumn("##disco");
|
|
||||||
ImGui::TableSetupColumn("##qdesc");
|
|
||||||
ImGui::TableSetupColumn("from");
|
|
||||||
ImGui::TableSetupColumn("to");
|
|
||||||
ImGui::TableSetupColumn("type");
|
|
||||||
|
|
||||||
ImGui::TableHeadersRow();
|
ImGui::PushID(i);
|
||||||
|
|
||||||
//for (const auto& con : _sm._connections) {
|
ImGui::TableNextColumn();
|
||||||
for (size_t i = 0; i < _sm._connections.size(); i++) {
|
ImGui::Text("%zu", i); // do connections have ids?
|
||||||
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::PushID(i);
|
ImGui::TableNextColumn();
|
||||||
|
if (ImGui::SmallButton("X")) {
|
||||||
|
con->stop = true;
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("%zu", i); // do connections have ids?
|
ImGui::Text("%d->%d", entt::to_integral(entt::to_entity(con->src.entity())), entt::to_integral(entt::to_entity(con->sink.entity())));
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
const auto *ssrc = con->src.try_get<Components::StreamSource>();
|
||||||
if (ImGui::SmallButton("X")) {
|
ImGui::TableNextColumn();
|
||||||
con->stop = true;
|
ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none");
|
||||||
|
|
||||||
|
const auto *ssink = con->sink.try_get<Components::StreamSink>();
|
||||||
|
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::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<Components::StreamSource>();
|
|
||||||
ImGui::TableNextColumn();
|
|
||||||
ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none");
|
|
||||||
|
|
||||||
const auto *ssink = con->sink.try_get<Components::StreamSink>();
|
|
||||||
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();
|
} // con header
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ class StreamManagerUI {
|
|||||||
ObjectStore2& _os;
|
ObjectStore2& _os;
|
||||||
StreamManager& _sm;
|
StreamManager& _sm;
|
||||||
|
|
||||||
|
bool _show_window {true};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StreamManagerUI(ObjectStore2& os, StreamManager& sm);
|
StreamManagerUI(ObjectStore2& os, StreamManager& sm);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user