diff options
Diffstat (limited to 'gtk2_ardour/editor_rulers.cc')
-rw-r--r-- | gtk2_ardour/editor_rulers.cc | 166 |
1 files changed, 128 insertions, 38 deletions
diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 4eb684c48a..f0624ccbb2 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -23,6 +23,7 @@ #include <string> #include <ardour/tempo.h> +#include <ardour/profile.h> #include <gtkmm2ext/gtk_ui.h> #include "editor.h" @@ -91,33 +92,64 @@ Editor::initialize_rulers () ruler_shown[ruler_time_marker] = true; ruler_shown[ruler_time_range_marker] = true; ruler_shown[ruler_time_transport_marker] = true; + if (Profile->get_sae()) { + ruler_shown[ruler_time_cd_marker] = false; + } else { + ruler_shown[ruler_time_cd_marker] = true; + } ruler_shown[ruler_metric_frames] = false; ruler_shown[ruler_metric_minsec] = false; - smpte_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - bbt_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - frames_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - minsec_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - - smpte_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - bbt_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - frames_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - minsec_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); - - smpte_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - bbt_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - frames_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - minsec_ruler->signal_button_press_event().connect (mem_fun(*this, &Editor::ruler_button_press)); - - smpte_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - bbt_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - frames_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - minsec_ruler->signal_motion_notify_event().connect (mem_fun(*this, &Editor::ruler_mouse_motion)); - visible_timebars = 7; /* 4 here, 3 in time_canvas */ ruler_pressed_button = 0; } +bool +Editor::ruler_scroll (GdkEventScroll* event) +{ + nframes_t xdelta; + int direction = event->direction; + bool handled = false; + + switch (direction) { + case GDK_SCROLL_UP: + temporal_zoom_step (true); + handled = true; + break; + + case GDK_SCROLL_DOWN: + temporal_zoom_step (false); + handled = true; + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_frames() / 2); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + handled = true; + break; + + case GDK_SCROLL_RIGHT: + xdelta = (current_page_frames() / 2); + if (max_frames - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_frames - current_page_frames()); + } + handled = true; + break; + + default: + /* what? */ + break; + } + + return handled; +} + gint Editor::ruler_button_press (GdkEventButton* ev) @@ -165,9 +197,7 @@ Editor::ruler_button_press (GdkEventButton* ev) case 2: /* edit point */ - if (snap_type != Editing::SnapToEditPoint) { - snap_to (where); - } + snap_to (where); break; default: @@ -206,9 +236,7 @@ Editor::ruler_button_release (GdkEventButton* ev) case 2: /* edit point */ - if (snap_type != Editing::SnapToEditPoint) { - snap_to (where); - } + snap_to (where); break; case 3: @@ -338,7 +366,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) switch (t) { 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 (_("New location marker"), bind ( mem_fun(*this, &Editor::mouse_add_new_marker), where, false))); 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 ()); @@ -353,7 +381,13 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) case TransportMarkerBarItem: break; + + case CdMarkerBarItem: + // TODO + ruler_items.push_back (MenuElem (_("New CD track marker"), bind ( mem_fun(*this, &Editor::mouse_add_new_marker), where, true))); + break; + case TempoBarItem: ruler_items.push_back (MenuElem (_("New Tempo"), bind ( mem_fun(*this, &Editor::mouse_add_new_tempo_event), where))); ruler_items.push_back (MenuElem (_("Clear tempo"))); @@ -382,7 +416,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) mitem->set_active(true); } - ruler_items.push_back (CheckMenuElem (_("Frames"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_frames))); + ruler_items.push_back (CheckMenuElem (_("Samples"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_frames))); mitem = (CheckMenuItem *) &ruler_items.back(); if (ruler_shown[ruler_metric_frames]) { mitem->set_active(true); @@ -414,9 +448,17 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) mitem->set_active(true); } - ruler_items.push_back (CheckMenuElem (_("Range Markers"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_range_marker))); + if (!Profile->get_sae()) { + ruler_items.push_back (CheckMenuElem (_("Range Markers"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_range_marker))); + mitem = (CheckMenuItem *) &ruler_items.back(); + if (ruler_shown[ruler_time_range_marker]) { + mitem->set_active(true); + } + } + + ruler_items.push_back (CheckMenuElem (_("CD Markers"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_cd_marker))); mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_time_range_marker]) { + if (ruler_shown[ruler_time_cd_marker]) { mitem->set_active(true); } @@ -468,6 +510,7 @@ Editor::store_ruler_visibility () node->add_property (X_("marker"), ruler_shown[ruler_time_marker] ? "yes": "no"); node->add_property (X_("rangemarker"), ruler_shown[ruler_time_range_marker] ? "yes": "no"); node->add_property (X_("transportmarker"), ruler_shown[ruler_time_transport_marker] ? "yes": "no"); + node->add_property (X_("cdmarker"), ruler_shown[ruler_time_cd_marker] ? "yes": "no"); session->add_extra_xml (*node); session->set_dirty (); @@ -528,6 +571,7 @@ Editor::restore_ruler_visibility () else ruler_shown[ruler_time_range_marker] = false; } + if ((prop = node->property ("transportmarker")) != 0) { if (prop->value() == "yes") ruler_shown[ruler_time_transport_marker] = true; @@ -535,6 +579,29 @@ Editor::restore_ruler_visibility () ruler_shown[ruler_time_transport_marker] = false; } + if ((prop = node->property ("cdmarker")) != 0) { + if (prop->value() == "yes") + ruler_shown[ruler_time_cd_marker] = true; + else + ruler_shown[ruler_time_cd_marker] = false; + + cerr << "cd marker ruler set to " << ruler_shown[ruler_time_cd_marker] << endl; + + } else { + // this session doesn't yet know about the cdmarker ruler + // as a benefit to the user who doesn't know the feature exists, show the ruler if + // any cd marks exist + ruler_shown[ruler_time_cd_marker] = false; + const Locations::LocationList & locs = session->locations()->list(); + for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) { + if ((*i)->is_cd_marker()) { + ruler_shown[ruler_time_cd_marker] = true; + break; + } + } + cerr << "cd marker ruler default to " << ruler_shown[ruler_time_cd_marker] << endl; + } + } update_ruler_visibility (); @@ -583,11 +650,10 @@ Editor::update_ruler_visibility () minsec_ruler->set_size_request (-1, (int)timebar_height); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]); - - smpte_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - bbt_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - frames_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - minsec_ruler->set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); + smpte_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + bbt_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + frames_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); + minsec_ruler->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK); smpte_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); bbt_ruler->signal_button_release_event().connect (mem_fun(*this, &Editor::ruler_button_release)); @@ -606,6 +672,13 @@ Editor::update_ruler_visibility () ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START)); + smpte_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + bbt_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + frames_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + minsec_ruler->signal_scroll_event().connect (mem_fun(*this, &Editor::ruler_scroll)); + + ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START)); + if (ruler_shown[ruler_metric_minsec]) { lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START)); @@ -662,7 +735,7 @@ Editor::update_ruler_visibility () tempo_group->hide(); } - if (ruler_shown[ruler_time_range_marker]) { + if (!Profile->get_sae() && ruler_shown[ruler_time_range_marker]) { lab_children.push_back (Element(range_mark_label, PACK_SHRINK, PACK_START)); old_unit_pos = range_marker_group->property_y(); if (tbpos != old_unit_pos) { @@ -671,8 +744,7 @@ Editor::update_ruler_visibility () range_marker_group->show(); tbpos += timebar_height; visible_timebars++; - } - else { + } else { range_marker_group->hide(); } @@ -689,6 +761,24 @@ Editor::update_ruler_visibility () else { transport_marker_group->hide(); } + + if (ruler_shown[ruler_time_cd_marker]) { + lab_children.push_back (Element(cd_mark_label, PACK_SHRINK, PACK_START)); + old_unit_pos = cd_marker_group->property_y(); + if (tbpos != old_unit_pos) { + cd_marker_group->move (0.0, tbpos - old_unit_pos); + } + cd_marker_group->show(); + tbpos += timebar_height; + visible_timebars++; + // make sure all cd markers show up in their respective places + update_cd_marker_display(); + } + else { + cd_marker_group->hide(); + // make sure all cd markers show up in their respective places + update_cd_marker_display(); + } if (ruler_shown[ruler_time_marker]) { lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START)); |