merge 2.0-ongoing into 3.0 @ 3581 - 3710
[ardour.git] / gtk2_ardour / editor_markers.cc
index e6fb32feca19000ac3fa91a3cc0b64fdb29cf97a..8d86a0fbb2d3d5e09b9a843bff90137ad1218e5a 100644 (file)
@@ -79,7 +79,7 @@ Editor::add_new_location (Location *location)
 
        if (location->is_mark()) {
 
-               if (location->is_cd_marker() && ruler_shown[ruler_time_cd_marker]) {
+               if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
                        lam->start = new Marker (*this, *cd_marker_group, color, location->name(), Marker::Mark, location->start());
                }
                else {
@@ -103,7 +103,7 @@ Editor::add_new_location (Location *location)
                
        } else {
                // range marker
-               if (location->is_cd_marker() && ruler_shown[ruler_time_cd_marker]) {
+               if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
                        lam->start = new Marker (*this, *cd_marker_group, color, 
                                                 location->name(), Marker::Start, location->start());
                        lam->end   = new Marker (*this, *cd_marker_group, color, 
@@ -212,7 +212,7 @@ void Editor::update_cd_marker_display ()
 void Editor::ensure_cd_marker_updated (LocationMarkers * lam, Location * location)
 {
        if (location->is_cd_marker()
-           && (ruler_shown[ruler_time_cd_marker] &&  lam->start->get_parent() != cd_marker_group))
+           && (ruler_cd_marker_action->get_active() &&  lam->start->get_parent() != cd_marker_group))
        {
                //cerr << "reparenting non-cd marker so it can be relocated: " << location->name() << endl;
                if (lam->start) {
@@ -222,7 +222,7 @@ void Editor::ensure_cd_marker_updated (LocationMarkers * lam, Location * locatio
                        lam->end->reparent (*cd_marker_group);
                }
        }
-       else if ( (!location->is_cd_marker() || !ruler_shown[ruler_time_cd_marker]
+       else if ( (!location->is_cd_marker() || !ruler_cd_marker_action->get_active()
                  && (lam->start->get_parent() == cd_marker_group))  
        {
                //cerr << "reparenting non-cd marker so it can be relocated: " << location->name() << endl;
@@ -328,7 +328,9 @@ Editor::refresh_location_display_internal (Locations::LocationList& locations)
 
                i = tmp;
        }
-       
+
+       update_punch_range_view (false);
+       update_loop_range_view (false);
 }
 
 void
@@ -373,8 +375,8 @@ Editor::LocationMarkers::set_name (const string& str)
 }
 
 void
-Editor::LocationMarkers::set_position (nframes_t startf, 
-                                      nframes_t endf) 
+Editor::LocationMarkers::set_position (nframes64_t startf, 
+                                      nframes64_t endf) 
 {
        start->set_position (startf);
        if (end) { end->set_position (endf); }
@@ -388,13 +390,23 @@ Editor::LocationMarkers::set_color_rgba (uint32_t rgba)
 }
 
 void
-Editor::mouse_add_new_marker (nframes_t where, bool is_cd)
+Editor::mouse_add_new_marker (nframes64_t where, bool is_cd, bool is_xrun)
 {
-       string markername;
+       string markername, markerprefix;
        int flags = (is_cd ? Location::IsCDMarker|Location::IsMark : Location::IsMark);
-       
+
+       if (is_xrun) {
+               markerprefix = "xrun";
+               flags = Location::IsMark;
+       } else {
+               markerprefix = "mark";
+       }
+
        if (session) {
-               session->locations()->next_available_name(markername,"mark");
+               session->locations()->next_available_name(markername, markerprefix);
+               if (!is_xrun && !choose_new_marker_name(markername)) {
+                       return;
+               }               
                Location *location = new Location (where, where, markername, (Location::Flags) flags);
                session->begin_reversible_command (_("add marker"));
                 XMLNode &before = session->locations()->get_state();
@@ -585,6 +597,8 @@ Editor::build_marker_menu (bool start_or_end)
 
        items.push_back (SeparatorElem());
 
+       items.push_back (MenuElem (_("Create range to next marker"), mem_fun(*this, &Editor::marker_menu_range_to_next)));
+
        items.push_back (MenuElem (_("Hide"), mem_fun(*this, &Editor::marker_menu_hide)));
        if (start_or_end) return;
        items.push_back (MenuElem (_("Rename"), mem_fun(*this, &Editor::marker_menu_rename)));
@@ -621,9 +635,11 @@ Editor::build_range_marker_menu (bool loop_or_punch)
                items.push_back (MenuElem (_("Set Range from Range Selection"), mem_fun(*this, &Editor::marker_menu_set_from_selection)));
        }
 
+       items.push_back (SeparatorElem());
+       items.push_back (MenuElem (_("Export Range"), mem_fun(*this, &Editor::marker_menu_export_range)));
        items.push_back (SeparatorElem());
 
-       if (! loop_or_punch) {
+       if (!loop_or_punch) {
                items.push_back (MenuElem (_("Hide Range"), mem_fun(*this, &Editor::marker_menu_hide)));
                items.push_back (MenuElem (_("Rename Range"), mem_fun(*this, &Editor::marker_menu_rename)));
                items.push_back (MenuElem (_("Remove Range"), mem_fun(*this, &Editor::marker_menu_remove)));
@@ -798,6 +814,57 @@ Editor::marker_menu_set_playhead ()
        }
 }
 
+void
+Editor::marker_menu_export_range ()
+{
+       Marker* marker;
+
+       if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+               fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
+               /*NOTREACHED*/
+       }
+
+       Location* l;
+       bool is_start;
+
+       if ((l = find_location_from_marker (marker, is_start)) != 0) {
+               if (l->is_range_marker()) {
+                       export_range (l->start(), l->end());
+               }
+       }
+}
+
+void
+Editor::marker_menu_range_to_next ()
+{
+       Marker* marker;
+       if (!session) {
+               return;
+       }
+
+       if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+               fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
+               /*NOTREACHED*/
+       }
+
+       Location* l;
+       bool is_start;
+
+       if ((l = find_location_from_marker (marker, is_start)) == 0) {
+               return;
+       }
+               
+       nframes_t end = session->locations()->first_mark_after (marker->position());
+
+       if (end != max_frames) {
+               string range_name = l->name();
+               range_name += "-range";
+
+               Location* newrange = new Location (marker->position(), end, range_name, Location::IsRangeMarker);
+               session->locations()->add (newrange);
+       }
+}
+
 void
 Editor::marker_menu_set_from_playhead ()
 {
@@ -1106,7 +1173,7 @@ Editor::update_punch_range_view (bool visibility)
                double x2 = frame_to_pixel (tpl->end());
                
                guint track_canvas_width,track_canvas_height;
-               track_canvas.get_size(track_canvas_width,track_canvas_height);
+               track_canvas->get_size(track_canvas_width,track_canvas_height);
                
                transport_punch_range_rect->property_x1() = x1;
                transport_punch_range_rect->property_x2() = x2;
@@ -1151,6 +1218,10 @@ Editor::update_punch_range_view (bool visibility)
 void
 Editor::marker_selection_changed ()
 {
+       if (session && session->deletion_in_progress()) {
+               return;
+       }
+
        for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) {
                LocationMarkers* lam = i->second;
 
@@ -1172,7 +1243,7 @@ Editor::marker_selection_changed ()
        }
 
        for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
-               (*x)->add_line (cursor_group, full_canvas_height);
+               (*x)->add_line (cursor_group, 0, canvas_height);
                (*x)->show_line ();
        }