Add operator<< for bundles.
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 6b1703ed1b5330f2cbe618cee1c449bbeb21f3ab..d1d9afc985c74f48ab92a1b2b65f6b8b330b4a86 100644 (file)
@@ -74,6 +74,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/source_factory.h"
 #include "ardour/session.h"
+#include "ardour/operations.h"
 
 #include <bitset>
 
@@ -200,10 +201,10 @@ Editor::which_grabber_cursor ()
                        c = _cursors->grabber_edit_point;
                        break;
                default:
-                        boost::shared_ptr<Movable> m = _movable.lock();
-                        if (m && m->locked()) {
-                                c = _cursors->speaker;
-                        
+                       boost::shared_ptr<Movable> m = _movable.lock();
+                       if (m && m->locked()) {
+                               c = _cursors->speaker;
+                       } 
                        break;
                }
        }
@@ -214,24 +215,23 @@ Editor::which_grabber_cursor ()
 void
 Editor::set_current_trimmable (boost::shared_ptr<Trimmable> t)
 {
-        boost::shared_ptr<Trimmable> st = _trimmable.lock();
+       boost::shared_ptr<Trimmable> st = _trimmable.lock();
 
-        if (!st || st == t) {
-                _trimmable = t;
-                set_canvas_cursor ();
-        } 
-        
+       if (!st || st == t) {
+               _trimmable = t;
+               set_canvas_cursor ();
+       }
 }
 
 void
 Editor::set_current_movable (boost::shared_ptr<Movable> m)
 {
-        boost::shared_ptr<Movable> sm = _movable.lock();
+       boost::shared_ptr<Movable> sm = _movable.lock();
 
-        if (!sm || sm != m) {
-                _movable = m;
-                set_canvas_cursor ();
-        }
+       if (!sm || sm != m) {
+               _movable = m;
+               set_canvas_cursor ();
+       }
 }
 
 void
@@ -310,7 +310,7 @@ Editor::set_canvas_cursor ()
                }
        }
 
-        set_canvas_cursor (current_canvas_cursor, true);
+       set_canvas_cursor (current_canvas_cursor, true);
 }
 
 void
@@ -360,6 +360,8 @@ Editor::set_mouse_mode (MouseMode m, bool force)
        /* go there and back to ensure that the toggled handler is called to set up mouse_mode */
        tact->set_active (false);
        tact->set_active (true);
+
+       MouseModeChanged (); /* EMIT SIGNAL */
 }
 
 void
@@ -369,33 +371,35 @@ Editor::mouse_mode_toggled (MouseMode m)
 
        instant_save ();
         
-        if (!internal_editing()) {
-                if (mouse_mode != MouseRange && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) {
+       if (!internal_editing()) {
+               if (mouse_mode != MouseRange && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) {
                         
-                        /* in all modes except range and joined object/range, hide the range selection,
-                           show the object (region) selection.
-                        */
+                       /* in all modes except range and joined object/range, hide the range selection,
+                          show the object (region) selection.
+                       */
                         
-                        for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
-                                (*i)->set_should_show_selection (true);
-                        }
-                        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
-                                (*i)->hide_selection ();
-                        }
+                       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+                               (*i)->set_should_show_selection (true);
+                       }
+                       for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+                               (*i)->hide_selection ();
+                       }
                         
-                } else {
+               } else {
                         
-                        /*
-                          in range or object/range mode, show the range selection.
-                        */
+                       /*
+                         in range or object/range mode, show the range selection.
+                       */
                         
-                        for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
-                                (*i)->show_selection (selection->time);
-                        }
-                }
-        }
+                       for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
+                               (*i)->show_selection (selection->time);
+                       }
+               }
+       }
 
        set_canvas_cursor ();
+
+       MouseModeChanged (); /* EMIT SIGNAL */
 }
 
 void
@@ -519,8 +523,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
 
        case RegionViewNameHighlight:
        case RegionViewName:
-        case LeftFrameHandle:
-        case RightFrameHandle:
+       case LeftFrameHandle:
+       case RightFrameHandle:
                if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
                        set_selected_regionview_from_click (press, op, true);
                } else if (event->type == GDK_BUTTON_PRESS) {
@@ -706,45 +710,45 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        }
                        break;
 
-                case NoteItem:
-                        if (internal_editing()) {
-                                /* trim notes if we're in internal edit mode and near the ends of the note */
-                                ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
-                                cerr << "NoteItem button press, cursor = " << current_canvas_cursor << endl;
-                                if (cn->mouse_near_ends()) {
-                                        _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
-                                } else {
-                                        _drags->set (new NoteDrag (this, item), event);
-                                }
-                        }
+               case NoteItem:
+                       if (internal_editing()) {
+                               /* trim notes if we're in internal edit mode and near the ends of the note */
+                               ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
+                               cerr << "NoteItem button press, cursor = " << current_canvas_cursor << endl;
+                               if (cn->mouse_near_ends()) {
+                                       _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+                               } else {
+                                       _drags->set (new NoteDrag (this, item), event);
+                               }
+                       }
                        return true;
 
-                case StreamItem:
-                        if (internal_editing()) {
+               case StreamItem:
+                       if (internal_editing()) {
                                if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
                                        _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
                                        return true;
                                }
-                        } else {
+                       } else {
                                _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
                                return true;
                        }
-                        break;
+                       break;
 
-                case RegionViewNameHighlight:
-                case LeftFrameHandle:
-                case RightFrameHandle:
-                        if (!clicked_regionview->region()->locked()) {
-                                RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                                _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
-                                return true;
-                        }
-                        break;
+               case RegionViewNameHighlight:
+               case LeftFrameHandle:
+               case RightFrameHandle:
+                       if (!clicked_regionview->region()->locked()) {
+                               RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
+                               _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
+                               return true;
+                       }
+                       break;
 
                default:
-                        if (!internal_editing()) {
-                                _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
-                        }
+                       if (!internal_editing()) {
+                               _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
+                       }
                }
                return true;
                break;
@@ -753,12 +757,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                switch (item_type) {
                case NoteItem:
                        if (internal_editing()) {
-                                ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
-                                if (cn->mouse_near_ends()) {
-                                        _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
-                                } else {
-                                        _drags->set (new NoteDrag (this, item), event);
-                                }
+                               ArdourCanvas::CanvasNoteEvent* cn = dynamic_cast<ArdourCanvas::CanvasNoteEvent*> (item);
+                               if (cn->mouse_near_ends()) {
+                                       _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+                               } else {
+                                       _drags->set (new NoteDrag (this, item), event);
+                               }
                                return true;
                        }
                        break;
@@ -1689,7 +1693,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                        }
                        set_canvas_cursor (_cursors->fade_in);
                }
-                break;
+               break;
 
        case FadeOutHandleItem:
                if (mouse_mode == MouseObject && !internal_editing()) {
@@ -1748,7 +1752,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        Location *loc;
        RegionView* rv;
        bool is_start;
-        bool ret = true;
+       bool ret = true;
 
        switch (item_type) {
        case ControlPointItem:
@@ -1760,7 +1764,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                }
 
                if (is_drawable()) {
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                }
 
                hide_verbose_canvas_cursor ();
@@ -1783,7 +1787,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                _over_region_trim_target = false;
                
                if (is_drawable()) {
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                }
                break;
 
@@ -1796,7 +1800,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                                line->property_fill_color_rgba() = al->get_line_color();
                }
                if (is_drawable()) {
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                }
                break;
 
@@ -1806,7 +1810,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                
                if (!reinterpret_cast<RegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (is_drawable() && mouse_mode == MouseObject) {
-                                set_canvas_cursor (current_canvas_cursor);
+                               set_canvas_cursor (current_canvas_cursor);
                        }
                }
                break;
@@ -1818,7 +1822,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case TempoBarItem:
        case MarkerBarItem:
                if (is_drawable()) {
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                }
                break;
 
@@ -1850,12 +1854,12 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                                rect->property_outline_pixels() = 0;
                        }
                }
-                set_canvas_cursor (current_canvas_cursor);
+               set_canvas_cursor (current_canvas_cursor);
                break;
 
        case AutomationTrackItem:
                if (is_drawable()) {
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                        clear_entered_track = true;
                        Glib::signal_idle().connect (sigc::mem_fun(*this, &Editor::left_automation_track));
                }
@@ -2147,7 +2151,7 @@ Editor::show_verbose_time_cursor (framepos_t frame, double offset, double xpos,
 {
        char buf[128];
        Timecode::Time timecode;
-       BBT_Time bbt;
+       Timecode::BBT_Time bbt;
        int hours, mins;
        framepos_t frame_rate;
        float secs;
@@ -2204,8 +2208,8 @@ Editor::show_verbose_duration_cursor (framepos_t start, framepos_t end, double o
 {
        char buf[128];
        Timecode::Time timecode;
-       BBT_Time sbbt;
-       BBT_Time ebbt;
+       Timecode::BBT_Time sbbt;
+       Timecode::BBT_Time ebbt;
        int hours, mins;
        framepos_t distance, frame_rate;
        float secs;
@@ -2244,7 +2248,7 @@ Editor::show_verbose_duration_cursor (framepos_t start, framepos_t end, double o
                        ebbt.ticks -= sbbt.ticks;
                } else {
                        ebbt.beats--;
-                       ebbt.ticks = int(Meter::ticks_per_beat) + ebbt.ticks - sbbt.ticks;
+                       ebbt.ticks = int(Timecode::BBT_Time::ticks_per_beat) + ebbt.ticks - sbbt.ticks;
                }
 
                snprintf (buf, sizeof (buf), "%02" PRIu32 "|%02" PRIu32 "|%02" PRIu32, ebbt.bars, ebbt.beats, ebbt.ticks);
@@ -2464,9 +2468,9 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
        boost::shared_ptr<Playlist> playlist = rtv->playlist();
        double speed = rtv->track()->speed();
 
-        playlist->clear_changes ();
+       playlist->clear_changes ();
        boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
-        playlist->add_region (new_region, (framepos_t) (pos * speed));
+       playlist->add_region (new_region, (framepos_t) (pos * speed));
        _session->add_command (new StatefulDiffCommand (playlist));
 
        // playlist is frozen, so we have to update manually XXX this is disgusting
@@ -2489,9 +2493,9 @@ Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView*
 {
        assert (region_view);
 
-        if (!region_view->region()->playlist()) {
-                return;
-        }
+       if (!region_view->region()->playlist()) {
+               return;
+       }
 
        _region_motion_group->raise_to_top ();
 
@@ -2511,9 +2515,9 @@ Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionV
 {
        assert (region_view);
 
-        if (!region_view->region()->playlist()) {
-                return;
-        }
+       if (!region_view->region()->playlist()) {
+               return;
+       }
 
        _region_motion_group->raise_to_top ();
 
@@ -2526,9 +2530,9 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent* event, Region
 {
        assert (region_view);
 
-        if (!region_view->region()->playlist()) {
-                return;
-        }
+       if (!region_view->region()->playlist()) {
+               return;
+       }
         
        if (Config->get_edit_mode() == Splice) {
                return;
@@ -2537,7 +2541,7 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent* event, Region
        RegionSelection s = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id);
        _drags->add (new RegionMoveDrag (this, item, region_view, s.by_layer(), true, false));
 
-       begin_reversible_command (_("Drag region brush"));
+       begin_reversible_command (Operations::drag_region_brush);
 }
 
 /** Start a grab where a time range is selected, track(s) are selected, and the
@@ -2578,11 +2582,11 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
           creating the new region and another for moving it.
        */
 
-       begin_reversible_command (_("selection grab"));
+       begin_reversible_command (Operations::selection_grab);
 
        boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
 
-        playlist->clear_changes ();
+       playlist->clear_changes ();
        clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start);
        _session->add_command(new StatefulDiffCommand (playlist));
 
@@ -2621,20 +2625,15 @@ Editor::set_internal_edit (bool yn)
        if (yn) {
                mouse_select_button.set_image (*(manage (new Image (::get_icon("midi_tool_pencil")))));
                mouse_select_button.get_image ()->show ();
-                ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Draw/Edit MIDI Notes"));
-                set_canvas_cursor ();
-
-               /* deselect everything to avoid confusion when e.g. we can't now cut a previously selected
-                  region because cut means "cut note" rather than "cut region".
-               */
-               selection->clear ();
+               ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Draw/Edit MIDI Notes"));
+               mouse_mode_toggled (mouse_mode);
 
        } else {
 
                mouse_select_button.set_image (*(manage (new Image (::get_icon("tool_range")))));
                mouse_select_button.get_image ()->show ();
-                ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges"));
-                mouse_mode_toggled (mouse_mode); // sets cursor
+               ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges"));
+               mouse_mode_toggled (mouse_mode); // sets cursor
        }
 }