Remove some calls to process_updates() which I think prevent GTK coalescing redraw...
authorCarl Hetherington <carl@carlh.net>
Sat, 16 Apr 2011 13:31:27 +0000 (13:31 +0000)
committerCarl Hetherington <carl@carlh.net>
Sat, 16 Apr 2011 13:31:27 +0000 (13:31 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9357 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_streamview.cc
gtk2_ardour/midi_streamview.h
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/piano_roll_header.cc
libs/gtkmm2ext/gtkmm2ext/scroomer.h
libs/gtkmm2ext/scroomer.cc

index b79a6dc6d0a61940f533bb5b80b8df69f959592f..fd3d5383aa55f25445f583fd60bac4c9e10e4fd2 100644 (file)
@@ -65,6 +65,7 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv)
        , _data_note_min(60)
        , _data_note_max(71)
         , _note_lines (0)
+       , _updates_suspended (false)
 {
        /* use a group dedicated to MIDI underlays. Audio underlays are not in this group. */
        midi_underlay_group = new ArdourCanvas::Group (*_canvas_group);
@@ -310,7 +311,7 @@ MidiStreamView::update_contents_height ()
 void
 MidiStreamView::draw_note_lines()
 {
-        if (!_note_lines) {
+        if (!_note_lines || _updates_suspended) {
                 return;
         }
 
@@ -371,7 +372,7 @@ MidiStreamView::apply_note_range(uint8_t lowest, uint8_t highest, bool to_region
 {
        _highest_note = highest;
        _lowest_note = lowest;
-       
+
        int const range = _highest_note - _lowest_note;  
        int const pixels_per_note = floor (child_height () / range);
        
@@ -405,12 +406,20 @@ MidiStreamView::apply_note_range(uint8_t lowest, uint8_t highest, bool to_region
        draw_note_lines();
 
        if (to_region_views) {
+               apply_note_range_to_regions ();
+       }
+       
+       NoteRangeChanged();
+}
+
+void
+MidiStreamView::apply_note_range_to_regions ()
+{
+       if (!_updates_suspended) {
                for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                        ((MidiRegionView*)(*i))->apply_note_range(_lowest_note, _highest_note);
                }
        }
-
-       NoteRangeChanged();
 }
 
 void
@@ -649,3 +658,24 @@ MidiStreamView::y_to_note (double y) const
        
        return n;
 }
+
+/** Suspend updates to the regions' note ranges and our
+ *  note lines until resume_updates() is called.
+ */
+void
+MidiStreamView::suspend_updates ()
+{
+       _updates_suspended = true;
+}
+
+/** Resume updates to region note ranges and note lines,
+ *  and update them now.
+ */
+void
+MidiStreamView::resume_updates ()
+{
+       _updates_suspended = false;
+
+       draw_note_lines ();
+       apply_note_range_to_regions ();
+}
index a939d8ea7d5e76b511784e65bfe819a339789e5a..aceb59e69f284757da89338b97af820b49af5797 100644 (file)
@@ -97,6 +97,9 @@ class MidiStreamView : public StreamView
 
        void apply_note_range(uint8_t lowest, uint8_t highest, bool to_region_views);
 
+       void suspend_updates ();
+       void resume_updates ();
+
   private:
        void setup_rec_box ();
        void update_rec_box ();
@@ -118,6 +121,7 @@ class MidiStreamView : public StreamView
        void color_handler ();
 
        void note_range_adjustment_changed();
+       void apply_note_range_to_regions ();
 
        bool                      _range_dirty;
        double                    _range_sum_cache;
@@ -126,6 +130,8 @@ class MidiStreamView : public StreamView
        uint8_t                   _data_note_min; ///< in data
        uint8_t                   _data_note_max; ///< in data
        ArdourCanvas::LineSet*    _note_lines;
+       /** true if updates to the note lines and regions are currently suspended */
+       bool                      _updates_suspended;
 };
 
 #endif /* __ardour_midi_streamview_h__ */
index bf0adfd3613615a89fb41410a0cb008fd4ef946f..2f809ce2e151d5b5cea59d24b4c78616cdfd66ec 100644 (file)
@@ -154,6 +154,10 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess,
 
                _range_scroomer = new MidiScroomer(midi_view()->note_range_adjustment);
 
+               /* Suspend updates of the StreamView during scroomer drags to speed things up */
+               _range_scroomer->DragStarting.connect (sigc::mem_fun (*midi_view(), &MidiStreamView::suspend_updates));
+               _range_scroomer->DragFinishing.connect (sigc::mem_fun (*midi_view(), &MidiStreamView::resume_updates));
+
                controls_hbox.pack_start(*_range_scroomer);
                controls_hbox.pack_start(*_piano_roll_header);
 
index 28398678a139cdcde0efca4ee98d597bced2ffa7..4bb8250fea2c38f2f223a23b5ea12393782a0574 100644 (file)
@@ -587,14 +587,7 @@ void
 PianoRollHeader::note_range_changed()
 {
        _note_height = floor(_view.note_height()) + 0.5f;
-
        queue_draw();
-
-       Glib::RefPtr<Gdk::Window> win = get_window();
-
-       if (win) {
-               win->process_updates(false);
-       }
 }
 
 void
index 34d5e309ae8ea5a028f435a8d31fe415cb33ea56..b5c93f7f9fd6ebf4d56ab1262e81f3ca3fb2fb0e 100644 (file)
@@ -57,8 +57,8 @@ public:
        
        inline int position_of(Component comp) { return position[comp]; }
 
-       // debug
-       std::string get_comp_name(Component);
+       sigc::signal0<void> DragStarting;
+       sigc::signal0<void> DragFinishing;
 
 protected:
        Gtk::Adjustment& adj;
index 3009449c91e0c8804790743d7f6406896a9f77fc..7ad99c07569cd33a9ff2bbac228a0e77dd8de7ae 100644 (file)
@@ -241,6 +241,8 @@ Scroomer::on_button_press_event (GdkEventButton* ev)
                } else {
                         pinch = false;
                 }
+
+               DragStarting (); /* EMIT SIGNAL */
        }
        
        return false;
@@ -281,6 +283,7 @@ Scroomer::on_button_release_event (GdkEventButton* ev)
        grab_comp = None;
 
        remove_modal_grab();
+       DragFinishing (); /* EMIT SIGNAL */
        return true;
 }
 
@@ -391,29 +394,5 @@ Scroomer::adjustment_changed()
                rect.set_height(position[BottomBase] - old_pos[Handle2]);
                win->invalidate_rect(rect, false);
        }
-
-       win->process_updates(false);
 }
 
-std::string
-Scroomer::get_comp_name(Component c)
-{
-       switch (c) {
-       case TopBase:
-               return "TopBase";
-       case Handle1:
-               return "Handle1";
-       case Slider:
-               return "Slider";
-       case Handle2:
-               return "Handle2";
-       case BottomBase:
-               return "BottomBase";
-       case Total:
-               return "Total";
-       case None:
-               return "None";
-       default:
-               return "ERROR";
-       }
-}