summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/audio_streamview.cc2
-rw-r--r--gtk2_ardour/canvas-note-event.cc75
-rw-r--r--gtk2_ardour/canvas-note-event.h8
-rw-r--r--gtk2_ardour/editor.h5
-rw-r--r--gtk2_ardour/editor_canvas.cc8
-rw-r--r--gtk2_ardour/editor_drag.cc2
-rw-r--r--gtk2_ardour/editor_mouse.cc18
-rw-r--r--gtk2_ardour/editor_regions.cc8
-rw-r--r--gtk2_ardour/midi_region_view.cc22
-rw-r--r--gtk2_ardour/midi_region_view.h5
-rw-r--r--gtk2_ardour/midi_streamview.cc2
-rw-r--r--libs/ardour/region.cc2
-rw-r--r--libs/pbd/pbd/stateful.h6
-rw-r--r--libs/pbd/stateful.cc1
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;