mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-19 06:09:59 +01:00
Improve UX List of New source type to insert
New icons for inserted source panel. Merged loopback into connected list. Removed 'internal' new source.
This commit is contained in:
Binary file not shown.
@@ -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,13 +588,17 @@ 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<int>( 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);
|
||||
|
||||
// draw menu item
|
||||
bool ret = ImGui::Selectable(text_buf, selected);
|
||||
bool ret = ImGui::Selectable(text_buf, selected, ImGuiSelectableFlags_None, size_arg);
|
||||
|
||||
// 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);
|
||||
|
||||
@@ -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<std::pair<int, int> > icons, int* state, std::vector<std::string> 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<std::tuple<int, int, std::string> > items, bool tooltiptext = false);
|
||||
|
||||
// buttons
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -175,5 +175,5 @@ glm::ivec2 RenderSource::icon() const
|
||||
|
||||
std::string RenderSource::info() const
|
||||
{
|
||||
return "Rendering Output";
|
||||
return "Display loopback";
|
||||
}
|
||||
|
||||
@@ -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<MediaSource *>(s);
|
||||
MultiFileSource *sequence = dynamic_cast<MultiFileSource *>(s);
|
||||
CloneSource *internal = dynamic_cast<CloneSource *>(s);
|
||||
PatternSource *generated = dynamic_cast<PatternSource *>(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) {
|
||||
|
||||
@@ -77,7 +77,6 @@ public:
|
||||
SOURCE_SEQUENCE,
|
||||
SOURCE_CONNECTED,
|
||||
SOURCE_GENERATED,
|
||||
SOURCE_INTERNAL,
|
||||
SOURCE_TYPES
|
||||
} NewSourceType;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user