diff --git a/rsc/images/icons.dds b/rsc/images/icons.dds index 3d4d75e..0e1bedc 100644 Binary files a/rsc/images/icons.dds and b/rsc/images/icons.dds differ diff --git a/src/ImGuiToolkit.cpp b/src/ImGuiToolkit.cpp index 9c88edf..a95cb87 100644 --- a/src/ImGuiToolkit.cpp +++ b/src/ImGuiToolkit.cpp @@ -541,9 +541,9 @@ bool ImGuiToolkit::ComboIcon (const char* label, int* current_item, std::vector< if ( ImGui::BeginCombo( label, text_buf, ImGuiComboFlags_None) ) { for (int p = 0; p < (int) items.size(); ++p){ ImGui::PushID((void*)(intptr_t)p); - if (ImGuiToolkit::SelectableIcon( "", - std::get<0>( items.at(p) ), + if (ImGuiToolkit::SelectableIcon( std::get<0>( items.at(p) ), std::get<1>( items.at(p) ), + "", p == *current_item) ) { *current_item = p; ret = true; @@ -560,9 +560,9 @@ bool ImGuiToolkit::ComboIcon (const char* label, int* current_item, std::vector< if ( ImGui::BeginCombo( label, text_buf, ImGuiComboFlags_None) ) { for (int p = 0; p < (int) items.size(); ++p){ ImGui::PushID((void*)(intptr_t)p); - if (ImGuiToolkit::SelectableIcon( std::get<2>( items.at(p) ).c_str(), - std::get<0>( items.at(p) ), + if (ImGuiToolkit::SelectableIcon( std::get<0>( items.at(p) ), std::get<1>( items.at(p) ), + std::get<2>( items.at(p) ).c_str(), p == *current_item) ) { *current_item = p; ret = true; @@ -579,7 +579,7 @@ bool ImGuiToolkit::ComboIcon (const char* label, int* current_item, std::vector< return ret; } -bool ImGuiToolkit::SelectableIcon(const char* label, int i, int j, bool selected) +bool ImGuiToolkit::SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2 &size_arg) { ImGuiContext& g = *GImGui; ImVec2 draw_pos = ImGui::GetCursorScreenPos() - g.Style.FramePadding * 0.5; @@ -588,15 +588,19 @@ bool ImGuiToolkit::SelectableIcon(const char* label, int i, int j, bool selected char space_buf[] = " "; const ImVec2 space_size = ImGui::CalcTextSize(" ", NULL); const int space_num = static_cast( ceil(g.FontSize / space_size.x) ); - space_buf[space_num]='\0'; + space_buf[space_num+1]='\0'; char text_buf[256]; - ImFormatString(text_buf, IM_ARRAYSIZE(text_buf), "%s %s", space_buf, label); + ImFormatString(text_buf, IM_ARRAYSIZE(text_buf), "%s%s", space_buf, label); // draw menu item - bool ret = ImGui::Selectable(text_buf, selected); + bool ret = ImGui::Selectable(text_buf, selected, ImGuiSelectableFlags_None, size_arg); - // overlay of icon on top of first item + // center icon vertically + draw_pos.y += size_arg.y > 0 ? (size_arg.y - space_size.y) * 0.5 : 0.0; + draw_pos.x += size_arg.x > 0 ? (size_arg.x - g.FontSize) * 0.5 : 0.0; + + // overlay of icon on top of first item _drawIcon(draw_pos, i, j); return ret; diff --git a/src/ImGuiToolkit.h b/src/ImGuiToolkit.h index 4670c56..7332881 100644 --- a/src/ImGuiToolkit.h +++ b/src/ImGuiToolkit.h @@ -28,7 +28,7 @@ namespace ImGuiToolkit bool ButtonIconToggle (int i, int j, int i_toggle, int j_toggle, bool* toggle, const char *tooltip = nullptr); bool ButtonIconMultistate (std::vector > icons, int* state, std::vector tooltips); bool MenuItemIcon (int i, int j, const char* label, const char* shortcut = nullptr, bool selected = false, bool enabled = true); - bool SelectableIcon(const char* label, int i, int j, bool selected = false); + bool SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2& size_arg = ImVec2(0,0)); bool ComboIcon (const char* label, int* current_item, std::vector > items, bool tooltiptext = false); // buttons diff --git a/src/ImGuiVisitor.cpp b/src/ImGuiVisitor.cpp index 22e6f65..927e454 100644 --- a/src/ImGuiVisitor.cpp +++ b/src/ImGuiVisitor.cpp @@ -923,7 +923,7 @@ void ImGuiVisitor::visit (RenderSource& s) } // icon to open output view ImGui::SetCursorPos(top); - if (ImGuiToolkit::IconButton(ICON_FA_LAPTOP, "Show Output")) + if (ImGuiToolkit::IconButton(ICON_FA_LAPTOP, "Open Display")) Settings::application.widget.preview = true; } else diff --git a/src/RenderSource.cpp b/src/RenderSource.cpp index 2edc4de..f3fd649 100644 --- a/src/RenderSource.cpp +++ b/src/RenderSource.cpp @@ -175,5 +175,5 @@ glm::ivec2 RenderSource::icon() const std::string RenderSource::info() const { - return "Rendering Output"; + return "Display loopback"; } diff --git a/src/UserInterfaceManager.cpp b/src/UserInterfaceManager.cpp index f9e69ea..4f77b0c 100644 --- a/src/UserInterfaceManager.cpp +++ b/src/UserInterfaceManager.cpp @@ -68,7 +68,6 @@ #include "Mixer.h" #include "Recorder.h" #include "SourceCallback.h" -#include "CloneSource.h" #include "MediaSource.h" #include "PatternSource.h" #include "DeviceSource.h" @@ -3103,14 +3102,11 @@ void Navigator::RenderSourcePannel(Source *s) // prepare panel for new source of same type MediaSource *file = dynamic_cast(s); MultiFileSource *sequence = dynamic_cast(s); - CloneSource *internal = dynamic_cast(s); PatternSource *generated = dynamic_cast(s); if (file != nullptr) Settings::application.source.new_type = SOURCE_FILE; else if (sequence != nullptr) Settings::application.source.new_type = SOURCE_SEQUENCE; - else if (internal != nullptr) - Settings::application.source.new_type = SOURCE_INTERNAL; else if (generated != nullptr) Settings::application.source.new_type = SOURCE_GENERATED; else @@ -3199,30 +3195,27 @@ void Navigator::RenderNewPannel() ImGui::Columns(5, NULL, false); bool selected_type[5] = {0}; selected_type[Settings::application.source.new_type] = true; - if (ImGui::Selectable( ICON_FA_PHOTO_VIDEO, &selected_type[SOURCE_FILE], 0, iconsize)) { + if (ImGuiToolkit::SelectableIcon( 2, 5, "##SOURCE_FILE", selected_type[SOURCE_FILE], iconsize)) { Settings::application.source.new_type = SOURCE_FILE; clearNewPannel(); } ImGui::NextColumn(); - if (ImGui::Selectable( ICON_FA_IMAGES, &selected_type[SOURCE_SEQUENCE], 0, iconsize)) { + if (ImGuiToolkit::SelectableIcon( 3, 9, "##SOURCE_SEQUENCE", selected_type[SOURCE_SEQUENCE], iconsize)) { Settings::application.source.new_type = SOURCE_SEQUENCE; clearNewPannel(); } ImGui::NextColumn(); - if (ImGui::Selectable( ICON_FA_PLUG, &selected_type[SOURCE_CONNECTED], 0, iconsize)) { + if (ImGuiToolkit::SelectableIcon( 10, 9, "##SOURCE_CONNECTED", selected_type[SOURCE_CONNECTED], iconsize)) { Settings::application.source.new_type = SOURCE_CONNECTED; clearNewPannel(); } ImGui::NextColumn(); - if (ImGui::Selectable( ICON_FA_COGS, &selected_type[SOURCE_GENERATED], 0, iconsize)) { + if (ImGuiToolkit::SelectableIcon( 11, 5, "##SOURCE_GENERATED", selected_type[SOURCE_GENERATED], iconsize)) { Settings::application.source.new_type = SOURCE_GENERATED; clearNewPannel(); } ImGui::NextColumn(); - if (ImGui::Selectable( ICON_FA_RETWEET, &selected_type[SOURCE_INTERNAL], 0, iconsize)) { - Settings::application.source.new_type = SOURCE_INTERNAL; - clearNewPannel(); - } + ImGui::Columns(1); ImGui::PopStyleVar(); @@ -3437,7 +3430,7 @@ void Navigator::RenderNewPannel() static MultiFileRecorder _video_recorder; static int _fps = 25; - ImGui::Text("Create image sequence:"); + ImGui::Text("Load image sequence:"); // clic button to load file if ( ImGui::Button( ICON_FA_FOLDER_OPEN " Open multiple", ImVec2(ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN, 0)) ) { @@ -3570,55 +3563,23 @@ void Navigator::RenderNewPannel() } - // Internal Source creator - else if (Settings::application.source.new_type == SOURCE_INTERNAL){ - - ImGui::Text("Loopback object:"); - - // fill new_source_preview with a new source - ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); - if (ImGui::BeginCombo("##Source", "Select")) - { - std::string label = "Rendering Loopback"; - if (ImGui::Selectable( label.c_str() )) { - new_source_preview_.setSource( Mixer::manager().createSourceRender(), label); - } - SourceList::iterator iter; - for (iter = Mixer::manager().session()->begin(); iter != Mixer::manager().session()->end(); ++iter) - { - label = std::string("Source ") + (*iter)->initials() + " - " + (*iter)->name(); - if (ImGui::Selectable( label.c_str() )) { - label = std::string("Clone of ") + label; - new_source_preview_.setSource( Mixer::manager().createSourceClone((*iter)->name(), false),label); - } - } - ImGui::EndCombo(); - } - - // Indication - ImGui::SameLine(); - ImGuiToolkit::HelpToolTip("Create a source replicating internal vimix objects.\n" - ICON_FA_CARET_RIGHT " Loopback from output\n" - ICON_FA_CARET_RIGHT " Clone other sources"); - } - // Generated Source creator else if (Settings::application.source.new_type == SOURCE_GENERATED){ bool update_new_source = false; - ImGui::Text("Generate graphics:"); + ImGui::Text("Generate graphic patterns:"); ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); if (ImGui::BeginCombo("##Pattern", "Select", ImGuiComboFlags_HeightLarge)) { - if ( ImGui::Selectable("Custom " ICON_FA_CARET_RIGHT) ) { + if ( ImGui::Selectable("Custom " ICON_FA_PLAY_CIRCLE) ) { update_new_source = true; custom_pipeline = true; pattern_type = -1; } for (int p = 0; p < (int) Pattern::count(); ++p){ pattern_descriptor pattern = Pattern::get(p); - std::string label = pattern.label + (pattern.animated ? " " ICON_FA_CARET_RIGHT : " "); + std::string label = pattern.label + (pattern.animated ? " " ICON_FA_PLAY_CIRCLE : " "); if (pattern.available && ImGui::Selectable( label.c_str(), p == pattern_type )) { update_new_source = true; custom_pipeline = false; @@ -3715,6 +3676,10 @@ void Navigator::RenderNewPannel() } } + if ( ImGui::Selectable("Display Loopback") ) { + new_source_preview_.setSource( Mixer::manager().createSourceRender(), "Display Loopback"); + } + if ( ImGui::Selectable("SRT Broadcaster") ) { new_source_preview_.setSource(); custom_connected = true; @@ -3732,7 +3697,8 @@ void Navigator::RenderNewPannel() ImGuiToolkit::HelpToolTip("Create a source capturing video streams from connected devices or machines;\n" ICON_FA_CARET_RIGHT " webcams or frame grabbers\n" ICON_FA_CARET_RIGHT " screen capture\n" - ICON_FA_CARET_RIGHT " shared by vimix on local network\n" + ICON_FA_CARET_RIGHT " vimix display loopback\n" + ICON_FA_CARET_RIGHT " vimix Peer-to-peer in local network\n" ICON_FA_CARET_RIGHT " broadcasted with SRT over network."); if (custom_connected) { diff --git a/src/UserInterfaceManager.h b/src/UserInterfaceManager.h index f73d8b7..b5489dd 100644 --- a/src/UserInterfaceManager.h +++ b/src/UserInterfaceManager.h @@ -77,7 +77,6 @@ public: SOURCE_SEQUENCE, SOURCE_CONNECTED, SOURCE_GENERATED, - SOURCE_INTERNAL, SOURCE_TYPES } NewSourceType;