summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_markers.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor_markers.cc')
-rw-r--r--gtk2_ardour/editor_markers.cc148
1 files changed, 131 insertions, 17 deletions
diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc
index 75776a7844..68ce914025 100644
--- a/gtk2_ardour/editor_markers.cc
+++ b/gtk2_ardour/editor_markers.cc
@@ -26,6 +26,7 @@
#include <gtkmm2ext/window_title.h>
#include <ardour/location.h>
+#include <ardour/profile.h>
#include <pbd/memento_command.h>
#include "editor.h"
@@ -77,9 +78,15 @@ Editor::add_new_location (Location *location)
}
if (location->is_mark()) {
- lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
- lam->end = 0;
+ if (location->is_cd_marker() && ruler_shown[ruler_time_cd_marker]) {
+ lam->start = new Marker (*this, *cd_marker_group, color, location->name(), Marker::Mark, location->start());
+ }
+ else {
+ lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
+ }
+ lam->end = 0;
+
} else if (location->is_auto_loop()) {
// transport marker
lam->start = new Marker (*this, *transport_marker_group, color,
@@ -95,12 +102,20 @@ Editor::add_new_location (Location *location)
location->name(), Marker::PunchOut, location->end());
} else {
-
// range marker
- lam->start = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::Start, location->start());
- lam->end = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::End, location->end());
+ if (location->is_cd_marker() && ruler_shown[ruler_time_cd_marker]) {
+ lam->start = new Marker (*this, *cd_marker_group, color,
+ location->name(), Marker::Start, location->start());
+ lam->end = new Marker (*this, *cd_marker_group, color,
+ location->name(), Marker::End, location->end());
+ }
+ else {
+
+ lam->start = new Marker (*this, *range_marker_group, color,
+ location->name(), Marker::Start, location->start());
+ lam->end = new Marker (*this, *range_marker_group, color,
+ location->name(), Marker::End, location->end());
+ }
}
if (location->is_hidden ()) {
@@ -121,6 +136,11 @@ Editor::add_new_location (Location *location)
newpair.second = lam;
location_markers.insert (newpair);
+
+ if (select_new_marker && location->is_mark()) {
+ selection->set (lam->start);
+ select_new_marker = false;
+ }
}
void
@@ -157,6 +177,9 @@ Editor::location_flags_changed (Location *location, void *src)
return;
}
+ // move cd markers to/from cd marker bar as appropriate
+ ensure_cd_marker_updated (lam, location);
+
if (location->is_cd_marker()) {
lam->set_color_rgba (location_cd_marker_color);
} else if (location->is_mark()) {
@@ -176,6 +199,52 @@ Editor::location_flags_changed (Location *location, void *src)
}
}
+void Editor::update_cd_marker_display ()
+{
+ for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) {
+ LocationMarkers * lam = i->second;
+ Location * location = i->first;
+
+ ensure_cd_marker_updated (lam, location);
+ }
+}
+
+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))
+ {
+ //cerr << "reparenting non-cd marker so it can be relocated: " << location->name() << endl;
+ if (lam->start) {
+ lam->start->reparent (*cd_marker_group);
+ }
+ if (lam->end) {
+ lam->end->reparent (*cd_marker_group);
+ }
+ }
+ else if ( (!location->is_cd_marker() || !ruler_shown[ruler_time_cd_marker])
+ && (lam->start->get_parent() == cd_marker_group))
+ {
+ //cerr << "reparenting non-cd marker so it can be relocated: " << location->name() << endl;
+ if (location->is_mark()) {
+ if (lam->start) {
+ lam->start->reparent (*marker_group);
+ }
+ if (lam->end) {
+ lam->end->reparent (*marker_group);
+ }
+ }
+ else {
+ if (lam->start) {
+ lam->start->reparent (*range_marker_group);
+ }
+ if (lam->end) {
+ lam->end->reparent (*range_marker_group);
+ }
+ }
+ }
+}
+
Editor::LocationMarkers::~LocationMarkers ()
{
if (start) {
@@ -319,12 +388,14 @@ Editor::LocationMarkers::set_color_rgba (uint32_t rgba)
}
void
-Editor::mouse_add_new_marker (nframes_t where)
+Editor::mouse_add_new_marker (nframes_t where, bool is_cd)
{
string markername;
+ int flags = (is_cd ? Location::IsCDMarker|Location::IsMark : Location::IsMark);
+
if (session) {
session->locations()->next_available_name(markername,"mark");
- Location *location = new Location (where, where, markername, Location::IsMark);
+ Location *location = new Location (where, where, markername, (Location::Flags) flags);
session->begin_reversible_command (_("add marker"));
XMLNode &before = session->locations()->get_state();
session->locations()->add (location, true);
@@ -353,6 +424,10 @@ Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent* event)
/*NOTREACHED*/
}
+ if (entered_marker == marker) {
+ entered_marker = NULL;
+ }
+
Location* loc = find_location_from_marker (marker, is_start);
if (session && loc) {
@@ -535,19 +610,21 @@ Editor::build_range_marker_menu (bool loop_or_punch)
MenuList& items = markerMenu->items();
markerMenu->set_name ("ArdourContextMenu");
+ items.push_back (MenuElem (_("Play Range"), mem_fun(*this, &Editor::marker_menu_play_range)));
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)));
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)));
+ if (!Profile->get_sae()) {
+ 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)));
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)));
}
@@ -556,8 +633,9 @@ Editor::build_range_marker_menu (bool loop_or_punch)
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)));
- items.push_back (MenuElem (_("Select Range"), mem_fun(*this, &Editor::marker_menu_select_using_range)));
-
+ if (!Profile->get_sae()) {
+ items.push_back (MenuElem (_("Select Range"), mem_fun(*this, &Editor::marker_menu_select_using_range)));
+ }
}
void
@@ -736,13 +814,13 @@ Editor::marker_menu_set_from_playhead ()
if ((l = find_location_from_marker (marker, is_start)) != 0) {
if (l->is_mark()) {
- l->set_start (session->transport_frame ());
+ l->set_start (session->audible_frame ());
}
else {
if (is_start) {
- l->set_start (session->transport_frame ());
+ l->set_start (session->audible_frame ());
} else {
- l->set_end (session->transport_frame ());
+ l->set_end (session->audible_frame ());
}
}
}
@@ -1027,9 +1105,15 @@ Editor::update_punch_range_view (bool visibility)
double x1 = frame_to_pixel (tpl->start());
double x2 = frame_to_pixel (tpl->end());
+ 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);
+
if (visibility) {
transport_punch_range_rect->show();
}
@@ -1108,3 +1192,33 @@ Editor::selected_marker_moved (Location* loc)
{
edit_point_clock.set (loc->start());
}
+
+struct SortLocationsByPosition {
+ bool operator() (Location* a, Location* b) {
+ return a->start() < b->start();
+ }
+};
+
+void
+Editor::goto_nth_marker (int n)
+{
+ if (!session) {
+ return;
+ }
+ const Locations::LocationList& l (session->locations()->list());
+ Locations::LocationList ordered;
+ ordered = l;
+
+ SortLocationsByPosition cmp;
+ ordered.sort (cmp);
+
+ for (Locations::LocationList::iterator i = ordered.begin(); n >= 0 && i != ordered.end(); ++i) {
+ if ((*i)->is_mark() && !(*i)->is_hidden() && !(*i)->is_start()) {
+ if (n == 0) {
+ session->request_locate ((*i)->start(), session->transport_rolling());
+ break;
+ }
+ --n;
+ }
+ }
+}