diff --git a/synfig-studio/src/gui/canvasview.cpp b/synfig-studio/src/gui/canvasview.cpp index f1b2953bd0e..f0f826472bb 100644 --- a/synfig-studio/src/gui/canvasview.cpp +++ b/synfig-studio/src/gui/canvasview.cpp @@ -696,6 +696,7 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handle 0; } void jack_lock(); void jack_unlock(); + bool get_jack_enabled_in_preview() const { return jack_enabled_in_preview; } + void set_jack_enabled_in_preview(bool x) { jack_enabled_in_preview = x; } #ifdef WITH_JACK bool get_jack_enabled() const { return jack_enabled; } bool get_jack_actual_enabled() const { return jack_actual_enabled; } diff --git a/synfig-studio/src/gui/dialogs/dialog_preview.cpp b/synfig-studio/src/gui/dialogs/dialog_preview.cpp index 7af81489163..665116caac0 100644 --- a/synfig-studio/src/gui/dialogs/dialog_preview.cpp +++ b/synfig-studio/src/gui/dialogs/dialog_preview.cpp @@ -87,11 +87,16 @@ void Dialog_Preview::set_preview(etl::handle prev) //preview.update(); } +void Dialog_Preview::on_show() +{ + Window::on_show(); + preview.on_show(); +} + void Dialog_Preview::on_hide() { Window::on_hide(); - preview.pause(); - preview.stoprender(); + preview.on_hide(); } //press escape key to close window diff --git a/synfig-studio/src/gui/dialogs/dialog_preview.h b/synfig-studio/src/gui/dialogs/dialog_preview.h index a87c4334d0a..603c6a20022 100644 --- a/synfig-studio/src/gui/dialogs/dialog_preview.h +++ b/synfig-studio/src/gui/dialogs/dialog_preview.h @@ -68,6 +68,7 @@ class Dialog_Preview : public Gtk::Window Widget_Preview &get_widget() {return preview;} const Widget_Preview &get_widget() const {return preview;} + virtual void on_show(); virtual void on_hide(); //other forwarding functions... diff --git a/synfig-studio/src/gui/preview.cpp b/synfig-studio/src/gui/preview.cpp index 97797c41371..c1b1e86b4ae 100644 --- a/synfig-studio/src/gui/preview.cpp +++ b/synfig-studio/src/gui/preview.cpp @@ -608,7 +608,7 @@ Widget_Preview::Widget_Preview(): studio::Widget_Preview::~Widget_Preview() { - set_jack_enabled(false); + clear(); } void studio::Widget_Preview::update() @@ -949,12 +949,13 @@ void studio::Widget_Preview::disconnect_preview(Preview *prev) { preview = 0; prevchanged.disconnect(); + soundProcessor.clear(); } } void studio::Widget_Preview::set_preview(etl::handle prev) { - soundProcessor.clear(); + disconnect_preview(preview.get()); preview = prev; @@ -996,6 +997,7 @@ void studio::Widget_Preview::set_preview(etl::handle prev) } preview->get_canvas()->fill_sound_processor(soundProcessor); + set_jack_enabled( preview && preview->get_canvasview()->get_jack_enabled_in_preview() ); //connect so future information will be found... prevchanged = prev->signal_changed().connect(sigc::mem_fun(*this,&Widget_Preview::whenupdated)); @@ -1016,9 +1018,8 @@ void studio::Widget_Preview::whenupdated() void studio::Widget_Preview::clear() { - preview = 0; - prevchanged.disconnect(); - soundProcessor.clear(); + disconnect_preview(preview.get()); + set_jack_enabled(false); } void studio::Widget_Preview::play() @@ -1348,8 +1349,28 @@ Widget_Preview::is_time_equal_to_current_frame(const synfig::Time &time) return t0.is_equal(t1); } +void Widget_Preview::on_show() +{ + Table::on_show(); + set_jack_enabled( preview && preview->get_canvasview()->get_jack_enabled_in_preview() ); +} + +void Widget_Preview::on_hide() +{ + Table::on_hide(); + if (preview) + { + bool enabled = get_jack_enabled(); + set_jack_enabled(false); + preview->get_canvasview()->set_jack_enabled_in_preview(enabled); + } + pause(); + stoprender(); +} + void Widget_Preview::set_jack_enabled(bool value) { if (jack_enabled == value) return; + #ifdef WITH_JACK if (playing) pause(); jack_enabled = value; @@ -1418,6 +1439,8 @@ void Widget_Preview::set_jack_enabled(bool value) { offset_widget->hide(); } #endif + + if (preview) preview->get_canvasview()->set_jack_enabled_in_preview( get_jack_enabled() ); } diff --git a/synfig-studio/src/gui/preview.h b/synfig-studio/src/gui/preview.h index f8eabb301be..af53aa133ab 100644 --- a/synfig-studio/src/gui/preview.h +++ b/synfig-studio/src/gui/preview.h @@ -285,6 +285,9 @@ class Widget_Preview : public Gtk::Table bool get_loop_flag() const {return b_loop.get_active();} void set_loop_flag(bool b) {return b_loop.set_active(b);} + virtual void on_show(); + virtual void on_hide(); + protected: class ModelColumns : public Gtk::TreeModel::ColumnRecord