move contrasting_text_color() into ArdourCanvas
[ardour.git] / gtk2_ardour / editor_rulers.cc
index a8f7cdbf74fe87079924ab0cc8de03621fb997b3..d1a002e60248271259b9aa574ae0fdfbe9f410f1 100644 (file)
 
 #include <gtk/gtkaction.h>
 
-#include "canvas/group.h"
+#include "canvas/container.h"
 #include "canvas/canvas.h"
 #include "canvas/ruler.h"
 #include "canvas/debug.h"
+#include "canvas/scroll_group.h"
 
 #include "ardour/session.h"
 #include "ardour/tempo.h"
 #include "ardour/profile.h"
 
 #include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/keyboard.h"
 
+#include "ardour_ui.h"
 #include "editor.h"
 #include "editing.h"
 #include "actions.h"
 #include "gui_thread.h"
+#include "ruler_dialog.h"
 #include "time_axis_view.h"
 #include "editor_drag.h"
 #include "editor_cursors.h"
-#include "utils.h"
 
 #include "i18n.h"
 
@@ -119,32 +122,32 @@ void
 Editor::initialize_rulers ()
 {
        ruler_grabbed_widget = 0;
-       Pango::FontDescription font = get_font_for_style ("editor_time_ruler");
+       Pango::FontDescription font (ARDOUR_UI::config()->get_canvasvar_SmallFont());
 
        _timecode_metric = new TimecodeMetric (this);
        _bbt_metric = new BBTMetric (this);
        _minsec_metric = new MinsecMetric (this);
        _samples_metric = new SamplesMetric (this);
        
-       timecode_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_timecode_metric);
-       timecode_ruler->set_size (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
+       timecode_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_timecode_metric,
+                                                 ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
        timecode_ruler->set_font_description (font);
        CANVAS_DEBUG_NAME (timecode_ruler, "timecode ruler");
        timecode_nmarks = 0;
 
-       samples_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_samples_metric);
-       samples_ruler->set_size (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
+       samples_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_samples_metric,
+                                                ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
        samples_ruler->set_font_description (font);
        CANVAS_DEBUG_NAME (samples_ruler, "samples ruler");
 
-       minsec_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_minsec_metric);
-       minsec_ruler->set_size (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
+       minsec_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_minsec_metric,
+                                               ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
        minsec_ruler->set_font_description (font);
        CANVAS_DEBUG_NAME (minsec_ruler, "minsec ruler");
        minsec_nmarks = 0;
 
-       bbt_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_bbt_metric);
-       bbt_ruler->set_size (ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
+       bbt_ruler = new ArdourCanvas::Ruler (_time_markers_group, *_bbt_metric,
+                                            ArdourCanvas::Rect (0, 0, ArdourCanvas::COORD_MAX, timebar_height));
        bbt_ruler->set_font_description (font);
        CANVAS_DEBUG_NAME (bbt_ruler, "bbt ruler");
        timecode_nmarks = 0;
@@ -164,177 +167,29 @@ Editor::initialize_rulers ()
        lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START));
        lab_children.push_back (Element(videotl_label, PACK_SHRINK, PACK_START));
 
-       // timecode_ruler->Event.connect (...);
-       // samples_ruler->Event.connect (...);
-       // bbt_ruler->Event.connect (...);
-       // minsec_ruler->Event.connect (...);
+       /* 1 event handler to bind them all ... */
+
+       timecode_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), timecode_ruler, TimecodeRulerItem));
+       minsec_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), minsec_ruler, MinsecRulerItem));
+       bbt_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), bbt_ruler, BBTRulerItem));
+       samples_ruler->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_event), samples_ruler, SamplesRulerItem));
        
        visible_timebars = 0; /*this will be changed below */
 }
 
-bool
-Editor::ruler_scroll (GdkEventScroll* event)
-{
-       framepos_t xdelta;
-       int direction = event->direction;
-       bool handled = false;
-
-       switch (direction) {
-       case GDK_SCROLL_UP:
-               temporal_zoom_step (false);
-               handled = true;
-               break;
-
-       case GDK_SCROLL_DOWN:
-               temporal_zoom_step (true);
-               handled = true;
-               break;
-
-       case GDK_SCROLL_LEFT:
-               xdelta = (current_page_samples() / 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_samples() / 2);
-               if (max_framepos - xdelta > leftmost_frame) {
-                       reset_x_origin (leftmost_frame + xdelta);
-               } else {
-                       reset_x_origin (max_framepos - current_page_samples());
-               }
-               handled = true;
-               break;
-
-       default:
-               /* what? */
-               break;
-       }
-
-       return handled;
-}
-
-
-bool
-Editor::ruler_button_press (GdkEventButton* /*ev*/)
-{
-       if (_session == 0) {
-               return false;
-       }
-
-#if 0
-
-       Widget * grab_widget = 0;
-
-       if (bbt_ruler->is_realized() && ev->window == bbt_ruler->get_window()->gobj()) {
-               grab_widget = bbt_ruler;
-       } else if (samples_ruler->is_realized() && ev->window == samples_ruler->get_window()->gobj()) {
-               grab_widget = samples_ruler;
-       } else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) {
-               grab_widget = minsec_ruler;
-       }
-
-       if (grab_widget) {
-               grab_widget->add_modal_grab ();
-               ruler_grabbed_widget = grab_widget;
-       }
-
-       if (ev->button == 1) {
-               // Since we will locate the playhead on button release, cancel any running
-               // auditions.
-               if (_session->is_auditioning()) {
-                       _session->cancel_audition ();
-               }
-
-               /* playhead cursor drag: CursorDrag expects an event with
-                * canvas coordinates, so convert from window coordinates,
-                * since for now, rulers are still Gtk::Widgets.
-                */
-
-               GdkEventButton canvas_ev = *ev;
-               ArdourCanvas::Duple d = _track_canvas->window_to_canvas (ArdourCanvas::Duple (ev->x, ev->y));
-               canvas_ev.x = rint (d.x);
-               canvas_ev.y = rint (d.y);
-
-               _drags->set (new CursorDrag (this, *playhead_cursor, false), reinterpret_cast<GdkEvent *> (&canvas_ev));
-               _dragging_playhead = true;
-       }
-#endif
-
-       return true;
-}
-
-bool
-Editor::ruler_button_release (GdkEventButton* ev)
-{
-       if (_session == 0) {
-               return false;
-       }
-
-       if (_drags->active ()) {
-               GdkEventButton canvas_ev = *ev;
-               ArdourCanvas::Duple d = _track_canvas->window_to_canvas (ArdourCanvas::Duple (ev->x, ev->y));
-               canvas_ev.x = rint (d.x);
-               canvas_ev.x = rint (d.y);
-               _drags->end_grab (reinterpret_cast<GdkEvent*> (&canvas_ev));
-               _dragging_playhead = false;
-       }
-
-       if (ev->button == 3) {
-               
-               stop_canvas_autoscroll();
-
-               framepos_t where = window_event_sample ((GdkEvent*) ev);
-
-               snap_to (where);
-               popup_ruler_menu (where);
-       }
-
-       if (ruler_grabbed_widget) {
-               ruler_grabbed_widget->remove_modal_grab();
-               ruler_grabbed_widget = 0;
-       }
-
-       return true;
-}
-
 bool
 Editor::ruler_label_button_release (GdkEventButton* ev)
 {
-       if (ev->button == 3) {
-               Gtk::Menu* m = dynamic_cast<Gtk::Menu*> (ActionManager::get_widget (X_("/RulerMenuPopup")));
-               if (m) {
-                       m->popup (1, ev->time);
+       if (Gtkmm2ext::Keyboard::is_context_menu_event (ev)) {
+               if (!ruler_dialog) {
+                       ruler_dialog = new RulerDialog ();
                }
+               ruler_dialog->present ();
        }
 
        return true;
 }
 
-
-bool
-Editor::ruler_mouse_motion (GdkEventMotion* ev)
-{
-       if (_session == 0) {
-               return false;
-       }
-
-       if (_drags->active ()) {
-               GdkEventMotion canvas_ev = *ev;
-               ArdourCanvas::Duple d = _track_canvas->window_to_canvas (ArdourCanvas::Duple (ev->x, ev->y));
-               canvas_ev.x = rint (d.x);
-               canvas_ev.y = rint (d.y);
-               _drags->window_motion_handler (reinterpret_cast<GdkEvent*> (&canvas_ev), false);
-       }
-
-       return true;
-}
-
-
 void
 Editor::popup_ruler_menu (framepos_t where, ItemType t)
 {
@@ -376,12 +231,10 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t)
 
        case TempoBarItem:
                ruler_items.push_back (MenuElem (_("New Tempo"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_tempo_event), where)));
-               ruler_items.push_back (SeparatorElem ());
                break;
 
        case MeterBarItem:
                ruler_items.push_back (MenuElem (_("New Meter"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_meter_event), where)));
-               ruler_items.push_back (SeparatorElem ());
                break;
 
        case VideoBarItem:
@@ -400,70 +253,19 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t)
 
                ruler_items.push_back (CheckMenuElem (_("Lock")));
                {
-               Gtk::CheckMenuItem* vtl_lock = static_cast<Gtk::CheckMenuItem*>(&ruler_items.back());
-               vtl_lock->set_active(is_video_timeline_locked());
-               vtl_lock->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_video_timeline_locked));
+                       Gtk::CheckMenuItem* vtl_lock = static_cast<Gtk::CheckMenuItem*>(&ruler_items.back());
+                       vtl_lock->set_active(is_video_timeline_locked());
+                       vtl_lock->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_video_timeline_locked));
                }
-
-               ruler_items.push_back (SeparatorElem ());
                break;
 
        default:
                break;
        }
 
-       Glib::RefPtr<Action> action;
-
-       action = ActionManager::get_action ("Rulers", "toggle-minsec-ruler");
-       if (action) {
-               ruler_items.push_back (MenuElem (*action->create_menu_item()));
-       }
-       if (!Profile->get_sae()) {
-               action = ActionManager::get_action ("Rulers", "toggle-timecode-ruler");
-               if (action) {
-                       ruler_items.push_back (MenuElem (*action->create_menu_item()));
-               }
+       if (!ruler_items.empty()) {
+               editor_ruler_menu->popup (1, gtk_get_current_event_time());
        }
-       action = ActionManager::get_action ("Rulers", "toggle-samples-ruler");
-       if (action) {
-               ruler_items.push_back (MenuElem (*action->create_menu_item()));
-       }
-       action = ActionManager::get_action ("Rulers", "toggle-bbt-ruler");
-       if (action) {
-               ruler_items.push_back (MenuElem (*action->create_menu_item()));
-       }
-       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()) {
-               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()));
-       }
-       action = ActionManager::get_action ("Rulers", "toggle-video-ruler");
-       if (action) {
-               ruler_items.push_back (MenuElem (*action->create_menu_item()));
-       }
-
-       editor_ruler_menu->popup (1, gtk_get_current_event_time());
 
        no_ruler_shown_update = false;
 }