diff options
-rw-r--r-- | gtk2_ardour/audio_streamview.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/canvas-note-event.cc | 75 | ||||
-rw-r--r-- | gtk2_ardour/canvas-note-event.h | 8 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 5 | ||||
-rw-r--r-- | gtk2_ardour/editor_canvas.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 18 | ||||
-rw-r--r-- | gtk2_ardour/editor_regions.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 22 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.h | 5 | ||||
-rw-r--r-- | gtk2_ardour/midi_streamview.cc | 2 | ||||
-rw-r--r-- | libs/ardour/region.cc | 2 | ||||
-rw-r--r-- | libs/pbd/pbd/stateful.h | 6 | ||||
-rw-r--r-- | libs/pbd/stateful.cc | 1 |
14 files changed, 131 insertions, 33 deletions
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index accc5b7ea4..3a7f985e30 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -488,7 +488,7 @@ AudioStreamView::setup_rec_box () boost::dynamic_pointer_cast<AudioRegion>(RegionFactory::create (sources, plist, false))); assert(region); - region->block_property_changes (); + region->suspend_property_changes (); region->set_position (_trackview.session()->transport_frame(), this); rec_regions.push_back (make_pair(region, (RegionView*) 0)); } diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index 739019b31e..b1bfa49ab4 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -53,6 +53,8 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, const boost , _note(note) , _selected(false) , _valid (true) + , _mouse_x_fraction (-1.0) + , _mouse_y_fraction (-1.0) { } @@ -223,6 +225,60 @@ CanvasNoteEvent::base_color() return 0; } +void +CanvasNoteEvent::set_mouse_fractions (GdkEvent* ev) +{ + double ix, iy; + double bx1, bx2, by1, by2; + + switch (ev->type) { + case GDK_MOTION_NOTIFY: + ix = ev->motion.x; + iy = ev->motion.y; + break; + case GDK_ENTER_NOTIFY: + ix = ev->crossing.x; + iy = ev->crossing.y; + break; + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + ix = ev->button.x; + iy = ev->button.y; + break; + default: + _mouse_x_fraction = -1.0; + _mouse_y_fraction = -1.0; + return; + } + + _item->get_bounds (bx1, by1, bx2, by2); + _item->w2i (ix, iy); + /* hmm, something wrong here. w2i should give item-local coordinates + but it doesn't. for now, finesse this. + */ + ix = ix - bx1; + iy = iy - by1; + + /* fraction of width/height */ + double xf; + double yf; + bool notify = false; + + xf = ix / (bx2 - bx1); + yf = iy / (by2 - by1); + + if (xf != _mouse_x_fraction || yf != _mouse_y_fraction) { + notify = true; + } + + _mouse_x_fraction = xf; + _mouse_y_fraction = yf; + + if (notify) { + _region.note_mouse_position (_mouse_x_fraction, _mouse_y_fraction); + } +} + bool CanvasNoteEvent::on_event(GdkEvent* ev) { @@ -232,22 +288,21 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (ev->type) { case GDK_ENTER_NOTIFY: - _region.note_entered(this); + set_mouse_fractions (ev); + _region.note_entered (this); break; case GDK_LEAVE_NOTIFY: + set_mouse_fractions (ev); _region.note_left (this); break; case GDK_MOTION_NOTIFY: - double ix, iy; - ix = ev->motion.x; - iy = ev->motion.y; - _item->w2i (ix, iy); - cerr << "note motion at " << ix << ',' << iy << endl; + set_mouse_fractions (ev); break; case GDK_BUTTON_PRESS: + set_mouse_fractions (ev); if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) { show_channel_selector(); return true; @@ -255,6 +310,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev) break; case GDK_BUTTON_RELEASE: + set_mouse_fractions (ev); if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) { return true; } @@ -267,6 +323,13 @@ CanvasNoteEvent::on_event(GdkEvent* ev) return false; } +bool +CanvasNoteEvent::mouse_near_ends () const +{ + return (_mouse_x_fraction >= 0.0 && _mouse_x_fraction < 0.25) || + (_mouse_x_fraction >= 0.75 && _mouse_x_fraction < 1.0); +} + } // namespace Canvas } // namespace Gnome diff --git a/gtk2_ardour/canvas-note-event.h b/gtk2_ardour/canvas-note-event.h index c1795c330e..5267398488 100644 --- a/gtk2_ardour/canvas-note-event.h +++ b/gtk2_ardour/canvas-note-event.h @@ -139,7 +139,9 @@ class CanvasNoteEvent : virtual public sigc::trackable /// hue circle divided into 16 equal-looking parts, courtesy Thorsten Wilms static const uint32_t midi_channel_colors[16]; -protected: + bool mouse_near_ends () const; + + protected: enum State { None, Pressed, Dragging }; MidiRegionView& _region; @@ -151,6 +153,10 @@ protected: bool _own_note; bool _selected; bool _valid; + float _mouse_x_fraction; + float _mouse_y_fraction; + + void set_mouse_fractions (GdkEvent*); }; } // namespace Gnome diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 01bc7a09e7..56abdee431 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -476,6 +476,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD static Gdk::Cursor* timebar_cursor; static Gdk::Cursor* transparent_cursor; + Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; } + void set_canvas_cursor (Gdk::Cursor*); + protected: void map_transport_state (); void map_position_change (framepos_t); @@ -686,8 +689,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::VBox vpacker; Gdk::Cursor* current_canvas_cursor; - void set_canvas_cursor (); Gdk::Cursor* which_grabber_cursor (); + void set_canvas_cursor (); ArdourCanvas::Canvas* track_canvas; diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 705e7efa3b..faf2c7e19e 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -917,6 +917,14 @@ Editor::horizontal_position () const { return frame_to_unit (leftmost_frame); } +void +Editor::set_canvas_cursor (Gdk::Cursor* cursor) +{ + if (is_drawable()) { + track_canvas->get_window()->set_cursor(*cursor); + } + +} bool Editor::track_canvas_key_press (GdkEventKey* event) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 61d137cb98..f79df6bb42 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3769,7 +3769,7 @@ NoteDrag::finished (GdkEvent* ev, bool moved) } } } else { - _region->note_dropped (_primary, total_dx(), - total_dy()); + _region->note_dropped (_primary, total_dx(), total_dy()); } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index d33db07e88..8adefaaa62 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -35,6 +35,7 @@ #include "ardour_ui.h" #include "actions.h" +#include "canvas-note.h" #include "editor.h" #include "time_axis_view.h" #include "audio_time_axis.h" @@ -677,14 +678,16 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case NoteItem: if (internal_editing()) { /* trim notes if we're in internal edit mode and near the ends of the note */ - _drags->set (new NoteResizeDrag (this, item), event); + ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item); + if (cn->mouse_near_ends()) { + _drags->set (new NoteResizeDrag (this, item), event); + } else { + _drags->set (new NoteDrag (this, item), event); + } } return true; case StreamItem: - cerr << "press on stream item, internal? " << internal_editing() << " MIDI ? " - << dynamic_cast<MidiTimeAxisView*>(clicked_axisview) - << endl; if (internal_editing()) { if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) { _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); @@ -718,7 +721,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT switch (item_type) { case NoteItem: if (internal_editing()) { - _drags->set (new NoteDrag (this, item), event); + ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item); + if (cn->mouse_near_ends()) { + _drags->set (new NoteResizeDrag (this, item), event); + } else { + _drags->set (new NoteDrag (this, item), event); + } return true; } break; diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 0cc8926371..075d048d73 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -89,8 +89,8 @@ EditorRegions::EditorRegions (Editor* e) _display.append_column (_("G"), _columns.glued); _display.append_column (_("M"), _columns.muted); _display.append_column (_("O"), _columns.opaque); - _display.append_column (_("Used"), _columns.used); - _display.append_column (_("Path"), _columns.path); + // _display.append_column (_("Used"), _columns.used); + // _display.append_column (_("Path"), _columns.path); _display.set_headers_visible (true); //_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH); @@ -461,10 +461,6 @@ EditorRegions::selection_changed () // they could have clicked on a row that is just a placeholder, like "Hidden" if (region) { - cerr << "Selected region has use count " - << _session->playlists->region_use_count (region) - << endl; - if (region->automatic()) { _display.get_selection()->unselect(*i); diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 20b93b71e5..94083bf73d 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -49,6 +49,7 @@ #include "canvas-hit.h" #include "canvas-note.h" #include "canvas-program-change.h" +#include "editor.h" #include "ghostregion.h" #include "gui_thread.h" #include "keyboard.h" @@ -2646,6 +2647,10 @@ MidiRegionView::change_channel(uint8_t channel) void MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev) { + Editor* editor = dynamic_cast<Editor*>(&trackview.editor()); + + pre_enter_cursor = editor->get_canvas_cursor (); + if (_mouse_state == SelectTouchDragging) { note_selected (ev, true); } @@ -2656,17 +2661,28 @@ MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev) void MidiRegionView::note_left (ArdourCanvas::CanvasNoteEvent* note) { + Editor* editor = dynamic_cast<Editor*>(&trackview.editor()); + for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) { (*i)->hide_velocity (); } - trackview.editor().hide_verbose_canvas_cursor (); + editor->hide_verbose_canvas_cursor (); + editor->set_canvas_cursor (pre_enter_cursor); } void -MidiRegionView::note_motion (float fraction) +MidiRegionView::note_mouse_position (float x_fraction, float y_fraction) { - cerr << "Now at " << fraction << " within note\n"; + Editor* editor = dynamic_cast<Editor*>(&trackview.editor()); + + if (x_fraction > 0.0 && x_fraction < 0.25) { + editor->set_canvas_cursor (editor->left_side_trim_cursor); + } else if (x_fraction >= 0.75 && x_fraction < 1.0) { + editor->set_canvas_cursor (editor->right_side_trim_cursor); + } else { + editor->set_canvas_cursor (pre_enter_cursor); + } } void diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index c66c6dc220..b2b54c5f3c 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -190,9 +190,11 @@ class MidiRegionView : public RegionView void apply_diff_as_subcommand(); void abort_command(); + Gdk::Cursor* pre_enter_cursor; + void note_entered(ArdourCanvas::CanvasNoteEvent* ev); void note_left(ArdourCanvas::CanvasNoteEvent* ev); - void note_motion (float fraction); + void note_mouse_position (float xfraction, float yfraction); void unique_select(ArdourCanvas::CanvasNoteEvent* ev); void note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false); void note_deselected(ArdourCanvas::CanvasNoteEvent* ev); @@ -432,7 +434,6 @@ class MidiRegionView : public RegionView void get_events (Events& e, Evoral::Sequence<Evoral::MusicalTime>::NoteOperator op, uint8_t val, int chan_mask = 0); void display_program_changes_on_channel (uint8_t); - }; diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 0b47e1bb20..fe1f778414 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -459,7 +459,7 @@ MidiStreamView::setup_rec_box () (RegionFactory::create (sources, plist, false))); assert(region); - region->block_property_changes (); + region->suspend_property_changes (); region->set_position (_trackview.session()->transport_frame(), this); rec_regions.push_back (make_pair(region, (RegionView*)0)); diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 98f48ab80a..7e78475eb3 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -1310,7 +1310,7 @@ Region::send_change (const PropertyChange& what_changed) Stateful::send_change (what_changed); - if (!_no_property_changes) { + if (!Stateful::frozen()) { /* Try and send a shared_pointer unless this is part of the constructor. If so, do nothing. diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 735ffbdc4a..1f0f73b3ef 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -86,10 +86,9 @@ class Stateful { virtual void suspend_property_changes (); virtual void resume_property_changes (); + + virtual bool frozen() const { return _frozen; } - void unlock_property_changes () { _no_property_changes = false; } - void block_property_changes () { _no_property_changes = true; } - protected: void add_instant_xml (XMLNode&, const sys::path& directory_path); @@ -108,7 +107,6 @@ class Stateful { XMLNode *_instant_xml; PBD::ID _id; int32_t _frozen; - bool _no_property_changes; PBD::PropertyChange _pending_changed; Glib::Mutex _lock; diff --git a/libs/pbd/stateful.cc b/libs/pbd/stateful.cc index e13a499e41..c33418ce39 100644 --- a/libs/pbd/stateful.cc +++ b/libs/pbd/stateful.cc @@ -40,7 +40,6 @@ int Stateful::loading_state_version = 0; Stateful::Stateful () : _frozen (0) - , _no_property_changes (false) , _properties (new OwnedPropertyList) { _extra_xml = 0; |