Tweak Mixer screenshot method, include VCA, master-bus
authorRobin Gareus <robin@gareus.org>
Wed, 17 Jul 2019 22:05:32 +0000 (00:05 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 17 Jul 2019 22:05:32 +0000 (00:05 +0200)
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
gtk2_ardour/mixer_ui.cc
gtk2_ardour/mixer_ui.h

index f7a61898ac0191c7377064756126b92cc87fc027..dc86a27222b0f6d5c154f4d588b21836e6fd6d42 100644 (file)
@@ -607,11 +607,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                control_slave_ui.set_sensitive(true);
        }
 
-       if (_mixer_owned && route()->is_master() ) {
-               spacer.show();
-       } else {
-               spacer.hide();
-       }
+       hide_master_spacer (false);
 
        if (is_track()) {
                monitor_input_button->show ();
@@ -2675,3 +2671,13 @@ MixerStrip::set_marked_for_display (bool yn)
 {
        return RouteUI::mark_hidden (!yn);
 }
+
+void
+MixerStrip::hide_master_spacer (bool yn)
+{
+       if (_mixer_owned && route()->is_master() && !yn) {
+               spacer.show();
+       } else {
+               spacer.hide();
+       }
+}
index 1510d38242033831b0fa313a0b86d9e7cc4dc6dd..7164d15e632ed22175acf74bc1892524aab5e6ec 100644 (file)
@@ -114,6 +114,9 @@ public:
                return _mixer_owned;
        }
 
+       /* used for screenshots */
+       void hide_master_spacer (bool);
+
        void hide_things ();
 
        sigc::signal<void> WidthChanged;
index 1773c4497cce89e28ab22c1402cd51801ac948ee..71f6bca825fa7b677e8787125b2337bb9af2c5d5 100644 (file)
@@ -3503,21 +3503,82 @@ Mixer_UI::vca_unassign (boost::shared_ptr<VCA> vca)
        }
 }
 
-void
+bool
 Mixer_UI::screenshot (std::string const& filename)
 {
-       Gtk::OffscreenWindow osw;
+       if (!_session) {
+               return false;
+       }
+
        int height = strip_packer.get_height();
+       bool with_vca = vca_vpacker.is_visible ();
+       MixerStrip* master = strip_by_route (_session->master_out ());
+
+       Gtk::OffscreenWindow osw;
+       Gtk::HBox b;
+       osw.add (b);
+       b.show ();
+
+       /* unpack widgets, add to OffscreenWindow */
+
        strip_group_box.remove (strip_packer);
-       osw.add (strip_packer);
+       b.pack_start (strip_packer, false, false);
+       /* hide extra elements inside strip_packer */
        add_button.hide ();
+       scroller_base.hide ();
+#ifdef MIXBUS
+       mb_shadow.hide();
+#endif
+
+       if (with_vca) {
+               /* work around Gtk::ScrolledWindow */
+               Gtk::Viewport* viewport = (Gtk::Viewport*) vca_scroller.get_child();
+               viewport->remove (); // << vca_hpacker
+               b.pack_start (vca_hpacker, false, false);
+               /* hide some growing widgets */
+               add_vca_button.hide ();
+               vca_scroller_base.hide();
+       }
+
+       if (master) {
+               out_packer.remove (*master);
+               b.pack_start (*master, false, false);
+               master->hide_master_spacer (true);
+       }
+
+       /* prepare the OffscreenWindow for rendering */
        osw.set_size_request (-1, height);
-       osw.show();
+       osw.show ();
+       osw.queue_resize ();
+       osw.queue_draw ();
        osw.get_window()->process_updates (true);
+
+       /* create screenshot */
        Glib::RefPtr<Gdk::Pixbuf> pb = osw.get_pixbuf ();
        pb->save (filename, "png");
+
+       /* unpack elements before destorying the Box & OffscreenWindow */
+       list<Gtk::Widget*> children = b.get_children();
+       for (list<Gtk::Widget*>::iterator child = children.begin(); child != children.end(); ++child) {
+               b.remove (**child);
+       }
        osw.remove ();
-       pb.release ();
+
+       /* now re-pack the widgets into the main mixer window */
        add_button.show ();
+       scroller_base.show ();
+#ifdef MIXBUS
+       mb_shadow.show();
+#endif
        strip_group_box.pack_start (strip_packer);
+       if (with_vca) {
+               add_vca_button.show ();
+               vca_scroller_base.show();
+               vca_scroller.add (vca_hpacker);
+       }
+       if (master) {
+               master->hide_master_spacer (false);
+               out_packer.pack_start (*master, false, false);
+       }
+       return true;
 }
index 85197b991de08c15d5591acf9c1c20779b564b5f..cda2d4e1bd06a3604ca70a191ccb159792b27458 100644 (file)
@@ -147,7 +147,7 @@ public:
        void showhide_mixbusses (bool on);
 #endif
 
-       void screenshot (std::string const&);
+       bool screenshot (std::string const&);
 
 protected:
        void set_axis_targets_for_operation ();