From 6607bd319c284d1a2e000683500808e910b4b33d Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Tue, 26 Jan 2021 22:16:57 +0100 Subject: [PATCH] New view navigation with [CTRL+TAB] --- UserInterfaceManager.cpp | 99 ++++++++++++++++++++++++++++++++++++++-- UserInterfaceManager.h | 3 ++ 2 files changed, 99 insertions(+), 3 deletions(-) diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 4c80ff6..338098f 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -161,6 +161,8 @@ UserInterface::UserInterface() show_imgui_about = false; show_gst_about = false; show_opengl_about = false; + show_view_navigator = 0; + target_view_navigator = 1; currentTextEdit = ""; screenshot_step = 0; @@ -340,11 +342,19 @@ void UserInterface::handleKeyboard() else if (ImGui::IsKeyPressed( GLFW_KEY_F ) && shift_modifier_active) { Rendering::manager().mainWindow().toggleFullscreen(); } + else if (ImGui::IsKeyPressed( GLFW_KEY_TAB )) { + show_view_navigator += shift_modifier_active ? 3 : 1; + } } // No CTRL modifier else { ctrl_modifier_active = false; + if (show_view_navigator > 0) { + show_view_navigator = 0; + Mixer::manager().setView((View::Mode) target_view_navigator); + } + // Application F-Keys if (ImGui::IsKeyPressed( GLFW_KEY_F1 )) Mixer::manager().setView(View::MIXING); @@ -783,7 +793,9 @@ void UserInterface::Render() if (Settings::application.widget.logs) Log::ShowLogWindow(&Settings::application.widget.logs); - // about dialogs + // dialogs + if (show_view_navigator > 0) + target_view_navigator = RenderViewNavigator( &show_view_navigator ); if (show_vimix_about) RenderAbout(&show_vimix_about); if (show_imgui_about) @@ -1375,6 +1387,88 @@ void UserInterface::RenderPreview() #endif } + +int UserInterface::RenderViewNavigator(int *shift) +{ + // calculate potential target view index : + // - shift increment : minus 1 to not react to first trigger + // - current_view : indices are between 1 (Mixing) and 5 (Appearance) + // - Modulo 4 to allow multiple repetition of shift increment + int target_index = ( (Settings::application.current_view -1)+ (*shift -1) )%4 + 1; + + // prepare rendering of centered, fixed-size, semi-transparent window; + ImGuiIO& io = ImGui::GetIO(); + ImVec2 window_pos = ImVec2(io.DisplaySize.x / 2.f, io.DisplaySize.y / 2.f); + ImVec2 window_pos_pivot = ImVec2(0.5f, 0.5f); + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + ImGui::SetNextWindowSize(ImVec2(500.f, 120.f + 2.f * ImGui::GetTextLineHeight()), ImGuiCond_Always); + ImGui::SetNextWindowBgAlpha(0.85f); + + // show window + if (ImGui::Begin("Views", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) + { + // prepare rendering of the array of selectable icons + bool selected_view[View::INVALID] = { }; + selected_view[ target_index ] = true; + ImVec2 iconsize(120.f, 120.f); + + // draw icons centered horizontally and vertically + ImVec2 alignment = ImVec2(0.4f, 0.5f); + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); + + // draw in 4 columns + ImGui::Columns(4, NULL, false); + + // 4 selectable large icons + ImGuiToolkit::PushFont(ImGuiToolkit::FONT_LARGE); + if (ImGui::Selectable( ICON_FA_BULLSEYE, &selected_view[1], 0, iconsize)) + { + Mixer::manager().setView(View::MIXING); + *shift = 0; + } + ImGui::NextColumn(); + if (ImGui::Selectable( ICON_FA_OBJECT_UNGROUP , &selected_view[2], 0, iconsize)) + { + Mixer::manager().setView(View::GEOMETRY); + *shift = 0; + } + ImGui::NextColumn(); + if (ImGui::Selectable( ICON_FA_LAYER_GROUP, &selected_view[3], 0, iconsize)) + { + Mixer::manager().setView(View::LAYER); + *shift = 0; + } + ImGui::NextColumn(); + if (ImGui::Selectable( ICON_FA_CHESS_BOARD, &selected_view[4], 0, iconsize)) + { + Mixer::manager().setView(View::APPEARANCE); + *shift = 0; + } + ImGui::PopFont(); + + // 4 subtitles (text centered in column) + ImGui::NextColumn(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Mixing").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x); + ImGui::Text("Mixing"); + ImGui::NextColumn(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Geometry").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x); + ImGui::Text("Geometry"); + ImGui::NextColumn(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Layers").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x); + ImGui::Text("Layers"); + ImGui::NextColumn(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Texturing").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x); + ImGui::Text("Texturing"); + + ImGui::Columns(1); + ImGui::PopStyleVar(); + + ImGui::End(); + } + + return target_index; +} + void UserInterface::showMediaPlayer(MediaPlayer *mp) { Settings::application.widget.media_player = true; @@ -1970,7 +2064,7 @@ void Navigator::Render() if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) { ImGui::SetDragDropPayload("DND_SOURCE", &index, sizeof(int)); - ImGui::Text("%s", s->initials()); + ImGui::Text( ICON_FA_SORT " %s ", s->initials()); ImGui::EndDragDropSource(); } if (ImGui::BeginDragDropTarget()) @@ -2027,7 +2121,6 @@ void Navigator::Render() about = "Mixing [ F1 ]"; if (ImGui::Selectable( ICON_FA_OBJECT_UNGROUP , &selected_view[2], 0, iconsize)) { - if (ImGui::IsItemHovered()) Mixer::manager().setView(View::GEOMETRY); view_pannel_visible = previous_view == Settings::application.current_view; } diff --git a/UserInterfaceManager.h b/UserInterfaceManager.h index 0d61542..2c829b1 100644 --- a/UserInterfaceManager.h +++ b/UserInterfaceManager.h @@ -113,6 +113,8 @@ class UserInterface bool show_imgui_about; bool show_gst_about; bool show_opengl_about; + int show_view_navigator; + int target_view_navigator; unsigned int screenshot_step; // frame grabbers @@ -165,6 +167,7 @@ protected: void RenderPreview(); void RenderHistory(); void RenderShaderEditor(); + int RenderViewNavigator(int* shift); void handleKeyboard(); void handleMouse(); void handleScreenshot();