/*
- Copyright (C) 1999 Paul Barton-Davis
+ Copyright (C) 1999 Paul Barton-Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
$Id$
*/
-#include <gtkmm2ext/auto_spin.h>
#include <cmath>
+#include "gtkmm2ext/auto_spin.h"
+#include "gtkmm2ext/keyboard.h"
using namespace Gtkmm2ext;
using namespace std;
const unsigned int AutoSpin::timer_interval = 20; /* msecs */
const unsigned int AutoSpin::climb_timer_calls = 5; /* between climbing */
-AutoSpin::AutoSpin (Gtk::Adjustment &adjr, gfloat cr, bool round_to_steps_yn)
+AutoSpin::AutoSpin (Gtk::Adjustment &adjr, gfloat cr, bool round_to_steps_yn)
: adjustment (adjr),
climb_rate (cr)
{
- initial = adjustment.get_value();
+ initial = adjustment.get_value ();
left_is_decrement = true;
wrap = false;
have_timer = false;
{
if (have_timer) {
g_source_remove (timeout_tag);
- have_timer = false;
+ have_timer = false;
}
}
gint
-AutoSpin::stop_spinning (GdkEventButton *ev)
+AutoSpin::stop_spinning (GdkEventButton */*ev*/)
{
need_timer = false;
stop_timer ();
stop_spinning (0);
- if (ev->state & GDK_SHIFT_MASK) {
+ if (ev->type == GDK_2BUTTON_PRESS || ev->type == GDK_3BUTTON_PRESS ) {
+ return true;
+ }
+
+ if (ev->state & Keyboard::TertiaryModifier) {
/* use page shift */
shifted = true;
}
- if (ev->state & GDK_CONTROL_MASK) {
+ if (ev->state & Keyboard::PrimaryModifier) {
/* go to upper/lower bound on button1/button2 */
control = true;
/* XXX should figure out which button is left/right */
switch (ev->button) {
- case 1:
- if (control) {
- set_value (left_is_decrement ? lower : upper);
- return TRUE;
- } else {
- if (left_is_decrement) {
- with_decrement = true;
+ case 1:
+ if (control) {
+ set_value (left_is_decrement ? lower : upper);
+ return TRUE;
} else {
- with_decrement = false;
+ if (left_is_decrement) {
+ with_decrement = true;
+ } else {
+ with_decrement = false;
+ }
}
- }
- break;
-
- case 2:
- if (!control) {
- set_value (initial);
- }
- return TRUE;
- break;
+ break;
- case 3:
- if (control) {
- set_value (left_is_decrement ? upper : lower);
+ case 2:
+ if (!control) {
+ set_value (initial);
+ }
return TRUE;
- }
- break;
+ break;
- case 4:
- if (!control) {
- adjust_value (shifted ? page_increment : step_increment);
- } else {
- set_value (upper);
- }
- return TRUE;
- break;
+ case 3:
+ if (control) {
+ set_value (left_is_decrement ? upper : lower);
+ return TRUE;
+ }
+ break;
- case 5:
- if (!control) {
- adjust_value (shifted ? -page_increment : -step_increment);
- } else {
- set_value (lower);
- }
- return TRUE;
- break;
- }
+ case 4:
+ if (!control) {
+ adjust_value (shifted ? page_increment : step_increment);
+ } else {
+ set_value (upper);
+ }
+ return TRUE;
+ break;
+
+ case 5:
+ if (!control) {
+ adjust_value (shifted ? -page_increment : -step_increment);
+ } else {
+ set_value (lower);
+ }
+ return TRUE;
+ break;
+ }
start_spinning (with_decrement, shifted);
return TRUE;
}
+gint
+AutoSpin::scroll_event (GdkEventScroll *ev)
+{
+ stop_spinning (0);
+
+ gfloat increment = step_increment;
+
+ if (ev->state & Keyboard::TertiaryModifier) {
+ increment = page_increment;
+ }
+
+ switch (ev->direction) {
+ case GDK_SCROLL_DOWN:
+ case GDK_SCROLL_LEFT:
+ adjust_value (-increment);
+ break;
+ case GDK_SCROLL_RIGHT:
+ case GDK_SCROLL_UP:
+ adjust_value (increment);
+ break;
+ }
+ return TRUE;
+}
+
void
AutoSpin::start_spinning (bool decrement, bool page)
{
timer_increment = page ? page_increment : step_increment;
- if (decrement) {
+ if (decrement) {
timer_increment = -timer_increment;
}
adjust_value (timer_increment);
-
+
have_timer = true;
timer_calls = 0;
timeout_tag = g_timeout_add (initial_timer_interval,
- AutoSpin::_timer,
- this);
+ AutoSpin::_timer,
+ this);
}
gint
gfloat val;
bool done = false;
- val = adjustment.get_value();
+ val = adjustment.get_value ();
val += increment;
}
}
- set_value(val);
+ set_value (val);
return done;
}
/* we're in the initial call, which happened
after initial_timer_interval msecs. Now
request a much more frequent update.
- */
-
+ */
+
timeout_tag = g_timeout_add (timer_interval,
- _timer,
- this);
+ _timer,
+ this);
have_timer = true;
need_timer = false;
/* cancel this initial timeout */
-
+
retval = FALSE;
- } else {
+ } else {
/* this is the regular "fast" call after each
- timer_interval msecs.
- */
+ timer_interval msecs.
+ */
if (timer_calls < climb_timer_calls) {
timer_calls++;
}
return retval;
-}
+}
void
AutoSpin::set_bounds (gfloat init, gfloat up, gfloat down, bool with_reset)
{
- adjustment.set_upper(up);
- adjustment.set_lower(down);
+ adjustment.set_upper (up);
+ adjustment.set_lower (down);
initial = init;
-
+
adjustment.changed ();
-
+
if (with_reset) {
adjustment.set_value (init);
}
-}
+}