Index: gtk2_ardour/editor_ops.cc =================================================================== --- gtk2_ardour/editor_ops.cc (revision 1279) +++ gtk2_ardour/editor_ops.cc (working copy) @@ -1197,6 +1197,8 @@ void Editor::add_location_from_selection () { + string rangename; + if (selection->time.empty()) { return; } @@ -1208,7 +1210,8 @@ nframes_t start = selection->time[clicked_selection].start; nframes_t end = selection->time[clicked_selection].end; - Location *location = new Location (start, end, "selection", Location::IsRangeMarker); + session->locations()->next_available_name(rangename,"selection"); + Location *location = new Location (start, end, rangename, Location::IsRangeMarker); session->begin_reversible_command (_("add marker")); XMLNode &before = session->locations()->get_state(); @@ -1221,9 +1224,12 @@ void Editor::add_location_from_playhead_cursor () { + string markername; + nframes_t where = session->audible_frame(); - Location *location = new Location (where, where, "mark", Location::IsMark); + session->locations()->next_available_name(markername,"mark"); + Location *location = new Location (where, where, markername, Location::IsMark); session->begin_reversible_command (_("add marker")); XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); @@ -1649,6 +1655,7 @@ nframes_t pos; float prefix; bool was_floating; + string markername; if (get_prefix (prefix, was_floating)) { pos = session->audible_frame (); @@ -1660,7 +1667,8 @@ } } - session->locations()->add (new Location (pos, 0, "mark", Location::IsMark), true); + session->locations()->next_available_name(markername,"mark"); + session->locations()->add (new Location (pos, 0, markername, Location::IsMark), true); } void @@ -1709,6 +1717,28 @@ session->locations()->clear (); } +void +Editor::unhide_markers () +{ + for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) { + Location *l = (*i).first; + if (l->is_hidden() && l->is_mark()) { + l->set_hidden(false, this); + } + } +} + +void +Editor::unhide_ranges () +{ + for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) { + Location *l = (*i).first; + if (l->is_hidden() && l->is_range_marker()) { + l->set_hidden(false, this); + } + } +} + /* INSERT/REPLACE */ void Index: gtk2_ardour/location_ui.cc =================================================================== --- gtk2_ardour/location_ui.cc (revision 1279) +++ gtk2_ardour/location_ui.cc (working copy) @@ -215,7 +215,7 @@ } hide_check_button.set_active (location->is_hidden()); - if (location->is_auto_loop() || location->is_auto_punch()) { + if (location->is_auto_loop() || location-> is_auto_punch()) { // use label instead of entry name_label.set_text (location->name()); @@ -770,9 +770,12 @@ void LocationUI::add_new_location() { + string markername; + if (session) { nframes_t where = session->audible_frame(); - Location *location = new Location (where, where, "mark", Location::IsMark); + session->locations()->next_available_name(markername,"mark"); + Location *location = new Location (where, where, markername, Location::IsMark); session->begin_reversible_command (_("add marker")); XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); @@ -786,10 +789,12 @@ void LocationUI::add_new_range() { + string rangename; + if (session) { nframes_t where = session->audible_frame(); - Location *location = new Location (where, where, "unnamed", - Location::IsRangeMarker); + session->locations()->next_available_name(rangename,"unnamed"); + Location *location = new Location (where, where, rangename, Location::IsRangeMarker); session->begin_reversible_command (_("add range marker")); XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); Index: gtk2_ardour/editor_mouse.cc =================================================================== --- gtk2_ardour/editor_mouse.cc (revision 1279) +++ gtk2_ardour/editor_mouse.cc (working copy) @@ -4472,6 +4472,7 @@ Editor::end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event) { Location * newloc = 0; + string rangename; if (!drag_info.first_move) { drag_range_markerbar_op (item, event); @@ -4481,7 +4482,8 @@ { begin_reversible_command (_("new range marker")); XMLNode &before = session->locations()->get_state(); - newloc = new Location(temp_location->start(), temp_location->end(), "unnamed", Location::IsRangeMarker); + session->locations()->next_available_name(rangename,"unnamed"); + newloc = new Location(temp_location->start(), temp_location->end(), rangename, Location::IsRangeMarker); session->locations()->add (newloc, true); XMLNode &after = session->locations()->get_state(); session->add_command(new MementoCommand(*(session->locations()), &before, &after)); Index: gtk2_ardour/editor_markers.cc =================================================================== --- gtk2_ardour/editor_markers.cc (revision 1279) +++ gtk2_ardour/editor_markers.cc (working copy) @@ -288,8 +288,10 @@ void Editor::mouse_add_new_marker (nframes_t where) { + string markername; if (session) { - Location *location = new Location (where, where, "mark", Location::IsMark); + session->locations()->next_available_name(markername,"mark"); + Location *location = new Location (where, where, markername, Location::IsMark); session->begin_reversible_command (_("add marker")); XMLNode &before = session->locations()->get_state(); session->locations()->add (location, true); @@ -313,17 +315,7 @@ Location* loc = find_location_from_marker (marker, is_start); if (session && loc) { - if (loc->is_end()) { - /* you can't hide or delete this marker */ - return; - } - if (loc->is_auto_loop() || loc->is_auto_punch()) { - // just hide them - loc->set_hidden (true, this); - } - else { - Glib::signal_idle().connect (bind (mem_fun(*this, &Editor::really_remove_marker), loc)); - } + Glib::signal_idle().connect (bind (mem_fun(*this, &Editor::really_remove_marker), loc)); } } @@ -388,16 +380,24 @@ Location * loc = find_location_from_marker (marker, is_start); if (loc == transport_loop_location() || loc == transport_punch_location()) { if (transport_marker_menu == 0) { - build_transport_marker_menu (); + build_range_marker_menu (true); } marker_menu_item = item; transport_marker_menu->popup (1, ev->time); } else { if (loc->is_mark()) { - if (marker_menu == 0) { - build_marker_menu (); - } + bool start_or_end = loc->is_start() || loc->is_end(); + Menu *markerMenu; + if (start_or_end) { + if (start_end_marker_menu == 0) + build_marker_menu (true); + markerMenu = start_end_marker_menu; + } else { + if (marker_menu == 0) + build_marker_menu (false); + markerMenu = marker_menu; + } // GTK2FIX use action group sensitivity @@ -415,12 +415,12 @@ } #endif marker_menu_item = item; - marker_menu->popup (1, ev->time); + markerMenu->popup (1, ev->time); } if (loc->is_range_marker()) { if (range_marker_menu == 0){ - build_range_marker_menu (); + build_range_marker_menu (false); } marker_menu_item = item; range_marker_menu->popup (1, ev->time); @@ -443,20 +443,25 @@ Editor::transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item) { if (transport_marker_menu == 0) { - build_transport_marker_menu (); + build_range_marker_menu (true); } transport_marker_menu->popup (1, ev->time); } void -Editor::build_marker_menu () +Editor::build_marker_menu (bool start_or_end) { using namespace Menu_Helpers; - marker_menu = new Menu; - MenuList& items = marker_menu->items(); - marker_menu->set_name ("ArdourContextMenu"); + Menu *markerMenu = new Menu; + if (start_or_end) { + start_end_marker_menu = markerMenu; + } else { + marker_menu = markerMenu; + } + MenuList& items = markerMenu->items(); + markerMenu->set_name ("ArdourContextMenu"); items.push_back (MenuElem (_("Locate to Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead))); items.push_back (MenuElem (_("Play from Mark"), mem_fun(*this, &Editor::marker_menu_play_from))); @@ -464,33 +469,43 @@ items.push_back (SeparatorElem()); - items.push_back (MenuElem (_("Rename Mark"), mem_fun(*this, &Editor::marker_menu_rename))); items.push_back (MenuElem (_("Hide Mark"), mem_fun(*this, &Editor::marker_menu_hide))); + if (start_or_end) return; + items.push_back (MenuElem (_("Rename Mark"), mem_fun(*this, &Editor::marker_menu_rename))); items.push_back (MenuElem (_("Remove Mark"), mem_fun(*this, &Editor::marker_menu_remove))); } void -Editor::build_range_marker_menu () +Editor::build_range_marker_menu (bool loop_or_punch) { using namespace Menu_Helpers; - range_marker_menu = new Menu; - MenuList& items = range_marker_menu->items(); - range_marker_menu->set_name ("ArdourContextMenu"); + Menu *markerMenu = new Menu; + if (loop_or_punch) { + transport_marker_menu = markerMenu; + } else { + range_marker_menu = markerMenu; + } + MenuList& items = markerMenu->items(); + markerMenu->set_name ("ArdourContextMenu"); items.push_back (MenuElem (_("Locate to Range Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead))); items.push_back (MenuElem (_("Play from Range Mark"), mem_fun(*this, &Editor::marker_menu_play_from))); - items.push_back (MenuElem (_("Play Range"), mem_fun(*this, &Editor::marker_menu_play_range))); - items.push_back (MenuElem (_("Loop Range"), mem_fun(*this, &Editor::marker_menu_loop_range))); + if (! loop_or_punch) { + items.push_back (MenuElem (_("Play Range"), mem_fun(*this, &Editor::marker_menu_play_range))); + items.push_back (MenuElem (_("Loop Range"), mem_fun(*this, &Editor::marker_menu_loop_range))); + } items.push_back (MenuElem (_("Set Range Mark from Playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead))); 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 (_("Rename Range"), mem_fun(*this, &Editor::marker_menu_rename))); items.push_back (MenuElem (_("Hide Range"), mem_fun(*this, &Editor::marker_menu_hide))); - items.push_back (MenuElem (_("Remove Range"), mem_fun(*this, &Editor::marker_menu_remove))); + if (! loop_or_punch) { + 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()); @@ -528,26 +543,6 @@ } void -Editor::build_transport_marker_menu () -{ - using namespace Menu_Helpers; - - transport_marker_menu = new Menu; - MenuList& items = transport_marker_menu->items(); - transport_marker_menu->set_name ("ArdourContextMenu"); - - items.push_back (MenuElem (_("Locate to Range Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead))); - items.push_back (MenuElem (_("Play from Range Mark"), mem_fun(*this, &Editor::marker_menu_play_from))); - items.push_back (MenuElem (_("Set Range Mark from Playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead))); - 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 (_("Hide Range"), mem_fun(*this, &Editor::marker_menu_hide))); - 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))); -} - -void Editor::marker_menu_hide () { Marker* marker; Index: gtk2_ardour/editor.cc =================================================================== --- gtk2_ardour/editor.cc (revision 1279) +++ gtk2_ardour/editor.cc (working copy) @@ -283,6 +283,7 @@ route_list_menu = 0; region_list_menu = 0; marker_menu = 0; + start_end_marker_menu = 0; range_marker_menu = 0; marker_menu_item = 0; tm_marker_menu = 0; Index: gtk2_ardour/editor_rulers.cc =================================================================== --- gtk2_ardour/editor_rulers.cc (revision 1279) +++ gtk2_ardour/editor_rulers.cc (working copy) @@ -337,11 +337,13 @@ case MarkerBarItem: ruler_items.push_back (MenuElem (_("New location marker"), bind ( mem_fun(*this, &Editor::mouse_add_new_marker), where))); ruler_items.push_back (MenuElem (_("Clear all locations"), mem_fun(*this, &Editor::clear_markers))); + ruler_items.push_back (MenuElem (_("Unhide locations"), mem_fun(*this, &Editor::unhide_markers))); ruler_items.push_back (SeparatorElem ()); break; case RangeMarkerBarItem: //ruler_items.push_back (MenuElem (_("New Range"))); ruler_items.push_back (MenuElem (_("Clear all ranges"), mem_fun(*this, &Editor::clear_ranges))); + ruler_items.push_back (MenuElem (_("Unhide ranges"), mem_fun(*this, &Editor::unhide_ranges))); ruler_items.push_back (SeparatorElem ()); break; Index: gtk2_ardour/editor.h =================================================================== --- gtk2_ardour/editor.h (revision 1279) +++ gtk2_ardour/editor.h (working copy) @@ -982,6 +982,8 @@ void clear_markers (); void clear_ranges (); void clear_locations (); + void unhide_markers (); + void unhide_ranges (); void jump_forward_to_mark (); void jump_backward_to_mark (); void cursor_align (bool playhead_to_edit); @@ -1218,14 +1220,14 @@ void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); - void build_range_marker_menu (); - void build_marker_menu (); + void build_range_marker_menu (bool loop_or_punch); + void build_marker_menu (bool start_or_end); void build_tm_marker_menu (); - void build_transport_marker_menu (); void build_new_transport_marker_menu (); Gtk::Menu* tm_marker_menu; Gtk::Menu* marker_menu; + Gtk::Menu* start_end_marker_menu; Gtk::Menu* range_marker_menu; Gtk::Menu* transport_marker_menu; Gtk::Menu* new_transport_marker_menu; Index: libs/ardour/ardour/location.h =================================================================== --- libs/ardour/ardour/location.h (revision 1279) +++ libs/ardour/ardour/location.h (working copy) @@ -153,6 +153,7 @@ Location* end_location() const; Location* start_location() const; + int next_available_name(string& result,string base); uint32_t num_range_markers() const; int set_current (Location *, bool want_lock = true); Index: libs/ardour/ardour/session.h =================================================================== --- libs/ardour/ardour/session.h (revision 1279) +++ libs/ardour/ardour/session.h (working copy) @@ -392,6 +392,7 @@ void set_auto_punch_location (Location *); void set_auto_loop_location (Location *); + int location_name(string& result, string base = string("")); void reset_input_monitor_state (); Index: libs/ardour/location.cc =================================================================== --- libs/ardour/location.cc (revision 1279) +++ libs/ardour/location.cc (working copy) @@ -36,6 +36,8 @@ #include "i18n.h" +#define SUFFIX_MAX 32 + using namespace std; using namespace ARDOUR; using namespace sigc; @@ -402,6 +404,40 @@ } int +Locations::next_available_name(string& result,string base) +{ + LocationList::iterator i; + Location* location; + string temp; + string::size_type l; + int suffix; + char buf[32]; + bool available[SUFFIX_MAX+1]; + + result = base; + for (int k=1; kname(); + if (l && !temp.find(base,0)) { + suffix = atoi(temp.substr(l,3)); + if (suffix) available[suffix] = false; + } + } + for (int k=1; k<=SUFFIX_MAX; k++) { + if (available[k]) { + snprintf (buf, 31, "%d", k); + result += buf; + return 1; + } + } + return 0; +} + +int Locations::set_current_unlocked (Location *loc) { if (find (locations.begin(), locations.end(), loc) == locations.end()) {