17
17
* You should have received a copy of the GNU General Public License
18
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
22
#ifdef HAVE_CONFIG_H
33
33
#include <string.h>
36
#define EOG_THUMB_NAV_GET_PRIVATE(object) \
37
(G_TYPE_INSTANCE_GET_PRIVATE ((object), EOG_TYPE_THUMB_NAV, EogThumbNavPrivate))
39
G_DEFINE_TYPE (EogThumbNav, eog_thumb_nav, GTK_TYPE_BOX);
41
#define EOG_THUMB_NAV_SCROLL_INC 20
42
#define EOG_THUMB_NAV_SCROLL_MOVE 20
43
#define EOG_THUMB_NAV_SCROLL_TIMEOUT 20
47
PROP_SHOW_BUTTONS = 1,
52
struct _EogThumbNavPrivate
54
38
gboolean show_buttons;
67
51
GtkAdjustment *hadj;
68
52
GtkAdjustment *vadj;
69
53
GtkAdjustment *adj;
56
G_DEFINE_TYPE_WITH_PRIVATE (EogThumbNav, eog_thumb_nav, GTK_TYPE_BOX)
58
#define EOG_THUMB_NAV_SCROLL_INC 20
59
#define EOG_THUMB_NAV_SCROLL_MOVE 20
60
#define EOG_THUMB_NAV_SCROLL_TIMEOUT 20
64
PROP_SHOW_BUTTONS = 1,
73
70
eog_thumb_nav_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
75
72
EogThumbNav *nav = EOG_THUMB_NAV (user_data);
73
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
76
74
gint inc = EOG_THUMB_NAV_SCROLL_INC * 3;
77
75
gdouble value, upper, page_size, delta_x, delta_y;
80
nav->priv->adj = nav->priv->vertical ? nav->priv->vadj : nav->priv->hadj;
78
priv->adj =priv->vertical ? priv->vadj : priv->hadj;
82
80
switch (event->direction)
110
value = gtk_adjustment_get_value (nav->priv->adj);
108
value = gtk_adjustment_get_value (priv->adj);
112
gtk_adjustment_set_value (nav->priv->adj, MAX (0, value + inc));
110
gtk_adjustment_set_value (priv->adj, MAX (0, value + inc));
115
upper = gtk_adjustment_get_upper (nav->priv->adj);
116
page_size = gtk_adjustment_get_page_size (nav->priv->adj);
117
gtk_adjustment_set_value (nav->priv->adj, MIN (upper - page_size, value + inc));
113
upper = gtk_adjustment_get_upper (priv->adj);
114
page_size = gtk_adjustment_get_page_size (priv->adj);
115
gtk_adjustment_set_value (priv->adj, MIN (upper - page_size, value + inc));
120
gtk_adjustment_value_changed (nav->priv->adj);
118
gtk_adjustment_value_changed (priv->adj);
128
126
EogThumbNav *nav;
129
127
EogThumbNavPrivate *priv;
131
128
gdouble value, upper, page_size;
133
130
nav = EOG_THUMB_NAV (user_data);
134
priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
135
ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR;
131
priv = eog_thumb_nav_get_instance_private (nav);
137
133
g_object_get (vadj,
154
150
gdouble value, upper, page_size;
156
152
nav = EOG_THUMB_NAV (user_data);
157
priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
153
priv = eog_thumb_nav_get_instance_private (nav);
158
154
ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR;
160
156
g_object_get (hadj,
173
169
EogThumbNav *nav;
174
170
EogThumbNavPrivate *priv;
176
171
gdouble value, upper, page_size;
178
173
nav = EOG_THUMB_NAV (user_data);
179
priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
180
ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR;
174
priv = eog_thumb_nav_get_instance_private (nav);
182
176
g_object_get (vadj,
200
194
gdouble value, upper, page_size;
202
196
nav = EOG_THUMB_NAV (user_data);
203
priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
197
priv = eog_thumb_nav_get_instance_private (nav);
204
198
ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR;
206
200
g_object_get (hadj,
219
213
eog_thumb_nav_scroll_step (gpointer user_data)
221
215
EogThumbNav *nav = EOG_THUMB_NAV (user_data);
216
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
223
218
gdouble value, upper, page_size;
225
if (nav->priv->scroll_pos < 10)
220
if (priv->scroll_pos < 10)
226
221
delta = EOG_THUMB_NAV_SCROLL_INC;
227
else if (nav->priv->scroll_pos < 20)
222
else if (priv->scroll_pos < 20)
228
223
delta = EOG_THUMB_NAV_SCROLL_INC * 2;
229
else if (nav->priv->scroll_pos < 30)
224
else if (priv->scroll_pos < 30)
230
225
delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 5;
232
227
delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 12;
234
if (!nav->priv->scroll_dir)
229
if (!priv->scroll_dir)
237
g_object_get (nav->priv->adj,
232
g_object_get (priv->adj,
240
235
"page_size", &page_size,
243
238
if ((gint) (value + (gdouble) delta) >= 0 &&
244
239
(gint) (value + (gdouble) delta) <= upper - page_size)
246
gtk_adjustment_set_value (nav->priv->adj, value + (gdouble) delta);
247
nav->priv->scroll_pos++;
248
gtk_adjustment_value_changed (nav->priv->adj);
241
gtk_adjustment_set_value (priv->adj, value + (gdouble) delta);
243
gtk_adjustment_value_changed (priv->adj);
253
gtk_adjustment_set_value (nav->priv->adj, upper - page_size);
248
gtk_adjustment_set_value (priv->adj, upper - page_size);
255
gtk_adjustment_set_value (nav->priv->adj, 0);
257
nav->priv->scroll_pos = 0;
259
gtk_adjustment_value_changed (nav->priv->adj);
250
gtk_adjustment_set_value (priv->adj, 0);
252
priv->scroll_pos = 0;
254
gtk_adjustment_value_changed (priv->adj);
261
256
return G_SOURCE_REMOVE;
268
263
eog_thumb_nav_button_clicked (GtkButton *button, EogThumbNav *nav)
270
nav->priv->scroll_pos = 0;
272
if ((GTK_WIDGET (button) == nav->priv->button_right) ||
273
(GTK_WIDGET (button) == nav->priv->button_left))
265
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
267
priv->scroll_pos = 0;
269
if ((GTK_WIDGET (button) == priv->button_right) ||
270
(GTK_WIDGET (button) == priv->button_left))
275
nav->priv->scroll_dir = gtk_widget_get_direction (GTK_WIDGET (button)) == GTK_TEXT_DIR_LTR ?
276
GTK_WIDGET (button) == nav->priv->button_right :
277
GTK_WIDGET (button) == nav->priv->button_left;
272
priv->scroll_dir = gtk_widget_get_direction (GTK_WIDGET (button)) == GTK_TEXT_DIR_LTR ?
273
GTK_WIDGET (button) == priv->button_right :
274
GTK_WIDGET (button) == priv->button_left;
281
nav->priv->scroll_dir = (GTK_WIDGET (button) == nav->priv->button_down);
278
priv->scroll_dir = (GTK_WIDGET (button) == priv->button_down);
284
nav->priv->adj = ((GTK_WIDGET (button) == nav->priv->button_right) ||
285
(GTK_WIDGET (button) == nav->priv->button_left)) ? nav->priv->hadj : nav->priv->vadj;
281
priv->adj = ((GTK_WIDGET (button) == priv->button_right) ||
282
(GTK_WIDGET (button) == priv->button_left)) ? priv->hadj : priv->vadj;
287
284
eog_thumb_nav_scroll_step (nav);
291
288
eog_thumb_nav_start_scroll (GtkButton *button, EogThumbNav *nav)
293
if ((GTK_WIDGET (button) == nav->priv->button_right) ||
294
(GTK_WIDGET (button) == nav->priv->button_left))
290
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
292
if ((GTK_WIDGET (button) == priv->button_right) ||
293
(GTK_WIDGET (button) == priv->button_left))
296
nav->priv->scroll_dir = gtk_widget_get_direction (GTK_WIDGET (button)) == GTK_TEXT_DIR_LTR ?
297
GTK_WIDGET (button) == nav->priv->button_right :
298
GTK_WIDGET (button) == nav->priv->button_left;
295
priv->scroll_dir = gtk_widget_get_direction (GTK_WIDGET (button)) == GTK_TEXT_DIR_LTR ?
296
GTK_WIDGET (button) == priv->button_right :
297
GTK_WIDGET (button) == priv->button_left;
302
nav->priv->scroll_dir = (GTK_WIDGET (button) == nav->priv->button_down);
301
priv->scroll_dir = (GTK_WIDGET (button) == priv->button_down);
305
nav->priv->adj = ((GTK_WIDGET (button) == nav->priv->button_right) ||
306
(GTK_WIDGET (button) == nav->priv->button_left)) ? nav->priv->hadj : nav->priv->vadj;
304
priv->adj = ((GTK_WIDGET (button) == priv->button_right) ||
305
(GTK_WIDGET (button) == priv->button_left)) ? priv->hadj : priv->vadj;
308
nav->priv->scroll_id = g_timeout_add (EOG_THUMB_NAV_SCROLL_TIMEOUT,
309
eog_thumb_nav_scroll_step,
307
priv->scroll_id = g_timeout_add (EOG_THUMB_NAV_SCROLL_TIMEOUT,
308
eog_thumb_nav_scroll_step,
314
313
eog_thumb_nav_stop_scroll (GtkButton *button, EogThumbNav *nav)
316
if (nav->priv->scroll_id > 0)
315
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
317
if (priv->scroll_id > 0)
318
g_source_remove (nav->priv->scroll_id);
319
nav->priv->scroll_id = 0;
320
nav->priv->scroll_pos = 0;
319
g_source_remove (priv->scroll_id);
321
priv->scroll_pos = 0;
375
378
object = G_OBJECT_CLASS (eog_thumb_nav_parent_class)->constructor
376
379
(type, n_construct_properties, construct_params);
378
priv = EOG_THUMB_NAV_GET_PRIVATE (object);
381
priv = eog_thumb_nav_get_instance_private (EOG_THUMB_NAV (object));
380
383
if (priv->thumbview != NULL)
619
618
eog_thumb_nav_get_show_buttons (EogThumbNav *nav)
620
EogThumbNavPrivate *priv;
621
622
g_return_val_if_fail (EOG_IS_THUMB_NAV (nav), FALSE);
623
return nav->priv->show_buttons;
624
return priv->show_buttons;
635
636
eog_thumb_nav_set_show_buttons (EogThumbNav *nav, gboolean show_buttons)
638
EogThumbNavPrivate *priv;
637
640
g_return_if_fail (EOG_IS_THUMB_NAV (nav));
638
g_return_if_fail (nav->priv->button_left != NULL);
639
g_return_if_fail (nav->priv->button_right != NULL);
641
nav->priv->show_buttons = show_buttons;
642
priv = eog_thumb_nav_get_instance_private (nav);
644
g_return_if_fail (priv->button_left != NULL);
645
g_return_if_fail (priv->button_right != NULL);
647
priv->show_buttons = show_buttons;
643
649
if (show_buttons)
645
gtk_widget_show_all (nav->priv->button_left);
646
gtk_widget_show_all (nav->priv->button_right);
651
gtk_widget_show_all (priv->button_left);
652
gtk_widget_show_all (priv->button_right);
650
gtk_widget_hide (nav->priv->button_left);
651
gtk_widget_hide (nav->priv->button_right);
656
gtk_widget_hide (priv->button_left);
657
gtk_widget_hide (priv->button_right);
657
663
GtkPolicyType hscrollbar_policy,
658
664
GtkPolicyType vscrollbar_policy)
660
EogThumbNavPrivate *priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
666
EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
662
668
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->sw),
663
669
hscrollbar_policy,
676
682
eog_thumb_nav_set_vertical (EogThumbNav *nav, gboolean vertical)
678
EogThumbNavPrivate *priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
684
EogThumbNavPrivate *priv;
680
686
g_return_if_fail (EOG_IS_THUMB_NAV (nav));
688
priv = eog_thumb_nav_get_instance_private (nav);
681
690
g_return_if_fail (priv->button_left != NULL);
682
691
g_return_if_fail (priv->button_right != NULL);
683
692
g_return_if_fail (priv->vbox != NULL);