13
0

Some cleanups to ruler drags.

git-svn-id: svn://localhost/ardour2/branches/3.0@5185 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-06-14 13:31:46 +00:00
parent 3f261ac90c
commit b192de88b6
4 changed files with 38 additions and 125 deletions

View File

@ -696,7 +696,6 @@ class Editor : public PublicEditor
gint ruler_mouse_motion (GdkEventMotion*); gint ruler_mouse_motion (GdkEventMotion*);
bool ruler_scroll (GdkEventScroll* event); bool ruler_scroll (GdkEventScroll* event);
gint ruler_pressed_button;
Gtk::Widget * ruler_grabbed_widget; Gtk::Widget * ruler_grabbed_widget;
void initialize_rulers (); void initialize_rulers ();

View File

@ -602,6 +602,8 @@ Editor::autoscroll_canvas ()
double new_pixel; double new_pixel;
double target_pixel; double target_pixel;
assert (_drag);
if (autoscroll_x_distance != 0) { if (autoscroll_x_distance != 0) {
if (autoscroll_x > 0) { if (autoscroll_x > 0) {
autoscroll_x_distance = (unit_to_frame (_drag->current_pointer_x()) - (leftmost_frame + current_page_frames())) / 3; autoscroll_x_distance = (unit_to_frame (_drag->current_pointer_x()) - (leftmost_frame + current_page_frames())) / 3;

View File

@ -34,6 +34,7 @@
#include "gtk-custom-hruler.h" #include "gtk-custom-hruler.h"
#include "gui_thread.h" #include "gui_thread.h"
#include "time_axis_view.h" #include "time_axis_view.h"
#include "editor_drag.h"
#include "i18n.h" #include "i18n.h"
@ -159,7 +160,6 @@ Editor::initialize_rulers ()
minsec_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 */ visible_timebars = 0; /*this will be changed below */
ruler_pressed_button = 0;
canvas_timebars_vsize = 0; canvas_timebars_vsize = 0;
} }
@ -217,50 +217,37 @@ Editor::ruler_button_press (GdkEventButton* ev)
return FALSE; return FALSE;
} }
ruler_pressed_button = ev->button;
// jlc: grab ev->window ? // jlc: grab ev->window ?
//Gtk::Main::grab_add (*minsec_ruler); //Gtk::Main::grab_add (*minsec_ruler);
Widget * grab_widget = 0; Widget * grab_widget = 0;
if (smpte_ruler->is_realized() && ev->window == smpte_ruler->get_window()->gobj()) grab_widget = smpte_ruler; if (smpte_ruler->is_realized() && ev->window == smpte_ruler->get_window()->gobj()) {
else if (bbt_ruler->is_realized() && ev->window == bbt_ruler->get_window()->gobj()) grab_widget = bbt_ruler; grab_widget = smpte_ruler;
else if (frames_ruler->is_realized() && ev->window == frames_ruler->get_window()->gobj()) grab_widget = frames_ruler; } else if (bbt_ruler->is_realized() && ev->window == bbt_ruler->get_window()->gobj()) {
else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) grab_widget = minsec_ruler; grab_widget = bbt_ruler;
} else if (frames_ruler->is_realized() && ev->window == frames_ruler->get_window()->gobj()) {
grab_widget = frames_ruler;
} else if (minsec_ruler->is_realized() && ev->window == minsec_ruler->get_window()->gobj()) {
grab_widget = minsec_ruler;
}
if (grab_widget) { if (grab_widget) {
grab_widget->add_modal_grab (); grab_widget->add_modal_grab ();
ruler_grabbed_widget = grab_widget; ruler_grabbed_widget = grab_widget;
} }
gint x,y; if (ev->button == 1) {
Gdk::ModifierType state;
/* need to use the correct x,y, the event lies */
time_canvas_event_box.get_window()->get_pointer (x, y, state);
nframes64_t where = leftmost_frame + pixel_to_frame (x);
switch (ev->button) {
case 1:
// Since we will locate the playhead on button release, cancel any running // Since we will locate the playhead on button release, cancel any running
// auditions. // auditions.
if (session->is_auditioning()) { if (session->is_auditioning()) {
session->cancel_audition (); session->cancel_audition ();
} }
/* playhead cursor */ /* playhead cursor */
snap_to (where); assert (_drag == 0);
playhead_cursor->set_position (where); _drag = new CursorDrag (this, &playhead_cursor->canvas_item, false);
_drag->start_grab (reinterpret_cast<GdkEvent *> (ev));
_dragging_playhead = true; _dragging_playhead = true;
break;
case 2:
/* edit point */
snap_to (where);
break;
default:
break;
} }
return TRUE; return TRUE;
@ -269,46 +256,31 @@ Editor::ruler_button_press (GdkEventButton* ev)
gint gint
Editor::ruler_button_release (GdkEventButton* ev) Editor::ruler_button_release (GdkEventButton* ev)
{ {
gint x,y;
Gdk::ModifierType state;
/* need to use the correct x,y, the event lies */
time_canvas_event_box.get_window()->get_pointer (x, y, state);
ruler_pressed_button = 0;
if (session == 0) { if (session == 0) {
return FALSE; return FALSE;
} }
gint x,y;
Gdk::ModifierType state;
if (_drag) {
_drag->end_grab (reinterpret_cast<GdkEvent*> (ev));
delete _drag;
_drag = 0;
_dragging_playhead = false;
}
if (ev->button == 3) {
/* need to use the correct x,y, the event lies */
time_canvas_event_box.get_window()->get_pointer (x, y, state);
stop_canvas_autoscroll(); stop_canvas_autoscroll();
nframes64_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);
break;
case 2:
/* edit point */
snap_to (where);
break;
case 3:
/* popup menu */
snap_to (where); snap_to (where);
popup_ruler_menu (where); popup_ruler_menu (where);
break;
default:
break;
} }
if (ruler_grabbed_widget) { if (ruler_grabbed_widget) {
ruler_grabbed_widget->remove_modal_grab(); ruler_grabbed_widget->remove_modal_grab();
ruler_grabbed_widget = 0; ruler_grabbed_widget = 0;
@ -334,72 +306,12 @@ Editor::ruler_label_button_release (GdkEventButton* ev)
gint gint
Editor::ruler_mouse_motion (GdkEventMotion* ev) Editor::ruler_mouse_motion (GdkEventMotion* ev)
{ {
if (session == 0 || !ruler_pressed_button) { if (session == 0) {
return FALSE; return FALSE;
} }
double wcx=0,wcy=0; if (_drag) {
double cx=0,cy=0; _drag->motion_handler (reinterpret_cast<GdkEvent*> (ev), false);
gint x,y;
Gdk::ModifierType state;
/* 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);
nframes64_t where = leftmost_frame + pixel_to_frame (x);
/// ripped from maybe_autoscroll, and adapted to work here
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, 0);
}
} else if (frame < leftmost_frame) {
if (leftmost_frame > 0) {
start_canvas_autoscroll (-1, 0);
}
}
} else {
if (frame >= leftmost_frame && frame < rightmost_frame) {
stop_canvas_autoscroll ();
}
}
//////
snap_to (where);
EditorCursor* cursor = 0;
switch (ruler_pressed_button) {
case 1:
/* transport playhead */
cursor = playhead_cursor;
break;
case 2:
/* edit point */
// EDIT CURSOR XXX do something useful
break;
default:
break;
}
if (cursor) {
cursor->set_position (where);
if (cursor == playhead_cursor) {
UpdateAllTransportClocks (cursor->current_frame);
}
} }
return TRUE; return TRUE;