summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_markers.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-05-02 23:14:43 +0000
committerCarl Hetherington <carl@carlh.net>2010-05-02 23:14:43 +0000
commitc2da4ec8f988f6f8b9e426b03222a2c687c72edb (patch)
tree0223f8268e4462f0f1494c2795adb6367cee975a /gtk2_ardour/editor_markers.cc
parentceb1025c2c8ab1246a51c3967ee5a79773a4e008 (diff)
Prevent multiple tempo / meter changes being inserted at the same point
on the timeline; adding a new change at the same time as an existing one will replace the existing one. Should prevent #769 from happening. Some cleanups and tweaks to tempo / meter dialogues. Desensitize Remove menu option for those changes that can't be removed. git-svn-id: svn://localhost/ardour2/branches/3.0@7045 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_markers.cc')
-rw-r--r--gtk2_ardour/editor_markers.cc75
1 files changed, 46 insertions, 29 deletions
diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc
index 81ad022ce0..dad515671e 100644
--- a/gtk2_ardour/editor_markers.cc
+++ b/gtk2_ardour/editor_markers.cc
@@ -490,15 +490,25 @@ Editor::location_gone (Location *location)
}
void
-Editor::tm_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
+Editor::tempo_or_meter_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
- if (tm_marker_menu == 0) {
- build_tm_marker_menu ();
- }
-
marker_menu_item = item;
- tm_marker_menu->popup (1, ev->time);
+
+ MeterMarker* mm;
+ TempoMarker* tm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+ bool can_remove = false;
+
+ if (mm) {
+ can_remove = mm->meter().movable ();
+ } else if (tm) {
+ can_remove = tm->tempo().movable ();
+ }
+
+ delete tempo_or_meter_marker_menu;
+ build_tempo_or_meter_marker_menu (can_remove);
+ tempo_or_meter_marker_menu->popup (1, ev->time);
}
void
@@ -662,16 +672,18 @@ Editor::build_range_marker_menu (bool loop_or_punch)
}
void
-Editor::build_tm_marker_menu ()
+Editor::build_tempo_or_meter_marker_menu (bool can_remove)
{
using namespace Menu_Helpers;
- tm_marker_menu = new Menu;
- MenuList& items = tm_marker_menu->items();
- tm_marker_menu->set_name ("ArdourContextMenu");
+ tempo_or_meter_marker_menu = new Menu;
+ MenuList& items = tempo_or_meter_marker_menu->items();
+ tempo_or_meter_marker_menu->set_name ("ArdourContextMenu");
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
@@ -972,43 +984,48 @@ Editor::marker_menu_loop_range ()
}
void
-Editor::marker_menu_edit ()
+Editor::dynamic_cast_marker_object (void* p, MeterMarker** m, TempoMarker** t) const
{
- MeterMarker* mm;
- TempoMarker* tm;
- Marker* marker;
-
- if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ Marker* marker = reinterpret_cast<Marker*> (p);
+ if (!marker) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
- if ((mm = dynamic_cast<MeterMarker*> (marker)) != 0) {
- edit_meter_section (&mm->meter());
- } else if ((tm = dynamic_cast<TempoMarker*> (marker)) != 0) {
- edit_tempo_section (&tm->tempo());
- } else {
- fatal << X_("programming erorr: unhandled marker type in Editor::marker_menu_edit")
+ *m = dynamic_cast<MeterMarker*> (marker);
+ *t = dynamic_cast<TempoMarker*> (marker);
+
+ if (*m == 0 && *t == 0) {
+ fatal << X_("programming erorr: unhandled marker type in Editor::dynamic_cast_marker_object")
<< endmsg;
/*NOTREACHED*/
}
}
void
-Editor::marker_menu_remove ()
+Editor::marker_menu_edit ()
{
MeterMarker* mm;
TempoMarker* tm;
- Marker* marker;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
- 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*/
+ if (mm) {
+ edit_meter_section (&mm->meter());
+ } else if (tm) {
+ edit_tempo_section (&tm->tempo());
}
+}
+
+void
+Editor::marker_menu_remove ()
+{
+ MeterMarker* mm;
+ TempoMarker* tm;
+ dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
- if ((mm = dynamic_cast<MeterMarker*> (marker)) != 0) {
+ if (mm) {
remove_meter_marker (marker_menu_item);
- } else if ((tm = dynamic_cast<TempoMarker*> (marker)) != 0) {
+ } else if (tm) {
remove_tempo_marker (marker_menu_item);
} else {
remove_marker (*marker_menu_item, (GdkEvent*) 0);