diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-03-17 20:54:03 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-03-17 20:54:03 +0000 |
commit | 997e4b1f9cd7ccfc704b7c035051da7f60d831e7 (patch) | |
tree | 1236e40183b677abf4a2882e4cfe8e0a345eb24d /gtk2_ardour/editor_rulers.cc | |
parent | 19a4b990325577fc949ccd5d5fbad4520eb1df56 (diff) |
merge with 2.0-ongoing @ rev 3147
git-svn-id: svn://localhost/ardour2/branches/3.0@3152 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_rulers.cc')
-rw-r--r-- | gtk2_ardour/editor_rulers.cc | 259 |
1 files changed, 105 insertions, 154 deletions
diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index cb3ef7d45e..8ed6ea9a53 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -22,12 +22,15 @@ #include <string> +#include <gtk/gtkaction.h> + #include <ardour/tempo.h> #include <ardour/profile.h> #include <gtkmm2ext/gtk_ui.h> #include "editor.h" #include "editing.h" +#include "actions.h" #include "gtk-custom-hruler.h" #include "gui_thread.h" @@ -66,14 +69,12 @@ Editor::initialize_rulers () smpte_ruler->set_name ("SMPTERuler"); smpte_ruler->set_size_request (-1, (int)timebar_height); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_smpte_ruler), &ruler_metrics[ruler_metric_smpte]); - ruler_shown[ruler_metric_smpte] = true; _bbt_ruler = gtk_custom_hruler_new (); bbt_ruler = Glib::wrap (_bbt_ruler); bbt_ruler->set_name ("BBTRuler"); bbt_ruler->set_size_request (-1, (int)timebar_height); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_bbt_ruler), &ruler_metrics[ruler_metric_bbt]); - ruler_shown[ruler_metric_bbt] = true; _frames_ruler = gtk_custom_hruler_new (); frames_ruler = Glib::wrap (_frames_ruler); @@ -87,19 +88,6 @@ Editor::initialize_rulers () minsec_ruler->set_size_request (-1, (int)timebar_height); gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]); - ruler_shown[ruler_time_meter] = true; - ruler_shown[ruler_time_tempo] = true; - 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; - visible_timebars = 7; /* 4 here, 3 in time_canvas */ ruler_pressed_button = 0; } @@ -261,9 +249,11 @@ Editor::ruler_button_release (GdkEventButton* ev) gint Editor::ruler_label_button_release (GdkEventButton* ev) { - if (ev->button == 3) - { - popup_ruler_menu(); + if (ev->button == 3) { + Gtk::Menu* m= dynamic_cast<Gtk::Menu*> (ActionManager::get_widget (X_("/RulerMenuPopup"))); + if (m) { + m->popup (1, ev->time); + } } return TRUE; @@ -287,8 +277,8 @@ Editor::ruler_mouse_motion (GdkEventMotion* ev) time_canvas_event_box.get_window()->get_pointer (x, y, state); - track_canvas.c2w (x, y, wcx, wcy); - track_canvas.w2c (wcx, wcy, cx, cy); + track_canvas->c2w (x, y, wcx, wcy); + track_canvas->w2c (wcx, wcy, cx, cy); nframes_t where = leftmost_frame + pixel_to_frame (x); @@ -360,10 +350,6 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) editor_ruler_menu->set_name ("ArdourContextMenu"); ruler_items.clear(); - CheckMenuItem * mitem; - - no_ruler_shown_update = true; - switch (t) { case MarkerBarItem: ruler_items.push_back (MenuElem (_("New location marker"), bind ( mem_fun(*this, &Editor::mouse_add_new_marker), where, false, false))); @@ -403,114 +389,74 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) default: break; } - - ruler_items.push_back (CheckMenuElem (_("Min:Secs"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_minsec))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_metric_minsec]) { - mitem->set_active(true); - } - ruler_items.push_back (CheckMenuElem (_("Timecode"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_smpte))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_metric_smpte]) { - mitem->set_active(true); - } + Glib::RefPtr<Action> action; - 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); + action = ActionManager::get_action ("Rulers", "toggle-minsec-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); } - - ruler_items.push_back (CheckMenuElem (_("Bars:Beats"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_bbt))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_metric_bbt]) { - mitem->set_active(true); + if (!Profile->get_sae()) { + action = ActionManager::get_action ("Rulers", "toggle-timecode-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } } - - ruler_items.push_back (SeparatorElem ()); - - ruler_items.push_back (CheckMenuElem (_("Meter"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_meter))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_time_meter]) { - mitem->set_active(true); + action = ActionManager::get_action ("Rulers", "toggle-samples-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); } - - ruler_items.push_back (CheckMenuElem (_("Tempo"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_tempo))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_time_tempo]) { - mitem->set_active(true); + action = ActionManager::get_action ("Rulers", "toggle-bbt-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); } - - ruler_items.push_back (CheckMenuElem (_("Location Markers"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_marker))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_time_marker]) { - mitem->set_active(true); + action = ActionManager::get_action ("Rulers", "toggle-meter-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } + action = ActionManager::get_action ("Rulers", "toggle-tempo-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); } - 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); + action = ActionManager::get_action ("Rulers", "toggle-range-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); } } + action = ActionManager::get_action ("Rulers", "toggle-loop-punch-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } + action = ActionManager::get_action ("Rulers", "toggle-cd-marker-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } + action = ActionManager::get_action ("Rulers", "toggle-marker-ruler"); + if (action) { + ruler_items.push_back (MenuElem (*action->create_menu_item())); + } - 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_cd_marker]) { - mitem->set_active(true); - } - - ruler_items.push_back (CheckMenuElem (_("Loop/Punch Ranges"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_time_transport_marker))); - mitem = (CheckMenuItem *) &ruler_items.back(); - if (ruler_shown[ruler_time_transport_marker]) { - mitem->set_active(true); - } - editor_ruler_menu->popup (1, gtk_get_current_event_time()); no_ruler_shown_update = false; } void -Editor::ruler_toggled (int ruler) -{ - if (!session) return; - if (ruler < 0 || ruler >= (int) sizeof(ruler_shown)) return; - - if (no_ruler_shown_update) return; - - if (ruler_shown[ruler]) { - if (visible_timebars <= 1) { - // must always have 1 visible - return; - } - } - - ruler_shown[ruler] = !ruler_shown[ruler]; - - update_ruler_visibility (); - - // update session extra RulerVisibility - store_ruler_visibility (); -} - -void Editor::store_ruler_visibility () { XMLNode* node = new XMLNode(X_("RulerVisibility")); - node->add_property (X_("smpte"), ruler_shown[ruler_metric_smpte] ? "yes": "no"); - node->add_property (X_("bbt"), ruler_shown[ruler_metric_bbt] ? "yes": "no"); - node->add_property (X_("frames"), ruler_shown[ruler_metric_frames] ? "yes": "no"); - node->add_property (X_("minsec"), ruler_shown[ruler_metric_minsec] ? "yes": "no"); - node->add_property (X_("tempo"), ruler_shown[ruler_time_tempo] ? "yes": "no"); - node->add_property (X_("meter"), ruler_shown[ruler_time_meter] ? "yes": "no"); - 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"); + node->add_property (X_("smpte"), ruler_timecode_action->get_active() ? "yes": "no"); + node->add_property (X_("bbt"), ruler_bbt_action->get_active() ? "yes": "no"); + node->add_property (X_("frames"), ruler_samples_action->get_active() ? "yes": "no"); + node->add_property (X_("minsec"), ruler_minsec_action->get_active() ? "yes": "no"); + node->add_property (X_("tempo"), ruler_tempo_action->get_active() ? "yes": "no"); + node->add_property (X_("meter"), ruler_meter_action->get_active() ? "yes": "no"); + node->add_property (X_("marker"), ruler_marker_action->get_active() ? "yes": "no"); + node->add_property (X_("rangemarker"), ruler_range_action->get_active() ? "yes": "no"); + node->add_property (X_("transportmarker"), ruler_loop_punch_action->get_active() ? "yes": "no"); + node->add_property (X_("cdmarker"), ruler_cd_marker_action->get_active() ? "yes": "no"); session->add_extra_xml (*node); session->set_dirty (); @@ -522,92 +468,92 @@ Editor::restore_ruler_visibility () XMLProperty* prop; XMLNode * node = session->extra_xml (X_("RulerVisibility")); + no_ruler_shown_update = true; + if (node) { if ((prop = node->property ("smpte")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_metric_smpte] = true; + ruler_timecode_action->set_active (true); else - ruler_shown[ruler_metric_smpte] = false; + ruler_timecode_action->set_active (false); } if ((prop = node->property ("bbt")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_metric_bbt] = true; + ruler_bbt_action->set_active (true); else - ruler_shown[ruler_metric_bbt] = false; + ruler_bbt_action->set_active (false); } if ((prop = node->property ("frames")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_metric_frames] = true; + ruler_samples_action->set_active (true); else - ruler_shown[ruler_metric_frames] = false; + ruler_samples_action->set_active (false); } if ((prop = node->property ("minsec")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_metric_minsec] = true; + ruler_minsec_action->set_active (true); else - ruler_shown[ruler_metric_minsec] = false; + ruler_minsec_action->set_active (false); } if ((prop = node->property ("tempo")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_tempo] = true; + ruler_tempo_action->set_active (true); else - ruler_shown[ruler_time_tempo] = false; + ruler_tempo_action->set_active (false); } if ((prop = node->property ("meter")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_meter] = true; + ruler_meter_action->set_active (true); else - ruler_shown[ruler_time_meter] = false; + ruler_meter_action->set_active (false); } if ((prop = node->property ("marker")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_marker] = true; + ruler_marker_action->set_active (true); else - ruler_shown[ruler_time_marker] = false; + ruler_marker_action->set_active (false); } if ((prop = node->property ("rangemarker")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_range_marker] = true; + ruler_range_action->set_active (true); else - ruler_shown[ruler_time_range_marker] = false; + ruler_range_action->set_active (false); } if ((prop = node->property ("transportmarker")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_transport_marker] = true; + ruler_loop_punch_action->set_active (true); else - ruler_shown[ruler_time_transport_marker] = false; + ruler_loop_punch_action->set_active (false); } if ((prop = node->property ("cdmarker")) != 0) { if (prop->value() == "yes") - ruler_shown[ruler_time_cd_marker] = true; + ruler_cd_marker_action->set_active (true); else - ruler_shown[ruler_time_cd_marker] = false; - - cerr << "cd marker ruler set to " << ruler_shown[ruler_time_cd_marker] << endl; + ruler_cd_marker_action->set_active (false); } 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; + ruler_cd_marker_action->set_active (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; + ruler_cd_marker_action->set_active (true); break; } } - cerr << "cd marker ruler default to " << ruler_shown[ruler_time_cd_marker] << endl; } } + no_ruler_shown_update = false; + update_ruler_visibility (); } - void Editor::update_ruler_visibility () { @@ -615,6 +561,10 @@ Editor::update_ruler_visibility () BoxList & lab_children = time_button_vbox.children(); BoxList & ruler_children = time_canvas_vbox.children(); + if (no_ruler_shown_update) { + return; + } + visible_timebars = 0; lab_children.clear(); @@ -679,25 +629,25 @@ Editor::update_ruler_visibility () ruler_children.insert (canvaspos, Element(*_ruler_separator, PACK_SHRINK, PACK_START)); - if (ruler_shown[ruler_metric_minsec]) { + if (ruler_minsec_action->get_active()) { lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START)); visible_timebars++; } - if (ruler_shown[ruler_metric_smpte]) { + if (ruler_timecode_action->get_active()) { lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START)); visible_timebars++; } - if (ruler_shown[ruler_metric_frames]) { + if (ruler_samples_action->get_active()) { lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START)); visible_timebars++; } - if (ruler_shown[ruler_metric_bbt]) { + if (ruler_bbt_action->get_active()) { lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START)); ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START)); visible_timebars++; @@ -706,7 +656,7 @@ Editor::update_ruler_visibility () double tbpos = 1.0; double old_unit_pos ; - if (ruler_shown[ruler_time_meter]) { + if (ruler_meter_action->get_active()) { lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); old_unit_pos = meter_group->property_y(); @@ -721,7 +671,7 @@ Editor::update_ruler_visibility () meter_group->hide(); } - if (ruler_shown[ruler_time_tempo]) { + if (ruler_tempo_action->get_active()) { lab_children.push_back (Element(tempo_label, PACK_SHRINK, PACK_START)); old_unit_pos = tempo_group->property_y(); if (tbpos != old_unit_pos) { @@ -735,20 +685,21 @@ Editor::update_ruler_visibility () tempo_group->hide(); } - if (!Profile->get_sae() && ruler_shown[ruler_time_range_marker]) { + if (!Profile->get_sae() && ruler_range_action->get_active()) { 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) { range_marker_group->move (0.0, tbpos - old_unit_pos); } range_marker_group->show(); + cerr << "range_marker_group now at " << range_marker_group->property_y() << endl; tbpos += timebar_height; visible_timebars++; } else { range_marker_group->hide(); } - if (ruler_shown[ruler_time_transport_marker]) { + if (ruler_loop_punch_action->get_active()) { lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START)); old_unit_pos = transport_marker_group->property_y(); if (tbpos != old_unit_pos) { @@ -762,7 +713,7 @@ Editor::update_ruler_visibility () transport_marker_group->hide(); } - if (ruler_shown[ruler_time_cd_marker]) { + if (ruler_cd_marker_action->get_active()) { 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) { @@ -780,7 +731,7 @@ Editor::update_ruler_visibility () update_cd_marker_display(); } - if (ruler_shown[ruler_time_marker]) { + if (ruler_marker_action->get_active()) { lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START)); old_unit_pos = marker_group->property_y(); if (tbpos != old_unit_pos) { @@ -819,7 +770,7 @@ Editor::update_just_smpte () nframes_t rightmost_frame = leftmost_frame + current_page_frames(); - if (ruler_shown[ruler_metric_smpte]) { + if (ruler_timecode_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_smpte_ruler), leftmost_frame, rightmost_frame, leftmost_frame, session->current_end_frame()); } @@ -832,11 +783,11 @@ Editor::compute_fixed_ruler_scale () return; } - if (ruler_shown[ruler_metric_smpte]) { + if (ruler_timecode_action->get_active()) { set_smpte_ruler_scale (leftmost_frame, leftmost_frame + (edit_packer.get_width() * frames_per_unit) ); } - if (ruler_shown[ruler_metric_minsec]) { + if (ruler_minsec_action->get_active()) { set_minsec_ruler_scale (leftmost_frame, leftmost_frame + (edit_packer.get_width() * frames_per_unit) ); } } @@ -860,17 +811,17 @@ Editor::update_fixed_rulers () to compute the relevant ticks to display. */ - if (ruler_shown[ruler_metric_smpte]) { + if (ruler_timecode_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_smpte_ruler), leftmost_frame, rightmost_frame, leftmost_frame, session->current_end_frame()); } - if (ruler_shown[ruler_metric_frames]) { + if (ruler_samples_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_frames_ruler), leftmost_frame, rightmost_frame, leftmost_frame, session->current_end_frame()); } - if (ruler_shown[ruler_metric_minsec]) { + if (ruler_minsec_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_minsec_ruler), leftmost_frame, rightmost_frame, leftmost_frame, session->current_end_frame()); } @@ -885,7 +836,7 @@ Editor::update_tempo_based_rulers () ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit; - if (ruler_shown[ruler_metric_bbt]) { + if (ruler_bbt_action->get_active()) { gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_bbt_ruler), leftmost_frame, leftmost_frame+current_page_frames(), leftmost_frame, session->current_end_frame()); } |