Improved Menu for creating Bundle

This commit is contained in:
brunoherbelin
2025-12-03 20:43:47 +01:00
parent 1f5c3ffa8a
commit 0d28b455bc
5 changed files with 63 additions and 30 deletions

View File

@@ -308,7 +308,6 @@ void Navigator::Render()
// the "+" icon for action of creating new source
if (ImGui::Selectable( source_to_replace != nullptr ? ICON_FA_PLUS_SQUARE : ICON_FA_PLUS,
&selected_button[NAV_NEW], 0, iconsize)) {
Mixer::manager().unsetCurrentSource();
applyButtonSelection(NAV_NEW);
}
if (ImGui::IsItemHovered())
@@ -909,11 +908,30 @@ void Navigator::RenderNewPannel(const ImVec2 &iconsize)
clearNewPannel();
}
ImGui::NextColumn();
static int _previous_new_type = Settings::application.source.new_type;
if (source_to_replace == nullptr) {
if (ImGuiToolkit::SelectableIcon( ICON_SOURCE_GROUP, "##SOURCE_BUNDLE", selected_type[SOURCE_BUNDLE],
iconsize, ImGuiDir_Right)) {
_previous_new_type = Settings::application.source.new_type;
Settings::application.source.new_type = SOURCE_BUNDLE;
ImGui::OpenPopup("SOURCE_BUNDLE_MENU");
clearNewPannel();
}
}
ImGui::Columns(1);
ImGui::PopStyleVar();
ImGui::PopFont();
// Menu popup for SOURCE_BUNDLE
if (ImGui::BeginPopup("SOURCE_BUNDLE_MENU")) {
UserInterface::manager().showMenuBundle();
ImGui::EndPopup();
}
// restore previous type after closing popup
if (Settings::application.source.new_type == SOURCE_BUNDLE && !ImGui::IsPopupOpen("SOURCE_BUNDLE_MENU"))
Settings::application.source.new_type = _previous_new_type;
// Edit menu
ImGui::SetCursorPosY(2.f * width_ - style.WindowPadding.x);
static bool request_open_shader_editor = false;
@@ -1974,15 +1992,17 @@ void Navigator::RenderMainPannelSession()
// Preview session
//
Session *se = Mixer::manager().session();
float width = preview_width;
float height = se->frame()->projectionSize().y * width / ( se->frame()->projectionSize().x * se->frame()->aspectRatio());
if (height > preview_height - space) {
height = preview_height - space;
width = height * se->frame()->aspectRatio() * ( se->frame()->projectionSize().x / se->frame()->projectionSize().y);
if (se->frame()) {
float width = preview_width;
float height = se->frame()->projectionSize().y * width / ( se->frame()->projectionSize().x * se->frame()->aspectRatio());
if (height > preview_height - space) {
height = preview_height - space;
width = height * se->frame()->aspectRatio() * ( se->frame()->projectionSize().x / se->frame()->projectionSize().y);
}
// centered image
ImGui::SetCursorPos( ImVec2(pos.x + 0.5f * (preview_width-width), pos.y) );
ImGui::Image((void*)(uintptr_t) se->frame()->texture(), ImVec2(width, height));
}
// centered image
ImGui::SetCursorPos( ImVec2(pos.x + 0.5f * (preview_width-width), pos.y) );
ImGui::Image((void*)(uintptr_t) se->frame()->texture(), ImVec2(width, height));
// right side options for session
if (!Mixer::manager().session()->filename().empty()) {
@@ -3423,11 +3443,11 @@ void Navigator::RenderMainPannel(const ImVec2 &iconsize)
UserInterface::manager().showMenuWindows();
ImGui::EndMenu();
}
ImGui::SetCursorPos( ImVec2( pannel_width_ IMGUI_RIGHT_ALIGN, IMGUI_TOP_ALIGN + 3.f * ImGui::GetTextLineHeightWithSpacing()) );
if (ImGui::BeginMenu("Bundle")) {
UserInterface::manager().showMenuBundle();
ImGui::EndMenu();
}
// ImGui::SetCursorPos( ImVec2( pannel_width_ IMGUI_RIGHT_ALIGN, IMGUI_TOP_ALIGN + 3.f * ImGui::GetTextLineHeightWithSpacing()) );
// if (ImGui::BeginMenu("Bundle")) {
// UserInterface::manager().showMenuBundle();
// ImGui::EndMenu();
// }
//
// Panel content

View File

@@ -82,7 +82,8 @@ public:
SOURCE_FILE = 0,
SOURCE_SEQUENCE,
SOURCE_CONNECTED,
SOURCE_GENERATED
SOURCE_GENERATED,
SOURCE_BUNDLE
} NewSourceType;
Navigator();

View File

@@ -617,7 +617,7 @@ bool ImGuiToolkit::ComboIcon (const char* label, int* current_item,
return ret;
}
bool ImGuiToolkit::SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2 &size_arg)
bool ImGuiToolkit::SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2 &size_arg, ImGuiDir dir)
{
ImGuiContext& g = *GImGui;
ImVec2 draw_pos = ImGui::GetCursorScreenPos() - g.Style.FramePadding * 0.5;
@@ -640,6 +640,13 @@ bool ImGuiToolkit::SelectableIcon(int i, int j, const char* label, bool selected
// overlay of icon on top of first item
_drawIcon(draw_pos, i, j);
// draw arrow
if (dir != ImGuiDir_None) {
draw_pos += size_arg - ImVec2( g.FontSize - g.Style.ItemInnerSpacing.x, g.FontSize - g.Style.ItemInnerSpacing.y);
ImGui::RenderArrow(ImGui::GetCurrentWindow()->DrawList, draw_pos,
ImGui::GetColorU32(ImGuiCol_Text), dir, 0.6f);
}
ImGui::PopID();
return ret;

View File

@@ -32,7 +32,7 @@ namespace ImGuiToolkit
bool ButtonIconMultistate (std::vector<std::pair<int, int> > icons, int* state, std::vector<std::string> tooltips);
bool BeginMenuIcon(int i, int j, const char *label, bool enabled = true);
bool MenuItemIcon (int i, int j, const char* label, const char* shortcut = nullptr, bool selected = false, bool enabled = true);
bool SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2& size_arg = ImVec2(0,0));
bool SelectableIcon(int i, int j, const char* label, bool selected, const ImVec2& size_arg = ImVec2(0,0), ImGuiDir dir = ImGuiDir_None);
bool ComboIcon (const char* label, int* current_item, std::vector<std::tuple<int, int, std::string> > items, std::vector<std::string> tooltips = {});
// buttons

View File

@@ -1085,28 +1085,33 @@ void UserInterface::showMenuEdit()
}
void UserInterface::showMenuBundle()
{
{
ImGui::MenuItem("Create bundle with:", NULL, false, false);
bool is_bundle = false;
if (Mixer::manager().currentSource() != nullptr)
bool is_clone = false;
if (Mixer::manager().currentSource() != nullptr){
is_bundle = Mixer::manager().currentSource()->icon() == glm::ivec2(ICON_SOURCE_GROUP);
is_clone = Mixer::manager().currentSource()->cloned() || Mixer::manager().currentSource()->icon() == glm::ivec2(ICON_SOURCE_CLONE);
}
if (ImGuiToolkit::MenuItemIcon(11, 2, " Current source", NULL, false,
Mixer::manager().currentSource() != nullptr && !is_bundle)) {
Mixer::manager().currentSource() != nullptr && !is_bundle && !is_clone)) {
Mixer::manager().groupCurrent();
// switch pannel to show first source (created)
navigator.showPannelSource(0);
navigator.showPannelSource(Mixer::manager().indexCurrentSource());
}
if (ImGuiToolkit::MenuItemIcon(11, 2, " Selection", NULL, false,
if (ImGuiToolkit::MenuItemIcon(11, 2, " Selected sources", NULL, false,
Mixer::manager().selectionCanBeGroupped())) {
Mixer::manager().groupSelection();
// switch pannel to show first source (created)
navigator.showPannelSource(0);
navigator.showPannelSource(Mixer::manager().indexCurrentSource());
}
if (ImGuiToolkit::MenuItemIcon(11, 2, " All active sources", NULL, false,
Mixer::manager().numSource() > 0)) {
// create a new group session with only active sources
Mixer::manager().groupAll( true );
// switch pannel to show first source (created)
navigator.showPannelSource(0);
navigator.showPannelSource(Mixer::manager().indexCurrentSource());
}
if (ImGuiToolkit::MenuItemIcon(11, 2, " Everything", NULL, false,
Mixer::manager().numSource() > 0)) {
@@ -1116,16 +1121,16 @@ void UserInterface::showMenuBundle()
navigator.showPannelSource(0);
}
ImGui::Separator();
if (ImGuiToolkit::MenuItemIcon(7, 2, " Uncover bundle", NULL, false,
if (ImGuiToolkit::MenuItemIcon(7, 2, " Uncover selected bundle", NULL, false,
is_bundle)) {
// import sourses of bundle
Mixer::manager().import( dynamic_cast<SessionSource*>(Mixer::manager().currentSource()) );
}
// if (ImGuiToolkit::MenuItemIcon(7, 2, " Uncover all", NULL, false,
// Mixer::manager().numSource() > 0)) {
// // ungroup all bundle sources
// Mixer::manager().ungroupAll();
// }
if (ImGuiToolkit::MenuItemIcon(7, 2, " Uncover every bundles", NULL, false,
Mixer::manager().numSource() > 0)) {
// ungroup all bundle sources
Mixer::manager().ungroupAll();
}
}
void UserInterface::showMenuWindows()