along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
*/
#include <cstdio> // for sprintf, grrr
#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"
ruler_editor = this;
ruler_grabbed_widget = 0;
+ _ruler_separator = new Gtk::HSeparator();
+ _ruler_separator->set_size_request(-1, 2);
+ _ruler_separator->show();
+
_smpte_ruler = gtk_custom_hruler_new ();
smpte_ruler = Glib::wrap (_smpte_ruler);
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);
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;
- 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);
+ visible_timebars = 1; /*this will be changed below */
+ ruler_pressed_button = 0;
+}
- 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));
+bool
+Editor::ruler_scroll (GdkEventScroll* event)
+{
+ nframes64_t xdelta;
+ int direction = event->direction;
+ bool handled = false;
+
+ switch (direction) {
+ case GDK_SCROLL_UP:
+ temporal_zoom_step (true);
+ handled = true;
+ break;
- 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;
+ 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;
}
/* need to use the correct x,y, the event lies */
time_canvas_event_box.get_window()->get_pointer (x, y, state);
- nframes_t where = leftmost_frame + pixel_to_frame (x);
+ nframes64_t where = leftmost_frame + pixel_to_frame (x);
switch (ev->button) {
case 1:
- /* transport playhead */
+ // Since we will locate the playhead on button release, cancel any running
+ // auditions.
+ if (session->is_auditioning()) {
+ session->cancel_audition ();
+ }
+ /* playhead cursor */
snap_to (where);
- session->request_locate (where);
+ playhead_cursor->set_position (where);
+ _dragging_playhead = true;
break;
case 2:
- /* edit cursor */
- if (snap_type != Editing::SnapToEditCursor) {
- snap_to (where);
- }
- edit_cursor->set_position (where);
- edit_cursor_clock.set (where);
+ /* edit point */
+ snap_to (where);
break;
default:
return FALSE;
}
- hide_verbose_canvas_cursor();
stop_canvas_autoscroll();
- nframes_t where = leftmost_frame + pixel_to_frame (x);
+ nframes64_t where = leftmost_frame + pixel_to_frame (x);
switch (ev->button) {
case 1:
/* transport playhead */
+ _dragging_playhead = false;
snap_to (where);
- session->request_locate (where);
+ session->request_locate (where, session->transport_rolling());
break;
case 2:
- /* edit cursor */
- if (snap_type != Editing::SnapToEditCursor) {
- snap_to (where);
- }
- edit_cursor->set_position (where);
- edit_cursor_clock.set (where);
+ /* edit point */
+ snap_to (where);
break;
case 3:
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;
return FALSE;
}
- double wcx=0,wcy=0;
+ double wcx=0,wcy=0;
double cx=0,cy=0;
gint x,y;
/* need to use the correct x,y, the event lies */
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);
-
- nframes_t where = leftmost_frame + pixel_to_frame (x);
+ track_canvas->c2w (x, y, wcx, wcy);
+ track_canvas->w2c (wcx, wcy, cx, cy);
+
+ nframes64_t where = leftmost_frame + pixel_to_frame (x);
/// ripped from maybe_autoscroll, and adapted to work here
- nframes_t one_page = (nframes_t) rint (canvas_width * frames_per_unit);
- nframes_t rightmost_frame = leftmost_frame + one_page;
+ nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
if (autoscroll_timeout_tag < 0) {
if (where > rightmost_frame) {
if (rightmost_frame < max_frames) {
- start_canvas_autoscroll (1);
+ start_canvas_autoscroll (1, 0);
}
} else if (where <= leftmost_frame) {
if (leftmost_frame > 0) {
- start_canvas_autoscroll (-1);
+ start_canvas_autoscroll (-1, 0);
}
}
} else {
break;
case 2:
- /* edit cursor */
- cursor = edit_cursor;
+ /* edit point */
+ // EDIT CURSOR XXX do something useful
break;
default:
break;
}
- if (cursor)
- {
+ if (cursor) {
cursor->set_position (where);
- if (cursor == edit_cursor) {
- edit_cursor_clock.set (where);
+ if (cursor == playhead_cursor) {
+ UpdateAllTransportClocks (cursor->current_frame);
}
-
- show_verbose_time_cursor (where, 10, cx, 0);
}
return TRUE;
void
-Editor::popup_ruler_menu (nframes_t where, ItemType t)
+Editor::popup_ruler_menu (nframes64_t where, ItemType t)
{
using namespace Menu_Helpers;
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)));
+ ruler_items.push_back (MenuElem (_("New location marker"), bind ( mem_fun(*this, &Editor::mouse_add_new_marker), where, false, 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 ());
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, false)));
+ 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")));
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 (X_("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 (_("Frames"), 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()));
}
-
- 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 (_("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;
+ 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()));
}
}
-
- ruler_shown[ruler] = !ruler_shown[ruler];
+ 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()));
+ }
- update_ruler_visibility ();
+ editor_ruler_menu->popup (1, gtk_get_current_event_time());
- // update session extra RulerVisibility
- store_ruler_visibility ();
+ no_ruler_shown_update = false;
}
void
{
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_("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 ();
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_cd_marker_action->set_active (true);
+ else
+ 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_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_cd_marker_action->set_active (true);
+ break;
+ }
+ }
}
}
+ no_ruler_shown_update = false;
+
update_ruler_visibility ();
}
-
void
Editor::update_ruler_visibility ()
{
using namespace Box_Helpers;
BoxList & lab_children = time_button_vbox.children();
+ BoxList & ruler_lab_children = ruler_label_vbox.children();
BoxList & ruler_children = time_canvas_vbox.children();
+ int visible_rulers = 0;
+
+ if (no_ruler_shown_update) {
+ return;
+ }
visible_timebars = 0;
lab_children.clear();
+ ruler_lab_children.clear();
// leave the last one (the time_canvas) intact
- while (ruler_children.size() > 1) {
+ while (ruler_children.size() > 0) {
ruler_children.pop_front();
}
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));
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));
+ 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));
+ if (ruler_minsec_action->get_active()) {
+ ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
- visible_timebars++;
+ visible_rulers++;
}
- if (ruler_shown[ruler_metric_smpte]) {
- lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
+ if (ruler_timecode_action->get_active()) {
+ ruler_lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START));
- visible_timebars++;
+ visible_rulers++;
}
- if (ruler_shown[ruler_metric_frames]) {
- lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
+ if (ruler_samples_action->get_active()) {
+ ruler_lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START));
- visible_timebars++;
+ visible_rulers++;
}
- if (ruler_shown[ruler_metric_bbt]) {
- lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
+ if (ruler_bbt_action->get_active()) {
+ ruler_lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START));
- visible_timebars++;
+ visible_rulers++;
}
- double tbpos = 0.0;
- double old_unit_pos ;
+ double tbpos = 1.0;
+ double tbgpos = 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();
if (tbpos != old_unit_pos) {
meter_group->move ( 0.0, tbpos - old_unit_pos);
}
+ old_unit_pos = meter_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ meter_bar_group->move ( 0.0, tbgpos - old_unit_pos);
+ }
+ meter_bar_group->show();
meter_group->show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ meter_bar_group->hide();
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) {
tempo_group->move(0.0, tbpos - old_unit_pos);
}
+ old_unit_pos = tempo_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ tempo_bar_group->move ( 0.0, tbgpos - old_unit_pos);
+ }
+ tempo_bar_group->show();
tempo_group->show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ tempo_bar_group->hide();
tempo_group->hide();
}
- if (ruler_shown[ruler_time_marker]) {
- lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START));
- old_unit_pos = marker_group->property_y();
- if (tbpos != old_unit_pos) {
- marker_group->move ( 0.0, tbpos - old_unit_pos);
- }
- marker_group->show();
- tbpos += timebar_height;
- visible_timebars++;
- }
- else {
- marker_group->hide();
- }
-
- if (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);
}
+ old_unit_pos = range_marker_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ range_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
+ }
+ range_marker_bar_group->show();
range_marker_group->show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ range_marker_bar_group->hide();
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) {
transport_marker_group->move ( 0.0, tbpos - old_unit_pos);
}
+ old_unit_pos = transport_marker_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ transport_marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
+ }
+ transport_marker_bar_group->show();
transport_marker_group->show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ transport_marker_bar_group->hide();
transport_marker_group->hide();
}
+
+ 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) {
+ cd_marker_group->move (0.0, tbpos - old_unit_pos);
+ }
+ old_unit_pos = cd_marker_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ cd_marker_bar_group->move (0.0, tbgpos - old_unit_pos);
+ }
+ cd_marker_bar_group->show();
+ cd_marker_group->show();
+ tbpos += timebar_height;
+ tbgpos += timebar_height;
+ visible_timebars++;
+ // make sure all cd markers show up in their respective places
+ update_cd_marker_display();
+ } else {
+ cd_marker_bar_group->hide();
+ cd_marker_group->hide();
+ // make sure all cd markers show up in their respective places
+ update_cd_marker_display();
+ }
+
+ 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) {
+ marker_group->move ( 0.0, tbpos - old_unit_pos);
+ }
+ old_unit_pos = marker_bar_group->property_y();
+ if (tbgpos != old_unit_pos) {
+ marker_bar_group->move ( 0.0, tbgpos - old_unit_pos);
+ }
+ marker_bar_group->show();
+ marker_group->show();
+ tbpos += timebar_height;
+ tbgpos += timebar_height;
+ visible_timebars++;
+ } else {
+ marker_bar_group->hide();
+ marker_group->hide();
+ }
- time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars));
+ gdouble old_canvas_timebars_vsize = canvas_timebars_vsize;
+ canvas_timebars_vsize = (timebar_height * visible_timebars) + 2.0;
+ gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize;
+
+ if (vertical_pos_delta < 0 && (vertical_adjustment.get_value() + canvas_height) >= vertical_adjustment.get_upper()) {
+ /*if we're at the bottom of the canvas, don't move the _trackview_grooup*/
+ vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
+ } else {
+ vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
+ _trackview_group->move (0, vertical_pos_delta);
+ }
+ ruler_label_vbox.set_size_request (-1, (int)(timebar_height * visible_rulers));
+
+ time_canvas_vbox.set_size_request (-1,-1);
time_canvas_event_box.queue_resize();
update_fixed_rulers();
- //update_tempo_based_rulers();
- tempo_map_changed(Change (0));
+ redisplay_tempo (false);
time_canvas_event_box.show_all();
- time_button_event_box.show_all();
+ ruler_label_frame.show_all();
+ time_button_frame.show_all();
}
void
return;
}
- /* XXX Note the potential loss of accuracy here as we convert from
- an uint32_t (or larger) to a float ... what to do ?
- */
-
- nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
- nframes_t rightmost_frame = leftmost_frame + page;
+ nframes64_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());
}
void
Editor::update_fixed_rulers ()
{
- nframes_t rightmost_frame;
+ nframes64_t rightmost_frame;
if (session == 0) {
return;
}
- /* XXX Note the potential loss of accuracy here as we convert from
- an uint32_t (or larger) to a float ... what to do ?
- */
-
- nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
-
ruler_metrics[ruler_metric_smpte].units_per_pixel = frames_per_unit;
ruler_metrics[ruler_metric_frames].units_per_pixel = frames_per_unit;
ruler_metrics[ruler_metric_minsec].units_per_pixel = frames_per_unit;
- rightmost_frame = leftmost_frame + page;
+ rightmost_frame = leftmost_frame + current_page_frames ();
/* these force a redraw, which in turn will force execution of the metric callbacks
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());
}
return;
}
- /* XXX Note the potential loss of accuracy here as we convert from
- an uint32_t (or larger) to a float ... what to do ?
- */
-
- nframes_t page = (nframes_t) floor (canvas_width * frames_per_unit);
ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit;
- if (ruler_shown[ruler_metric_bbt]) {
- gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_bbt_ruler), leftmost_frame, leftmost_frame+page,
+ 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());
}
}
gint
Editor::metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
{
- nframes_t range;
nframes_t pos;
- nframes_t spacer;
- nframes_t fr;
+ nframes64_t range;
+ nframes64_t spacer;
+ nframes64_t fr;
SMPTE::Time smpte;
gchar buf[16];
gint nmarks = 0;
fr = session->frame_rate();
- if (lower > (spacer = (nframes_t)(128 * Editor::get_current_zoom ()))) {
+ if (lower > (spacer = (nframes64_t)(128 * Editor::get_current_zoom ()))) {
lower = lower - spacer;
} else {
lower = 0;
}
upper = upper + spacer;
- range = (nframes_t) floor (upper - lower);
+ range = (nframes64_t) floor (upper - lower);
if (range < (2 * session->frames_per_smpte_frame())) { /* 0 - 2 frames */
show_bits = true;
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
show_frames = true;
mark_modulo = 1;
- nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame());
+ nmarks = 1 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
show_frames = true;
mark_modulo = 2;
- nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame());
+ nmarks = 1 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= fr) { /* 0.5-1 second */
show_frames = true;
mark_modulo = 5;
- nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame());
+ nmarks = 1 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= 2 * fr) { /* 1-2 seconds */
show_frames = true;
mark_modulo = 10;
- nmarks = 1 + (range / (nframes_t)session->frames_per_smpte_frame());
+ nmarks = 1 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= 8 * fr) { /* 2-8 seconds */
show_seconds = true;
mark_modulo = 1;
nmarks = 1 + 24;
} else {
- /* not possible if nframes_t is a 32 bit quantity */
+ /* not possible if nframes64_t is a 32 bit quantity */
show_hours = true;
mark_modulo = 4;
gint nmarks;
char buf[64];
gint n = 0;
- nframes_t pos;
+ nframes64_t pos;
bool bar_helper_on = true;
BBT_Time next_beat;
- nframes_t next_beat_pos;
+ nframes64_t next_beat_pos;
if ((desirable_marks = maxchars / 7) == 0) {
return 0;
uint32_t tick = 0;
uint32_t skip;
uint32_t t;
- nframes_t frame_skip;
+ nframes64_t frame_skip;
double frame_skip_error;
double accumulated_error;
double position_of_helper;
next_beat_pos = session->tempo_map().frame_time(next_beat);
- frame_skip = (nframes_t) floor (frame_skip_error = (session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
+ frame_skip = (nframes64_t) floor (frame_skip_error = (session->frame_rate() * 60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
frame_skip_error -= frame_skip;
skip = (uint32_t) (Meter::ticks_per_beat / bbt_beat_subdivision);
(*marks)[n].label = g_strdup (buf);
- /* Error compensation for float to nframes_t*/
+ /* Error compensation for float to nframes64_t*/
accumulated_error += frame_skip_error;
if (accumulated_error > 1) {
pos += 1;
gint
Editor::metric_get_frames (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
{
- nframes_t mark_interval;
- nframes_t pos;
- nframes_t ilower = (nframes_t) floor (lower);
- nframes_t iupper = (nframes_t) floor (upper);
+ nframes64_t mark_interval;
+ nframes64_t pos;
+ nframes64_t ilower = (nframes64_t) floor (lower);
+ nframes64_t iupper = (nframes64_t) floor (upper);
gchar buf[16];
gint nmarks;
gint n;
nmarks = 5;
*marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * nmarks);
for (n = 0, pos = ilower; n < nmarks; pos += mark_interval, ++n) {
- snprintf (buf, sizeof(buf), "%u", pos);
+ snprintf (buf, sizeof(buf), "%" PRIi64, pos);
(*marks)[n].label = g_strdup (buf);
(*marks)[n].position = pos;
(*marks)[n].style = GtkCustomRulerMarkMajor;
}
static void
-sample_to_clock_parts ( nframes_t sample,
- nframes_t sample_rate,
+sample_to_clock_parts ( nframes64_t sample,
+ nframes64_t sample_rate,
long *hrs_p,
long *mins_p,
long *secs_p,
long *millisecs_p)
{
- nframes_t left;
+ nframes64_t left;
long hrs;
long mins;
long secs;
gint
Editor::metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
{
- nframes_t range;
- nframes_t fr;
- nframes_t mark_interval;
- nframes_t pos;
- nframes_t spacer;
+ nframes64_t range;
+ nframes64_t fr;
+ nframes64_t mark_interval;
+ nframes64_t pos;
+ nframes64_t spacer;
long hrs, mins, secs, millisecs;
gchar buf[16];
gint nmarks;
bool show_seconds = false;
bool show_minutes = false;
bool show_hours = false;
- nframes_t ilower = (nframes_t) floor (lower);
- nframes_t iupper = (nframes_t) floor (upper);
+ nframes64_t ilower = (nframes64_t) floor (lower);
+ nframes64_t iupper = (nframes64_t) floor (upper);
if (session == 0) {
return 0;
fr = session->frame_rate();
/* to prevent 'flashing' */
- if (lower > (spacer = (nframes_t)(128 * Editor::get_current_zoom ()))) {
+ if (lower > (spacer = (nframes64_t)(128 * Editor::get_current_zoom ()))) {
lower = lower - spacer;
} else {
lower = 0;
mark_modulo = 2;
} else {
- /* not possible if nframes_t is a 32 bit quantity */
+ /* not possible if nframes64_t is a 32 bit quantity */
mark_interval = 4 * 60 * 60 * fr; /* show 4 hrs */
}