boost::shared_ptr<NoteType> note (*n);
CanvasNoteEvent* cne;
-
- if (note_in_visible_range (note)) {
+ bool visible;
+
+ if (note_in_region_range (note, visible)) {
if ((cne = find_canvas_note (note)) != 0) {
update_hit (ch);
}
- cne->show ();
+ if (visible) {
+ cne->show ();
+ } else {
+ cne->hide ();
+ }
} else {
- add_note (note);
+ add_note (note, visible);
}
} else {
}
bool
-MidiRegionView::note_in_visible_range(const boost::shared_ptr<NoteType> note) const
+MidiRegionView::note_in_region_range(const boost::shared_ptr<NoteType> note, bool& visible) const
{
const nframes64_t note_start_frames = beats_to_frames(note->time());
- bool outside = (note_start_frames - _region->start() >= _region->length())
- || (note_start_frames < _region->start())
- || (note->note() < midi_stream_view()->lowest_note())
- || (note->note() > midi_stream_view()->highest_note());
+
+ bool outside = (note_start_frames - _region->start() >= _region->length()) ||
+ (note_start_frames < _region->start());
+
+ visible = (note->note() >= midi_stream_view()->lowest_note()) &&
+ (note->note() <= midi_stream_view()->highest_note());
+
return !outside;
}
* event arrives, to properly display the note.
*/
void
-MidiRegionView::add_note(const boost::shared_ptr<NoteType> note)
+MidiRegionView::add_note(const boost::shared_ptr<NoteType> note, bool visible)
{
CanvasNoteEvent* event = 0;
event->on_channel_selection_change(_last_channel_selection);
_events.push_back(event);
- if (note_in_visible_range(note)) {
+ if (visible) {
event->show();
} else {
event->hide ();
GhostRegion* add_ghost (TimeAxisView&);
- void add_note(const boost::shared_ptr<NoteType> note);
+ void add_note(const boost::shared_ptr<NoteType> note, bool visible);
void resolve_note(uint8_t note_num, double end_time);
void cut_copy_clear (Editing::CutCopyOp);
void move_selection(double dx, double dy);
void note_dropped(ArdourCanvas::CanvasNoteEvent* ev, double d_pixels, uint8_t d_note);
- /** Return true iff the note is within the currently visible range */
- bool note_in_visible_range(const boost::shared_ptr<NoteType> note) const;
+ /** Return true iff the note is within the extent of the region.
+ * @param visible will be set to true if the note is within the visible note range, false otherwise.
+ */
+ bool note_in_region_range(const boost::shared_ptr<NoteType> note, bool& visible) const;
/** Get the region position in pixels relative to session. */
double get_position_pixels();
if (note->time() + region->position() > start + dur)
break;
- mrv->add_note(note);
-
if (note->note() < _lowest_note) {
_lowest_note = note->note();
update_range = true;
_highest_note = note->note();
update_range = true;
}
+
+ mrv->add_note (note, !update_range);
+
}
mrv->extend_active_notes();
_added_notes.clear();
XMLNode* added_notes = delta_command.child(ADDED_NOTES_ELEMENT);
- XMLNodeList notes = added_notes->children();
- transform(notes.begin(), notes.end(), back_inserter(_added_notes),
- sigc::mem_fun(*this, &DeltaCommand::unmarshal_note));
+ if (added_notes) {
+ XMLNodeList notes = added_notes->children();
+ transform(notes.begin(), notes.end(), back_inserter(_added_notes),
+ sigc::mem_fun(*this, &DeltaCommand::unmarshal_note));
+ }
_removed_notes.clear();
XMLNode* removed_notes = delta_command.child(REMOVED_NOTES_ELEMENT);
- notes = removed_notes->children();
- transform(notes.begin(), notes.end(), back_inserter(_removed_notes),
- sigc::mem_fun(*this, &DeltaCommand::unmarshal_note));
+ if (removed_notes) {
+ XMLNodeList notes = removed_notes->children();
+ transform(notes.begin(), notes.end(), back_inserter(_removed_notes),
+ sigc::mem_fun(*this, &DeltaCommand::unmarshal_note));
+ }
return 0;
}
_changes.clear();
XMLNode* changed_notes = diff_command.child(DIFF_NOTES_ELEMENT);
- XMLNodeList notes = changed_notes->children();
- transform (notes.begin(), notes.end(), back_inserter(_changes),
- sigc::mem_fun(*this, &DiffCommand::unmarshal_change));
-
+ if (changed_notes) {
+ XMLNodeList notes = changed_notes->children();
+
+ transform (notes.begin(), notes.end(), back_inserter(_changes),
+ sigc::mem_fun(*this, &DiffCommand::unmarshal_change));
+ }
+
return 0;
}