#include <gtk/gtkaction.h>
-#include <ardour/tempo.h>
-#include <ardour/profile.h>
+#include "ardour/tempo.h"
+#include "ardour/profile.h"
#include <gtkmm2ext/gtk_ui.h>
#include "editor.h"
#include "actions.h"
#include "gtk-custom-hruler.h"
#include "gui_thread.h"
+#include "time_axis_view.h"
#include "i18n.h"
{
ruler_editor = this;
ruler_grabbed_widget = 0;
-
+
_ruler_separator = new Gtk::HSeparator();
_ruler_separator->set_size_request(-1, 2);
_ruler_separator->set_name("TimebarPadding");
_ruler_separator->show();
-
+
+ _minsec_ruler = gtk_custom_hruler_new ();
+ minsec_ruler = Glib::wrap (_minsec_ruler);
+ minsec_ruler->set_name ("MinSecRuler");
+ minsec_ruler->set_size_request (-1, (int)timebar_height);
+ gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]);
+ minsec_ruler->hide ();
+ minsec_ruler->set_no_show_all();
+
_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]);
-
+ smpte_ruler->hide ();
+ smpte_ruler->set_no_show_all();
+ smpte_nmarks = 0;
+
_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]);
+ bbt_ruler->hide ();
+ bbt_ruler->set_no_show_all();
+ bbt_nmarks = 0;
_frames_ruler = gtk_custom_hruler_new ();
frames_ruler = Glib::wrap (_frames_ruler);
frames_ruler->set_name ("FramesRuler");
frames_ruler->set_size_request (-1, (int)timebar_height);
gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_frames_ruler), &ruler_metrics[ruler_metric_frames]);
+ frames_ruler->hide ();
+ frames_ruler->set_no_show_all();
- _minsec_ruler = gtk_custom_hruler_new ();
- minsec_ruler = Glib::wrap (_minsec_ruler);
- minsec_ruler->set_name ("MinSecRuler");
- minsec_ruler->set_size_request (-1, (int)timebar_height);
- gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_minsec_ruler), &ruler_metrics[ruler_metric_minsec]);
+ _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]);
+ bbt_ruler->hide ();
+ bbt_ruler->set_no_show_all();
+ minsec_ruler->hide ();
+ minsec_ruler->set_no_show_all();
+ minsec_nmarks = 0;
- visible_timebars = 7; /* 4 here, 3 in time_canvas */
+ using namespace Box_Helpers;
+ BoxList & ruler_lab_children = ruler_label_vbox.children();
+ BoxList & ruler_children = time_canvas_vbox.children();
+ BoxList & lab_children = time_button_vbox.children();
+
+ BoxList::iterator canvaspos = ruler_children.begin();
+
+ lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START));
+ lab_children.push_back (Element(tempo_label, PACK_SHRINK, PACK_START));
+ lab_children.push_back (Element(range_mark_label, PACK_SHRINK, PACK_START));
+ lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START));
+ lab_children.push_back (Element(cd_mark_label, PACK_SHRINK, PACK_START));
+ lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START));
+
+ ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
+ ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
+ ruler_lab_children.push_back (Element(smpte_label, PACK_SHRINK, PACK_START));
+ ruler_children.insert (canvaspos, Element(*smpte_ruler, PACK_SHRINK, PACK_START));
+ ruler_lab_children.push_back (Element(frame_label, PACK_SHRINK, PACK_START));
+ ruler_children.insert (canvaspos, Element(*frames_ruler, PACK_SHRINK, PACK_START));
+ ruler_lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START));
+ ruler_children.insert (canvaspos, Element(*bbt_ruler, PACK_SHRINK, PACK_START));
+
+ 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_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));
+
+ 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));
+
+ visible_timebars = 0; /*this will be changed below */
ruler_pressed_button = 0;
+ canvas_timebars_vsize = 0;
}
bool
Editor::ruler_scroll (GdkEventScroll* event)
{
- nframes_t xdelta;
+ nframes64_t xdelta;
int direction = event->direction;
bool handled = false;
/* 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:
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:
track_canvas->c2w (x, y, wcx, wcy);
track_canvas->w2c (wcx, wcy, cx, cy);
- nframes_t where = leftmost_frame + pixel_to_frame (x);
+ nframes64_t where = leftmost_frame + pixel_to_frame (x);
/// ripped from maybe_autoscroll, and adapted to work here
- nframes_t rightmost_frame = leftmost_frame + current_page_frames ();
+ nframes64_t rightmost_frame = leftmost_frame + current_page_frames ();
jack_nframes_t frame = pixel_to_frame (cx);
if (autoscroll_timeout_tag < 0) {
if (frame > rightmost_frame) {
if (rightmost_frame < max_frames) {
- start_canvas_autoscroll (1);
+ start_canvas_autoscroll (1, 0);
}
} else if (frame < leftmost_frame) {
if (leftmost_frame > 0) {
- start_canvas_autoscroll (-1);
+ start_canvas_autoscroll (-1, 0);
}
}
} else {
void
-Editor::popup_ruler_menu (nframes_t where, ItemType t)
+Editor::popup_ruler_menu (nframes64_t where, ItemType t)
{
using namespace Menu_Helpers;
ruler_items.push_back (MenuElem (*action->create_menu_item()));
}
- editor_ruler_menu->popup (1, gtk_get_current_event_time());
+ editor_ruler_menu->popup (1, gtk_get_current_event_time());
no_ruler_shown_update = false;
}
if (node) {
if ((prop = node->property ("smpte")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_timecode_action->set_active (true);
- else
+ } else {
ruler_timecode_action->set_active (false);
+ }
}
if ((prop = node->property ("bbt")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_bbt_action->set_active (true);
- else
+ } else {
ruler_bbt_action->set_active (false);
+ }
}
if ((prop = node->property ("frames")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_samples_action->set_active (true);
- else
+ } else {
ruler_samples_action->set_active (false);
+ }
}
if ((prop = node->property ("minsec")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_minsec_action->set_active (true);
- else
+ } else {
ruler_minsec_action->set_active (false);
+ }
}
if ((prop = node->property ("tempo")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_tempo_action->set_active (true);
- else
+ } else {
ruler_tempo_action->set_active (false);
+ }
}
if ((prop = node->property ("meter")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_meter_action->set_active (true);
- else
+ } else {
ruler_meter_action->set_active (false);
+ }
}
if ((prop = node->property ("marker")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_marker_action->set_active (true);
- else
+ } else {
ruler_marker_action->set_active (false);
+ }
}
if ((prop = node->property ("rangemarker")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_range_action->set_active (true);
- else
+ } else {
ruler_range_action->set_active (false);
+ }
}
if ((prop = node->property ("transportmarker")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_loop_punch_action->set_active (true);
- else
+ } else {
ruler_loop_punch_action->set_active (false);
+ }
}
if ((prop = node->property ("cdmarker")) != 0) {
- if (prop->value() == "yes")
+ if (prop->value() == "yes") {
ruler_cd_marker_action->set_active (true);
- else
+ } else {
ruler_cd_marker_action->set_active (false);
+ }
} else {
// this session doesn't yet know about the cdmarker ruler
}
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_children = time_canvas_vbox.children();
+ int visible_rulers = 0;
if (no_ruler_shown_update) {
return;
visible_timebars = 0;
- lab_children.clear();
-
- // leave the last one (the time_canvas) intact
- while (ruler_children.size() > 1) {
- ruler_children.pop_front();
- }
-
- BoxList::iterator canvaspos = ruler_children.begin();
-
- _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]);
-
- _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]);
-
- _frames_ruler = gtk_custom_hruler_new ();
- frames_ruler = Glib::wrap (_frames_ruler);
- frames_ruler->set_name ("FramesRuler");
- frames_ruler->set_size_request (-1, (int)timebar_height);
- gtk_custom_ruler_set_metric (GTK_CUSTOM_RULER(_frames_ruler), &ruler_metrics[ruler_metric_frames]);
-
- _minsec_ruler = gtk_custom_hruler_new ();
- minsec_ruler = Glib::wrap (_minsec_ruler);
- minsec_ruler->set_name ("MinSecRuler");
- 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->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_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));
-
- 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_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++;
+ visible_rulers++;
+ minsec_label.show ();
+ minsec_ruler->show ();
+ } else {
+ minsec_label.hide ();
+ minsec_ruler->hide ();
}
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++;
+ visible_rulers++;
+ smpte_label.show ();
+ smpte_ruler->show ();
+ } else {
+ smpte_label.hide ();
+ smpte_ruler->hide ();
}
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++;
+ visible_rulers++;
+ frame_label.show ();
+ frames_ruler->show ();
+ } else {
+ frame_label.hide ();
+ frames_ruler->hide ();
}
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++;
- }
-
- double tbpos = 1.0;
- double old_unit_pos ;
-
+ visible_rulers++;
+ bbt_label.show ();
+ bbt_ruler->show ();
+ } else {
+ bbt_label.hide ();
+ bbt_ruler->hide ();
+ }
+
+ double tbpos = 0.0;
+ double tbgpos = 0.0;
+ double old_unit_pos;
+
+#ifdef GTKOSX
+ /* gtk update probs require this (damn) */
+ meter_label.hide();
+ tempo_label.hide();
+ range_mark_label.hide();
+ transport_mark_label.hide();
+ cd_mark_label.hide();
+ mark_label.hide();
+#endif
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();
+ meter_label.show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ meter_bar_group->hide();
meter_group->hide();
+ meter_label.hide();
}
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();
+ tempo_label.show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ tempo_bar_group->hide();
tempo_group->hide();
+ tempo_label.hide();
}
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();
- cerr << "range_marker_group now at " << range_marker_group->property_y() << endl;
+ range_mark_label.show();
+
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
} else {
+ range_marker_bar_group->hide();
range_marker_group->hide();
+ range_mark_label.hide();
}
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();
+ transport_mark_label.show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ transport_marker_bar_group->hide();
transport_marker_group->hide();
+ transport_mark_label.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();
+ cd_mark_label.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 {
+ } else {
+ cd_marker_bar_group->hide();
cd_marker_group->hide();
+ cd_mark_label.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();
+ mark_label.show();
tbpos += timebar_height;
+ tbgpos += timebar_height;
visible_timebars++;
- }
- else {
+ } else {
+ marker_bar_group->hide();
marker_group->hide();
+ mark_label.hide();
}
-
- time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars));
- time_canvas_event_box.queue_resize();
- compute_fixed_ruler_scale();
- update_fixed_rulers();
- time_canvas_event_box.show_all();
- time_button_frame.show_all();
+ gdouble old_canvas_timebars_vsize = canvas_timebars_vsize;
+ canvas_timebars_vsize = (timebar_height * visible_timebars) - 1;
+ gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize;
+ vertical_adjustment.set_upper(vertical_adjustment.get_upper() + vertical_pos_delta);
+ full_canvas_height += vertical_pos_delta;
+
+ if (vertical_adjustment.get_value() != 0 && (vertical_adjustment.get_value() + canvas_height >= full_canvas_height)) {
+ /*if we're at the bottom of the canvas, don't move the _trackview_group*/
+ vertical_adjustment.set_value (full_canvas_height - canvas_height + 1);
+ } else {
+ _trackview_group->property_y () = - get_trackview_group_vertical_offset ();
+ _background_group->property_y () = - get_trackview_group_vertical_offset ();
+ _trackview_group->move (0, 0);
+ _background_group->move (0, 0);
+ last_trackview_group_vertical_offset = get_trackview_group_vertical_offset ();
+ }
+
+ gdouble bottom_track_pos = vertical_adjustment.get_value() + canvas_height - canvas_timebars_vsize;
+ std::pair<TimeAxisView*, int> const p = trackview_by_y_position (bottom_track_pos);
+ if (p.first) {
+ p.first->clip_to_viewport ();
+ }
- compute_current_bbt_points (leftmost_frame, leftmost_frame + (nframes_t)(edit_packer.get_width() * frames_per_unit));
- compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + (nframes_t)(edit_packer.get_width() * frames_per_unit));
+ ruler_label_vbox.set_size_request (-1, (int)(timebar_height * visible_rulers));
+ time_canvas_vbox.set_size_request (-1,-1);
+ update_fixed_rulers();
redisplay_tempo (false);
}
return;
}
- nframes_t rightmost_frame = leftmost_frame + current_page_frames();
+ nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
if (ruler_timecode_action->get_active()) {
gtk_custom_ruler_set_range (GTK_CUSTOM_RULER(_smpte_ruler), leftmost_frame, rightmost_frame,
}
if (ruler_timecode_action->get_active()) {
- set_smpte_ruler_scale (leftmost_frame, leftmost_frame + (edit_packer.get_width() * frames_per_unit) );
+ set_smpte_ruler_scale (leftmost_frame, leftmost_frame + current_page_frames() );
}
if (ruler_minsec_action->get_active()) {
- set_minsec_ruler_scale (leftmost_frame, leftmost_frame + (edit_packer.get_width() * frames_per_unit) );
+ set_minsec_ruler_scale (leftmost_frame, leftmost_frame + current_page_frames() );
}
}
void
Editor::update_fixed_rulers ()
{
- nframes_t rightmost_frame;
+ nframes64_t rightmost_frame;
if (session == 0) {
return;
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 + current_page_frames ();
+ 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.
void
Editor::set_smpte_ruler_scale (gdouble lower, gdouble upper)
{
- nframes_t range;
- nframes_t spacer;
- nframes_t fr;
+ nframes64_t range;
+ nframes64_t spacer;
+ nframes64_t fr;
if (session == 0) {
return;
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 */
smpte_ruler_scale = smpte_show_bits;
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
smpte_ruler_scale = smpte_show_frames;
smpte_mark_modulo = 1;
- smpte_nmarks = 2 + (range / (nframes_t)session->frames_per_smpte_frame());
+ smpte_nmarks = 2 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
smpte_ruler_scale = smpte_show_frames;
smpte_mark_modulo = 2;
- smpte_nmarks = 2 + (range / (nframes_t)session->frames_per_smpte_frame());
+ smpte_nmarks = 2 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= fr) { /* 0.5-1 second */
smpte_ruler_scale = smpte_show_frames;
smpte_mark_modulo = 5;
- smpte_nmarks = 2 + (range / (nframes_t)session->frames_per_smpte_frame());
+ smpte_nmarks = 2 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= 2 * fr) { /* 1-2 seconds */
smpte_ruler_scale = smpte_show_frames;
smpte_mark_modulo = 10;
- smpte_nmarks = 2 + (range / (nframes_t)session->frames_per_smpte_frame());
+ smpte_nmarks = 2 + (range / (nframes64_t)session->frames_per_smpte_frame());
} else if (range <= 8 * fr) { /* 2-8 seconds */
smpte_ruler_scale = smpte_show_seconds;
smpte_mark_modulo = 1;
smpte_nmarks = 2 + 24;
} else {
- /* not possible if nframes_t is a 32 bit quantity */
+ /* not possible if nframes64_t is a 32 bit quantity */
smpte_ruler_scale = smpte_show_hours;
smpte_mark_modulo = 4;
Editor::metric_get_smpte (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
{
nframes_t pos;
- nframes_t spacer;
+ nframes64_t spacer;
SMPTE::Time smpte;
gchar buf[16];
gint n;
return 0;
}
- 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;
void
-Editor::compute_bbt_ruler_scale (nframes_t lower, nframes_t upper)
+Editor::compute_bbt_ruler_scale (nframes64_t lower, nframes64_t upper)
{
if (session == 0) {
return;
char buf[64];
gint n = 0;
- nframes_t pos;
+ nframes64_t pos;
BBT_Time next_beat;
- nframes_t next_beat_pos;
+ nframes64_t next_beat_pos;
uint32_t beats = 0;
uint32_t tick = 0;
uint32_t skip;
uint32_t t;
- nframes_t frame_skip;
+ nframes64_t frame_skip;
double frame_skip_error;
double bbt_position_of_helper;
double accumulated_error;
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);
snprintf (buf, sizeof(buf), " ");
(*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;
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;
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;
void
Editor::set_minsec_ruler_scale (gdouble lower, gdouble upper)
{
- nframes_t range;
- nframes_t fr;
- nframes_t spacer;
+ nframes64_t range;
+ nframes64_t fr;
+ nframes64_t spacer;
if (session == 0) {
return;
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 -= spacer;
} else {
lower = 0;
}
upper += spacer;
- range = (nframes_t) (upper - lower);
+ range = (nframes64_t) (upper - lower);
if (range < (fr / 50)) {
minsec_mark_interval = fr / 1000; /* show 1/1000 seconds */
minsec_mark_modulo = 2;
} else {
- /* not possible if nframes_t is a 32 bit quantity */
+ /* not possible if nframes64_t is a 32 bit quantity */
minsec_mark_interval = 4 * 60 * 60 * fr; /* show 4 hrs */
}
gint
Editor::metric_get_minsec (GtkCustomRulerMark **marks, gdouble lower, gdouble upper, gint maxchars)
{
- nframes_t pos;
- nframes_t spacer;
+ nframes64_t pos;
+ nframes64_t spacer;
long hrs, mins, secs, millisecs;
gchar buf[16];
gint n;
}
/* 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;
}
*marks = (GtkCustomRulerMark *) g_malloc (sizeof(GtkCustomRulerMark) * minsec_nmarks);
- pos = ((((nframes_t) floor(lower)) + (minsec_mark_interval/2))/minsec_mark_interval) * minsec_mark_interval;
+ pos = ((((nframes64_t) floor(lower)) + (minsec_mark_interval/2))/minsec_mark_interval) * minsec_mark_interval;
switch (minsec_ruler_scale) {
case minsec_show_seconds:
for (n = 0; n < minsec_nmarks; pos += minsec_mark_interval, ++n) {