From 48380fab7e95a53f727f40142adc445477c0081c Mon Sep 17 00:00:00 2001 From: Bruno Date: Sun, 23 May 2021 12:32:32 +0200 Subject: [PATCH] Improved link between ImGuiVisitor and SourcePlayer Source panel shows description and icon to open player UI. Changed icon player, and fixed source selection. --- ImGuiToolkit.cpp | 1 + ImGuiVisitor.cpp | 143 ++++++++++-- UserInterfaceManager.cpp | 472 ++++----------------------------------- UserInterfaceManager.h | 20 +- defines.h | 2 +- 5 files changed, 164 insertions(+), 474 deletions(-) diff --git a/ImGuiToolkit.cpp b/ImGuiToolkit.cpp index 71f97ae..7d9b8e1 100644 --- a/ImGuiToolkit.cpp +++ b/ImGuiToolkit.cpp @@ -213,6 +213,7 @@ bool ImGuiToolkit::IconButton(const char* icon, const char *tooltip) float frame_height = ImGui::GetFrameHeight(); float frame_width = frame_height; + ImVec2 draw_pos = ImGui::GetCursorScreenPos(); // toggle action : operate on the whole area diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index 1b51cac..2be3e3a 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -553,9 +553,24 @@ void ImGuiVisitor::visit (MediaSource& s) else ImGui::Text("Video File"); - if ( ImGui::Button(IMGUI_TITLE_MEDIAPLAYER, ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) - UserInterface::manager().showMediaPlayer( s.mediaplayer()); + // Media info + MediaPlayer *mp = s.mediaplayer(); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%s\n%d x %d px, %s", SystemToolkit::filename(s.path()).c_str(), + mp->width(), mp->height(), mp->media().codec_name.c_str()); + ImGui::PopTextWrapPos(); + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } + + // folder std::string path = SystemToolkit::path_filename(s.path()); std::string label = BaseToolkit::trunc_string(path, 25); label = BaseToolkit::transliterate(label); @@ -573,7 +588,27 @@ void ImGuiVisitor::visit (SessionFileSource& s) ImGuiToolkit::Icon(s.icon().x, s.icon().y); ImGui::SameLine(0, 10); ImGui::Text("Session File"); -// ImGui::Text("%s", SystemToolkit::base_filename(s.path()).c_str()); + + // info + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%d sources in %s\n%d x %d px, RGB", s.session()->numSource(), SystemToolkit::filename(s.path()).c_str(), + s.session()->frame()->width(), s.session()->frame()->height() ); + ImGui::PopTextWrapPos(); + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } + + if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) + Mixer::manager().import( &s ); + ImGui::SameLine(); + ImGui::Text("Sources"); if (ImGuiToolkit::ButtonIcon(3, 2)) s.session()->setFading(0.f); float f = s.session()->fading(); @@ -586,7 +621,7 @@ void ImGuiVisitor::visit (SessionFileSource& s) oss << s.name() << ": Fading " << std::setprecision(2) << f; Action::manager().store(oss.str()); } - if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Open Session", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) + if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Open", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) Mixer::manager().set( s.detach() ); ImGui::SameLine(); ImGui::Text("File"); @@ -598,9 +633,6 @@ void ImGuiVisitor::visit (SessionFileSource& s) ImGui::SameLine(); ImGui::Text("Folder"); - ImGui::Text("Contains %d sources.", s.session()->numSource()); - if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) - Mixer::manager().import( &s ); } void ImGuiVisitor::visit (SessionGroupSource& s) @@ -611,12 +643,25 @@ void ImGuiVisitor::visit (SessionGroupSource& s) ImGuiToolkit::Icon(s.icon().x, s.icon().y); ImGui::SameLine(0, 10); ImGui::Text("Flat Sesion group"); - ImGui::Text("Contains %d sources.", s.session()->numSource()); + + // info + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%d sources in group\n%d x %d px, RGB", s.session()->numSource(), s.session()->frame()->width(), s.session()->frame()->height() ); + ImGui::PopTextWrapPos(); + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } if ( ImGui::Button( ICON_FA_UPLOAD " Expand", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ){ Mixer::manager().import( &s ); } - } void ImGuiVisitor::visit (RenderSource& s) @@ -645,6 +690,22 @@ void ImGuiVisitor::visit (PatternSource& s) ImGui::SameLine(0, 10); ImGui::Text("Pattern"); + // stream info + Pattern *mp = s.pattern(); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%d x %d px, RGB", mp->width(), mp->height() ); + ImGui::PopTextWrapPos(); + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } + ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); if (ImGui::BeginCombo("##Patterns", Pattern::pattern_types[s.pattern()->type()].c_str()) ) { @@ -668,6 +729,26 @@ void ImGuiVisitor::visit (DeviceSource& s) ImGui::SameLine(0, 10); ImGui::Text("Device"); + // device info + DeviceConfigSet confs = Device::manager().config( Device::manager().index(s.device().c_str())); + if ( !confs.empty()) { + DeviceConfig best = *confs.rbegin(); + float fps = static_cast(best.fps_numerator) / static_cast(best.fps_denominator); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%d x %d px @%.1ffps, %s %s ", best.width, best.height, fps, best.stream.c_str(), best.format.c_str()); + ImGui::PopTextWrapPos(); + } + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } + ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); if (ImGui::BeginCombo("##Hardware", s.device().c_str())) { @@ -682,12 +763,7 @@ void ImGuiVisitor::visit (DeviceSource& s) } ImGui::EndCombo(); } - DeviceConfigSet confs = Device::manager().config( Device::manager().index(s.device().c_str())); - if ( !confs.empty()) { - DeviceConfig best = *confs.rbegin(); - float fps = static_cast(best.fps_numerator) / static_cast(best.fps_denominator); - ImGui::Text("%s %s %dx%d@%.1ffps", best.stream.c_str(), best.format.c_str(), best.width, best.height, fps); - } + } void ImGuiVisitor::visit (NetworkSource& s) @@ -696,19 +772,31 @@ void ImGuiVisitor::visit (NetworkSource& s) ImGui::SameLine(0, 10); ImGui::Text("Network stream"); + // network info + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(IMGUI_COLOR_STREAM, 0.9f)); ImGui::Text("%s", s.connection().c_str()); ImGui::PopStyleColor(1); NetworkStream *ns = s.networkStream(); - ImGui::Text(" - %s (%dx%d)\n - Server address %s", NetworkToolkit::protocol_name[ns->protocol()], - ns->resolution().x, ns->resolution().y, ns->serverAddress().c_str()); + ImGui::Text("%d x %d px, %s\nServer address %s", ns->resolution().x, ns->resolution().y, + NetworkToolkit::protocol_name[ns->protocol()], ns->serverAddress().c_str()); + ImGui::PopTextWrapPos(); + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } if ( ImGui::Button( ICON_FA_REPLY " Reconnect", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) { // TODO : reload ? s.setConnection(s.connection()); } - } @@ -720,10 +808,20 @@ void ImGuiVisitor::visit (MultiFileSource& s) static int64_t id = s.id(); // information text - std::ostringstream msg; - msg << "Sequence of " << s.sequence().max - s.sequence().min + 1 << " "; - msg << s.sequence().codec << " images"; - ImGui::Text("%s", msg.str().c_str()); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + ImGui::Text("%d numbered images [%d %d]\n%d x %d px, %s", s.sequence().max - s.sequence().min + 1, + s.sequence().min, s.sequence().max, s.sequence().width, s.sequence().height, s.sequence().codec.c_str()); + ImGui::PopTextWrapPos(); + + // icon (>) to open player + if ( s.playable() ) { + ImVec2 pos = ImGui::GetCursorPos(); + ImGui::SameLine(0, 0); + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN); + if (ImGuiToolkit::IconButton(ICON_FA_PLAY_CIRCLE, "Open in Player")) + UserInterface::manager().showSourceEditor(&s); + ImGui::SetCursorPos(pos); + } // change range static int _begin = -1; @@ -764,5 +862,4 @@ void ImGuiVisitor::visit (MultiFileSource& s) ImGui::SameLine(); ImGui::Text("Folder"); - id = s.id(); } diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 0a4b0fc..6be0605 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -1399,28 +1399,28 @@ int UserInterface::RenderViewNavigator(int *shift) void UserInterface::showSourceEditor(Source *s) { - MediaSource *ms = dynamic_cast(s); - if (ms != nullptr) { - showMediaPlayer(ms->mediaplayer()); - return; - } - CloneSource *cs = dynamic_cast(s); - if (cs != nullptr) { - Mixer::manager().setCurrentSource( cs->origin() ); - return; - } - RenderSource *rs = dynamic_cast(s); - if (rs != nullptr) { - Settings::application.widget.preview = true; - return; - } - navigator.showPannelSource( Mixer::manager().indexCurrentSource() ); -} + Mixer::manager().unsetCurrentSource(); + Mixer::selection().clear(); -void UserInterface::showMediaPlayer(MediaPlayer *mp) -{ - Settings::application.widget.media_player = true; - mediacontrol.setMediaPlayer(mp); + if (s) { + Mixer::manager().setCurrentSource( s ); + if (s->playable()) { + Settings::application.widget.media_player = true; + sourcecontrol.resetActiveSelection(); + return; + } + CloneSource *cs = dynamic_cast(s); + if (cs != nullptr) { + Mixer::manager().setCurrentSource( cs->origin() ); + return; + } + RenderSource *rs = dynamic_cast(s); + if (rs != nullptr) { + Settings::application.widget.preview = true; + return; + } + navigator.showPannelSource( Mixer::manager().indexCurrentSource() ); + } } void UserInterface::fillShaderEditor(const std::string &text) @@ -1742,7 +1742,6 @@ void UserInterface::RenderNotes() if (se!=nullptr) { ImVec4 color = ImGui::GetStyle().Colors[ImGuiCol_ResizeGripHovered]; - // ImVec4 color = ImGui::GetStyle().Colors[ImGuiCol_CheckMark]; color.w = 0.35f; ImGui::PushStyleColor(ImGuiCol_WindowBg, color); ImGui::PushStyleColor(ImGuiCol_TitleBg, color); @@ -1960,411 +1959,27 @@ void ToolBox::Render() } -/// -/// MEDIA CONTROLLER -/// -MediaController::MediaController() : mp_(nullptr), current_(LABEL_AUTO_MEDIA_PLAYER), - follow_active_source_(true), media_playing_mode_(false), slider_pressed_(false) -{ -} - -void MediaController::setMediaPlayer(MediaPlayer *mp) -{ - if (mp && mp->isOpen()) { - mp_ = mp; - current_ = SystemToolkit::base_filename(mp_->filename()); - follow_active_source_ = false; - media_playing_mode_ = mp_->isPlaying(); - } - else { - mp_ = nullptr; - current_ = LABEL_AUTO_MEDIA_PLAYER; - follow_active_source_ = true; - media_playing_mode_ = false; - } -} - -void MediaController::followCurrentSource() -{ - Source *s = Mixer::manager().currentSource(); - MediaSource *ms = nullptr; - - if ( s != nullptr) - ms = dynamic_cast(s); - - if ( ms != nullptr) { - // update the internal mediaplayer if changed - if (mp_ != ms->mediaplayer()) { - mp_ = ms->mediaplayer(); - media_playing_mode_ = mp_->isPlaying(); - } - } - else { - mp_ = nullptr; - media_playing_mode_ = false; - } -} - -void MediaController::Render() -{ - ImGui::SetNextWindowPos(ImVec2(1180, 400), ImGuiCond_FirstUseEver); - ImGui::SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); - - // constraint position - static ImVec2 media_window_pos = ImVec2(1180, 20); - static ImVec2 media_window_size = ImVec2(400, 260); - SetNextWindowVisible(media_window_pos, media_window_size); - - // estimate window size - const ImGuiContext& g = *GImGui; - const float _spacing = 6.0f; - const float _height = g.FontSize + g.Style.FramePadding.y * 2.0f ; - const float _timeline_height = (g.FontSize + g.Style.FramePadding.y) * 2.0f ; // double line for each timeline - const float _scrollbar_height = g.Style.ScrollbarSize; - // all together: 1 title bar + spacing + 1 toolbar + spacing + 2 timelines + scrollbar - const float _toobar_height = _height + 2.f * _timeline_height + _scrollbar_height + 2.f * _spacing; - - // window: 1 title bar + spacing + toolbar - ImVec2 MinWindowSize = ImVec2(350.f, _height + _spacing + _toobar_height); - if (Settings::application.widget.media_player_listview) { - // + min 2 lines for player if visible - MinWindowSize.y += 2.f * _height; - // free window height - ImGui::SetNextWindowSizeConstraints(MinWindowSize, ImVec2(FLT_MAX, FLT_MAX)); - } - else { - // fixed window height - ImGui::SetNextWindowSizeConstraints(MinWindowSize, ImVec2(FLT_MAX, MinWindowSize.y)); - } - - if ( !ImGui::Begin(IMGUI_TITLE_MEDIAPLAYER, &Settings::application.widget.media_player, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse )) - { - ImGui::End(); - return; - } - media_window_pos = ImGui::GetWindowPos(); - media_window_size = ImGui::GetWindowSize(); - - // verify that mp is still registered - if ( std::find(MediaPlayer::begin(),MediaPlayer::end(), mp_ ) == MediaPlayer::end() ) { - setMediaPlayer(); - } - - // menu (no title bar) - if (ImGui::BeginMenuBar()) - { - if (ImGuiToolkit::IconButton(4,16)) - Settings::application.widget.media_player = false; - if (ImGui::BeginMenu(IMGUI_TITLE_MEDIAPLAYER)) - { - ImGui::MenuItem( ICON_FA_EYE " Preview", nullptr, &Settings::application.widget.media_player_listview); -// ImGui::MenuItem( ICON_FA_QUESTION_CIRCLE " Help", nullptr, &media_player_help); - -// if ( ImGui::MenuItem( " RESET") ){ -// std::list lm = MediaPlayer::registered(); -// for( auto m=lm.begin(); m!=lm.end();++m) -// (*m)->reopen(); -// } - - if ( ImGui::MenuItem( ICON_FA_TIMES " Close", CTRL_MOD "P") ) - Settings::application.widget.media_player = false; - - ImGui::EndMenu(); - } - if (mp_ && current_ != LABEL_AUTO_MEDIA_PLAYER && MediaPlayer::registered().size() > 1) { - bool tmp = false; - if ( ImGui::Selectable(ICON_FA_CHEVRON_LEFT, &tmp, ImGuiSelectableFlags_None, ImVec2(10,0))) { - - auto mpit = std::find(MediaPlayer::begin(),MediaPlayer::end(), mp_ ); - if (mpit == MediaPlayer::begin()) { - mpit = MediaPlayer::end(); - } - mpit--; - setMediaPlayer(*mpit); - - } - if ( ImGui::Selectable(ICON_FA_CHEVRON_RIGHT, &tmp, ImGuiSelectableFlags_None, ImVec2(10,0))) { - - auto mpit = std::find(MediaPlayer::begin(),MediaPlayer::end(), mp_ ); - mpit++; - if (mpit == MediaPlayer::end()) { - mpit = MediaPlayer::begin(); - } - setMediaPlayer(*mpit); - } - } - if (ImGui::BeginMenu(current_.c_str())) - { - if (ImGui::MenuItem(LABEL_AUTO_MEDIA_PLAYER)) - setMediaPlayer(); - - // display list of available media - for (auto mpit = MediaPlayer::begin(); mpit != MediaPlayer::end(); ++mpit ) - { - std::string label = (*mpit)->filename(); - if (ImGui::MenuItem( label.c_str() )) - setMediaPlayer(*mpit); - } - - ImGui::EndMenu(); - } - - - ImGui::EndMenuBar(); - } - - // mode auto : select the media player from active source - if (follow_active_source_) - followCurrentSource(); - - // Something to show ? - if (mp_ && mp_->isOpen()) - { - static float timeline_zoom = 1.f; - const float width = ImGui::GetContentRegionAvail().x; - const float slider_zoom_width = _timeline_height / 2.f; - - if (Settings::application.widget.media_player_listview) - { - // set an image height to fill the vertical space, minus the height of control bar - float image_height = ImGui::GetContentRegionAvail().y; - if ( !mp_->isImage() ) { - // leave space for buttons and timelines + spacing - image_height -= _toobar_height; - } - - // display media - ImVec2 imagesize ( image_height * mp_->aspectRatio(), image_height); - ImVec2 tooltip_pos = ImGui::GetCursorScreenPos(); - ImGui::SetCursorPosX(ImGui::GetCursorPos().x + (ImGui::GetContentRegionAvail().x - imagesize.x) / 2.0); - ImGui::Image((void*)(uintptr_t)mp_->texture(), imagesize); - ImVec2 return_to_pos = ImGui::GetCursorPos(); - - // display media information - if (ImGui::IsItemHovered()) { - - float tooltip_height = 3.f * ImGui::GetTextLineHeightWithSpacing(); - - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - draw_list->AddRectFilled(ImVec2(tooltip_pos.x - 10.f, tooltip_pos.y), - ImVec2(tooltip_pos.x + width + 10.f, tooltip_pos.y + tooltip_height), IMGUI_COLOR_OVERLAY); - - ImGui::SetCursorScreenPos(tooltip_pos); - // filename - ImGui::Text(" %s", mp_->filename().c_str()); - // decoding info - if (Settings::application.render.gpu_decoding && !mp_->hardwareDecoderName().empty() ) - ImGui::Text(" %s (%s hardware decoder)", mp_->media().codec_name.c_str(), mp_->hardwareDecoderName().c_str()); - else - ImGui::Text(" %s", mp_->media().codec_name.c_str()); - // framerate - if ( mp_->frameRate() > 1.f ) - ImGui::Text(" %d x %d px, %.2f / %.2f fps", mp_->width(), mp_->height(), mp_->updateFrameRate() , mp_->frameRate() ); - else - ImGui::Text(" %d x %d px", mp_->width(), mp_->height()); - - } - - // display time - if ( !mp_->isImage() ) { - ImGuiToolkit::PushFont(ImGuiToolkit::FONT_LARGE); - ImGui::SetCursorPos( ImVec2(return_to_pos.x + 5, return_to_pos.y - ImGui::GetTextLineHeightWithSpacing()) ); - ImGui::Text("%s", GstToolkit::time_to_string(mp_->position(), GstToolkit::TIME_STRING_FIXED).c_str()); - ImGui::PopFont(); - } - - ImGui::SetCursorPos(return_to_pos); - } - - ImGui::Spacing(); - // Control bar - if ( mp_->isEnabled() && !mp_->isImage()) { - - float spacing = ImGui::GetStyle().ItemInnerSpacing.x; - - if (ImGui::Button(mp_->playSpeed() > 0 ? ICON_FA_FAST_BACKWARD :ICON_FA_FAST_FORWARD)) - mp_->rewind(); - ImGui::SameLine(0, spacing); - - // ignore actual play status of mediaplayer when slider is pressed - if (!slider_pressed_) - media_playing_mode_ = mp_->isPlaying(); - - // display buttons Play/Stop depending on current playing mode - if (media_playing_mode_) { - if (ImGui::Button(ICON_FA_PAUSE " Pause", ImVec2(100, 0))) - media_playing_mode_ = false; - ImGui::SameLine(0, spacing); - - ImGui::PushButtonRepeat(true); - if (ImGui::Button( mp_->playSpeed() < 0 ? ICON_FA_BACKWARD :ICON_FA_FORWARD)) - mp_->jump (); - ImGui::PopButtonRepeat(); - } - else { - if (ImGui::Button(mp_->playSpeed() < 0 ? ICON_FA_LESS_THAN " Play": ICON_FA_GREATER_THAN " Play", ImVec2(100, 0))) - media_playing_mode_ = true; - ImGui::SameLine(0, spacing); - - ImGui::PushButtonRepeat(true); - if (ImGui::Button( mp_->playSpeed() < 0 ? ICON_FA_STEP_BACKWARD : ICON_FA_STEP_FORWARD)) - mp_->step(); - ImGui::PopButtonRepeat(); - } - - // loop modes button - ImGui::SameLine(0, spacing); - static int current_loop = 0; - static std::vector< std::pair > iconsloop = { {0,15}, {1,15}, {19,14} }; - current_loop = (int) mp_->loop(); - if ( ImGuiToolkit::ButtonIconMultistate(iconsloop, ¤t_loop) ) - mp_->setLoop( (MediaPlayer::LoopMode) current_loop ); - - // speed slider - ImGui::SameLine(0, MAX(spacing * 2.f, width - 450.f) ); - float speed = static_cast(mp_->playSpeed()); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - slider_zoom_width - 3.0); - if (ImGui::DragFloat( "##Speed", &speed, 0.01f, -10.f, 10.f, "Speed x %.1f", 2.f)) - mp_->setPlaySpeed( static_cast(speed) ); - - // Timeline popup menu - ImGui::SameLine(0, spacing * 0.5f); - bool l = true; - if (ImGuiToolkit::IconToggle(5,8,5,8, &l) ) - ImGui::OpenPopup( "MenuTimeline" ); - if (ImGui::BeginPopup( "MenuTimeline" )) - { - if (ImGui::MenuItem("Reset Speed" )){ - speed = 1.f; - mp_->setPlaySpeed( static_cast(speed) ); - } - if (ImGui::MenuItem( "Reset Timeline" )){ - timeline_zoom = 1.f; - mp_->timeline()->clearFading(); - mp_->timeline()->clearGaps(); - Action::manager().store("Timeline Reset"); - } - if (ImGui::BeginMenu("Smooth curve")) - { - const char* names[] = { "Just a little", "A bit more", "Quite a lot"}; - for (int i = 0; i < IM_ARRAYSIZE(names); ++i) { - if (ImGui::MenuItem(names[i])) { - mp_->timeline()->smoothFading( 10 * (int) pow(4, i) ); - Action::manager().store("Timeline Smooth curve"); - } - } - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("Auto fading")) - { - const char* names[] = { "250 ms", "500 ms", "1 second", "2 seconds"}; - for (int i = 0; i < IM_ARRAYSIZE(names); ++i) { - if (ImGui::MenuItem(names[i])) { - mp_->timeline()->autoFading( 250 * (int ) pow(2, i) ); - mp_->timeline()->smoothFading( 10 * (i + 1) ); - Action::manager().store("Timeline Auto fading"); - } - } - ImGui::EndMenu(); - } - if (Settings::application.render.gpu_decoding && ImGui::BeginMenu("Hardware Decoding")) - { - bool hwdec = !mp_->softwareDecodingForced(); - if (ImGui::MenuItem("Auto", "", &hwdec )) - mp_->setSoftwareDecodingForced(false); - hwdec = mp_->softwareDecodingForced(); - if (ImGui::MenuItem("Disabled", "", &hwdec )) - mp_->setSoftwareDecodingForced(true); - ImGui::EndMenu(); - } - ImGui::EndPopup(); - } - - ImGui::Spacing(); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(3.f, 3.f)); - - guint64 seek_t = mp_->position(); - - // scrolling sub-window - ImGui::BeginChild("##scrolling", - ImVec2(ImGui::GetContentRegionAvail().x - slider_zoom_width - 3.0, - 2.f * _timeline_height + _scrollbar_height ), - false, ImGuiWindowFlags_HorizontalScrollbar); - { - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(1.f, 1.f)); - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.f); - ImVec2 size = ImGui::CalcItemSize(ImVec2(-FLT_MIN, 0.0f), ImGui::CalcItemWidth(), _timeline_height -1); - size.x *= timeline_zoom; - - bool released = false; - if ( ImGuiToolkit::EditPlotHistoLines("##TimelineArray", - mp_->timeline()->gapsArray(), - mp_->timeline()->fadingArray(), - MAX_TIMELINE_ARRAY, 0.f, 1.f, true, &released, size) ) { - mp_->timeline()->update(); - } - else if (released) { - Action::manager().store("Timeline change"); - } - - // custom timeline slider - slider_pressed_ = ImGuiToolkit::TimelineSlider("##timeline", &seek_t, mp_->timeline()->begin(), - mp_->timeline()->end(), mp_->timeline()->step(), size.x); - - ImGui::PopStyleVar(2); - } - ImGui::EndChild(); - - // zoom slider - ImGui::SameLine(); - ImGui::VSliderFloat("##TimelineZoom", ImVec2(slider_zoom_width, 2.f * _timeline_height), &timeline_zoom, 1.0, 5.f, ""); - ImGui::PopStyleVar(); - - // request seek (ASYNC) - if ( slider_pressed_ && mp_->go_to(seek_t) ) - slider_pressed_ = false; - - // play/stop command should be following the playing mode (buttons) - // AND force to stop when the slider is pressed - bool media_play = media_playing_mode_ & (!slider_pressed_); - - // apply play action to media only if status should change - if ( mp_->isPlaying() != media_play ) { - mp_->play( media_play ); - } - - } - } - else { - ImVec2 center = ImGui::GetContentRegionAvail() * ImVec2(0.5f, 0.5f); - ImGuiToolkit::PushFont(ImGuiToolkit::FONT_ITALIC); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6, 0.6, 0.6, 0.5f)); - center.x -= ImGui::GetTextLineHeight() * 2.f; - center.y += ImGui::GetTextLineHeight() * 0.5f; - ImGui::SetCursorPos(center); - ImGui::Text("No media"); - ImGui::PopFont(); - ImGui::PopStyleColor(1); - } - - ImGui::End(); -} - - /// /// SOURCE CONTROLLER /// -SourceController::SourceController() : active_label_(LABEL_AUTO_MEDIA_PLAYER), - active_selection_(-1), media_playing_mode_(false), slider_pressed_(false) +SourceController::SourceController() : _min_width(0.f), _h_space(0.f), _v_space(0.f), _buttons_height(0.f), + _timeline_height(0.f), _scrollbar(0.f), _mediaplayer_height(0.f), + active_label_(LABEL_AUTO_MEDIA_PLAYER), active_selection_(-1), + media_playing_mode_(false), slider_pressed_(false) { } +void SourceController::resetActiveSelection() +{ + active_selection_ = -1; + active_label_ = LABEL_AUTO_MEDIA_PLAYER; +} void SourceController::Render() { -// ImGui::SetNextWindowPos(ImVec2(1180, 400), ImGuiCond_FirstUseEver); -// ImGui::SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowPos(ImVec2(1180, 400), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); // estimate window size const ImGuiContext& g = *GImGui; @@ -2410,16 +2025,15 @@ void SourceController::Render() if (ImGui::BeginMenu(active_label_.c_str())) { - if (ImGui::MenuItem(LABEL_AUTO_MEDIA_PLAYER)) { - active_selection_ = -1; - active_label_ = LABEL_AUTO_MEDIA_PLAYER; - } + if (ImGui::MenuItem(LABEL_AUTO_MEDIA_PLAYER)) + resetActiveSelection(); // display list of available media for (size_t i = 0 ; i < Mixer::manager().session()->numPlayGroups(); ++i) { std::string label = std::string(ICON_FA_CHECK_SQUARE " Selection #") + std::to_string(i); - if (ImGui::MenuItem( label.c_str() )) { + if (ImGui::MenuItem( label.c_str() )) + { active_selection_ = i; active_label_ = label; } @@ -2471,7 +2085,7 @@ void SourceController::RenderSelection(size_t i) ImGuiToolkit::PushFont(ImGuiToolkit::FONT_ITALIC); center.x -= ImGui::GetTextLineHeight() * 2.f; ImGui::SetCursorScreenPos(top + center); - ImGui::Text("Empty"); + ImGui::Text("Empty selection"); ImGui::PopFont(); ImGui::PopStyleColor(1); } @@ -2495,11 +2109,8 @@ void SourceController::RenderSelection(size_t i) framesize.x -= _h_space; ImVec2 image_top = ImGui::GetCursorPos(); - if (SourceButton(*source, framesize)){ - Mixer::selection().set(*source); - active_selection_ = -1; - active_label_ = LABEL_AUTO_MEDIA_PLAYER; - } + if (SourceButton(*source, framesize)) + UserInterface::manager().showSourceEditor(*source); // Play icon lower left corner ImGuiToolkit::PushFont(framesize.x > 350.f ? ImGuiToolkit::FONT_LARGE : ImGuiToolkit::FONT_MONO); @@ -2567,8 +2178,7 @@ void SourceController::RenderSelection(size_t i) ImGui::SameLine(0, width_); if (ImGui::Button( ICON_FA_BACKSPACE )) { - active_selection_ = -1; - active_label_ = LABEL_AUTO_MEDIA_PLAYER; + resetActiveSelection(); Mixer::manager().session()->deletePlayGroup(i); } @@ -4178,7 +3788,7 @@ void Navigator::RenderMainPannelVimix() tooltip_ = "New note " CTRL_MOD "Shift+N"; ImGui::SameLine(0, 40); - if ( ImGuiToolkit::IconButton( ICON_FA_FILM ) ) + if ( ImGuiToolkit::IconButton( ICON_FA_PLAY_CIRCLE ) ) Settings::application.widget.media_player = true; if (ImGui::IsItemHovered()) tooltip_ = "Player " CTRL_MOD "P"; diff --git a/UserInterfaceManager.h b/UserInterfaceManager.h index 52294e6..1ce71df 100644 --- a/UserInterfaceManager.h +++ b/UserInterfaceManager.h @@ -103,23 +103,6 @@ public: }; -class MediaController -{ - MediaPlayer *mp_; - std::string current_; - bool follow_active_source_; - bool media_playing_mode_; - bool slider_pressed_; - -public: - MediaController(); - - void setMediaPlayer(MediaPlayer *mp = nullptr); - void followCurrentSource(); - - void Render(); -}; - class SourceController { float _min_width; @@ -148,6 +131,7 @@ class SourceController public: SourceController(); + void resetActiveSelection(); void Render(); }; @@ -157,7 +141,6 @@ class UserInterface friend class Navigator; Navigator navigator; ToolBox toolbox; - MediaController mediacontrol; SourceController sourcecontrol; bool ctrl_modifier_active; @@ -208,7 +191,6 @@ public: void showPannel(int id = 0); void showSourceEditor(Source *s); - void showMediaPlayer(MediaPlayer *mp); // TODO implement the shader editor std::string currentTextEdit; diff --git a/defines.h b/defines.h index 250882d..a7b8bb3 100644 --- a/defines.h +++ b/defines.h @@ -62,7 +62,7 @@ #define SESSION_THUMBNAIL_HEIGHT 120.f #define IMGUI_TITLE_MAINWINDOW ICON_FA_CIRCLE_NOTCH " vimix" -#define IMGUI_TITLE_MEDIAPLAYER ICON_FA_FILM " Player" +#define IMGUI_TITLE_MEDIAPLAYER ICON_FA_PLAY_CIRCLE " Player" #define IMGUI_TITLE_HISTORY ICON_FA_HISTORY " History" #define IMGUI_TITLE_LOGS ICON_FA_LIST " Logs" #define IMGUI_TITLE_TOOLBOX ICON_FA_WRENCH " Development Toolbox"