fix redrawing of canvas with an optimized build
[ardour.git] / gtk2_ardour / editor_selection.cc
index 6e12a03856769ddf5799871bd60bdbd1b54e68db..59425b289c362f71cf423eb747b9059427186860 100644 (file)
@@ -318,19 +318,39 @@ Editor::set_selected_control_point_from_click (bool press, Selection::Operation
                return false;
        }
 
-       if (!press) {
-               return true;
-       }
-
        switch (op) {
        case Selection::Set:
-               selection->set (clicked_control_point);
+               if (press) {
+                       selection->set (clicked_control_point);
+               }
                break;
        case Selection::Add:
-               selection->add (clicked_control_point);
+               if (press) {
+                       selection->add (clicked_control_point);
+               }
                break;
        case Selection::Toggle:
-               selection->toggle (clicked_control_point);
+               /* This is a bit of a hack; if we Primary-Click-Drag a control
+                  point (for push drag) we want the point we clicked on to be
+                  selected, otherwise we end up confusingly dragging an
+                  unselected point.  So here we ensure that the point is selected
+                  after the press, and if we subsequently get a release (meaning no
+                  drag occurred) we set things up so that the toggle has happened.
+               */
+               if (press && !selection->selected (clicked_control_point)) {
+                       /* This is the button press, and the control point is not selected; make it so,
+                          in case this press leads to a drag.  Also note that having done this, we don't
+                          need to toggle again on release.
+                       */
+                       selection->toggle (clicked_control_point);
+                       _control_point_toggled_on_press = true;
+               } else if (!press && !_control_point_toggled_on_press) {
+                       /* This is the release, and the point wasn't toggled on the press, so do it now */
+                       selection->toggle (clicked_control_point);
+               } else {
+                       /* Reset our flag */
+                       _control_point_toggled_on_press = false;
+               }
                break;
        case Selection::Extend:
                /* XXX */
@@ -344,7 +364,7 @@ void
 Editor::get_onscreen_tracks (TrackViewList& tvl)
 {
        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
-               if ((*i)->y_position() < _canvas_height) {
+               if ((*i)->y_position() < _visible_canvas_height) {
                        tvl.push_back (*i);
                }
        }
@@ -759,7 +779,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 
                                        RouteTimeAxisView* closest = 0;
                                        int distance = INT_MAX;
-                                       int key = rtv->route()->order_key ("editor");
+                                       int key = rtv->route()->order_key ();
 
                                        for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
 
@@ -774,7 +794,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
                                                        if (result.second) {
                                                                /* newly added to already_in_selection */
 
-                                                               int d = artv->route()->order_key ("editor");
+                                                               int d = artv->route()->order_key ();
 
                                                                d -= key;
 
@@ -790,7 +810,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 
                                                /* now add all tracks between that one and this one */
 
-                                               int okey = closest->route()->order_key ("editor");
+                                               int okey = closest->route()->order_key ();
 
                                                if (okey > key) {
                                                        swap (okey, key);
@@ -800,7 +820,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
                                                        RouteTimeAxisView* artv = dynamic_cast<RouteTimeAxisView*>(*x);
                                                        if (artv && artv != rtv) {
 
-                                                               int k = artv->route()->order_key ("editor");
+                                                               int k = artv->route()->order_key ();
 
                                                                if (k >= okey && k <= key) {
 
@@ -860,7 +880,7 @@ Editor::set_selected_regionview_from_region_list (boost::shared_ptr<Region> regi
 {
        vector<RegionView*> all_equivalent_regions;
 
-       get_regions_corresponding_to (region, all_equivalent_regions);
+       get_regions_corresponding_to (region, all_equivalent_regions, region->whole_file());
 
        if (all_equivalent_regions.empty()) {
                return;
@@ -942,9 +962,7 @@ Editor::track_selection_changed ()
                        (*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end());
                }
 
-               if (yn &&
-                   ((mouse_mode == MouseRange) ||
-                    ((mouse_mode == MouseObject) && (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT)))) {
+               if (yn) {
                        (*i)->reshow_selection (selection->time);
                } else {
                        (*i)->hide_selection ();
@@ -1016,19 +1034,6 @@ Editor::sensitize_all_region_actions (bool s)
 void
 Editor::sensitize_the_right_region_actions ()
 {
-       if ((mouse_mode == MouseRange) || (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) {
-               sensitize_all_region_actions (false);
-               if (!selection->time.empty()) {
-                       _region_actions->get_action("split-region")->set_sensitive (true);
-               }
-               return;
-
-       } else if (mouse_mode != MouseObject) {
-               sensitize_all_region_actions (false);
-               return;
-       }
-
-       /* We get here if we are in Object mode */
 
        RegionSelection rs = get_regions_from_selection_and_entered ();
        sensitize_all_region_actions (!rs.empty ());
@@ -1042,6 +1047,8 @@ Editor::sensitize_the_right_region_actions ()
        bool have_midi = false;
        bool have_locked = false;
        bool have_unlocked = false;
+       bool have_video_locked = false;
+       bool have_video_unlocked = false;
        bool have_position_lock_style_audio = false;
        bool have_position_lock_style_music = false;
        bool have_muted = false;
@@ -1084,6 +1091,12 @@ Editor::sensitize_the_right_region_actions ()
                        have_unlocked = true;
                }
 
+               if (r->video_locked()) {
+                       have_video_locked = true;
+               } else {
+                       have_video_unlocked = true;
+               }
+
                if (r->position_lock_style() == MusicTime) {
                        have_position_lock_style_music = true;
                } else {
@@ -1136,6 +1149,9 @@ Editor::sensitize_the_right_region_actions ()
                _region_actions->get_action("show-region-properties")->set_sensitive (false);
                _region_actions->get_action("rename-region")->set_sensitive (false);
                if (have_audio) {
+                       /* XXX need to check whether there is than 1 per
+                          playlist, because otherwise this makes no sense.
+                       */
                        _region_actions->get_action("combine-regions")->set_sensitive (true);
                } else {
                        _region_actions->get_action("combine-regions")->set_sensitive (false);
@@ -1204,6 +1220,12 @@ Editor::sensitize_the_right_region_actions ()
                // a->set_inconsistent ();
        }
 
+       a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-video-lock"));
+       a->set_active (have_video_locked && !have_video_unlocked);
+       if (have_video_locked && have_video_unlocked) {
+               // a->set_inconsistent ();
+       }
+
        a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"));
        a->set_active (have_position_lock_style_music && !have_position_lock_style_audio);
 
@@ -1291,8 +1313,8 @@ Editor::region_selection_changed ()
                sensitize_all_region_actions (true);
        }
 
-       if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->regions.empty()) {
-               _session->request_locate (selection->regions.start());
+       if (_session && !_session->transport_rolling() && !selection->regions.empty()) {
+               maybe_locate_with_edit_preroll (selection->regions.start());
        }
 }
 
@@ -1347,17 +1369,48 @@ Editor::select_all (Selection::Operation op)
 {
        list<Selectable *> touched;
 
+       TrackViewList ts;
+
+       if (selection->tracks.empty()) {
+               if (entered_track) {
+                       ts.push_back (entered_track);
+               } else {
+                       ts = track_views;
+               }
+       } else {
+               ts = selection->tracks;
+       }
+
        if (_internal_editing) {
-               select_all_internal_edit (op);
-               return;
+
+               bool midi_selected = false;
+
+               for (TrackViewList::iterator iter = ts.begin(); iter != ts.end(); ++iter) {
+                       if ((*iter)->hidden()) {
+                               continue;
+                       }
+                       
+                       RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*iter);
+
+                       if (rtav && rtav->is_midi_track()) {
+                               midi_selected = true;
+                               break;
+                       }
+               }
+
+               if (midi_selected) {
+                       select_all_internal_edit (op);
+                       return;
+               }
        }
 
-       for (TrackViewList::iterator iter = track_views.begin(); iter != track_views.end(); ++iter) {
+       for (TrackViewList::iterator iter = ts.begin(); iter != ts.end(); ++iter) {
                if ((*iter)->hidden()) {
                        continue;
                }
                (*iter)->get_selectables (0, max_framepos, 0, DBL_MAX, touched);
        }
+
        begin_reversible_command (_("select all"));
        switch (op) {
        case Selection::Add:
@@ -1624,12 +1677,12 @@ Editor::select_all_selectables_using_cursor (EditorCursor *cursor, bool after)
        list<Selectable *> touched;
 
        if (after) {
-               start = cursor->current_frame;
+               start = cursor->current_frame();
                end = _session->current_end_frame();
        } else {
-               if (cursor->current_frame > 0) {
+               if (cursor->current_frame() > 0) {
                        start = 0;
-                       end = cursor->current_frame - 1;
+                       end = cursor->current_frame() - 1;
                } else {
                        return;
                }
@@ -1763,7 +1816,7 @@ Editor::select_range_between ()
        framepos_t start;
        framepos_t end;
 
-       if (mouse_mode == MouseRange && !selection->time.empty()) {
+       if ( !selection->time.empty() ) {
                selection->clear_time ();
        }
 
@@ -1781,9 +1834,9 @@ Editor::get_edit_op_range (framepos_t& start, framepos_t& end) const
        framepos_t m;
        bool ignored;
 
-       /* in range mode, use any existing selection */
+       /* if an explicit range exists, use it */
 
-       if (mouse_mode == MouseRange && !selection->time.empty()) {
+       if (!selection->time.empty()) {
                /* we know that these are ordered */
                start = selection->time.start();
                end = selection->time.end_frame();