X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fvideo_timeline.cc;h=78b5f0345da819373ceb7948a72f0e5b60eb51cd;hb=ed1f310f109279347906bbcb85757b5a54792e26;hp=c77b345fecd2595227c0d1e43a71368bc03de24c;hpb=5a4d0fff019f1f024ffc22f661ea93b2fe989aa1;p=ardour.git diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc index c77b345fec..78b5f0345d 100644 --- a/gtk2_ardour/video_timeline.cc +++ b/gtk2_ardour/video_timeline.cc @@ -89,63 +89,23 @@ VideoTimeLine::save_session () LocaleGuard lg (X_("POSIX")); - bool is_dirty = false; - - XMLNode* prev = _session->extra_xml (X_("Videomonitor")); - - /* remember if vmonitor was open.. */ XMLNode* node = new XMLNode(X_("Videomonitor")); - + if (!node) return; node->add_property (X_("active"), (vmonitor && vmonitor->is_started())?"yes":"no"); - if (!prev || !(prev->property (X_("active")) && prev->property (X_("active"))->value() == node->property(X_("active"))->value()) ){ - _session->add_extra_xml (*node); - is_dirty=true; // TODO not if !prev && value==default + _session->add_extra_xml (*node); + + if (vmonitor) { + vmonitor->save_session(); } /* VTL settings */ node = _session->extra_xml (X_("Videotimeline")); - - if (node) { - if (!(node->property(X_("id")) && node->property(X_("id"))->value() == id().to_s())) { - node->add_property (X_("id"), id().to_s()); - is_dirty=true; - } - } - - /* remember timeline height.. */ - if (node) { - int h = editor->get_videotl_bar_height(); - if (!(node->property(X_("Height")) && atoi(node->property(X_("Height"))->value().c_str())==h)) { - node->add_property (X_("Height"), h); - is_dirty=true; - } - } - - /* save video-offset-lock */ - if (node) { - if (!(node->property(X_("VideoOffsetLock")) && atoi(node->property(X_("VideoOffsetLock"))->value().c_str())==video_offset_lock)) { - node->add_property (X_("VideoOffsetLock"), video_offset_lock?X_("1"):X_("0")); - is_dirty=true; - } - } - /* save video-offset */ - if (node) { - if (!(node->property(X_("VideoOffset")) && atoll(node->property(X_("VideoOffset"))->value().c_str())==video_offset)) { - node->add_property (X_("VideoOffset"), video_offset); - is_dirty=true; - } - } - - /* save 'auto_set_session_fps' */ - if (node) { - if (!(node->property(X_("AutoFPS")) && atoi(node->property(X_("AutoFPS"))->value().c_str())==auto_set_session_fps)) { - node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0")); - is_dirty=true; - } - } - if (is_dirty) { - _session->set_dirty (); - } + if (!node) return; + node->add_property (X_("id"), id().to_s()); + node->add_property (X_("Height"), editor->get_videotl_bar_height()); + node->add_property (X_("VideoOffsetLock"), video_offset_lock?X_("1"):X_("0")); + node->add_property (X_("VideoOffset"), video_offset); + node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0")); } /* close and save settings */ @@ -155,8 +115,8 @@ VideoTimeLine::close_session () if (video_duration == 0) { return; } + sessionsave.disconnect(); close_video_monitor(); - save_session(); remove_frames(); video_filename = ""; @@ -164,6 +124,16 @@ VideoTimeLine::close_session () GuiUpdate("set-xjadeo-sensitive-off"); } +void +VideoTimeLine::sync_session_state () +{ + if (!_session || !vmonitor || !vmonitor->is_started()) { + return; + } + vmonitor->query_full_state(true); + save_session(); +} + /** load settings from session */ void VideoTimeLine::set_session (ARDOUR::Session *s) @@ -171,6 +141,7 @@ VideoTimeLine::set_session (ARDOUR::Session *s) SessionHandlePtr::set_session (s); if (!_session) { return ; } + _session->SaveSession.connect_same_thread (sessionsave, boost::bind (&VideoTimeLine::save_session, this)); LocaleGuard lg (X_("POSIX")); XMLNode* node = _session->extra_xml (X_("Videotimeline")); @@ -227,9 +198,28 @@ VideoTimeLine::set_session (ARDOUR::Session *s) _session->config.ParameterChanged.connect (*this, invalidator (*this), ui_bind (&VideoTimeLine::parameter_changed, this, _1), gui_context()); } +void +VideoTimeLine::set_offset_locked (bool v) { + if (_session && v != video_offset_lock) { + _session->set_dirty (); + } + video_offset_lock = v; +} + +void +VideoTimeLine::toggle_offset_locked () { + video_offset_lock = !video_offset_lock; + if (_session) { + _session->set_dirty (); + } +} + void VideoTimeLine::save_undo () { + if (_session && video_offset_p != video_offset) { + _session->set_dirty (); + } video_offset_p = video_offset; } @@ -523,11 +513,6 @@ VideoTimeLine::video_file_info (std::string filename, bool local) } flush_local_cache (); - _session->maybe_update_session_range( - std::max(get_offset(), (ARDOUR::frameoffset_t) 0), - std::max(get_offset() + get_duration(), (ARDOUR::frameoffset_t) 0) - ); - if (found_xjadeo() && local_file) { GuiUpdate("set-xjadeo-sensitive-on"); if (vmonitor && vmonitor->is_started()) { @@ -586,11 +571,38 @@ VideoTimeLine::gui_update(std::string const & t) { editor->toggle_xjadeo_proc(0); //close_video_monitor(); editor->set_xjadeo_sensitive(false); + } else if (t == "xjadeo-window-ontop-on") { + editor->toggle_xjadeo_viewoption(1, 1); + } else if (t == "xjadeo-window-ontop-off") { + editor->toggle_xjadeo_viewoption(1, 0); + } else if (t == "xjadeo-window-osd-timecode-on") { + editor->toggle_xjadeo_viewoption(2, 1); + } else if (t == "xjadeo-window-osd-timecode-off") { + editor->toggle_xjadeo_viewoption(2, 0); + } else if (t == "xjadeo-window-osd-frame-on") { + editor->toggle_xjadeo_viewoption(3, 1); + } else if (t == "xjadeo-window-osd-frame-off") { + editor->toggle_xjadeo_viewoption(3, 0); + } else if (t == "xjadeo-window-osd-box-on") { + editor->toggle_xjadeo_viewoption(4, 1); + } else if (t == "xjadeo-window-osd-box-off") { + editor->toggle_xjadeo_viewoption(4, 0); + } else if (t == "xjadeo-window-fullscreen-on") { + editor->toggle_xjadeo_viewoption(5, 1); + } else if (t == "xjadeo-window-fullscreen-off") { + editor->toggle_xjadeo_viewoption(5, 0); + } else if (t == "xjadeo-window-letterbox-on") { + editor->toggle_xjadeo_viewoption(6, 1); + } else if (t == "xjadeo-window-letterbox-off") { + editor->toggle_xjadeo_viewoption(6, 0); } } void VideoTimeLine::set_height (int height) { + if (_session && bar_height != height) { + _session->set_dirty (); + } bar_height = height; flush_local_cache(); } @@ -693,6 +705,7 @@ VideoTimeLine::open_video_monitor() { vmonitor = new VideoMonitor(editor, _xjadeo_bin); vmonitor->set_session(_session); vmonitor->Terminated.connect (sigc::mem_fun (*this, &VideoTimeLine::terminated_video_monitor)); + vmonitor->UiState.connect (*this, invalidator (*this), boost::bind (&VideoTimeLine::gui_update, this, _1), gui_context()); } else if (vmonitor->is_started()) { return; } @@ -718,6 +731,17 @@ VideoTimeLine::open_video_monitor() { GuiUpdate("set-xjadeo-active-on"); vmonitor->set_fps(video_file_fps); vmonitor->open(video_filename); + + if (_session) { + XMLNode* node = _session->extra_xml (X_("Videomonitor")); + if (node) { + const XMLProperty* prop = node->property (X_("active")); + if (prop && prop->value() != "yes") _session->set_dirty (); + } else { + _session->set_dirty (); + } + } + } } @@ -728,6 +752,15 @@ VideoTimeLine::close_video_monitor() { } } +void +VideoTimeLine::control_video_monitor(int what, int param) { + if (!vmonitor || !vmonitor->is_started()) { + return; + } + vmonitor->send_cmd(what, param); +} + + void VideoTimeLine::terminated_video_monitor () { if (vmonitor) { @@ -735,9 +768,13 @@ VideoTimeLine::terminated_video_monitor () { } GuiUpdate("set-xjadeo-active-off"); vmonitor=0; - if (reopen_vmonitor) { + if (reopen_vmonitor) { reopen_vmonitor=false; open_video_monitor(); + } else { + if (_session) { + _session->set_dirty (); + } } }