make meter point button work again, and allow momentary button action to work again
[ardour.git] / gtk2_ardour / midi_streamview.cc
index 4e1afffbfbf47bb734ec79369b56a496c7650cdb..ebc6b0d64254b31be804c12e58c8135acef6f9b1 100644 (file)
 
 #include <gtkmm2ext/gtk_ui.h>
 
-#include <ardour/midi_diskstream.h>
-#include <ardour/midi_playlist.h>
-#include <ardour/midi_region.h>
-#include <ardour/midi_source.h>
-#include <ardour/midi_track.h>
-#include <ardour/region_factory.h>
-#include <ardour/smf_source.h>
+#include "ardour/midi_diskstream.h"
+#include "ardour/midi_playlist.h"
+#include "ardour/midi_region.h"
+#include "ardour/midi_source.h"
+#include "ardour/midi_track.h"
+#include "ardour/region_factory.h"
+#include "ardour/smf_source.h"
 
 #include "ardour_ui.h"
 #include "canvas-simplerect.h"
@@ -130,18 +130,32 @@ veto_note_range(uint8_t& min, uint8_t& max)
 }
 
 RegionView*
-MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wfd, bool recording)
+MidiStreamView::create_region_view (boost::shared_ptr<Region> r, bool wfd, bool)
 {
        boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (r);
 
        if (region == 0) {
-               return NULL;
+               return 0;
        }
 
-       MidiRegionView *region_view;
-       list<RegionView *>::iterator i;
+       RegionView* region_view = new MidiRegionView (canvas_group, _trackview, region, 
+                                                     _samples_per_unit, region_color);
+               
+       region_view->init (region_color, false);
+                       
+       return region_view;
+}
 
-       for (i = region_views.begin(); i != region_views.end(); ++i) {
+RegionView*
+MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wfd, bool recording)
+{
+       boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (r);
+
+       if (region == 0) {
+               return 0;
+       }
+
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                if ((*i)->region() == r) {
                        
                        /* great. we already have a MidiRegionView for this Region. use it again. */
@@ -150,18 +164,19 @@ MidiStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wfd,
                        
                        display_region(dynamic_cast<MidiRegionView*>(*i), wfd);
 
-                       return NULL;
+                       return 0;
                }
        }
+
+       MidiRegionView* region_view = dynamic_cast<MidiRegionView*> (create_region_view (r, wfd, recording));
+       if (region_view == 0) {
+               return 0;
+       }
        
-       region_view = new MidiRegionView (canvas_group, _trackview, region, 
-                       _samples_per_unit, region_color);
-               
-       region_view->init (region_color, false);
        region_views.push_front (region_view);
                        
        /* display events and find note range */
-       display_region(region_view, wfd);
+       display_region (region_view, wfd);
 
        /* catch regionview going away */
        region->GoingAway.connect (bind (mem_fun (*this, &MidiStreamView::remove_region_view), region));
@@ -243,8 +258,8 @@ MidiStreamView::redisplay_diskstream ()
        _data_note_min = 127;
        _data_note_max = 0;
        _trackview.get_diskstream()->playlist()->foreach_region(
-                       static_cast<StreamView*>(this),
-                       &StreamView::update_contents_metrics);
+               sigc::mem_fun (*this, &StreamView::update_contents_metrics)
+               );
 
        // No notes, use default range
        if (!_range_dirty) {
@@ -266,8 +281,8 @@ MidiStreamView::redisplay_diskstream ()
 
        // Add and display region views, and flag them as valid
        _trackview.get_diskstream()->playlist()->foreach_region(
-                       static_cast<StreamView*>(this),
-                       &StreamView::add_region_view);
+               sigc::hide_return (sigc::mem_fun (*this, &StreamView::add_region_view))
+               );
 
        // Stack regions by layer, and remove invalid regions
        layer_regions();
@@ -594,7 +609,7 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiModel> data, nframes_t
 
                                if (nlen != region->length()) {
 
-                                       if (region->source(0)->length() >= region->position() + nlen) {
+                                       if (region->source_length(0) >= region->position() + nlen) {
 
                                                region->freeze ();
                                                region->set_position (_trackview.get_diskstream()->get_capture_start_frame(n), this);