Tweak spacing.
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 30e117fb590019c5470df16f2567c12876e8cd7a..1ddf026af7a54a379d23a166beca3f8f3dbc42f3 100644 (file)
@@ -66,8 +66,6 @@
 #include "ardour/profile.h"
 #include "ardour/route.h"
 #include "ardour/audio_track.h"
-#include "ardour/audio_diskstream.h"
-#include "ardour/midi_diskstream.h"
 #include "ardour/playlist.h"
 #include "ardour/audioplaylist.h"
 #include "ardour/audioregion.h"
@@ -589,26 +587,42 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                return true;
 
        case TempoMarkerItem:
-               _drags->set (
-                       new TempoMarkerDrag (
-                               this,
-                               item,
-                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                               ),
-                       event
-                       );
-               return true;
+       {
+               TempoMarker* m = reinterpret_cast<TempoMarker*> (item->get_data ("marker"));
+               assert (m);
+               if (m->tempo().movable ()) {
+                       _drags->set (
+                               new TempoMarkerDrag (
+                                       this,
+                                       item,
+                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                                       ),
+                               event
+                               );
+                       return true;
+               } else {
+                       return false;
+               }
+       }
 
        case MeterMarkerItem:
-               _drags->set (
-                       new MeterMarkerDrag (
-                               this,
-                               item,
-                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                               ),
-                       event
-                       );
-               return true;
+       {
+               MeterMarker* m = reinterpret_cast<MeterMarker*> (item->get_data ("marker"));
+               assert (m);
+               if (m->meter().movable ()) {
+                       _drags->set (
+                               new MeterMarkerDrag (
+                                       this,
+                                       item,
+                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                                       ),
+                               event
+                               );
+                       return true;
+               } else {
+                       return false;
+               }
+       }
 
        case MarkerBarItem:
        case TempoBarItem:
@@ -881,7 +895,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case AutomationTrackItem:
                        {
                                TimeAxisView* parent = clicked_axisview->get_parent ();
-                               if (parent && dynamic_cast<MidiTimeAxisView*> (parent)) {
+                               AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (clicked_axisview);
+                               assert (atv);
+                               if (parent && dynamic_cast<MidiTimeAxisView*> (parent) && atv->show_regions ()) {
                                        /* create a MIDI region so that we have somewhere to put automation */
                                        _drags->set (new RegionCreateDrag (this, item, parent), event);
                                } else {
@@ -1340,6 +1356,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                popup_track_context_menu (1, event->button.time, item_type, false);
                                break;
 
+                       case ControlPointItem:
+                               popup_control_point_context_menu (item, event);
+                               break;
+
 #ifdef WITH_CMT
                        case ImageFrameItem:
                                popup_imageframe_edit_menu(1, event->button.time, item, true) ;
@@ -1389,11 +1409,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                case ControlPointItem:
-                       if (eff == MouseGain) {
-                               remove_gain_control_point (item, event);
-                       } else {
-                               remove_control_point (item, event);
-                       }
+                       remove_control_point (item);
                        break;
 
                case NoteItem:
@@ -1788,7 +1804,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 }
 
 bool
-Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
+Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
 {
        AutomationLine* al;
        ControlPoint* cp;
@@ -2065,8 +2081,8 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from
        return true;
 }
 
-void
-Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/)
+bool
+Editor::can_remove_control_point (ArdourCanvas::Item* item)
 {
        ControlPoint* control_point;
 
@@ -2075,18 +2091,24 @@ Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/)
                /*NOTREACHED*/
        }
 
-       // We shouldn't remove the first or last gain point
-       if (control_point->line().is_last_point(*control_point) ||
-               control_point->line().is_first_point(*control_point)) {
-               return;
+       AutomationLine& line = control_point->line ();
+       if (dynamic_cast<AudioRegionGainLine*> (&line)) {
+               /* we shouldn't remove the first or last gain point in region gain lines */
+               if (line.is_last_point(*control_point) || line.is_first_point(*control_point)) {
+                       return false;
+               }
        }
 
-       control_point->line().remove_point (*control_point);
+       return true;
 }
 
 void
-Editor::remove_control_point (ArdourCanvas::Item* item, GdkEvent* /*event*/)
+Editor::remove_control_point (ArdourCanvas::Item* item)
 {
+       if (!can_remove_control_point (item)) {
+               return;
+       }
+
        ControlPoint* control_point;
 
        if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) {
@@ -2393,7 +2415,7 @@ Editor::track_height_step_timeout ()
 }
 
 void
-Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
@@ -2415,7 +2437,7 @@ Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView*
 }
 
 void
-Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
@@ -2430,7 +2452,7 @@ Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionV
 }
 
 void
-Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
@@ -2560,7 +2582,7 @@ Editor::set_internal_edit (bool yn)
  *  used by the `join object/range' tool mode.
  */
 void
-Editor::update_join_object_range_location (double x, double y)
+Editor::update_join_object_range_location (double /*x*/, double y)
 {
        /* XXX: actually, this decides based on whether the mouse is in the top or bottom half of a RouteTimeAxisView;
           entered_{track,regionview} is not always setup (e.g. if the mouse is over a TimeSelection), and to get a Region