vtl: rework session-needs-save logic
[ardour.git] / gtk2_ardour / video_timeline.cc
index c77b345fecd2595227c0d1e43a71368bc03de24c..78b5f0345da819373ceb7948a72f0e5b60eb51cd 100644 (file)
@@ -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 ();
+               }
        }
 }