{
ENSURE_GUI_THREAD (*this, &Editor::add_new_location, location);
- ArdourCanvas::Group* group = add_new_location_internal (location);
+ ArdourCanvas::Container* group = add_new_location_internal (location);
/* Do a full update of the markers in this group */
update_marker_labels (group);
+
+ if (location->is_auto_punch()) {
+ update_punch_range_view ();
+ }
+
+ if (location->is_auto_loop()) {
+ update_loop_range_view ();
+ }
}
/** Add a new location, without a time-consuming update of all marker labels;
* the caller must call update_marker_labels () after calling this.
* @return canvas group that the location's marker was added to.
*/
-ArdourCanvas::Group*
+ArdourCanvas::Container*
Editor::add_new_location_internal (Location* location)
{
LocationMarkers *lam = new LocationMarkers;
uint32_t color;
/* make a note here of which group this marker ends up in */
- ArdourCanvas::Group* group = 0;
+ ArdourCanvas::Container* group = 0;
if (location->is_cd_marker()) {
color = location_cd_marker_color;
if (location->is_mark()) {
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());
+ lam->start = new ArdourMarker (*this, *cd_marker_group, color, location->name(), ArdourMarker::Mark, location->start());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
+ lam->start = new ArdourMarker (*this, *marker_group, color, location->name(), ArdourMarker::Mark, location->start());
group = marker_group;
}
} else if (location->is_auto_loop()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::LoopStart, location->start());
- lam->end = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::LoopEnd, location->end());
+ lam->start = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::LoopStart, location->start());
+ lam->end = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::LoopEnd, location->end());
group = transport_marker_group;
} else if (location->is_auto_punch()) {
// transport marker
- lam->start = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::PunchIn, location->start());
- lam->end = new Marker (*this, *transport_marker_group, color,
- location->name(), Marker::PunchOut, location->end());
+ lam->start = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::PunchIn, location->start());
+ lam->end = new ArdourMarker (*this, *transport_marker_group, color,
+ location->name(), ArdourMarker::PunchOut, location->end());
group = transport_marker_group;
} else if (location->is_session_range()) {
// session range
- 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());
+ lam->start = new ArdourMarker (*this, *marker_group, color, _("start"), ArdourMarker::SessionStart, location->start());
+ lam->end = new ArdourMarker (*this, *marker_group, color, _("end"), ArdourMarker::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, color,
- location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *cd_marker_group, color,
- location->name(), Marker::RangeEnd, location->end());
+ lam->start = new ArdourMarker (*this, *cd_marker_group, color,
+ location->name(), ArdourMarker::RangeStart, location->start());
+ lam->end = new ArdourMarker (*this, *cd_marker_group, color,
+ location->name(), ArdourMarker::RangeEnd, location->end());
group = cd_marker_group;
} else {
- lam->start = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::RangeStart, location->start());
- lam->end = new Marker (*this, *range_marker_group, color,
- location->name(), Marker::RangeEnd, location->end());
+ lam->start = new ArdourMarker (*this, *range_marker_group, color,
+ location->name(), ArdourMarker::RangeStart, location->start());
+ lam->end = new ArdourMarker (*this, *range_marker_group, color,
+ location->name(), ArdourMarker::RangeEnd, location->end());
group = range_marker_group;
}
}
lam->show ();
}
- location->start_changed.connect (*this, invalidator (*this), boost::bind (&Editor::location_changed, this, _1), gui_context());
- location->end_changed.connect (*this, invalidator (*this), boost::bind (&Editor::location_changed, this, _1), gui_context());
- location->changed.connect (*this, invalidator (*this), boost::bind (&Editor::location_changed, this, _1), gui_context());
location->name_changed.connect (*this, invalidator (*this), boost::bind (&Editor::location_changed, this, _1), gui_context());
- location->FlagsChanged.connect (*this, invalidator (*this), boost::bind (&Editor::location_flags_changed, this, _1, _2), gui_context());
+ location->FlagsChanged.connect (*this, invalidator (*this), boost::bind (&Editor::location_flags_changed, this, location), gui_context());
pair<Location*,LocationMarkers*> newpair;
* lengthened)
*/
void
-Editor::check_marker_label (Marker* m)
+Editor::check_marker_label (ArdourMarker* m)
{
/* Get a time-ordered list of markers from the last time anything changed */
- std::list<Marker*>& sorted = _sorted_marker_lists[m->get_parent()];
+ std::list<ArdourMarker*>& sorted = _sorted_marker_lists[m->get_parent()];
- list<Marker*>::iterator i = find (sorted.begin(), sorted.end(), m);
+ list<ArdourMarker*>::iterator i = find (sorted.begin(), sorted.end(), m);
- list<Marker*>::iterator prev = sorted.end ();
- list<Marker*>::iterator next = i;
+ list<ArdourMarker*>::iterator prev = sorted.end ();
+ list<ArdourMarker*>::iterator next = i;
++next;
/* Look to see if the previous marker is still behind `m' in time */
}
struct MarkerComparator {
- bool operator() (Marker const * a, Marker const * b) {
+ bool operator() (ArdourMarker const * a, ArdourMarker const * b) {
return a->position() < b->position();
}
};
void
Editor::update_marker_labels ()
{
- for (std::map<ArdourCanvas::Group *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ for (std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
update_marker_labels (i->first);
}
}
/** Look at all markers in a group and update label widths */
void
-Editor::update_marker_labels (ArdourCanvas::Group* group)
+Editor::update_marker_labels (ArdourCanvas::Container* group)
{
- list<Marker*>& sorted = _sorted_marker_lists[group];
+ list<ArdourMarker*>& sorted = _sorted_marker_lists[group];
if (sorted.empty()) {
return;
sorted.sort (MarkerComparator ());
- list<Marker*>::iterator i = sorted.begin ();
+ list<ArdourMarker*>::iterator i = sorted.begin ();
- list<Marker*>::iterator prev = sorted.end ();
- list<Marker*>::iterator next = i;
- ++next;
+ list<ArdourMarker*>::iterator prev = sorted.end ();
+ list<ArdourMarker*>::iterator next = i;
+
+ if (next != sorted.end()) {
+ ++next;
+ }
while (i != sorted.end()) {
} else {
(*i)->set_right_label_limit (p);
}
+
+ ++next;
}
prev = i;
++i;
- ++next;
}
}
void
-Editor::location_flags_changed (Location *location, void*)
+Editor::location_flags_changed (Location *location)
{
ENSURE_GUI_THREAD (*this, &Editor::location_flags_changed, location, src)
}
Location *
-Editor::find_location_from_marker (Marker *marker, bool& is_start) const
+Editor::find_location_from_marker (ArdourMarker *marker, bool& is_start) const
{
LocationMarkerMap::const_iterator i;
}
void
-Editor::refresh_location_display_internal (Locations::LocationList& locations)
+Editor::refresh_location_display_internal (const Locations::LocationList& locations)
{
/* invalidate all */
/* add new ones */
- for (Locations::LocationList::iterator i = locations.begin(); i != locations.end(); ++i) {
+ for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
LocationMarkerMap::iterator x;
i = tmp;
}
- update_punch_range_view (false);
- update_loop_range_view (false);
+ update_punch_range_view ();
+ update_loop_range_view ();
}
void
{
/* XXX: hack: don't change names of session start/end markers */
- if (start->type() != Marker::SessionStart) {
+ if (start->type() != ArdourMarker::SessionStart) {
start->set_name (str);
}
- if (end && end->type() != Marker::SessionEnd) {
+ if (end && end->type() != ArdourMarker::SessionEnd) {
end->set_name (str);
}
}
}
void
-Editor::mouse_add_new_marker (framepos_t where, bool is_cd, bool is_xrun)
+Editor::mouse_add_new_marker (framepos_t where, bool is_cd)
{
- string markername, markerprefix;
+ string markername;
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, markerprefix);
- if (!is_xrun && !choose_new_marker_name(markername)) {
+ _session->locations()->next_available_name(markername, _("mark"));
+ if (!choose_new_marker_name(markername)) {
return;
}
Location *location = new Location (*_session, where, where, markername, (Location::Flags) flags);
- _session->begin_reversible_command (_("add marker"));
+ begin_reversible_command (_("add marker"));
+
XMLNode &before = _session->locations()->get_state();
_session->locations()->add (location, true);
XMLNode &after = _session->locations()->get_state();
_session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));
- _session->commit_reversible_command ();
/* find the marker we just added */
/* make it the selected marker */
selection->set (lam->start);
}
+
+ commit_reversible_command ();
}
}
+void
+Editor::mouse_add_new_loop (framepos_t where)
+{
+ if (!_session) {
+ return;
+ }
+
+ /* Make this marker 1/8th of the visible area of the session so that
+ it's reasonably easy to manipulate after creation.
+ */
+
+ framepos_t const end = where + current_page_samples() / 8;
+
+ set_loop_range (where, end, _("set loop range"));
+}
+
+void
+Editor::mouse_add_new_punch (framepos_t where)
+{
+ if (!_session) {
+ return;
+ }
+
+ /* Make this marker 1/8th of the visible area of the session so that
+ it's reasonably easy to manipulate after creation.
+ */
+
+ framepos_t const end = where + current_page_samples() / 8;
+
+ set_punch_range (where, end, _("set punch range"));
+}
+
void
Editor::mouse_add_new_range (framepos_t where)
{
void
Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent*)
{
- Marker* marker;
+ ArdourMarker* marker;
bool is_start;
- if ((marker = static_cast<Marker*> (item.get_data ("marker"))) == 0) {
+ if ((marker = static_cast<ArdourMarker*> (item.get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
if (entered_marker == marker) {
gint
Editor::really_remove_marker (Location* loc)
{
- _session->begin_reversible_command (_("remove marker"));
+ begin_reversible_command (_("remove marker"));
XMLNode &before = _session->locations()->get_state();
_session->locations()->remove (loc);
XMLNode &after = _session->locations()->get_state();
_session->add_command (new MementoCommand<Locations>(*(_session->locations()), &before, &after));
- _session->commit_reversible_command ();
+ commit_reversible_command ();
return FALSE;
}
LocationMarkerMap::iterator i;
if (location == transport_loop_location()) {
- update_loop_range_view (true);
+ update_loop_range_view ();
}
if (location == transport_punch_location()) {
- update_punch_range_view (true);
+ update_punch_range_view ();
}
for (i = location_markers.begin(); i != location_markers.end(); ++i) {
LocationMarkers* m = i->second;
location_markers.erase (i);
delete m;
+
+ /* Markers that visually overlap with this (removed) marker
+ * need to be re-displayed.
+ * But finding such cases is similarly expensive as simply
+ * re-displaying all.. so:
+ */
+ refresh_location_display ();
break;
}
}
if (mm) {
can_remove = mm->meter().movable ();
+ delete meter_marker_menu;
+ build_meter_marker_menu (mm, can_remove);
+ meter_marker_menu->popup (1, ev->time);
} else if (tm) {
- can_remove = tm->tempo().movable ();
+ if (!tm->tempo().active()) {
+ return;
+ }
+ can_remove = tm->tempo().movable() && !tm->tempo().locked_to_meter();
+ delete tempo_marker_menu;
+ build_tempo_marker_menu (tm, can_remove);
+ tempo_marker_menu->popup (1, ev->time);
} else {
return;
}
-
- delete tempo_or_meter_marker_menu;
- build_tempo_or_meter_marker_menu (can_remove);
- tempo_or_meter_marker_menu->popup (1, ev->time);
}
void
Editor::marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
- Marker * marker;
- if ((marker = reinterpret_cast<Marker *> (item->get_data("marker"))) == 0) {
+ ArdourMarker * marker;
+ if ((marker = reinterpret_cast<ArdourMarker *> (item->get_data("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
bool is_start;
items.push_back (MenuElem (_("Loop Range"), sigc::mem_fun(*this, &Editor::marker_menu_loop_range)));
items.push_back (MenuElem (_("Set Marker from Playhead"), sigc::mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
- }
+ items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
items.push_back (MenuElem (_("Zoom to Range"), sigc::mem_fun (*this, &Editor::marker_menu_zoom_to_range)));
if (!loop_or_punch_or_session || !session) {
items.push_back (SeparatorElem());
}
-
+
items.push_back (MenuElem (_("Separate Regions in Range"), sigc::mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
items.push_back (MenuElem (_("Select All in Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
- if (!Profile->get_sae()) {
- items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+ items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+}
+
+void
+Editor::build_tempo_marker_menu (TempoMarker* loc, bool can_remove)
+{
+ using namespace Menu_Helpers;
+
+ tempo_marker_menu = new Menu;
+ MenuList& items = tempo_marker_menu->items();
+ tempo_marker_menu->set_name ("ArdourContextMenu");
+
+ if (loc->tempo().type() == TempoSection::Constant) {
+ items.push_back (MenuElem (_("Make Ramped"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+ } else {
+ items.push_back (MenuElem (_("Make Constant"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+ }
+
+ if (loc->tempo().position_lock_style() == AudioTime && can_remove) {
+ items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ } else if (can_remove) {
+ items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
}
+
+ items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
+ items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
+ items.back().set_sensitive (can_remove);
}
void
-Editor::build_tempo_or_meter_marker_menu (bool can_remove)
+Editor::build_meter_marker_menu (MeterMarker* loc, bool can_remove)
{
using namespace Menu_Helpers;
- tempo_or_meter_marker_menu = new Menu;
- MenuList& items = tempo_or_meter_marker_menu->items();
- tempo_or_meter_marker_menu->set_name ("ArdourContextMenu");
+ meter_marker_menu = new Menu;
+ MenuList& items = meter_marker_menu->items();
+ meter_marker_menu->set_name ("ArdourContextMenu");
+
+ if (loc->meter().position_lock_style() == AudioTime && can_remove) {
+ items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ } else if (can_remove) {
+ items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+ }
items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
void
Editor::marker_menu_hide ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_select_using_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_select_all_selectables_using_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_separate_regions_using_location ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_play_from ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_set_playhead ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_range_to_next ()
{
- Marker* marker;
+ ArdourMarker* marker;
if (!_session) {
return;
}
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_set_from_playhead ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_set_from_selection (bool /*force_regions*/)
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
// nothing for now
} else {
-
+
if (!selection->time.empty()) {
l->set (selection->time.start(), selection->time.end_frame());
} else if (!selection->regions.empty()) {
void
Editor::marker_menu_play_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
void
Editor::marker_menu_loop_range ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* l;
l2->set (l->start(), l->end());
// enable looping, reposition and start rolling
- _session->request_play_loop(true);
_session->request_locate (l2->start(), true);
+ _session->request_play_loop(true);
}
}
}
void
Editor::marker_menu_zoom_to_range ()
{
- Marker* marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"));
+ ArdourMarker* marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"));
assert (marker);
bool is_start;
if (a >= extra) {
a -= extra;
}
-
+
framepos_t b = l->end ();
if (b < (max_framepos - extra)) {
b += extra;
void
Editor::dynamic_cast_marker_object (void* p, MeterMarker** m, TempoMarker** t) const
{
- Marker* marker = reinterpret_cast<Marker*> (p);
+ ArdourMarker* marker = reinterpret_cast<ArdourMarker*> (p);
if (!marker) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
*m = dynamic_cast<MeterMarker*> (marker);
}
}
+void
+Editor::toggle_marker_lock_style ()
+{
+ MeterMarker* mm;
+ TempoMarker* tm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+ if (mm) {
+ begin_reversible_command (_("change meter lock style"));
+ XMLNode &before = _session->tempo_map().get_state();
+ MeterSection* msp = &mm->meter();
+
+ const Meter meter (msp->divisions_per_bar(), msp->note_divisor());
+ const Timecode::BBT_Time bbt (msp->bbt());
+ const framepos_t frame = msp->frame();
+ const PositionLockStyle pls = (msp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+ _session->tempo_map().replace_meter (*msp, meter, bbt, frame, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ } else if (tm) {
+ TempoSection* tsp = &tm->tempo();
+
+ const Tempo tempo (tsp->beats_per_minute());
+ const double pulse = tsp->pulse();
+ const framepos_t frame = tsp->frame();
+ const TempoSection::Type type = tsp->type();
+ const PositionLockStyle pls = (tsp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+ begin_reversible_command (_("change tempo lock style"));
+ XMLNode &before = _session->tempo_map().get_state();
+
+ _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ }
+}
+
+void
+Editor::toggle_tempo_type ()
+{
+ TempoMarker* tm;
+ MeterMarker* mm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+ if (tm) {
+ TempoSection* tsp = &tm->tempo();
+
+ const Tempo tempo (tsp->beats_per_minute(), tsp->note_type());
+ const double pulse = tsp->pulse();
+ const framepos_t frame = tsp->frame();
+ const TempoSection::Type type = (tsp->type() == TempoSection::Ramp) ? TempoSection::Constant : TempoSection::Ramp;
+ const PositionLockStyle pls = tsp->position_lock_style();
+
+ begin_reversible_command (_("change tempo type"));
+ XMLNode &before = _session->tempo_map().get_state();
+
+ _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+ XMLNode &after = _session->tempo_map().get_state();
+ _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+ commit_reversible_command ();
+ }
+}
+
void
Editor::toggle_marker_menu_lock ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* loc;
void
Editor::marker_menu_rename ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
}
void
-Editor::rename_marker(Marker *marker)
+Editor::rename_marker(ArdourMarker *marker)
{
Location* loc;
bool is_start;
}
void
-Editor::update_loop_range_view (bool visibility)
+Editor::update_loop_range_view ()
{
if (_session == 0) {
return;
transport_loop_range_rect->set_x0 (x1);
transport_loop_range_rect->set_x1 (x2);
- if (visibility) {
- transport_loop_range_rect->show();
- }
+ transport_loop_range_rect->show();
- } else if (visibility) {
+ } else {
transport_loop_range_rect->hide();
}
}
void
-Editor::update_punch_range_view (bool visibility)
+Editor::update_punch_range_view ()
{
if (_session == 0) {
return;
Location* tpl;
if ((_session->config.get_punch_in() || _session->config.get_punch_out()) && ((tpl = transport_punch_location()) != 0)) {
- ArdourCanvas::Rect const v = _track_canvas->visible_area ();
+
+ double pixel_start;
+ double pixel_end;
+
if (_session->config.get_punch_in()) {
- transport_punch_range_rect->set_x0 (sample_to_pixel (tpl->start()));
- transport_punch_range_rect->set_x1 (_session->config.get_punch_out() ? sample_to_pixel (tpl->end()) : sample_to_pixel (JACK_MAX_FRAMES));
+ pixel_start = sample_to_pixel (tpl->start());
} else {
- transport_punch_range_rect->set_x0 (0);
- transport_punch_range_rect->set_x1 (_session->config.get_punch_out() ? sample_to_pixel (tpl->end()) : v.width ());
+ pixel_start = 0;
}
-
- if (visibility) {
- transport_punch_range_rect->show();
+ if (_session->config.get_punch_out()) {
+ pixel_end = sample_to_pixel (tpl->end());
+ } else {
+ pixel_end = sample_to_pixel (max_framepos);
}
- } else if (visibility) {
+
+ transport_punch_range_rect->set_x0 (pixel_start);
+ transport_punch_range_rect->set_x1 (pixel_end);
+ transport_punch_range_rect->show();
+
+ } else {
+
transport_punch_range_rect->hide();
}
}
void
Editor::toggle_marker_menu_glue ()
{
- Marker* marker;
+ ArdourMarker* marker;
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ if ((marker = reinterpret_cast<ArdourMarker *> (marker_menu_item->get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
Location* loc;
}
void
-Editor::remove_sorted_marker (Marker* m)
+Editor::remove_sorted_marker (ArdourMarker* m)
{
- for (std::map<ArdourCanvas::Group *, std::list<Marker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
+ for (std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> >::iterator i = _sorted_marker_lists.begin(); i != _sorted_marker_lists.end(); ++i) {
i->second.remove (m);
}
}
-Marker *
+ArdourMarker *
Editor::find_marker_from_location_id (PBD::ID const & id, bool is_start) const
{
for (LocationMarkerMap::const_iterator i = location_markers.begin(); i != location_markers.end(); ++i) {