~ubuntu-branches/debian/jessie/cheese/jessie

« back to all changes in this revision

Viewing changes to src/thumbview/eog-thumb-nav.c

  • Committer: Package Import Robot
  • Author(s): Andreas Henriksson
  • Date: 2014-04-02 21:39:33 UTC
  • mfrom: (1.5.1) (15.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20140402213933-r0w3gna0pv7q7085
Tags: 3.12.0-1
* New upstream release.
* Revert changes done in 3.10.1-3
  - i.e. lower gnome-desktop build-dependency again.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 *
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.
20
20
 */
21
21
 
22
22
#ifdef HAVE_CONFIG_H
33
33
#include <string.h>
34
34
#include <math.h>
35
35
 
36
 
#define EOG_THUMB_NAV_GET_PRIVATE(object) \
37
 
  (G_TYPE_INSTANCE_GET_PRIVATE ((object), EOG_TYPE_THUMB_NAV, EogThumbNavPrivate))
38
 
 
39
 
G_DEFINE_TYPE (EogThumbNav, eog_thumb_nav, GTK_TYPE_BOX);
40
 
 
41
 
#define EOG_THUMB_NAV_SCROLL_INC     20
42
 
#define EOG_THUMB_NAV_SCROLL_MOVE    20
43
 
#define EOG_THUMB_NAV_SCROLL_TIMEOUT 20
44
 
 
45
 
enum
46
 
{
47
 
  PROP_SHOW_BUTTONS = 1,
48
 
  PROP_THUMB_VIEW,
49
 
  PROP_MODE
50
 
};
51
 
 
52
 
struct _EogThumbNavPrivate
 
36
typedef struct
53
37
{
54
38
  gboolean show_buttons;
55
39
  gboolean vertical;
67
51
  GtkAdjustment *hadj;
68
52
  GtkAdjustment *vadj;
69
53
  GtkAdjustment *adj;
 
54
} EogThumbNavPrivate;
 
55
 
 
56
G_DEFINE_TYPE_WITH_PRIVATE (EogThumbNav, eog_thumb_nav, GTK_TYPE_BOX)
 
57
 
 
58
#define EOG_THUMB_NAV_SCROLL_INC     20
 
59
#define EOG_THUMB_NAV_SCROLL_MOVE    20
 
60
#define EOG_THUMB_NAV_SCROLL_TIMEOUT 20
 
61
 
 
62
enum
 
63
{
 
64
  PROP_SHOW_BUTTONS = 1,
 
65
  PROP_THUMB_VIEW,
 
66
  PROP_MODE
70
67
};
71
68
 
72
69
static gboolean
73
70
eog_thumb_nav_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
74
71
{
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;
78
76
  gboolean smooth;
79
77
 
80
 
  nav->priv->adj = nav->priv->vertical ? nav->priv->vadj : nav->priv->hadj;
 
78
  priv->adj =priv->vertical ? priv->vadj : priv->hadj;
81
79
 
82
80
  switch (event->direction)
83
81
  {
107
105
      return FALSE;
108
106
  }
109
107
 
110
 
  value = gtk_adjustment_get_value (nav->priv->adj);
 
108
  value = gtk_adjustment_get_value (priv->adj);
111
109
  if (inc < 0)
112
 
    gtk_adjustment_set_value (nav->priv->adj, MAX (0, value + inc));
 
110
    gtk_adjustment_set_value (priv->adj, MAX (0, value + inc));
113
111
  else
114
112
  {
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));
118
116
  }
119
117
 
120
 
  gtk_adjustment_value_changed (nav->priv->adj);
 
118
  gtk_adjustment_value_changed (priv->adj);
121
119
 
122
120
  return TRUE;
123
121
}
127
125
{
128
126
  EogThumbNav        *nav;
129
127
  EogThumbNavPrivate *priv;
130
 
  gboolean            ltr;
131
128
  gdouble             value, upper, page_size;
132
129
 
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);
136
132
 
137
133
  g_object_get (vadj,
138
134
                "value", &value,
154
150
  gdouble             value, upper, page_size;
155
151
 
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;
159
155
 
160
156
  g_object_get (hadj,
172
168
{
173
169
  EogThumbNav        *nav;
174
170
  EogThumbNavPrivate *priv;
175
 
  gboolean            ltr;
176
171
  gdouble             value, upper, page_size;
177
172
 
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);
181
175
 
182
176
  g_object_get (vadj,
183
177
                "value", &value,
200
194
  gdouble             value, upper, page_size;
201
195
 
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;
205
199
 
206
200
  g_object_get (hadj,
219
213
eog_thumb_nav_scroll_step (gpointer user_data)
220
214
{
221
215
  EogThumbNav *nav = EOG_THUMB_NAV (user_data);
 
216
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
222
217
  gint         delta;
223
218
  gdouble      value, upper, page_size;
224
219
 
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;
231
226
  else
232
227
    delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 12;
233
228
 
234
 
  if (!nav->priv->scroll_dir)
 
229
  if (!priv->scroll_dir)
235
230
    delta *= -1;
236
231
 
237
 
  g_object_get (nav->priv->adj,
 
232
  g_object_get (priv->adj,
238
233
                "value", &value,
239
234
                "upper", &upper,
240
235
                "page_size", &page_size,
243
238
  if ((gint) (value + (gdouble) delta) >= 0 &&
244
239
      (gint) (value + (gdouble) delta) <= upper - page_size)
245
240
  {
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);
 
242
    priv->scroll_pos++;
 
243
    gtk_adjustment_value_changed (priv->adj);
249
244
  }
250
245
  else
251
246
  {
252
247
    if (delta > 0)
253
 
      gtk_adjustment_set_value (nav->priv->adj, upper - page_size);
 
248
      gtk_adjustment_set_value (priv->adj, upper - page_size);
254
249
    else
255
 
      gtk_adjustment_set_value (nav->priv->adj, 0);
256
 
 
257
 
    nav->priv->scroll_pos = 0;
258
 
 
259
 
    gtk_adjustment_value_changed (nav->priv->adj);
 
250
      gtk_adjustment_set_value (priv->adj, 0);
 
251
 
 
252
    priv->scroll_pos = 0;
 
253
 
 
254
    gtk_adjustment_value_changed (priv->adj);
260
255
 
261
256
    return G_SOURCE_REMOVE;
262
257
  }
267
262
static void
268
263
eog_thumb_nav_button_clicked (GtkButton *button, EogThumbNav *nav)
269
264
{
270
 
  nav->priv->scroll_pos = 0;
271
 
 
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);
 
266
 
 
267
  priv->scroll_pos = 0;
 
268
 
 
269
  if ((GTK_WIDGET (button) == priv->button_right) ||
 
270
      (GTK_WIDGET (button) == priv->button_left))
274
271
  {
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;
278
275
  }
279
276
  else
280
277
  {
281
 
    nav->priv->scroll_dir = (GTK_WIDGET (button) == nav->priv->button_down);
 
278
    priv->scroll_dir = (GTK_WIDGET (button) == priv->button_down);
282
279
  }
283
280
 
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;
286
283
 
287
284
  eog_thumb_nav_scroll_step (nav);
288
285
}
290
287
static void
291
288
eog_thumb_nav_start_scroll (GtkButton *button, EogThumbNav *nav)
292
289
{
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);
 
291
 
 
292
  if ((GTK_WIDGET (button) == priv->button_right) ||
 
293
      (GTK_WIDGET (button) == priv->button_left))
295
294
  {
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;
299
298
  }
300
299
  else
301
300
  {
302
 
    nav->priv->scroll_dir = (GTK_WIDGET (button) == nav->priv->button_down);
 
301
    priv->scroll_dir = (GTK_WIDGET (button) == priv->button_down);
303
302
  }
304
303
 
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;
307
306
 
308
 
  nav->priv->scroll_id = g_timeout_add (EOG_THUMB_NAV_SCROLL_TIMEOUT,
309
 
                                        eog_thumb_nav_scroll_step,
310
 
                                        nav);
 
307
  priv->scroll_id = g_timeout_add (EOG_THUMB_NAV_SCROLL_TIMEOUT,
 
308
                                   eog_thumb_nav_scroll_step,
 
309
                                   nav);
311
310
}
312
311
 
313
312
static void
314
313
eog_thumb_nav_stop_scroll (GtkButton *button, EogThumbNav *nav)
315
314
{
316
 
  if (nav->priv->scroll_id > 0)
 
315
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
 
316
 
 
317
  if (priv->scroll_id > 0)
317
318
  {
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);
 
320
    priv->scroll_id  = 0;
 
321
    priv->scroll_pos = 0;
321
322
  }
322
323
}
323
324
 
328
329
                            GParamSpec *pspec)
329
330
{
330
331
  EogThumbNav *nav = EOG_THUMB_NAV (object);
 
332
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
331
333
 
332
334
  switch (property_id)
333
335
  {
337
339
      break;
338
340
 
339
341
    case PROP_THUMB_VIEW:
340
 
      g_value_set_object (value, nav->priv->thumbview);
 
342
      g_value_set_object (value, priv->thumbview);
341
343
      break;
342
344
  }
343
345
}
349
351
                            GParamSpec   *pspec)
350
352
{
351
353
  EogThumbNav *nav = EOG_THUMB_NAV (object);
 
354
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
352
355
 
353
356
  switch (property_id)
354
357
  {
358
361
      break;
359
362
 
360
363
    case PROP_THUMB_VIEW:
361
 
      nav->priv->thumbview =
 
364
      priv->thumbview =
362
365
        GTK_WIDGET (g_value_get_object (value));
363
366
      break;
364
367
  }
375
378
  object = G_OBJECT_CLASS (eog_thumb_nav_parent_class)->constructor
376
379
             (type, n_construct_properties, construct_params);
377
380
 
378
 
  priv = EOG_THUMB_NAV_GET_PRIVATE (object);
 
381
  priv = eog_thumb_nav_get_instance_private (EOG_THUMB_NAV (object));
379
382
 
380
383
  if (priv->thumbview != NULL)
381
384
  {
417
420
                                                        G_PARAM_CONSTRUCT_ONLY |
418
421
                                                        G_PARAM_READWRITE |
419
422
                                                        G_PARAM_STATIC_STRINGS));
420
 
 
421
 
  g_type_class_add_private (g_object_class, sizeof (EogThumbNavPrivate));
422
423
}
423
424
 
424
425
static void
427
428
  EogThumbNavPrivate *priv;
428
429
  GtkWidget          *arrow;
429
430
 
430
 
  nav->priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
431
 
 
432
 
  priv = nav->priv;
 
431
  priv = eog_thumb_nav_get_instance_private (nav);
433
432
 
434
433
  priv->show_buttons = TRUE;
435
434
  priv->vertical     = FALSE;
618
617
gboolean
619
618
eog_thumb_nav_get_show_buttons (EogThumbNav *nav)
620
619
{
 
620
  EogThumbNavPrivate *priv;
 
621
 
621
622
  g_return_val_if_fail (EOG_IS_THUMB_NAV (nav), FALSE);
622
623
 
623
 
  return nav->priv->show_buttons;
 
624
  return priv->show_buttons;
624
625
}
625
626
 
626
627
/**
634
635
void
635
636
eog_thumb_nav_set_show_buttons (EogThumbNav *nav, gboolean show_buttons)
636
637
{
 
638
  EogThumbNavPrivate *priv;
 
639
 
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);
640
 
 
641
 
  nav->priv->show_buttons = show_buttons;
 
641
 
 
642
  priv = eog_thumb_nav_get_instance_private (nav);
 
643
 
 
644
  g_return_if_fail (priv->button_left != NULL);
 
645
  g_return_if_fail (priv->button_right != NULL);
 
646
 
 
647
  priv->show_buttons = show_buttons;
642
648
 
643
649
  if (show_buttons)
644
650
  {
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);
647
653
  }
648
654
  else
649
655
  {
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);
652
658
  }
653
659
}
654
660
 
657
663
                          GtkPolicyType hscrollbar_policy,
658
664
                          GtkPolicyType vscrollbar_policy)
659
665
{
660
 
  EogThumbNavPrivate *priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
 
666
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
661
667
 
662
668
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->sw),
663
669
                                  hscrollbar_policy,
667
673
gboolean
668
674
eog_thumb_nav_is_vertical (EogThumbNav *nav)
669
675
{
670
 
  EogThumbNavPrivate *priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
 
676
  EogThumbNavPrivate *priv = eog_thumb_nav_get_instance_private (nav);
671
677
 
672
678
  return priv->vertical;
673
679
}
675
681
void
676
682
eog_thumb_nav_set_vertical (EogThumbNav *nav, gboolean vertical)
677
683
{
678
 
  EogThumbNavPrivate *priv = EOG_THUMB_NAV_GET_PRIVATE (nav);
 
684
  EogThumbNavPrivate *priv;
679
685
 
680
686
  g_return_if_fail (EOG_IS_THUMB_NAV (nav));
 
687
 
 
688
  priv = eog_thumb_nav_get_instance_private (nav);
 
689
 
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);