Make MIDI note editing work somewhat again...
authorDavid Robillard <d@drobilla.net>
Tue, 5 May 2009 00:08:30 +0000 (00:08 +0000)
committerDavid Robillard <d@drobilla.net>
Tue, 5 May 2009 00:08:30 +0000 (00:08 +0000)
Only show note velocity text when the user is actually editing velocity.

git-svn-id: svn://localhost/ardour2/branches/3.0@5047 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/canvas-note-event.cc
gtk2_ardour/canvas-note.cc
gtk2_ardour/interactive-item.h
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h

index a81692d01e9d3c40cb513471ac88f3b39a0f4794..88b6633dd33bf0c4dc38a3929be9091226238dfd 100644 (file)
@@ -74,8 +74,9 @@ CanvasNoteEvent::move_event(double dx, double dy)
 void
 CanvasNoteEvent::show_velocity()
 {
-       hide_velocity();
-       _text = new InteractiveText(*(_item->property_parent()), this);
+       if (!_text) {
+               _text = new InteractiveText(*(_item->property_parent()), this);
+       }
        _text->property_x() = (x1() + x2()) /2;
        _text->property_y() = (y1() + y2()) /2;
        ostringstream velo(ios::ate);
@@ -93,8 +94,8 @@ CanvasNoteEvent::hide_velocity()
        if (_text) {
                _text->hide();
                delete _text;
+               _text = 0;
        }
-       _text = 0;
 }
 
 void 
@@ -166,11 +167,9 @@ CanvasNoteEvent::selected(bool selected)
                                ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5));
                set_outline_color(calculate_outline(
                                ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get()));
-               show_velocity();
        } else {
                set_fill_color(base_color());
                set_outline_color(calculate_outline(base_color()));
-               hide_velocity();
        }
 
        _selected = selected;
@@ -260,17 +259,17 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
 
        case GDK_ENTER_NOTIFY:
                _region.note_entered(this);
-               _item->grab_focus();
-               show_velocity();
-               Keyboard::magic_widget_grab_focus();
+               //_item->grab_focus();
+               //show_velocity();
+               //Keyboard::magic_widget_grab_focus();
                break;
 
        case GDK_LEAVE_NOTIFY:
-               Keyboard::magic_widget_drop_focus();
+               //Keyboard::magic_widget_drop_focus();
                if (! selected()) {
                        hide_velocity();
                }
-               _region.get_canvas_group()->grab_focus();
+               //_region.get_canvas_group()->grab_focus();
                break;
 
        case GDK_BUTTON_PRESS:
index 973ab4db6dfef12e5c8f8808701c5f6707e8c2ad..06234e3e55d5f71db9835255529be4ca1ac67789 100644 (file)
@@ -20,8 +20,7 @@ CanvasNote::on_event(GdkEvent* ev)
        switch (ev->type) {
        case GDK_BUTTON_PRESS:
                if (ev->button.button == 2 ||
-                               (ev->button.button == 1 &&
-                                edit_mode == Editing::MidiEditResize)) {
+                               (ev->button.button == 1 && edit_mode == Editing::MidiEditResize)) {
                        double region_start = _region.get_position_pixels();
                        event_x = ev->button.x;
                        middle_point = region_start + x1() + (x2() - x1()) / 2.0L;
index 2b54675c111ac24b0b914ed18dd88737b6851f09..25406bd7660c2d3e32d2641c588a18176594db61 100644 (file)
@@ -66,13 +66,14 @@ protected:
 class InteractiveRect: public SimpleRect, public InteractiveItem
 {
 public:
-       InteractiveRect(Group& parent, InteractiveItem* parent_item, double x1, double y1, double x2, double y2) 
+       InteractiveRect(Group& parent, InteractiveItem* parent_item,
+                       double x1, double y1, double x2, double y2) 
                : SimpleRect(parent, x1, y1, x2, y2) 
                , _parent_item(parent_item)
-               {}
+       {}
        
        bool on_event(GdkEvent* ev) {
-               if(_parent_item) {
+               if (_parent_item) {
                        return _parent_item->on_event(ev);
                } else {
                        return false;
index 4a5c2091017f40c6d133630734d0fab4b0c58a3c..6ee71ab41f9a786b0972a11fd70c183fc10c29f0 100644 (file)
@@ -499,7 +499,7 @@ MidiRegionView::start_delta_command(string name)
 }
 
 void
-MidiRegionView::command_add_note(const boost::shared_ptr<NoteType> note, bool selected)
+MidiRegionView::command_add_note(const boost::shared_ptr<NoteType> note, bool selected, bool show_velocity)
 {
        if (_delta_command) {
                _delta_command->add(note);
@@ -507,6 +507,9 @@ MidiRegionView::command_add_note(const boost::shared_ptr<NoteType> note, bool se
        if (selected) {
                _marked_for_selection.insert(note);
        }
+       if (show_velocity) {
+               _marked_for_velocity.insert(note);
+       }
 }
 
 void
@@ -534,6 +537,7 @@ MidiRegionView::apply_command()
        midi_view()->midi_track()->diskstream()->playlist_modified();
 
        _marked_for_selection.clear();
+       _marked_for_velocity.clear();
 }
        
 
@@ -754,7 +758,6 @@ MidiRegionView::apply_note_range (uint8_t min, uint8_t max, bool force)
                                        item->show();
                                }
 
-                               event->hide_velocity();
                                if (CanvasNote* note = dynamic_cast<CanvasNote*>(event)) {
                                        const double y1 = midi_stream_view()->note_to_y(event->note()->note());
                                        const double y2 = y1 + floor(midi_stream_view()->note_height());
@@ -772,9 +775,6 @@ MidiRegionView::apply_note_range (uint8_t min, uint8_t max, bool force)
                                        hit->move(x-hit->x1(), y-hit->y1());
                                        hit->show();
                                }
-                               if (event->selected()) {
-                                       event->show_velocity();
-                               }
                        }
                }
        }
@@ -838,6 +838,7 @@ MidiRegionView::end_write()
        delete[] _active_notes;
        _active_notes = NULL;
        _marked_for_selection.clear();
+       _marked_for_velocity.clear();
 }
 
 
@@ -998,6 +999,9 @@ MidiRegionView::add_note(const boost::shared_ptr<NoteType> note)
                if (_marked_for_selection.find(note) != _marked_for_selection.end()) {
                        note_selected(event, true);
                }
+               if (_marked_for_velocity.find(note) != _marked_for_velocity.end()) {
+                       event->show_velocity();
+               }
                event->on_channel_selection_change(_last_channel_selection);
                _events.push_back(event);
                if (note_in_visible_range(note)) {
@@ -1163,6 +1167,7 @@ MidiRegionView::clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev)
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
                if ((*i)->selected() && (*i) != ev) {
                        (*i)->selected(false);
+                       (*i)->hide_velocity();
                }
        }
 
@@ -1175,6 +1180,7 @@ MidiRegionView::unique_select(ArdourCanvas::CanvasNoteEvent* ev)
        for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
                if ((*i) != ev) {
                        (*i)->selected(false);
+                       (*i)->hide_velocity();
                }
        }
 
@@ -1279,8 +1285,9 @@ MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2
 void
 MidiRegionView::move_selection(double dx, double dy)
 {
-       for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i)
+       for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
                (*i)->move_event(dx, dy);
+       }
 }
 
 
@@ -1550,7 +1557,7 @@ MidiRegionView::change_note_velocity(CanvasNoteEvent* event, int8_t velocity, bo
        }
 
        command_remove_note(event);
-       command_add_note(copy, event->selected());
+       command_add_note(copy, event->selected(), true);
 }
 
 void
@@ -1599,8 +1606,8 @@ void
 MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev)
 {
        if (ev->note() && _mouse_state == EraseTouchDragging) {
-               start_delta_command(_("note entered"));
-               ev->selected(true);
+               if (!_delta_command)
+                       start_delta_command(_("note entered"));
                _delta_command->remove(ev->note());
        } else if (_mouse_state == SelectTouchDragging) {
                note_selected(ev, true);
index adb4a1e31665db0f41ea41612b24f28813d63922..61e426795b5941534273e6f861a1cd5776189e4c 100644 (file)
@@ -159,7 +159,7 @@ class MidiRegionView : public RegionView
        void display_model(boost::shared_ptr<ARDOUR::MidiModel> model);
 
        void start_delta_command(std::string name = "midi edit");
-       void command_add_note(const boost::shared_ptr<NoteType> note, bool selected);
+       void command_add_note(const boost::shared_ptr<NoteType> note, bool selected, bool show_velocity=false);
        void command_remove_note(ArdourCanvas::CanvasNoteEvent* ev);
 
        void apply_command();
@@ -333,6 +333,10 @@ class MidiRegionView : public RegionView
        /** New notes (created in the current command) which should be selected
         * when they appear after the command is applied. */
        std::set< boost::shared_ptr<NoteType> > _marked_for_selection;
+       
+       /** New notes (created in the current command) which should have visible velocity
+        * when they appear after the command is applied. */
+       std::set< boost::shared_ptr<NoteType> > _marked_for_velocity;
 
        std::vector<NoteResizeData *> _resize_data;
 };