Redraw MIDI region views on zoom and track height changes.
[ardour.git] / gtk2_ardour / midi_region_view.cc
index c3a7e1830dfbd5c6f7c464d0f12641d47fc8890a..678f97b6c6798b252231861f49d629766b28a2e9 100644 (file)
@@ -87,15 +87,29 @@ MidiRegionView::init (Gdk::Color& basic_color, bool wfd)
 
        set_colors ();
 
-       boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion> (_region);
-       mr->midi_source(0)->load_model();
+       if (wfd) {
+               midi_region()->midi_source(0)->load_model();
+               display_events();
+       }
+}
 
+
+void
+MidiRegionView::display_events()
+{
+       for (std::vector<ArdourCanvas::Item*>::iterator i = _events.begin(); i != _events.end(); ++i)
+               delete *i;
+       
+       _events.clear();
        begin_write();
-       for (size_t i=0; i < mr->midi_source(0)->model().n_events(); ++i)
-               add_event(mr->midi_source(0)->model().event_at(i));
+
+       for (size_t i=0; i < midi_region()->midi_source(0)->model()->n_events(); ++i)
+               add_event(midi_region()->midi_source(0)->model()->event_at(i));
+
        end_write();
 }
 
+
 MidiRegionView::~MidiRegionView ()
 {
        in_destructor = true;
@@ -111,6 +125,47 @@ MidiRegionView::midi_region() const
        return boost::dynamic_pointer_cast<MidiRegion>(_region);
 }
 
+void
+MidiRegionView::region_resized (Change what_changed)
+{
+       RegionView::region_resized(what_changed);
+
+       if (what_changed & ARDOUR::PositionChanged) {
+       
+               display_events();
+       
+       } else if (what_changed & Change (StartChanged)) {
+
+               //cerr << "MIDI RV START CHANGED" << endl;
+
+       } else if (what_changed & Change (LengthChanged)) {
+               
+               //cerr << "MIDI RV LENGTH CHANGED" << endl;
+       
+       }
+}
+
+void
+MidiRegionView::reset_width_dependent_items (double pixel_width)
+{
+       RegionView::reset_width_dependent_items(pixel_width);
+       assert(_pixel_width == pixel_width);
+               
+       display_events();
+}
+
+void
+MidiRegionView::set_y_position_and_height (double y, double h)
+{
+       RegionView::set_y_position_and_height(y, h - 1);
+               
+       display_events();
+
+       if (name_text) {
+               name_text->raise_to_top();
+       }
+}
+
 void
 MidiRegionView::show_region_editor ()
 {
@@ -149,12 +204,12 @@ MidiRegionView::end_write()
 void
 MidiRegionView::add_event (const MidiEvent& ev)
 {
-       /*printf("Event, time = %u, size = %zu, data = ",
-         ev.time, ev.size);
-         for (size_t i=0; i < ev.size; ++i) {
-         printf("%X ", ev.buffer[i]);
-         }
-         printf("\n");*/
+       /*printf("Event, time = %f, size = %zu, data = ", ev.time, ev.size);
+       for (size_t i=0; i < ev.size; ++i) {
+               printf("%X ", ev.buffer[i]);
+       }
+       printf("\n\n");*/
+
        double y1 = trackview.height / 2.0;
        if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
                const Byte& note = ev.buffer[1];
@@ -163,7 +218,7 @@ MidiRegionView::add_event (const MidiEvent& ev)
                ArdourCanvas::SimpleRect * ev_rect = new Gnome::Canvas::SimpleRect(
                                *(ArdourCanvas::Group*)get_canvas_group());
                ev_rect->property_x1() = trackview.editor.frame_to_pixel (
-                               ev.time);
+                               (nframes_t)ev.time);
                ev_rect->property_y1() = y1;
                ev_rect->property_x2() = trackview.editor.frame_to_pixel (
                                _region->length());
@@ -180,7 +235,7 @@ MidiRegionView::add_event (const MidiEvent& ev)
        } else if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_OFF) {
                const Byte& note = ev.buffer[1];
                if (_active_notes && _active_notes[note]) {
-                       _active_notes[note]->property_x2() = trackview.editor.frame_to_pixel(ev.time);
+                       _active_notes[note]->property_x2() = trackview.editor.frame_to_pixel((nframes_t)ev.time);
                        _active_notes[note]->property_outline_what() = (guint32) 0xF; // all edges
                        _active_notes[note] = NULL;
                }