From c846a0626f3f507442a3b1c208160a692adb870b Mon Sep 17 00:00:00 2001 From: Bruno Herbelin Date: Sun, 11 Jun 2023 16:54:33 +0200 Subject: [PATCH] New left panel mode (auto hide or always visible) --- src/Settings.cpp | 2 + src/Settings.h | 1 + src/UserInterfaceManager.cpp | 149 ++++++++++++++++++++++++++++++----- src/UserInterfaceManager.h | 8 +- 4 files changed, 141 insertions(+), 19 deletions(-) diff --git a/src/Settings.cpp b/src/Settings.cpp index 8b6e1ac..6fdca23 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -137,6 +137,7 @@ void Settings::Save(uint64_t runtime) applicationNode->SetAttribute("show_tooptips", application.show_tooptips); applicationNode->SetAttribute("accept_connections", application.accept_connections); applicationNode->SetAttribute("pannel_history_mode", application.pannel_current_session_mode); + applicationNode->SetAttribute("pannel_always_visible", application.pannel_always_visible); applicationNode->SetAttribute("stream_protocol", application.stream_protocol); applicationNode->SetAttribute("broadcast_port", application.broadcast_port); applicationNode->SetAttribute("loopback_camera", application.loopback_camera); @@ -413,6 +414,7 @@ void Settings::Load() applicationNode->QueryBoolAttribute("action_history_follow_view", &application.action_history_follow_view); applicationNode->QueryBoolAttribute("show_tooptips", &application.show_tooptips); applicationNode->QueryBoolAttribute("accept_connections", &application.accept_connections); + applicationNode->QueryBoolAttribute("pannel_always_visible", &application.pannel_always_visible); applicationNode->QueryIntAttribute("pannel_history_mode", &application.pannel_current_session_mode); applicationNode->QueryIntAttribute("stream_protocol", &application.stream_protocol); applicationNode->QueryIntAttribute("broadcast_port", &application.broadcast_port); diff --git a/src/Settings.h b/src/Settings.h index 4a54215..21be66a 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -276,6 +276,7 @@ struct Application bool show_tooptips; int pannel_current_session_mode; + bool pannel_always_visible; // connection settings bool accept_connections; diff --git a/src/UserInterfaceManager.cpp b/src/UserInterfaceManager.cpp index 7ee66a0..576bd4b 100644 --- a/src/UserInterfaceManager.cpp +++ b/src/UserInterfaceManager.cpp @@ -381,9 +381,9 @@ void UserInterface::handleKeyboard() else if (ImGui::IsKeyPressed( GLFW_KEY_F12, false )) { Settings::application.render.disabled = !Settings::application.render.disabled; } - // button home to toggle menu + // button home to toggle panel else if (ImGui::IsKeyPressed( GLFW_KEY_HOME, false )) - navigator.togglePannelMenu(); + navigator.togglePannelAutoHide(); // button home to toggle menu else if (ImGui::IsKeyPressed( GLFW_KEY_INSERT, false )) navigator.togglePannelNew(); @@ -2488,7 +2488,7 @@ void HelperToolbox::Render() ImGui::SetColumnWidth(0, width_column0); ImGui::Text("HOME"); ImGui::NextColumn(); - ImGui::Text(ICON_FA_BARS " Main menu"); ImGui::NextColumn(); + ImGui::Text(ICON_FA_BARS " Toggle left panel"); ImGui::NextColumn(); ImGui::Text("INS"); ImGui::NextColumn(); ImGui::Text(ICON_FA_PLUS " New source"); ImGui::NextColumn(); ImGui::Text("DEL"); ImGui::NextColumn(); @@ -2523,7 +2523,7 @@ void HelperToolbox::Render() ImGui::Text(SHORTCUT_SHADEREDITOR); ImGui::NextColumn(); ImGui::Text(ICON_FA_CODE " " TOOLTIP_SHADEREDITOR "window"); ImGui::NextColumn(); ImGui::Text("ESC"); ImGui::NextColumn(); - ImGui::Text(ICON_FA_TOGGLE_OFF " Hide / " ICON_FA_TOGGLE_ON " Show windows"); ImGui::NextColumn(); + ImGui::Text(" Hide / Show all windows"); ImGui::NextColumn(); ImGui::Separator(); ImGui::Text(SHORTCUT_NEW_FILE); ImGui::NextColumn(); ImGui::Text(MENU_NEW_FILE " session"); ImGui::NextColumn(); @@ -2799,7 +2799,7 @@ SourceController::SourceController() : WorkspaceWindow("SourceController"), play_toggle_request_(false), replay_request_(false), pending_(false), active_label_(LABEL_AUTO_MEDIA_PLAYER), active_selection_(-1), selection_context_menu_(false), selection_mediaplayer_(nullptr), selection_target_slower_(0), selection_target_faster_(0), - mediaplayer_active_(nullptr), mediaplayer_edit_fading_(false), mediaplayer_mode_(false), mediaplayer_slider_pressed_(false), mediaplayer_timeline_zoom_(1.f), + mediaplayer_active_(nullptr), mediaplayer_edit_fading_(false), mediaplayer_edit_pipeline_(false), mediaplayer_mode_(false), mediaplayer_slider_pressed_(false), mediaplayer_timeline_zoom_(1.f), magnifying_glass(false) { info_.setExtendedStringMode(); @@ -3148,6 +3148,7 @@ void SourceController::Render() ImGui::EndMenu(); } + ImGui::Separator(); if (ImGui::BeginMenu(ICON_FA_SNOWFLAKE " Deactivation")) { bool option = !mediaplayer_active_->rewindOnDisabled(); @@ -3159,7 +3160,6 @@ void SourceController::Render() ImGui::EndMenu(); } // always allow for hardware decoding to be disabled - ImGui::Separator(); if (ImGui::BeginMenu(ICON_FA_MICROCHIP " Hardware decoding")) { bool hwdec = !mediaplayer_active_->softwareDecodingForced(); @@ -4539,6 +4539,78 @@ void SourceController::RenderMediaPlayer(MediaSource *ms) ImGui::CloseCurrentPopup(); ImGui::EndPopup(); } + + + if (mediaplayer_edit_pipeline_) { + ImGui::OpenPopup("Edit gstreamer pipeline"); + mediaplayer_edit_pipeline_ = false; + } + const ImVec2 mpp_dialog_size(buttons_width_ * 3.f, buttons_height_ * 6); + ImGui::SetNextWindowSize(mpp_dialog_size, ImGuiCond_Always); + const ImVec2 mpp_dialog_pos = top + rendersize * 0.5f - mpp_dialog_size * 0.5f; + ImGui::SetNextWindowPos(mpp_dialog_pos, ImGuiCond_Always); + if (ImGui::BeginPopupModal("Edit gstreamer pipeline", NULL, ImGuiWindowFlags_NoResize)) + { + bool update_new_source = false; + const ImVec2 pos = ImGui::GetCursorPos(); + const ImVec2 area = ImGui::GetContentRegionAvail(); + + static std::vector< std::pair< std::string, std::string> > _examples = { {"Primary color", "frei0r-filter-primaries" }, + {"Histogram", "frei0r-filter-rgb-parade"}, + {"Emboss", "frei0r-filter-emboss"}, + {"B&W", "frei0r-filter-bw0r"}, + {"Gamma", "frei0r-filter-gamma gamma=0.5"}, + {"Broken tv", "frei0r-filter-nosync0r "} + }; + static std::string _description = _examples[0].second; + static ImVec2 fieldsize(ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN, 100); + static int numlines = 0; + const ImGuiContext& g = *GImGui; + fieldsize.y = MAX(3, numlines) * g.FontSize + g.Style.ItemSpacing.y + g.Style.FramePadding.y; + + ImGui::Spacing(); + ImGui::Text("Enter pipeline element and apply:"); + ImGui::Spacing(); + + // Editor + if ( ImGuiToolkit::InputCodeMultiline("Filter", &_description, fieldsize, &numlines) ) + update_new_source = true; + + // Local menu for list of examples + ImVec2 pos_bot = ImGui::GetCursorPos(); + ImGui::SetCursorPos( pos_bot + ImVec2(fieldsize.x + IMGUI_SAME_LINE, -ImGui::GetFrameHeightWithSpacing())); + if (ImGui::BeginCombo("##Examples", "Examples", ImGuiComboFlags_NoPreview)) { + ImGui::TextDisabled("Gstreamer examples"); + ImGui::Separator(); + for (auto it = _examples.begin(); it != _examples.end(); ++it) { + if (ImGui::Selectable( it->first.c_str() ) ) { + _description = it->second; + update_new_source = true; + } + } + ImGui::EndCombo(); + } + + + bool close = false; + ImGui::SetCursorPos(pos + ImVec2(0.f, area.y - buttons_height_)); + if (ImGui::Button(ICON_FA_TIMES " Cancel", ImVec2(area.x * 0.3f, 0))) + close = true; + ImGui::SetCursorPos(pos + ImVec2(area.x * 0.7f, area.y - buttons_height_)); + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_Tab)); + if (ImGui::Button(ICON_FA_CHECK " Apply", ImVec2(area.x * 0.3f, 0)) + || ImGui::IsKeyPressed(GLFW_KEY_ENTER) || ImGui::IsKeyPressed(GLFW_KEY_KP_ENTER) ) { + close = true; + + // apply to pipeline + mediaplayer_active_->setEffect(_description); + } + ImGui::PopStyleColor(1); + + if (close) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } } void SourceController::DrawButtonBar(ImVec2 bottom, float width) @@ -7119,6 +7191,7 @@ Navigator::Navigator() // clean start show_config_ = false; pannel_visible_ = false; + pannel_alpha_ = 0.85f; view_pannel_visible = false; clearButtonSelection(); @@ -7172,7 +7245,7 @@ void Navigator::clearButtonSelection() void Navigator::showPannelSource(int index) { // invalid index given - if ( index < 0) + if ( index < 0 ) hidePannel(); else { selected_button[index] = true; @@ -7200,11 +7273,38 @@ void Navigator::togglePannelNew() new_media_mode_changed = true; } +void Navigator::togglePannelAutoHide() +{ + // toggle variable + Settings::application.pannel_always_visible = !Settings::application.pannel_always_visible; + // initiate change + if (Settings::application.pannel_always_visible) { + int current = Mixer::manager().indexCurrentSource(); + if ( current < 0 ) { + if (!selected_button[NAV_MENU] && !selected_button[NAV_TRANS] && !selected_button[NAV_NEW] ) + showPannelSource(NAV_MENU); + } + else + showPannelSource( current ); + } + else + hidePannel(); +} + +bool Navigator::pannelVisible() +{ + return pannel_visible_; +} + void Navigator::hidePannel() { - clearButtonSelection(); - pannel_visible_ = false; - view_pannel_visible = false; + if ( Settings::application.pannel_always_visible ) + showPannelSource(NAV_MENU); + else if ( pannel_visible_) { + clearButtonSelection(); + pannel_visible_ = false; + } + view_pannel_visible = false; show_config_ = false; } @@ -7388,16 +7488,18 @@ void Navigator::Render() ImVec2 pos = ImGui::GetCursorPos(); ImGui::SetCursorPos(pos + ImVec2(0.f, style.WindowPadding.y)); ImGuiToolkit::PushFont(ImGuiToolkit::FONT_MONO); + // icon for Fullscreen if ( ImGuiToolkit::IconButton( Rendering::manager().mainWindow().isFullscreen() ? ICON_FA_COMPRESS_ALT : ICON_FA_EXPAND_ALT ) ) Rendering::manager().mainWindow().toggleFullscreen(); if (ImGui::IsItemHovered()) tooltip = {TOOLTIP_FULLSCREEN, SHORTCUT_FULLSCREEN}; + // icon for toggle always visible / auto hide pannel ImGui::SetCursorPos(pos + ImVec2(width_ * 0.5f, style.WindowPadding.y)); - if ( ImGuiToolkit::IconButton( WorkspaceWindow::clear() ? ICON_FA_TOGGLE_OFF : ICON_FA_TOGGLE_ON ) ) - WorkspaceWindow::toggleClearRestoreWorkspace(); + if ( ImGuiToolkit::IconButton( Settings::application.pannel_always_visible ? ICON_FA_TOGGLE_ON : ICON_FA_TOGGLE_OFF ) ) + togglePannelAutoHide(); if (ImGui::IsItemHovered()) - tooltip = { WorkspaceWindow::clear() ? TOOLTIP_SHOW : TOOLTIP_HIDE, SHORTCUT_HIDE}; + tooltip = { Settings::application.pannel_always_visible ? TOOLTIP_PANEL_VISIBLE : TOOLTIP_PANEL_AUTO, SHORTCUT_PANEL_MODE }; ImGui::PopFont(); @@ -7415,13 +7517,18 @@ void Navigator::Render() else _timeout_tooltip = 0; + // Rendering of special side pannel for view zoom if ( view_pannel_visible && !pannel_visible_ ) RenderViewPannel( ImVec2(width_, sourcelist_height), ImVec2(width_*0.8f, height_ - sourcelist_height) ); ImGui::PopStyleVar(); ImGui::PopFont(); - if ( pannel_visible_){ + // Rendering of the side pannel + if ( pannel_visible_ || Settings::application.pannel_always_visible ){ + + pannel_alpha_ = Settings::application.pannel_always_visible ? 0.95f : 0.85f; + // pannel menu if (selected_button[NAV_MENU]) { @@ -7492,7 +7599,7 @@ void Navigator::RenderSourcePannel(Source *s) // Next window is a side pannel ImGui::SetNextWindowPos( ImVec2(width_, 0), ImGuiCond_Always ); ImGui::SetNextWindowSize( ImVec2(pannel_width_, height_), ImGuiCond_Always ); - ImGui::SetNextWindowBgAlpha(0.85f); // Transparent background + ImGui::SetNextWindowBgAlpha( pannel_alpha_ ); // Transparent background if (ImGui::Begin("##navigatorSource", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) { // TITLE @@ -7601,10 +7708,13 @@ void Navigator::setNewMedia(MediaCreateMode mode, std::string path) void Navigator::RenderNewPannel() { + if (Settings::application.current_view == View::TRANSITION) + return; + // Next window is a side pannel ImGui::SetNextWindowPos( ImVec2(width_, 0), ImGuiCond_Always ); ImGui::SetNextWindowSize( ImVec2(pannel_width_, height_), ImGuiCond_Always ); - ImGui::SetNextWindowBgAlpha(0.85f); // Transparent background + ImGui::SetNextWindowBgAlpha( pannel_alpha_ ); // Transparent background if (ImGui::Begin("##navigatorNewSource", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) { // TITLE @@ -9221,7 +9331,7 @@ void Navigator::RenderTransitionPannel() // Next window is a side pannel ImGui::SetNextWindowPos( ImVec2(width_, 0), ImGuiCond_Always ); ImGui::SetNextWindowSize( ImVec2(pannel_width_, height_), ImGuiCond_Always ); - ImGui::SetNextWindowBgAlpha(0.85f); // Transparent background + ImGui::SetNextWindowBgAlpha( pannel_alpha_ ); // Transparent background if (ImGui::Begin("##navigatorTrans", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) { // TITLE @@ -9283,10 +9393,13 @@ void Navigator::RenderTransitionPannel() void Navigator::RenderMainPannel() { + if (Settings::application.current_view == View::TRANSITION) + return; + // Next window is a side pannel ImGui::SetNextWindowPos( ImVec2(width_, 0), ImGuiCond_Always ); ImGui::SetNextWindowSize( ImVec2(pannel_width_, height_), ImGuiCond_Always ); - ImGui::SetNextWindowBgAlpha(0.85f); // Transparent background + ImGui::SetNextWindowBgAlpha( pannel_alpha_ ); // Transparent background if (ImGui::Begin("##navigatorMain", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav)) { // Temporary fix for preventing horizontal scrolling (https://github.com/ocornut/imgui/issues/2915) diff --git a/src/UserInterfaceManager.h b/src/UserInterfaceManager.h index 0d7b202..1226797 100644 --- a/src/UserInterfaceManager.h +++ b/src/UserInterfaceManager.h @@ -101,6 +101,9 @@ #define TOOLTIP_HIDE "Hide windows " #define TOOLTIP_SHOW "Show windows " #define SHORTCUT_HIDE "ESC" +#define TOOLTIP_PANEL_VISIBLE "Panel always visible " +#define TOOLTIP_PANEL_AUTO "Panel auto hide " +#define SHORTCUT_PANEL_MODE "HOME" #define LABEL_AUTO_MEDIA_PLAYER ICON_FA_USER_CIRCLE " User selection" #define LABEL_STORE_SELECTION " Create batch" @@ -167,6 +170,7 @@ class Navigator // behavior pannel bool show_config_; bool pannel_visible_; + float pannel_alpha_; bool view_pannel_visible; bool selected_button[NAV_COUNT]; int pattern_type; @@ -199,12 +203,13 @@ public: Navigator(); void Render(); - bool pannelVisible() { return pannel_visible_; } + bool pannelVisible(); void hidePannel(); void showPannelSource(int index); void togglePannelMenu(); void togglePannelNew(); void showConfig(); + void togglePannelAutoHide(); typedef enum { MEDIA_RECENT = 0, @@ -313,6 +318,7 @@ class SourceController : public WorkspaceWindow // Render a single media player MediaPlayer *mediaplayer_active_; bool mediaplayer_edit_fading_; + bool mediaplayer_edit_pipeline_; bool mediaplayer_mode_; bool mediaplayer_slider_pressed_; float mediaplayer_timeline_zoom_;