#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"
Editor::initialize_rulers ()
{
ruler_grabbed_widget = 0;
- Pango::FontDescription font = get_font_for_style ("editor_time_ruler");
-
+ /* Not really sure why we can't get this right in a cross-platform way,
+ but it seems hard.
+ */
+#ifdef __APPLE__
+ Pango::FontDescription font (ARDOUR_UI::config()->get_SmallerFont());
+#else
+ Pango::FontDescription font (ARDOUR_UI::config()->get_SmallFont());
+#endif
_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;
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)
{
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:
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;
}