}
location_markers.clear ();
+ _sorted_marker_lists.clear ();
}
void
if (location->is_mark()) {
if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
- lam->start = new Marker (*this, *cd_marker_group, *cursor_group, color, location->name(), Marker::Mark, location->start());
+ lam->start = new Marker (*this, *cd_marker_group, color, location->name(), Marker::Mark, location->start());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *marker_group, *cursor_group, color, location->name(), Marker::Mark, location->start());
+ lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
group = marker_group;
}
} else if (location->is_auto_loop()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, *cursor_group, color,
+ lam->start = new Marker (*this, *transport_marker_group, color,
location->name(), Marker::LoopStart, location->start());
- lam->end = new Marker (*this, *transport_marker_group, *cursor_group, color,
+ lam->end = new Marker (*this, *transport_marker_group, color,
location->name(), Marker::LoopEnd, location->end());
group = transport_marker_group;
} else if (location->is_auto_punch()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, *cursor_group, color,
+ lam->start = new Marker (*this, *transport_marker_group, color,
location->name(), Marker::PunchIn, location->start());
- lam->end = new Marker (*this, *transport_marker_group, *cursor_group, color,
+ lam->end = new Marker (*this, *transport_marker_group, color,
location->name(), Marker::PunchOut, location->end());
group = transport_marker_group;
} else if (location->is_session_range()) {
// session range
- lam->start = new Marker (*this, *marker_group, *cursor_group, color, _("start"), Marker::SessionStart, location->start());
- lam->end = new Marker (*this, *marker_group, *cursor_group, color, _("end"), Marker::SessionEnd, location->end());
+ lam->start = new Marker (*this, *marker_group, color, _("start"), Marker::SessionStart, location->start());
+ lam->end = new Marker (*this, *marker_group, color, _("end"), Marker::SessionEnd, location->end());
group = marker_group;
} else {
// range marker
if (location->is_cd_marker() && ruler_cd_marker_action->get_active()) {
- lam->start = new Marker (*this, *cd_marker_group, *cursor_group, color,
+ lam->start = new Marker (*this, *cd_marker_group, color,
location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *cd_marker_group, *cursor_group, color,
+ lam->end = new Marker (*this, *cd_marker_group, color,
location->name(), Marker::RangeEnd, location->end());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *range_marker_group, *cursor_group, color,
+ lam->start = new Marker (*this, *range_marker_group, color,
location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *range_marker_group, *cursor_group, color,
+ lam->end = new Marker (*this, *range_marker_group, color,
location->name(), Marker::RangeEnd, location->end());
group = range_marker_group;
}
++tmp;
if (!i->second->valid) {
+
+ remove_sorted_marker (i->second->start);
+ if (i->second->end) {
+ remove_sorted_marker (i->second->end);
+ }
+
delete i->second;
location_markers.erase (i);
}
}
for (i = location_markers.begin(); i != location_markers.end(); ++i) {
- if ((*i).first == location) {
- delete (*i).second;
+ if (i->first == location) {
+
+ remove_sorted_marker (i->second->start);
+ if (i->second->end) {
+ remove_sorted_marker (i->second->end);
+ }
+
+
+ delete i->second;
location_markers.erase (i);
break;
}
bool is_start;
Location * loc = find_location_from_marker (marker, is_start);
- if (loc == transport_loop_location() || loc == transport_punch_location()) {
+
+ if (loc == transport_loop_location() || loc == transport_punch_location() || loc->is_session_range ()) {
+
if (transport_marker_menu == 0) {
build_range_marker_menu (true);
}
+
marker_menu_item = item;
transport_marker_menu->popup (1, ev->time);
- } else {
-
- if (loc->is_mark()) {
- Menu *markerMenu;
- if (loc->is_session_range ()) {
- delete session_range_marker_menu;
- build_marker_menu (true, loc);
- markerMenu = session_range_marker_menu;
- } else {
- delete marker_menu;
- build_marker_menu (false, loc);
- markerMenu = marker_menu;
- }
+ } else if (loc->is_mark()) {
+
+ delete marker_menu;
+ build_marker_menu (loc);
// GTK2FIX use action group sensitivity
#ifdef GTK2FIX
- if (children.size() >= 3) {
- MenuItem * loopitem = &children[2];
- if (loopitem) {
- if (loc->is_mark()) {
- loopitem->set_sensitive(false);
- }
- else {
- loopitem->set_sensitive(true);
+ if (children.size() >= 3) {
+ MenuItem * loopitem = &children[2];
+ if (loopitem) {
+ if (loc->is_mark()) {
+ loopitem->set_sensitive(false);
+ }
+ else {
+ loopitem->set_sensitive(true);
+ }
}
}
- }
#endif
- marker_menu_item = item;
- markerMenu->popup (1, ev->time);
+ marker_menu_item = item;
+ marker_menu->popup (1, ev->time);
+
+ } else if (loc->is_range_marker()) {
+ if (range_marker_menu == 0) {
+ build_range_marker_menu (false);
}
-
- if (loc->is_range_marker()) {
- if (range_marker_menu == 0){
- build_range_marker_menu (false);
- }
- marker_menu_item = item;
- range_marker_menu->popup (1, ev->time);
- }
+ marker_menu_item = item;
+ range_marker_menu->popup (1, ev->time);
}
}
}
void
-Editor::build_marker_menu (bool session_range, Location* loc)
+Editor::build_marker_menu (Location* loc)
{
using namespace Menu_Helpers;
- Menu *markerMenu = new Menu;
- if (session_range) {
- session_range_marker_menu = markerMenu;
- } else {
- marker_menu = markerMenu;
- }
- MenuList& items = markerMenu->items();
- markerMenu->set_name ("ArdourContextMenu");
+ marker_menu = new Menu;
+ MenuList& items = marker_menu->items();
+ marker_menu->set_name ("ArdourContextMenu");
items.push_back (MenuElem (_("Locate to Here"), sigc::mem_fun(*this, &Editor::marker_menu_set_playhead)));
items.push_back (MenuElem (_("Play from Here"), sigc::mem_fun(*this, &Editor::marker_menu_play_from)));
items.push_back (MenuElem (_("Create Range to Next Marker"), sigc::mem_fun(*this, &Editor::marker_menu_range_to_next)));
items.push_back (MenuElem (_("Hide"), sigc::mem_fun(*this, &Editor::marker_menu_hide)));
- if (session_range) {
- return;
- }
items.push_back (MenuElem (_("Rename"), sigc::mem_fun(*this, &Editor::marker_menu_rename)));
items.push_back (CheckMenuElem (_("Lock")));
}
void
-Editor::build_range_marker_menu (bool loop_or_punch)
+Editor::build_range_marker_menu (bool loop_or_punch_or_session)
{
using namespace Menu_Helpers;
Menu *markerMenu = new Menu;
- if (loop_or_punch) {
+ if (loop_or_punch_or_session) {
transport_marker_menu = markerMenu;
} else {
range_marker_menu = markerMenu;
items.push_back (MenuElem (_("Play Range"), sigc::mem_fun(*this, &Editor::marker_menu_play_range)));
items.push_back (MenuElem (_("Locate to Range Mark"), sigc::mem_fun(*this, &Editor::marker_menu_set_playhead)));
items.push_back (MenuElem (_("Play from Range Mark"), sigc::mem_fun(*this, &Editor::marker_menu_play_from)));
- if (! loop_or_punch) {
+ if (!loop_or_punch_or_session) {
items.push_back (MenuElem (_("Loop Range"), sigc::mem_fun(*this, &Editor::marker_menu_loop_range)));
}
items.push_back (MenuElem (_("Set Range Mark from Playhead"), sigc::mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
items.push_back (MenuElem (_("Export Range"), sigc::mem_fun(*this, &Editor::export_range)));
items.push_back (SeparatorElem());
- if (!loop_or_punch) {
+ if (!loop_or_punch_or_session) {
items.push_back (MenuElem (_("Hide Range"), sigc::mem_fun(*this, &Editor::marker_menu_hide)));
items.push_back (MenuElem (_("Rename Range"), sigc::mem_fun(*this, &Editor::marker_menu_rename)));
items.push_back (MenuElem (_("Remove Range"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
i->second->set_show_lines (_show_marker_lines);
}
}
+
+void
+Editor::remove_sorted_marker (Marker* m)
+{
+ for (std::map<ArdourCanvas::Group *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ i->second.remove (m);
+ }
+}