#include "simpleline_p.h"
#include "imageframe_p.h"
#include "canvas_impl.h"
+#include "canvas-noevent-text.h"
#include "editing.h"
#include "rgb_macros.h"
#include "utils.h"
#include "i18n.h"
using namespace std;
-using namespace sigc;
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
Pango::FontDescription* font = get_font_for_style (N_("VerboseCanvasCursor"));
- verbose_canvas_cursor = new ArdourCanvas::Text (*track_canvas->root());
+ verbose_canvas_cursor = new ArdourCanvas::NoEventText (*track_canvas->root());
verbose_canvas_cursor->property_font_desc() = *font;
verbose_canvas_cursor->property_anchor() = ANCHOR_NW;
zoom_rect->property_outline_pixels() = 1;
zoom_rect->hide();
- zoom_rect->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0));
+ zoom_rect->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0));
// used as rubberband rect
rubberband_rect = new ArdourCanvas::SimpleRect (*_trackview_group, 0.0, 0.0, 0.0, 0.0);
rubberband_rect->property_outline_pixels() = 1;
rubberband_rect->hide();
- tempo_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_tempo_bar_event), tempo_bar));
- meter_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_meter_bar_event), meter_bar));
- marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_marker_bar_event), marker_bar));
- cd_marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_cd_marker_bar_event), cd_marker_bar));
- range_marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_range_marker_bar_event), range_marker_bar));
- transport_marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_transport_marker_bar_event), transport_marker_bar));
+ tempo_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_tempo_bar_event), tempo_bar));
+ meter_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_meter_bar_event), meter_bar));
+ marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_marker_bar_event), marker_bar));
+ cd_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_cd_marker_bar_event), cd_marker_bar));
+ range_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_range_marker_bar_event), range_marker_bar));
+ transport_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_transport_marker_bar_event), transport_marker_bar));
playhead_cursor = new EditorCursor (*this, &Editor::canvas_playhead_cursor_event);
}
/* need to handle 4 specific types of events as catch-alls */
- track_canvas->signal_scroll_event().connect (mem_fun (*this, &Editor::track_canvas_scroll_event));
- track_canvas->signal_motion_notify_event().connect (mem_fun (*this, &Editor::track_canvas_motion_notify_event));
- track_canvas->signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event));
- track_canvas->signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event));
- track_canvas->signal_drag_motion().connect (mem_fun (*this, &Editor::track_canvas_drag_motion));
+ track_canvas->signal_scroll_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_scroll_event));
+ track_canvas->signal_motion_notify_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_motion_notify_event));
+ track_canvas->signal_button_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_press_event));
+ track_canvas->signal_button_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_release_event));
+ track_canvas->signal_drag_motion().connect (sigc::mem_fun (*this, &Editor::track_canvas_drag_motion));
track_canvas->set_name ("EditorMainCanvas");
track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
- track_canvas->signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas));
- track_canvas->signal_enter_notify_event().connect (mem_fun(*this, &Editor::entered_track_canvas));
+ track_canvas->signal_leave_notify_event().connect (sigc::mem_fun(*this, &Editor::left_track_canvas));
+ track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas));
track_canvas->set_flags (CAN_FOCUS);
/* set up drag-n-drop */
target_table.push_back (TargetEntry ("application/x-rootwin-drop"));
track_canvas->drag_dest_set (target_table);
- track_canvas->signal_drag_data_received().connect (mem_fun(*this, &Editor::track_canvas_drag_data_received));
+ track_canvas->signal_drag_data_received().connect (sigc::mem_fun(*this, &Editor::track_canvas_drag_data_received));
- track_canvas->signal_size_allocate().connect (mem_fun(*this, &Editor::track_canvas_allocate));
+ track_canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &Editor::track_canvas_allocate));
- ColorsChanged.connect (mem_fun (*this, &Editor::color_handler));
+ ColorsChanged.connect (sigc::mem_fun (*this, &Editor::color_handler));
color_handler();
}
_canvas_width = canvas_allocation.get_width();
_canvas_height = canvas_allocation.get_height();
- if (session) {
+ if (_session) {
TrackViewList::iterator i;
double height = 0;
}
}
- handle_new_duration ();
- reset_hscrollbar_stepping ();
update_fixed_rulers();
redisplay_tempo (false);
_summary->set_overlays_dirty ();
}
if (changed) {
- controls_layout_size_request_connection = controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
+ controls_layout_size_request_connection = controls_layout.signal_size_request().connect (sigc::mem_fun (*this, &Editor::controls_layout_size_request));
}
//cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG
}
return false;
}
+/** This is called when something is dropped onto the track canvas */
void
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
int x, int y,
/* check that its an audio track, not a bus */
- if (tv->get_diskstream()) {
+ if (tv->track()) {
/* select the track, then embed/import */
selection->set (tv);
the main event loop with GTK/Quartz. Since import/embed wants
to push up a progress dialog, defer all this till we go idle.
*/
- Glib::signal_idle().connect (bind (mem_fun (*this, &Editor::idle_drop_paths), paths, frame, cy));
+ Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &Editor::idle_drop_paths), paths, frame, cy));
#else
drop_paths_part_two (paths, frame, cy);
#endif
const SelectionData& /*data*/,
guint /*info*/, guint /*time*/)
{
- assert (_drag);
- _drag->end_grab (0);
- delete _drag;
- _drag = 0;
+ _drags->end_grab (0);
}
void
Editor::maybe_autoscroll (GdkEventMotion* event, bool allow_vert)
{
nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
- nframes64_t frame = _drag->current_pointer_frame();
bool startit = false;
autoscroll_y = 0;
startit = true;
}
- if (frame > rightmost_frame) {
-
+ if (_drags->current_pointer_frame() > rightmost_frame) {
if (rightmost_frame < max_frames) {
autoscroll_x = 1;
startit = true;
}
-
- } else if (frame < leftmost_frame) {
+ } else if (_drags->current_pointer_frame() < leftmost_frame) {
if (leftmost_frame > 0) {
autoscroll_x = -1;
startit = true;
}
-
}
if (!allow_vertical_scroll) {
double new_pixel;
double target_pixel;
- assert (_drag);
-
if (autoscroll_x_distance != 0) {
+
if (autoscroll_x > 0) {
- autoscroll_x_distance = (unit_to_frame (_drag->current_pointer_x()) - (leftmost_frame + current_page_frames())) / 3;
+ autoscroll_x_distance = (_drags->current_pointer_frame() - (leftmost_frame + current_page_frames())) / 3;
} else if (autoscroll_x < 0) {
- autoscroll_x_distance = (leftmost_frame - unit_to_frame (_drag->current_pointer_x())) / 3;
+ autoscroll_x_distance = (leftmost_frame - _drags->current_pointer_frame()) / 3;
}
}
if (autoscroll_y_distance != 0) {
if (autoscroll_y > 0) {
- autoscroll_y_distance = (_drag->current_pointer_y() - (get_trackview_group_vertical_offset() + _canvas_height)) / 3;
+ autoscroll_y_distance = (_drags->current_pointer_y() - (get_trackview_group_vertical_offset() + _canvas_height)) / 3;
} else if (autoscroll_y < 0) {
- autoscroll_y_distance = (vertical_adjustment.get_value () - _drag->current_pointer_y()) / 3;
+ autoscroll_y_distance = (vertical_adjustment.get_value () - _drags->current_pointer_y()) / 3;
}
}
new_pixel = vertical_pos - autoscroll_y_distance;
}
- target_pixel = _drag->current_pointer_y() - autoscroll_y_distance;
+ target_pixel = _drags->current_pointer_y() - autoscroll_y_distance;
target_pixel = max (target_pixel, 0.0);
} else if (autoscroll_y > 0) {
new_pixel = min (top_of_bottom_of_canvas, new_pixel);
- target_pixel = _drag->current_pointer_y() + autoscroll_y_distance;
+ target_pixel = _drags->current_pointer_y() + autoscroll_y_distance;
/* don't move to the full canvas height because the item will be invisible
(its top edge will line up with the bottom of the visible canvas.
target_pixel = min (target_pixel, full_canvas_height - 10);
} else {
- target_pixel = _drag->current_pointer_y();
+ target_pixel = _drags->current_pointer_y();
new_pixel = vertical_pos;
}
Gdk::ModifierType mask;
canvas_window->get_pointer (x, y, mask);
ev.type = GDK_MOTION_NOTIFY;
- ev.state &= Gdk::BUTTON1_MASK;
+ ev.state = Gdk::BUTTON1_MASK;
ev.x = x;
ev.y = y;
- motion_handler (_drag->item(), (GdkEvent*) &ev, true);
+ motion_handler (0, (GdkEvent*) &ev, true);
autoscroll_cnt++;
void
Editor::start_canvas_autoscroll (int dx, int dy)
{
- if (!session || autoscroll_active) {
+ if (!_session || autoscroll_active) {
return;
}
bool
Editor::left_track_canvas (GdkEventCrossing */*ev*/)
{
+ DropDownKeys ();
set_entered_track (0);
set_entered_regionview (0);
reset_canvas_action_sensitivity (false);
}
void
-Editor::scroll_canvas_horizontally ()
+Editor::set_horizontal_position (double p)
{
/* horizontal scrolling only */
double x1, y1, x2, y2, x_delta;
_master_group->get_bounds (x1, y1, x2, y2);
- x_delta = - (x1 + horizontal_adjustment.get_value());
+ x_delta = - (x1 + p);
_master_group->move (x_delta, 0);
timebar_group->move (x_delta, 0);
time_line_group->move (x_delta, 0);
cursor_group->move (x_delta, 0);
- leftmost_frame = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
+ leftmost_frame = (nframes64_t) floor (p * frames_per_unit);
update_fixed_rulers ();
redisplay_tempo (true);
}
#ifndef GTKOSX
- if (!autoscroll_active) {
+ if (!autoscroll_active && !_stationary_playhead) {
/* force rulers and canvas to move in lock step */
while (gtk_events_pending ()) {
gtk_main_iteration ();
/*
redisplay_tempo (true);
- if (session)
- session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
+ if (_session)
+ _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
*/
}
track_canvas->update_now ();
}
}
+
+double
+Editor::horizontal_position () const
+{
+ return frame_to_unit (leftmost_frame);
+}