Preserve stacked / overlaid state of tracks in the session file.
[ardour.git] / gtk2_ardour / editor_markers.cc
index 13e8f49d61be9fd0462e4969ed51c069f6f42c36..83a3beabc5b4dcd021374b87965dd2c60ee6ffd1 100644 (file)
@@ -25,9 +25,9 @@
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/window_title.h>
 
-#include <ardour/location.h>
-#include <ardour/profile.h>
-#include <pbd/memento_command.h>
+#include "ardour/location.h"
+#include "ardour/profile.h"
+#include "pbd/memento_command.h"
 
 #include "editor.h"
 #include "marker.h"
@@ -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;
@@ -247,13 +247,8 @@ void Editor::ensure_cd_marker_updated (LocationMarkers * lam, Location * locatio
 
 Editor::LocationMarkers::~LocationMarkers ()
 {
-       if (start) {
-               delete start;
-       }
-
-       if (end) {
-               delete end;
-       }
+       delete start;
+       delete end;
 }
 
 Editor::LocationMarkers *
@@ -328,7 +323,9 @@ Editor::refresh_location_display_internal (Locations::LocationList& locations)
 
                i = tmp;
        }
-       
+
+       update_punch_range_view (false);
+       update_loop_range_view (false);
 }
 
 void
@@ -373,8 +370,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,18 +385,28 @@ 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();
+               XMLNode &before = session->locations()->get_state();
                session->locations()->add (location, true);
-                XMLNode &after = session->locations()->get_state();
+               XMLNode &after = session->locations()->get_state();
                session->add_command (new MementoCommand<Locations>(*(session->locations()), &before, &after));
                session->commit_reversible_command ();
 
@@ -414,7 +421,7 @@ Editor::mouse_add_new_marker (nframes_t where, bool is_cd)
 }
 
 void
-Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent* event)
+Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent*)
 {
        Marker* marker;
        bool is_start;
@@ -545,7 +552,7 @@ Editor::marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
 }
 
 void
-Editor::new_transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
+Editor::new_transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item*)
 {
        if (new_transport_marker_menu == 0) {
                build_new_transport_marker_menu ();
@@ -556,7 +563,7 @@ Editor::new_transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Ite
 }
 
 void
-Editor::transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
+Editor::transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item*)
 {
        if (transport_marker_menu == 0) {
                build_range_marker_menu (true);
@@ -585,6 +592,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,16 +630,17 @@ 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::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)));
+               items.push_back (SeparatorElem());
        }
 
-       items.push_back (SeparatorElem());
-
        items.push_back (MenuElem (_("Separate Regions in Range"), mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
        items.push_back (MenuElem (_("Select All in Range"), mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
        if (!Profile->get_sae()) {
@@ -663,7 +673,7 @@ Editor::build_new_transport_marker_menu ()
        items.push_back (MenuElem (_("Set Loop Range"), mem_fun(*this, &Editor::new_transport_marker_menu_set_loop)));
        items.push_back (MenuElem (_("Set Punch Range"), mem_fun(*this, &Editor::new_transport_marker_menu_set_punch)));
 
-       new_transport_marker_menu->signal_unmap_event().connect ( mem_fun(*this, &Editor::new_transport_marker_menu_popdown)); 
+       new_transport_marker_menu->signal_unmap().connect ( mem_fun(*this, &Editor::new_transport_marker_menu_popdown)); 
 }
 
 void
@@ -798,6 +808,37 @@ Editor::marker_menu_set_playhead ()
        }
 }
 
+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 ()
 {
@@ -1000,7 +1041,7 @@ Editor::marker_menu_rename ()
        loc = find_location_from_marker (marker, is_start);
 
        if (!loc) return;
-       
+
        ArdourPrompter dialog (true);
        string txt;
 
@@ -1033,24 +1074,23 @@ Editor::marker_menu_rename ()
        }
 
        begin_reversible_command ( _("rename marker") );
-        XMLNode &before = session->locations()->get_state();
+       XMLNode &before = session->locations()->get_state();
 
        dialog.get_result(txt);
        loc->set_name (txt);
-       
-        XMLNode &after = session->locations()->get_state();
+
+       XMLNode &after = session->locations()->get_state();
        session->add_command (new MementoCommand<Locations>(*(session->locations()), &before, &after));
        commit_reversible_command ();
 }
 
-gint
-Editor::new_transport_marker_menu_popdown (GdkEventAny *ev)
+void
+Editor::new_transport_marker_menu_popdown ()
 {
        // hide rects
        transport_bar_drag_rect->hide();
-       range_marker_drag_rect->hide();
 
-       return FALSE;
+       break_drag ();
 }
 
 void
@@ -1100,57 +1140,32 @@ Editor::update_punch_range_view (bool visibility)
 
        Location* tpl;
 
-       if ((Config->get_punch_in() || Config->get_punch_out()) && ((tpl = transport_punch_location()) != 0)) {
-
-               double x1 = frame_to_pixel (tpl->start());
-               double x2 = frame_to_pixel (tpl->end());
-               
+       if ((session->config.get_punch_in() || session->config.get_punch_out()) && ((tpl = transport_punch_location()) != 0)) {
                guint 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;
-               
-               transport_punch_range_rect->property_x1() = (Config->get_punch_in() ? x1 : 0);
-               transport_punch_range_rect->property_x2() = (Config->get_punch_out() ? x2 : track_canvas_width);
+               track_canvas->get_size(track_canvas_width,track_canvas_height);
+               if (session->config.get_punch_in()) {
+                       transport_punch_range_rect->property_x1() = frame_to_pixel (tpl->start());
+                       transport_punch_range_rect->property_x2() = (session->config.get_punch_out() ? frame_to_pixel (tpl->end()) : frame_to_pixel (JACK_MAX_FRAMES));
+               } else {
+                       transport_punch_range_rect->property_x1() = 0;
+                       transport_punch_range_rect->property_x2() = (session->config.get_punch_out() ? frame_to_pixel (tpl->end()) : track_canvas_width);
+               }
                
                if (visibility) {
                        transport_punch_range_rect->show();
                }
-       }
-       else if (visibility) {
+       } else if (visibility) {
                transport_punch_range_rect->hide();
        }
-
-//     if (session->get_punch_in()) {
-//             double x = frame_to_pixel (transport_punch_location->start());
-//             gnome_canvas_item_set (transport_punchin_line, "x1", x, "x2", x, NULL);
-               
-//             if (visibility) {
-//                     gnome_canvas_item_show (transport_punchin_line);
-//             }
-//     }
-//     else if (visibility) {
-//             gnome_canvas_item_hide (transport_punchin_line);
-//     }
-       
-//     if (session->get_punch_out()) {
-//             double x = frame_to_pixel (transport_punch_location->end());
-               
-//             gnome_canvas_item_set (transport_punchout_line, "x1", x, "x2", x, NULL);
-               
-//             if (visibility) {
-//                     gnome_canvas_item_show (transport_punchout_line);
-//             }
-//     }
-//     else if (visibility) {
-//             gnome_canvas_item_hide (transport_punchout_line);
-//     }
 }
 
 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 +1187,7 @@ Editor::marker_selection_changed ()
        }
 
        for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
-               (*x)->add_line (cursor_group, vertical_adjustment.get_value(), canvas_height);
+               (*x)->add_line (cursor_group, 0, _canvas_height);
                (*x)->show_line ();
        }