Reinstate mouse scroll actions (audio clocks, shuttle wheel, faders), clearing selection is undoable, fix compiler warning, add modified patch by Jon Michael Smith for mouse wheel track height adjustment and vertical canvas scrolling (thanks Jon)

git-svn-id: svn://localhost/trunk/ardour2@449 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Nick Mainsbridge 2006-04-10 02:14:05 +00:00
parent e9f9ca5278
commit 7e8a982245
11 changed files with 189 additions and 55 deletions

View File

@ -408,6 +408,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI
gint shuttle_box_button_press (GdkEventButton*);
gint shuttle_box_button_release (GdkEventButton*);
gint shuttle_box_scroll (GdkEventScroll*);
gint shuttle_box_motion (GdkEventMotion*);
gint shuttle_box_expose (GdkEventExpose*);
gint mouse_shuttle (double x, bool force);

View File

@ -306,11 +306,12 @@ ARDOUR_UI::setup_transport ()
ARDOUR_UI::instance()->tooltips().set_tip (speed_display_box, _("Current transport speed"));
shuttle_box.set_flags (CAN_FOCUS);
shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK);
shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
shuttle_box.set_size_request (100, 15);
shuttle_box.signal_button_press_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_press));
shuttle_box.signal_button_release_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_button_release));
shuttle_box.signal_scroll_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_scroll));
shuttle_box.signal_motion_notify_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_motion));
shuttle_box.signal_expose_event().connect (mem_fun(*this, &ARDOUR_UI::shuttle_box_expose));
@ -683,6 +684,28 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
return true;
}
gint
ARDOUR_UI::shuttle_box_scroll (GdkEventScroll* ev)
{
if (!session) {
return true;
}
switch (ev->direction) {
case GDK_SCROLL_UP:
shuttle_fract += 0.005;
break;
case GDK_SCROLL_DOWN:
shuttle_fract -= 0.005;
break;
}
use_shuttle_fract (true);
return true;
}
gint
ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
{

View File

@ -186,7 +186,7 @@ AudioClock::AudioClock (const string& name, bool allow_edit, bool duration, bool
stays disabled.
*/
clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
clock_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::SCROLL_MASK);
clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours));
if (editable) {
@ -201,17 +201,17 @@ AudioClock::setup_events ()
{
clock_base.set_flags (Gtk::CAN_FOCUS);
hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
bars_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
beats_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
ticks_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
ms_hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
ms_minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
ms_seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
audio_frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK);
hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
bars_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
beats_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
ticks_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
ms_hours_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
ms_minutes_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
ms_seconds_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
audio_frames_ebox.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
hours_ebox.set_flags (Gtk::CAN_FOCUS);
minutes_ebox.set_flags (Gtk::CAN_FOCUS);
@ -261,6 +261,18 @@ AudioClock::setup_events ()
ms_minutes_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Minutes));
ms_seconds_ebox.signal_button_release_event().connect (bind (mem_fun(*this, &AudioClock::field_button_release_event), MS_Seconds));
hours_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Hours));
minutes_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Minutes));
seconds_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Seconds));
frames_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), SMPTE_Frames));
audio_frames_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), AudioFrames));
bars_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Bars));
beats_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Beats));
ticks_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), Ticks));
ms_hours_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Hours));
ms_minutes_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Minutes));
ms_seconds_ebox.signal_scroll_event().connect (bind (mem_fun(*this, &AudioClock::field_button_scroll_event), MS_Seconds));
hours_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Hours));
minutes_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Minutes));
seconds_ebox.signal_key_release_event().connect (bind (mem_fun(*this, &AudioClock::field_key_release_event), SMPTE_Seconds));
@ -984,6 +996,51 @@ AudioClock::field_button_press_event (GdkEventButton *ev, Field field)
return TRUE;
}
bool
AudioClock::field_button_scroll_event (GdkEventScroll *ev, Field field)
{
if (session == 0) return FALSE;
jack_nframes_t frames = 0;
switch (ev->direction) {
case GDK_SCROLL_UP:
frames = get_frames (field);
if (frames != 0) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
frames *= 10;
}
set (current_time() + frames, true);
ValueChanged (); /* EMIT_SIGNAL */
}
break;
case GDK_SCROLL_DOWN:
frames = get_frames (field);
if (frames != 0) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
frames *= 10;
}
if ((double)current_time() - (double)frames < 0.0) {
set (0, true);
} else {
set (current_time() - frames, true);
}
ValueChanged (); /* EMIT_SIGNAL */
}
break;
default:
return FALSE;
break;
}
return TRUE;
}
bool
AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field)
{

View File

@ -153,6 +153,7 @@ class AudioClock : public Gtk::HBox
bool field_motion_notify_event (GdkEventMotion *ev, Field);
bool field_button_press_event (GdkEventButton *ev, Field);
bool field_button_release_event (GdkEventButton *ev, Field);
bool field_button_scroll_event (GdkEventScroll *ev, Field);
bool field_key_release_event (GdkEventKey *, Field);
bool field_focus_in_event (GdkEventFocus *, Field);
bool field_focus_out_event (GdkEventFocus *, Field);

View File

@ -966,7 +966,7 @@ Editor::control_scroll (float fraction)
} else if ((fraction > 0.0f) && (max_frames - session->transport_frame() < step)) {
target = (max_frames - (current_page_frames()*2)); // allow room for slop in where the PH is on the screen
} else {
target = (session->transport_frame() + (fraction * current_page_frames()));
target = (session->transport_frame() + (jack_nframes_t)(fraction * current_page_frames()));
}
/* move visuals, we'll catch up with it later */

View File

@ -49,7 +49,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
{
int x, y;
double wx, wy;
switch (ev->direction) {
case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
@ -72,6 +72,16 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
jack_nframes_t where = event_frame (&event, 0, 0);
temporal_zoom_to_frame (true, where);
return true;
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
if (!(current_stepping_trackview = dynamic_cast<AudioTimeAxisView*> (trackview_by_y_position (ev->y)))) {
return false;
}
}
gettimeofday (&last_track_height_step_timestamp, 0);
current_stepping_trackview->step_height (true);
return true;
} else {
scroll_tracks_up_line ();
return true;
@ -94,15 +104,15 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
temporal_zoom_to_frame (false, where);
return true;
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
if (clicked_trackview) {
if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
current_stepping_trackview = clicked_trackview;
}
gettimeofday (&last_track_height_step_timestamp, 0);
current_stepping_trackview->step_height (true);
if (!current_stepping_trackview) {
step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
if (!(current_stepping_trackview = dynamic_cast<AudioTimeAxisView*> (trackview_by_y_position (ev->y)))) {
return false;
}
}
return true;
gettimeofday (&last_track_height_step_timestamp, 0);
current_stepping_trackview->step_height (false);
return true;
} else {
scroll_tracks_down_line ();
return true;

View File

@ -3609,11 +3609,13 @@ Editor::start_selection_grab (ArdourCanvas::Item* item, GdkEvent* event)
void
Editor::cancel_selection ()
{
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(*i)->hide_selection ();
}
begin_reversible_command (_("cancel selection"));
selection->clear ();
clicked_selection = 0;
commit_reversible_command ();
}
void

View File

@ -984,7 +984,12 @@ Editor::scroll_tracks_down ()
cnt = (int) floor (prefix);
}
vertical_adjustment.set_value (vertical_adjustment.get_value() + (cnt * vertical_adjustment.get_page_size()));
double vert_value = vertical_adjustment.get_value() + (cnt *
vertical_adjustment.get_page_size());
if (vert_value > vertical_adjustment.get_upper() - canvas_height) {
vert_value = vertical_adjustment.get_upper() - canvas_height;
}
vertical_adjustment.set_value (vert_value);
}
void
@ -1006,15 +1011,21 @@ Editor::scroll_tracks_up ()
void
Editor::scroll_tracks_down_line ()
{
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
adj->set_value (adj->get_value() + 10);
double vert_value = adj->get_value() + 20;
if (vert_value>adj->get_upper() - canvas_height) {
vert_value = adj->get_upper() - canvas_height;
}
adj->set_value (vert_value);
}
void
Editor::scroll_tracks_up_line ()
{
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
adj->set_value (adj->get_value() - 10);
adj->set_value (adj->get_value() - 20);
}
/* ZOOM */

View File

@ -244,14 +244,14 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
{
switch (ev->direction) {
case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
step_height (true);
return true;
}
break;
case GDK_SCROLL_DOWN:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
step_height (false);
return true;
}
@ -328,30 +328,35 @@ TimeAxisView::hide ()
void
TimeAxisView::step_height (bool bigger)
{
switch (height) {
case Largest:
if (!bigger) set_height (Large);
break;
case Large:
if (bigger) set_height (Largest);
else set_height (Larger);
break;
case Larger:
if (bigger) set_height (Large);
else set_height (Normal);
break;
case Normal:
if (bigger) set_height (Larger);
else set_height (Smaller);
break;
case Smaller:
if (bigger) set_height (Normal);
else set_height (Small);
break;
case Small:
if (bigger) set_height (Smaller);
break;
}
if (height == hLargest) {
if (!bigger) set_height (Large);
return;
}
if (height == hLarge) {
if (bigger) set_height (Largest);
else set_height (Larger);
return;
}
if (height == hLarger) {
if (bigger) set_height (Large);
else set_height (Normal);
return;
}
if (height == hNormal) {
if (bigger) set_height (Larger);
else set_height (Smaller);
return;
}
if (height == hSmaller) {
if (bigger) set_height (Normal);
else set_height (Small);
return;
}
if (height == hSmall) {
if (bigger) set_height (Smaller);
return;
}
}
void

View File

@ -18,6 +18,7 @@ class PixScroller : public Gtk::DrawingArea
bool on_motion_notify_event (GdkEventMotion*);
bool on_button_press_event (GdkEventButton*);
bool on_button_release_event (GdkEventButton*);
bool on_scroll_event (GdkEventScroll*);
void on_size_request (GtkRequisition*);
protected:

View File

@ -176,11 +176,34 @@ PixScroller::on_button_release_event (GdkEventButton* ev)
}
}
break;
case 4:
default:
break;
}
return false;
}
bool
PixScroller::on_scroll_event (GdkEventScroll* ev)
{
double scale;
if (ev->state & GDK_CONTROL_MASK) {
if (ev->state & GDK_MOD1_MASK) {
scale = 0.05;
} else {
scale = 0.1;
}
} else {
scale = 0.5;
}
switch (ev->direction) {
case GDK_SCROLL_UP:
/* wheel up */
adj.set_value (adj.get_value() + (adj.get_page_increment() * scale));
break;
case 5:
case GDK_SCROLL_DOWN:
/* wheel down */
adj.set_value (adj.get_value() - (adj.get_page_increment() * scale));
break;