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_press (GdkEventButton*);
gint shuttle_box_button_release (GdkEventButton*); gint shuttle_box_button_release (GdkEventButton*);
gint shuttle_box_scroll (GdkEventScroll*);
gint shuttle_box_motion (GdkEventMotion*); gint shuttle_box_motion (GdkEventMotion*);
gint shuttle_box_expose (GdkEventExpose*); gint shuttle_box_expose (GdkEventExpose*);
gint mouse_shuttle (double x, bool force); 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")); ARDOUR_UI::instance()->tooltips().set_tip (speed_display_box, _("Current transport speed"));
shuttle_box.set_flags (CAN_FOCUS); 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.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_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_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_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)); 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; 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 gint
ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev) 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. 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)); clock_base.signal_button_release_event().connect (bind (mem_fun (*this, &AudioClock::field_button_release_event), SMPTE_Hours));
if (editable) { if (editable) {
@ -201,17 +201,17 @@ AudioClock::setup_events ()
{ {
clock_base.set_flags (Gtk::CAN_FOCUS); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); hours_ebox.set_flags (Gtk::CAN_FOCUS);
minutes_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_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)); 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)); 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)); 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)); 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; 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 bool
AudioClock::field_motion_notify_event (GdkEventMotion *ev, Field field) 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_motion_notify_event (GdkEventMotion *ev, Field);
bool field_button_press_event (GdkEventButton *ev, Field); bool field_button_press_event (GdkEventButton *ev, Field);
bool field_button_release_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_key_release_event (GdkEventKey *, Field);
bool field_focus_in_event (GdkEventFocus *, Field); bool field_focus_in_event (GdkEventFocus *, Field);
bool field_focus_out_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)) { } 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 target = (max_frames - (current_page_frames()*2)); // allow room for slop in where the PH is on the screen
} else { } 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 */ /* move visuals, we'll catch up with it later */

View file

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

View file

@ -3609,11 +3609,13 @@ Editor::start_selection_grab (ArdourCanvas::Item* item, GdkEvent* event)
void void
Editor::cancel_selection () 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 (); (*i)->hide_selection ();
} }
begin_reversible_command (_("cancel selection"));
selection->clear (); selection->clear ();
clicked_selection = 0; clicked_selection = 0;
commit_reversible_command ();
} }
void void

View file

@ -984,7 +984,12 @@ Editor::scroll_tracks_down ()
cnt = (int) floor (prefix); 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 void
@ -1006,15 +1011,21 @@ Editor::scroll_tracks_up ()
void void
Editor::scroll_tracks_down_line () Editor::scroll_tracks_down_line ()
{ {
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment(); 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 void
Editor::scroll_tracks_up_line () Editor::scroll_tracks_up_line ()
{ {
Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment(); Gtk::Adjustment* adj = edit_vscrollbar.get_adjustment();
adj->set_value (adj->get_value() - 10); adj->set_value (adj->get_value() - 20);
} }
/* ZOOM */ /* ZOOM */

View file

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

View file

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

View file

@ -176,11 +176,34 @@ PixScroller::on_button_release_event (GdkEventButton* ev)
} }
} }
break; 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 */ /* wheel up */
adj.set_value (adj.get_value() + (adj.get_page_increment() * scale)); adj.set_value (adj.get_value() + (adj.get_page_increment() * scale));
break; break;
case 5: case GDK_SCROLL_DOWN:
/* wheel down */ /* wheel down */
adj.set_value (adj.get_value() - (adj.get_page_increment() * scale)); adj.set_value (adj.get_value() - (adj.get_page_increment() * scale));
break; break;