77
72
static void e_mail_tab_close_clicked_cb (MxButton *button, EMailTab *self);
79
struct _EMailTabPrivate
82
ClutterActor *default_icon;
84
ClutterActor *close_button;
98
ClutterActor *preview;
99
gboolean preview_mode;
100
ClutterTimeline *preview_timeline;
101
gdouble preview_height_progress;
104
ClutterActor *old_bg;
106
ClutterActor *drag_actor;
107
ClutterActorBox drag_area;
108
gboolean drag_enabled;
109
MxDragAxis drag_axis;
110
// MxDragContainment containment;
112
gulong drag_threshold_handler;
74
struct _EMailTabPrivate {
76
ClutterActor *default_icon;
78
ClutterActor *close_button;
92
ClutterActor *preview;
93
gboolean preview_mode;
94
ClutterTimeline *preview_timeline;
95
gdouble preview_height_progress;
100
ClutterActor *drag_actor;
101
ClutterActorBox drag_area;
102
gboolean drag_enabled;
103
MxDragAxis drag_axis;
105
gulong drag_threshold_handler;
119
e_mail_tab_drag_begin (MxDraggable *draggable,
123
ClutterModifierType modifiers)
112
e_mail_tab_drag_begin (MxDraggable *draggable,
116
ClutterModifierType modifiers)
127
EMailTabPrivate *priv = E_MAIL_TAB (draggable)->priv;
128
ClutterActor *self = CLUTTER_ACTOR (draggable);
129
ClutterActor *actor = mx_draggable_get_drag_actor (draggable);
130
ClutterActor *stage = clutter_actor_get_stage (self);
132
priv->in_drag = TRUE;
134
clutter_actor_get_transformed_position (self, &x, &y);
135
clutter_actor_set_position (actor, x, y);
137
/* Start up animation */
138
if (CLUTTER_IS_TEXTURE (actor))
140
/* TODO: Some neat deformation effect? */
145
clutter_actor_set_opacity (actor, 0x00);
146
clutter_actor_animate (actor, CLUTTER_LINEAR, 150,
150
clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
120
EMailTabPrivate *priv = E_MAIL_TAB (draggable)->priv;
121
ClutterActor *self = CLUTTER_ACTOR (draggable);
122
ClutterActor *actor = mx_draggable_get_drag_actor (draggable);
123
ClutterActor *stage = clutter_actor_get_stage (self);
125
priv->in_drag = TRUE;
127
clutter_actor_get_transformed_position (self, &x, &y);
128
clutter_actor_set_position (actor, x, y);
130
/* Start up animation */
131
if (CLUTTER_IS_TEXTURE (actor)) {
132
/* TODO: Some neat deformation effect? */
135
clutter_actor_set_opacity (actor, 0x00);
136
clutter_actor_animate (
137
actor, CLUTTER_LINEAR, 150,
142
clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
154
146
e_mail_tab_drag_motion (MxDraggable *draggable,
158
ClutterActor *actor = mx_draggable_get_drag_actor (draggable);
159
clutter_actor_move_by (actor, delta_x, delta_y);
150
ClutterActor *actor = mx_draggable_get_drag_actor (draggable);
151
clutter_actor_move_by (actor, delta_x, delta_y);
163
155
e_mail_tab_drag_end_anim_cb (ClutterAnimation *animation,
166
ClutterActor *actor =
167
CLUTTER_ACTOR (clutter_animation_get_object (animation));
168
ClutterActor *parent = clutter_actor_get_parent (actor);
158
ClutterActor *actor =
159
CLUTTER_ACTOR (clutter_animation_get_object (animation));
160
ClutterActor *parent = clutter_actor_get_parent (actor);
171
clutter_container_remove_actor (CLUTTER_CONTAINER (parent), actor);
163
clutter_container_remove_actor (
164
CLUTTER_CONTAINER (parent), actor);
175
168
e_mail_tab_drag_end (MxDraggable *draggable,
179
EMailTab *self = E_MAIL_TAB (draggable);
180
EMailTabPrivate *priv = self->priv;
182
priv->in_drag = FALSE;
184
if (priv->drag_actor)
186
ClutterActor *parent = clutter_actor_get_parent (priv->drag_actor);
190
if (CLUTTER_IS_TEXTURE (priv->drag_actor))
192
/* TODO: Some neat deformation effect? */
193
clutter_container_remove_actor (CLUTTER_CONTAINER (parent),
198
clutter_actor_animate (priv->drag_actor, CLUTTER_LINEAR, 150,
201
G_CALLBACK (e_mail_tab_drag_end_anim_cb),
172
EMailTab *self = E_MAIL_TAB (draggable);
173
EMailTabPrivate *priv = self->priv;
175
priv->in_drag = FALSE;
177
if (priv->drag_actor) {
178
ClutterActor *parent = clutter_actor_get_parent (priv->drag_actor);
181
if (CLUTTER_IS_TEXTURE (priv->drag_actor)) {
182
/* TODO: Some neat deformation effect? */
183
clutter_container_remove_actor (
184
CLUTTER_CONTAINER (parent),
187
clutter_actor_animate (
192
G_CALLBACK (e_mail_tab_drag_end_anim_cb),
197
g_object_unref (priv->drag_actor);
198
priv->drag_actor = NULL;
206
g_object_unref (priv->drag_actor);
207
priv->drag_actor = NULL;
212
203
mx_draggable_iface_init (MxDraggableIface *iface)
214
iface->drag_begin = e_mail_tab_drag_begin;
215
iface->drag_motion = e_mail_tab_drag_motion;
216
iface->drag_end = e_mail_tab_drag_end;
220
e_mail_tab_get_property (GObject *object, guint property_id,
221
GValue *value, GParamSpec *pspec)
223
EMailTab *tab = E_MAIL_TAB (object);
224
EMailTabPrivate *priv = tab->priv;
229
g_value_set_object (value, e_mail_tab_get_icon (tab));
233
g_value_set_string (value, e_mail_tab_get_text (tab));
237
g_value_set_boolean (value, e_mail_tab_get_can_close (tab));
241
g_value_set_int (value, e_mail_tab_get_width (tab));
245
g_value_set_boolean (value, e_mail_tab_get_docking (tab));
249
g_value_set_object (value, e_mail_tab_get_preview_actor (tab));
252
case PROP_PREVIEW_MODE:
253
g_value_set_boolean (value, e_mail_tab_get_preview_mode (tab));
256
case PROP_PREVIEW_DURATION:
257
g_value_set_uint (value, e_mail_tab_get_preview_duration (tab));
261
g_value_set_float (value, e_mail_tab_get_spacing (tab));
265
g_value_set_boolean (value, e_mail_tab_get_private (tab));
269
g_value_set_boolean (value, e_mail_tab_get_active (tab));
272
case PROP_DRAG_THRESHOLD:
273
g_value_set_uint (value, (guint) priv->drag_threshold);
277
g_value_set_enum (value, priv->drag_axis);
280
// case PROP_DRAG_CONTAINMENT_TYPE:
281
// g_value_set_enum (value, priv->containment);
284
case PROP_DRAG_CONTAINMENT_AREA:
285
g_value_set_boxed (value, &priv->drag_area);
288
case PROP_DRAG_ENABLED:
289
g_value_set_boolean (value, priv->drag_enabled);
292
case PROP_DRAG_ACTOR:
293
if (!priv->drag_actor)
296
/*clutter_texture_new_from_actor (CLUTTER_ACTOR (tab));*/
300
/* This is where we'd setup deformations, or something along
303
priv->drag_actor = g_object_ref_sink (fbo);
307
g_object_ref_sink (clutter_clone_new (CLUTTER_ACTOR (tab)));
205
iface->drag_begin = e_mail_tab_drag_begin;
206
iface->drag_motion = e_mail_tab_drag_motion;
207
iface->drag_end = e_mail_tab_drag_end;
211
e_mail_tab_get_property (GObject *object,
216
EMailTab *tab = E_MAIL_TAB (object);
217
EMailTabPrivate *priv = tab->priv;
219
switch (property_id) {
221
g_value_set_object (value, e_mail_tab_get_icon (tab));
225
g_value_set_string (value, e_mail_tab_get_text (tab));
229
g_value_set_boolean (value, e_mail_tab_get_can_close (tab));
233
g_value_set_int (value, e_mail_tab_get_width (tab));
237
g_value_set_boolean (value, e_mail_tab_get_docking (tab));
241
g_value_set_object (value, e_mail_tab_get_preview_actor (tab));
244
case PROP_PREVIEW_MODE:
245
g_value_set_boolean (value, e_mail_tab_get_preview_mode (tab));
248
case PROP_PREVIEW_DURATION:
249
g_value_set_uint (value, e_mail_tab_get_preview_duration (tab));
253
g_value_set_float (value, e_mail_tab_get_spacing (tab));
257
g_value_set_boolean (value, e_mail_tab_get_private (tab));
261
g_value_set_boolean (value, e_mail_tab_get_active (tab));
264
case PROP_DRAG_THRESHOLD:
265
g_value_set_uint (value, (guint) priv->drag_threshold);
269
g_value_set_enum (value, priv->drag_axis);
272
case PROP_DRAG_CONTAINMENT_AREA:
273
g_value_set_boxed (value, &priv->drag_area);
276
case PROP_DRAG_ENABLED:
277
g_value_set_boolean (value, priv->drag_enabled);
280
case PROP_DRAG_ACTOR:
281
if (!priv->drag_actor)
282
priv->drag_actor = g_object_ref_sink (
283
clutter_clone_new (CLUTTER_ACTOR (tab)));
284
g_value_set_object (value, priv->drag_actor);
288
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
293
e_mail_tab_set_property (GObject *object,
298
EMailTab *tab = E_MAIL_TAB (object);
299
EMailTabPrivate *priv = tab->priv;
301
switch (property_id) {
303
e_mail_tab_set_icon (
304
tab, g_value_get_object (value));
308
e_mail_tab_set_text (
309
tab, g_value_get_string (value));
313
e_mail_tab_set_can_close (
314
tab, g_value_get_boolean (value));
317
e_mail_tab_set_width (
318
tab, g_value_get_int (value));
322
e_mail_tab_set_docking (
323
tab, g_value_get_boolean (value));
327
e_mail_tab_set_preview_actor (
328
tab, g_value_get_object (value));
331
case PROP_PREVIEW_MODE:
332
e_mail_tab_set_preview_mode (
333
tab, g_value_get_boolean (value));
336
case PROP_PREVIEW_DURATION:
337
e_mail_tab_set_preview_duration (
338
tab, g_value_get_uint (value));
342
e_mail_tab_set_spacing (
343
tab, g_value_get_float (value));
347
e_mail_tab_set_private (
348
tab, g_value_get_boolean (value));
352
e_mail_tab_set_active (
353
tab, g_value_get_boolean (value));
356
case PROP_DRAG_THRESHOLD:
360
priv->drag_axis = g_value_get_enum (value);
363
case PROP_DRAG_CONTAINMENT_AREA:
365
ClutterActorBox *box = g_value_get_boxed (value);
368
priv->drag_area = *box;
372
sizeof (ClutterActorBox));
376
case PROP_DRAG_ENABLED:
377
priv->drag_enabled = g_value_get_boolean (value);
380
case PROP_DRAG_ACTOR:
382
ClutterActor *new_actor = g_value_get_object (value);
384
if (priv->drag_actor) {
385
ClutterActor *parent;
387
parent = clutter_actor_get_parent (priv->drag_actor);
389
/* We know it's a container because we added it ourselves */
391
clutter_container_remove_actor (
392
CLUTTER_CONTAINER (parent),
395
g_object_unref (priv->drag_actor);
396
priv->drag_actor = NULL;
400
priv->drag_actor = g_object_ref_sink (new_actor);
406
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
309
g_value_set_object (value, priv->drag_actor);
313
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
318
e_mail_tab_set_property (GObject *object, guint property_id,
319
const GValue *value, GParamSpec *pspec)
321
EMailTab *tab = E_MAIL_TAB (object);
322
EMailTabPrivate *priv = tab->priv;
327
e_mail_tab_set_icon (tab, g_value_get_object (value));
331
e_mail_tab_set_text (tab, g_value_get_string (value));
335
e_mail_tab_set_can_close (tab, g_value_get_boolean (value));
338
e_mail_tab_set_width (tab, g_value_get_int (value));
342
e_mail_tab_set_docking (tab, g_value_get_boolean (value));
346
e_mail_tab_set_preview_actor (tab,
347
CLUTTER_ACTOR (g_value_get_object (value)));
350
case PROP_PREVIEW_MODE:
351
e_mail_tab_set_preview_mode (tab, g_value_get_boolean (value));
354
case PROP_PREVIEW_DURATION:
355
e_mail_tab_set_preview_duration (tab, g_value_get_uint (value));
359
e_mail_tab_set_spacing (tab, g_value_get_float (value));
363
e_mail_tab_set_private (tab, g_value_get_boolean (value));
367
e_mail_tab_set_active (tab, g_value_get_boolean (value));
370
case PROP_DRAG_THRESHOLD:
374
priv->drag_axis = g_value_get_enum (value);
377
// case PROP_DRAG_CONTAINMENT_TYPE:
378
// priv->containment = g_value_get_enum (value);
381
case PROP_DRAG_CONTAINMENT_AREA:
383
ClutterActorBox *box = g_value_get_boxed (value);
386
priv->drag_area = *box;
388
memset (&priv->drag_area, 0, sizeof (ClutterActorBox));
393
case PROP_DRAG_ENABLED:
394
priv->drag_enabled = g_value_get_boolean (value);
397
case PROP_DRAG_ACTOR:
399
ClutterActor *new_actor = g_value_get_object (value);
401
if (priv->drag_actor)
403
ClutterActor *parent = clutter_actor_get_parent (priv->drag_actor);
405
/* We know it's a container because we added it ourselves */
407
clutter_container_remove_actor (CLUTTER_CONTAINER (parent),
410
g_object_unref (priv->drag_actor);
411
priv->drag_actor = NULL;
415
priv->drag_actor = g_object_ref_sink (new_actor);
421
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
426
411
e_mail_tab_dispose_old_bg (EMailTab *tab)
428
EMailTabPrivate *priv = tab->priv;
432
if (clutter_actor_get_parent (priv->old_bg) == (ClutterActor *) tab)
433
clutter_actor_unparent (priv->old_bg);
434
g_object_unref (priv->old_bg);
413
EMailTabPrivate *priv = tab->priv;
416
ClutterActor *parent;
418
parent = clutter_actor_get_parent (priv->old_bg);
419
if (parent == (ClutterActor *) tab)
420
clutter_actor_unparent (priv->old_bg);
421
g_object_unref (priv->old_bg);
440
427
e_mail_tab_dispose (GObject *object)
442
EMailTab *tab = E_MAIL_TAB (object);
443
EMailTabPrivate *priv = tab->priv;
445
e_mail_tab_dispose_old_bg (tab);
449
clutter_actor_unparent (priv->icon);
453
if (priv->default_icon)
455
g_object_unref (priv->default_icon);
456
priv->default_icon = NULL;
461
clutter_actor_unparent (CLUTTER_ACTOR (priv->label));
465
if (priv->close_button)
467
clutter_actor_unparent (CLUTTER_ACTOR (priv->close_button));
468
priv->close_button = NULL;
473
clutter_actor_unparent (priv->preview);
474
priv->preview = NULL;
477
if (priv->alert_source)
479
g_source_remove (priv->alert_source);
480
priv->alert_source = 0;
483
if (priv->drag_actor)
485
ClutterActor *parent = clutter_actor_get_parent (priv->drag_actor);
487
clutter_container_remove_actor (CLUTTER_CONTAINER (parent),
489
g_object_unref (priv->drag_actor);
490
priv->drag_actor = NULL;
493
if (priv->drag_threshold_handler)
495
g_signal_handler_disconnect (gtk_settings_get_default (),
496
priv->drag_threshold_handler);
497
priv->drag_threshold_handler = 0;
500
G_OBJECT_CLASS (e_mail_tab_parent_class)->dispose (object);
504
e_mail_tab_finalize (GObject *object)
506
G_OBJECT_CLASS (e_mail_tab_parent_class)->finalize (object);
429
EMailTab *tab = E_MAIL_TAB (object);
430
EMailTabPrivate *priv = tab->priv;
432
e_mail_tab_dispose_old_bg (tab);
435
clutter_actor_unparent (priv->icon);
439
if (priv->default_icon) {
440
g_object_unref (priv->default_icon);
441
priv->default_icon = NULL;
445
clutter_actor_unparent (CLUTTER_ACTOR (priv->label));
449
if (priv->close_button) {
450
clutter_actor_unparent (CLUTTER_ACTOR (priv->close_button));
451
priv->close_button = NULL;
455
clutter_actor_unparent (priv->preview);
456
priv->preview = NULL;
459
if (priv->alert_source) {
460
g_source_remove (priv->alert_source);
461
priv->alert_source = 0;
464
if (priv->drag_actor) {
465
ClutterActor *parent;
467
parent = clutter_actor_get_parent (priv->drag_actor);
469
clutter_container_remove_actor (
470
CLUTTER_CONTAINER (parent),
473
g_object_unref (priv->drag_actor);
474
priv->drag_actor = NULL;
477
if (priv->drag_threshold_handler)
478
g_signal_handler_disconnect (
479
gtk_settings_get_default (),
480
priv->drag_threshold_handler);
481
priv->drag_threshold_handler = 0;
483
G_OBJECT_CLASS (e_mail_tab_parent_class)->dispose (object);
510
487
e_mail_tab_get_preferred_width (ClutterActor *actor,
513
gfloat *natural_width_p)
490
gfloat *natural_width_p)
516
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
519
mx_widget_get_padding (MX_WIDGET (actor), &padding);
521
*min_width_p = padding.left + padding.right;
523
*natural_width_p = padding.left + padding.right;
525
if (priv->width >= 0)
528
*natural_width_p += priv->width;
532
gfloat min_width, nat_width, acc_min_width, acc_nat_width;
534
acc_min_width = acc_nat_width = 0;
537
clutter_actor_get_preferred_size (CLUTTER_ACTOR (priv->label),
538
&acc_min_width, NULL,
539
&acc_nat_width, NULL);
543
clutter_actor_get_preferred_size (priv->icon,
546
acc_min_width += min_width;
547
acc_nat_width += nat_width;
552
clutter_actor_get_preferred_size (CLUTTER_ACTOR (priv->close_button),
555
acc_min_width += min_width;
556
acc_nat_width += nat_width;
559
if (priv->preview && priv->preview_mode)
561
clutter_actor_get_preferred_size (priv->preview,
564
if (min_width > acc_min_width)
565
acc_min_width = min_width;
566
if (nat_width > acc_nat_width)
567
acc_nat_width = nat_width;
571
*min_width_p += acc_min_width;
573
*natural_width_p += acc_nat_width;
493
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
496
mx_widget_get_padding (MX_WIDGET (actor), &padding);
498
*min_width_p = padding.left + padding.right;
500
*natural_width_p = padding.left + padding.right;
502
if (priv->width >= 0) {
504
*natural_width_p += priv->width;
506
gfloat min_width, nat_width, acc_min_width, acc_nat_width;
508
acc_min_width = acc_nat_width = 0;
511
clutter_actor_get_preferred_size (
512
CLUTTER_ACTOR (priv->label),
513
&acc_min_width, NULL,
514
&acc_nat_width, NULL);
517
clutter_actor_get_preferred_size (
521
acc_min_width += min_width;
522
acc_nat_width += nat_width;
525
clutter_actor_get_preferred_size (
526
CLUTTER_ACTOR (priv->close_button),
529
acc_min_width += min_width;
530
acc_nat_width += nat_width;
532
if (priv->preview && priv->preview_mode) {
533
clutter_actor_get_preferred_size (
538
if (min_width > acc_min_width)
539
acc_min_width = min_width;
540
if (nat_width > acc_nat_width)
541
acc_nat_width = nat_width;
545
*min_width_p += acc_min_width;
547
*natural_width_p += acc_nat_width;
578
552
e_mail_tab_get_height_no_preview (EMailTab *tab,
580
gfloat *min_height_p,
581
gfloat *natural_height_p)
554
gfloat *min_height_p,
555
gfloat *natural_height_p)
584
gfloat min_height, nat_height, tmp_min_height, tmp_nat_height;
586
ClutterActor *actor = CLUTTER_ACTOR (tab);
587
EMailTabPrivate *priv = tab->priv;
590
mx_widget_get_padding (MX_WIDGET (actor), &padding);
592
*min_height_p = padding.top + padding.bottom;
593
if (natural_height_p)
594
*natural_height_p = padding.top + padding.bottom;
596
min_height = nat_height = 0;
598
clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->label), -1,
599
&min_height, &nat_height);
603
clutter_actor_get_preferred_height (priv->icon, -1,
604
&tmp_min_height, &tmp_nat_height);
605
if (tmp_min_height > min_height)
606
min_height = tmp_min_height;
607
if (tmp_nat_height > nat_height)
608
nat_height = tmp_nat_height;
613
clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->close_button),
614
-1, &tmp_min_height, &tmp_nat_height);
615
if (tmp_min_height > min_height)
616
min_height = tmp_min_height;
617
if (tmp_nat_height > nat_height)
618
nat_height = tmp_nat_height;
622
*min_height_p += min_height;
623
if (natural_height_p)
624
*natural_height_p += nat_height;
558
gfloat min_height, nat_height, tmp_min_height, tmp_nat_height;
560
ClutterActor *actor = CLUTTER_ACTOR (tab);
561
EMailTabPrivate *priv = tab->priv;
564
mx_widget_get_padding (MX_WIDGET (actor), &padding);
566
*min_height_p = padding.top + padding.bottom;
567
if (natural_height_p)
568
*natural_height_p = padding.top + padding.bottom;
570
min_height = nat_height = 0;
572
clutter_actor_get_preferred_height (
573
CLUTTER_ACTOR (priv->label), -1,
574
&min_height, &nat_height);
577
clutter_actor_get_preferred_height (
578
priv->icon, -1, &tmp_min_height, &tmp_nat_height);
579
if (tmp_min_height > min_height)
580
min_height = tmp_min_height;
581
if (tmp_nat_height > nat_height)
582
nat_height = tmp_nat_height;
585
if (priv->can_close) {
586
clutter_actor_get_preferred_height (
587
CLUTTER_ACTOR (priv->close_button),
588
-1, &tmp_min_height, &tmp_nat_height);
590
if (tmp_min_height > min_height)
591
min_height = tmp_min_height;
592
if (tmp_nat_height > nat_height)
593
nat_height = tmp_nat_height;
597
*min_height_p += min_height;
598
if (natural_height_p)
599
*natural_height_p += nat_height;
628
603
e_mail_tab_get_preferred_height (ClutterActor *actor,
630
gfloat *min_height_p,
631
gfloat *natural_height_p)
605
gfloat *min_height_p,
606
gfloat *natural_height_p)
633
EMailTab *tab = E_MAIL_TAB (actor);
634
EMailTabPrivate *priv = tab->priv;
636
e_mail_tab_get_height_no_preview (tab, for_width,
637
min_height_p, natural_height_p);
642
gfloat min_height, nat_height, label_min_height, label_nat_height;
644
/* Get preview + padding height */
645
mx_widget_get_padding (MX_WIDGET (actor), &padding);
647
clutter_actor_get_preferred_height (priv->preview,
648
(gfloat) priv->width,
652
/* Add label height */
653
clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->label), -1,
654
&label_min_height, &label_nat_height);
656
min_height = (min_height * priv->preview_height_progress) +
657
padding.top + padding.bottom + priv->spacing +
659
nat_height = (nat_height * priv->preview_height_progress) +
660
padding.top + padding.bottom + priv->spacing +
663
/* Sometimes the preview's natural height will be nan due to
664
* keeping of the aspect ratio. This guards against that and stops
665
* Clutter from warning that the natural height is less than the
668
if (isnan (nat_height))
669
nat_height = min_height;
671
if (min_height_p && (min_height > *min_height_p))
672
*min_height_p = min_height;
673
if (natural_height_p && (nat_height > *natural_height_p))
674
*natural_height_p = nat_height;
608
EMailTab *tab = E_MAIL_TAB (actor);
609
EMailTabPrivate *priv = tab->priv;
611
e_mail_tab_get_height_no_preview (
612
tab, for_width, min_height_p, natural_height_p);
616
gfloat min_height, nat_height;
617
gfloat label_min_height, label_nat_height;
619
/* Get preview + padding height */
620
mx_widget_get_padding (MX_WIDGET (actor), &padding);
622
clutter_actor_get_preferred_height (
624
(gfloat) priv->width,
625
&min_height, &nat_height);
627
/* Add label height */
628
clutter_actor_get_preferred_height (
629
CLUTTER_ACTOR (priv->label), -1,
630
&label_min_height, &label_nat_height);
633
(min_height * priv->preview_height_progress) +
634
padding.top + padding.bottom + priv->spacing +
638
(nat_height * priv->preview_height_progress) +
639
padding.top + padding.bottom + priv->spacing +
642
/* Sometimes the preview's natural height will be nan due to
643
* keeping of the aspect ratio. This guards against that and
644
* stops Clutter from warning that the natural height is less
645
* than the minimum height. */
646
if (isnan (nat_height))
647
nat_height = min_height;
649
if (min_height_p && (min_height > *min_height_p))
650
*min_height_p = min_height;
651
if (natural_height_p && (nat_height > *natural_height_p))
652
*natural_height_p = nat_height;
679
e_mail_tab_allocate (ClutterActor *actor,
680
const ClutterActorBox *box,
681
ClutterAllocationFlags flags)
657
e_mail_tab_allocate (ClutterActor *actor,
658
const ClutterActorBox *box,
659
ClutterAllocationFlags flags)
684
ClutterActorBox child_box;
685
gfloat icon_width, icon_height, label_width, label_height,
686
close_width, close_height, preview_width, preview_height;
688
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
690
/* Chain up to store box */
691
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->allocate (actor, box, flags);
693
/* Possibly synchronise an axis if we're dragging */
696
ClutterActor *drag_actor =
697
mx_draggable_get_drag_actor (MX_DRAGGABLE (actor));
702
clutter_actor_get_transformed_position (actor, &x, &y);
703
switch (mx_draggable_get_axis (MX_DRAGGABLE (actor)))
705
case MX_DRAG_AXIS_X :
706
/* Synchronise y axis */
707
clutter_actor_set_y (drag_actor, y);
709
case MX_DRAG_AXIS_Y :
710
/* Synchronise x axis */
711
clutter_actor_set_x (drag_actor, x);
719
/* Allocate old background texture */
724
child_box.x2 = box->x2 - box->x1;
725
child_box.y2 = box->y2 - box->y1;
726
clutter_actor_allocate (priv->old_bg, &child_box, flags);
729
mx_widget_get_padding (MX_WIDGET (actor), &padding);
731
/* Get the preferred width/height of the icon, label and close-button first */
733
clutter_actor_get_preferred_size (priv->icon, NULL, NULL,
734
&icon_width, &icon_height);
735
clutter_actor_get_preferred_size (CLUTTER_ACTOR (priv->label), NULL, NULL,
736
&label_width, &label_height);
738
clutter_actor_get_preferred_size (CLUTTER_ACTOR (priv->close_button),
739
NULL, NULL, &close_width, &close_height);
741
/* Allocate for icon */
744
child_box.x1 = padding.left;
745
child_box.x2 = child_box.x1 + icon_width;
746
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1)/2 - icon_height/2);
747
child_box.y2 = child_box.y1 + icon_height;
748
clutter_actor_allocate (priv->icon, &child_box, flags);
751
/* Allocate for close button */
754
child_box.x2 = box->x2 - box->x1 - padding.right;
755
child_box.x1 = child_box.x2 - close_width;
756
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1)/2 - close_height/2);
757
child_box.y2 = child_box.y1 + close_height;
758
clutter_actor_allocate (CLUTTER_ACTOR (priv->close_button),
763
/* Allocate for preview widget */
767
preview_width = (box->x2 - box->x1 - padding.left - padding.right);
768
preview_height = (box->y2 - box->y1 - padding.top - padding.bottom -
769
priv->spacing - label_height);
771
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
772
child_box.y1 = E_MAIL_PIXBOUND (padding.top);
773
child_box.x2 = child_box.x1 + preview_width;
774
child_box.y2 = child_box.y1 + preview_height;
775
clutter_actor_allocate (priv->preview, &child_box, flags);
778
/* Allocate for label */
779
if ((priv->preview_height_progress <= TAB_S1_ANIM) || (!priv->preview))
782
child_box.x1 = E_MAIL_PIXBOUND (padding.left + icon_width + priv->spacing);
784
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
785
child_box.x2 = (box->x2 - box->x1 - padding.right);
786
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1)/2 - label_height/2);
787
child_box.y2 = child_box.y1 + label_height;
789
/* If close button is visible, don't overlap it */
791
child_box.x2 -= close_width + priv->spacing;
795
/* Put label underneath preview */
796
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
797
child_box.x2 = (box->x2 - box->x1 - padding.right);
798
child_box.y1 = E_MAIL_PIXBOUND (padding.top + preview_height +
800
child_box.y2 = child_box.y1 + label_height;
803
clutter_actor_allocate (CLUTTER_ACTOR (priv->label), &child_box, flags);
805
/* If we're in preview mode, re-allocate the background so it doesn't
806
* encompass the label. (A bit hacky?)
808
if (priv->preview && CLUTTER_ACTOR_IS_VISIBLE (priv->preview))
810
gfloat max_height = padding.top + padding.bottom + preview_height;
811
if (box->y2 - box->y1 > max_height)
813
MxWidget *widget = MX_WIDGET (actor);
814
ClutterActor *background = mx_widget_get_border_image (widget);
817
background = mx_widget_get_background_image (widget);
820
child_box.x2 = box->x2 - box->x1;
822
child_box.y2 = max_height;
825
clutter_actor_allocate (background, &child_box, flags);
826
if (priv->old_bg && (priv->old_bg != background))
827
clutter_actor_allocate (priv->old_bg, &child_box, flags);
662
ClutterActorBox child_box;
663
gfloat icon_width, icon_height;
664
gfloat label_width, label_height;
665
gfloat close_width, close_height;
666
gfloat preview_width, preview_height;
668
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
670
/* Chain up to store box */
671
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->allocate (actor, box, flags);
673
/* Possibly synchronise an axis if we're dragging */
675
ClutterActor *drag_actor =
676
mx_draggable_get_drag_actor (MX_DRAGGABLE (actor));
680
clutter_actor_get_transformed_position (actor, &x, &y);
682
switch (mx_draggable_get_axis (MX_DRAGGABLE (actor))) {
683
case MX_DRAG_AXIS_X :
684
/* Synchronise y axis */
685
clutter_actor_set_y (drag_actor, y);
687
case MX_DRAG_AXIS_Y :
688
/* Synchronise x axis */
689
clutter_actor_set_x (drag_actor, x);
697
/* Allocate old background texture */
701
child_box.x2 = box->x2 - box->x1;
702
child_box.y2 = box->y2 - box->y1;
703
clutter_actor_allocate (priv->old_bg, &child_box, flags);
706
mx_widget_get_padding (MX_WIDGET (actor), &padding);
708
/* Get the preferred width/height of the icon,
709
* label and close-button first. */
711
clutter_actor_get_preferred_size (
712
priv->icon, NULL, NULL,
713
&icon_width, &icon_height);
715
clutter_actor_get_preferred_size (
716
CLUTTER_ACTOR (priv->label), NULL, NULL,
717
&label_width, &label_height);
720
clutter_actor_get_preferred_size (
721
CLUTTER_ACTOR (priv->close_button),
722
NULL, NULL, &close_width, &close_height);
724
/* Allocate for icon */
726
child_box.x1 = padding.left;
727
child_box.x2 = child_box.x1 + icon_width;
728
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1) / 2 - icon_height / 2);
729
child_box.y2 = child_box.y1 + icon_height;
730
clutter_actor_allocate (priv->icon, &child_box, flags);
733
/* Allocate for close button */
734
if (priv->can_close) {
735
child_box.x2 = box->x2 - box->x1 - padding.right;
736
child_box.x1 = child_box.x2 - close_width;
737
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1) / 2 - close_height / 2);
738
child_box.y2 = child_box.y1 + close_height;
739
clutter_actor_allocate (
740
CLUTTER_ACTOR (priv->close_button),
744
/* Allocate for preview widget */
749
padding.left - padding.right);
752
padding.top - padding.bottom -
753
priv->spacing - label_height);
755
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
756
child_box.y1 = E_MAIL_PIXBOUND (padding.top);
757
child_box.x2 = child_box.x1 + preview_width;
758
child_box.y2 = child_box.y1 + preview_height;
760
clutter_actor_allocate (priv->preview, &child_box, flags);
763
/* Allocate for label */
764
if ((priv->preview_height_progress <= TAB_S1_ANIM) || (!priv->preview)) {
766
child_box.x1 = E_MAIL_PIXBOUND (padding.left + icon_width + priv->spacing);
768
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
769
child_box.x2 = (box->x2 - box->x1 - padding.right);
770
child_box.y1 = E_MAIL_PIXBOUND ((box->y2 - box->y1) / 2 - label_height / 2);
771
child_box.y2 = child_box.y1 + label_height;
773
/* If close button is visible, don't overlap it */
775
child_box.x2 -= close_width + priv->spacing;
777
/* Put label underneath preview */
778
child_box.x1 = E_MAIL_PIXBOUND (padding.left);
779
child_box.x2 = (box->x2 - box->x1 - padding.right);
780
child_box.y1 = E_MAIL_PIXBOUND (
781
padding.top + preview_height + priv->spacing);
782
child_box.y2 = child_box.y1 + label_height;
785
clutter_actor_allocate (CLUTTER_ACTOR (priv->label), &child_box, flags);
787
/* If we're in preview mode, re-allocate the background so it doesn't
788
* encompass the label. (A bit hacky?)
790
if (priv->preview && CLUTTER_ACTOR_IS_VISIBLE (priv->preview)) {
791
gfloat max_height = padding.top + padding.bottom + preview_height;
792
if (box->y2 - box->y1 > max_height) {
793
MxWidget *widget = MX_WIDGET (actor);
794
ClutterActor *background = mx_widget_get_border_image (widget);
797
background = mx_widget_get_background_image (widget);
800
child_box.x2 = box->x2 - box->x1;
802
child_box.y2 = max_height;
805
clutter_actor_allocate (
806
background, &child_box, flags);
808
if (priv->old_bg && (priv->old_bg != background))
809
clutter_actor_allocate (
810
priv->old_bg, &child_box, flags);
833
816
e_mail_tab_paint (ClutterActor *actor)
835
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
837
/* Chain up to paint background */
838
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->paint (actor);
841
clutter_actor_paint (priv->old_bg);
844
clutter_actor_paint (priv->icon);
846
clutter_actor_paint (CLUTTER_ACTOR (priv->label));
849
clutter_actor_paint (CLUTTER_ACTOR (priv->close_button));
852
clutter_actor_paint (CLUTTER_ACTOR (priv->preview));
818
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
820
/* Chain up to paint background */
821
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->paint (actor);
824
clutter_actor_paint (priv->old_bg);
827
clutter_actor_paint (priv->icon);
829
clutter_actor_paint (CLUTTER_ACTOR (priv->label));
832
clutter_actor_paint (CLUTTER_ACTOR (priv->close_button));
835
clutter_actor_paint (CLUTTER_ACTOR (priv->preview));
856
e_mail_tab_pick (ClutterActor *actor, const ClutterColor *c)
839
e_mail_tab_pick (ClutterActor *actor,
840
const ClutterColor *c)
858
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->pick (actor, c);
842
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->pick (actor, c);
860
if (clutter_actor_should_pick_paint (actor))
861
e_mail_tab_paint (actor);
844
if (clutter_actor_should_pick_paint (actor))
845
e_mail_tab_paint (actor);
865
849
e_mail_tab_map (ClutterActor *actor)
867
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
869
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->map (actor);
871
clutter_actor_map (CLUTTER_ACTOR (priv->label));
872
clutter_actor_map (CLUTTER_ACTOR (priv->close_button));
874
clutter_actor_map (priv->icon);
876
clutter_actor_map (priv->preview);
878
clutter_actor_map (priv->old_bg);
851
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
853
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->map (actor);
855
clutter_actor_map (CLUTTER_ACTOR (priv->label));
856
clutter_actor_map (CLUTTER_ACTOR (priv->close_button));
859
clutter_actor_map (priv->icon);
861
clutter_actor_map (priv->preview);
863
clutter_actor_map (priv->old_bg);
882
867
e_mail_tab_unmap (ClutterActor *actor)
884
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
886
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->unmap (actor);
888
clutter_actor_unmap (CLUTTER_ACTOR (priv->label));
889
clutter_actor_unmap (CLUTTER_ACTOR (priv->close_button));
891
clutter_actor_unmap (priv->icon);
893
clutter_actor_unmap (priv->preview);
895
clutter_actor_unmap (priv->old_bg);
899
e_mail_tab_button_press_event (ClutterActor *actor,
900
ClutterButtonEvent *event)
902
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
904
if (event->button == 1)
906
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "active");
907
clutter_grab_pointer (actor);
908
priv->pressed = TRUE;
910
priv->press_x = event->x;
911
priv->press_y = event->y;
914
/* We have to always return false, or dragging won't work */
919
e_mail_tab_button_release_event (ClutterActor *actor,
920
ClutterButtonEvent *event)
922
EMailTab *tab = E_MAIL_TAB (actor);
923
EMailTabPrivate *priv = tab->priv;
927
clutter_ungrab_pointer ();
928
priv->pressed = FALSE;
930
/* Note, no need to set the pseudo class here as clicking always results
931
* in being set active.
936
e_mail_tab_set_active (tab, TRUE);
938
g_signal_emit (actor, signals[CLICKED], 0);
946
e_mail_tab_motion_event (ClutterActor *actor,
947
ClutterMotionEvent *event)
949
EMailTab *tab = E_MAIL_TAB (actor);
950
EMailTabPrivate *priv = tab->priv;
952
if (priv->pressed && priv->drag_enabled)
954
if ((ABS (event->x - priv->press_x) >= priv->drag_threshold) ||
955
(ABS (event->y - priv->press_y) >= priv->drag_threshold))
957
/* Ungrab the pointer so that the MxDraggable code can take over */
958
clutter_ungrab_pointer ();
959
priv->pressed = FALSE;
963
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor),
869
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
871
CLUTTER_ACTOR_CLASS (e_mail_tab_parent_class)->unmap (actor);
873
clutter_actor_unmap (CLUTTER_ACTOR (priv->label));
874
clutter_actor_unmap (CLUTTER_ACTOR (priv->close_button));
877
clutter_actor_unmap (priv->icon);
879
clutter_actor_unmap (priv->preview);
881
clutter_actor_unmap (priv->old_bg);
885
e_mail_tab_button_press_event (ClutterActor *actor,
886
ClutterButtonEvent *event)
888
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
890
if (event->button == 1) {
891
mx_stylable_set_style_pseudo_class (
892
MX_STYLABLE (actor), "active");
893
clutter_grab_pointer (actor);
894
priv->pressed = TRUE;
896
priv->press_x = event->x;
897
priv->press_y = event->y;
900
/* We have to always return false, or dragging won't work */
905
e_mail_tab_button_release_event (ClutterActor *actor,
906
ClutterButtonEvent *event)
908
EMailTab *tab = E_MAIL_TAB (actor);
909
EMailTabPrivate *priv = tab->priv;
912
clutter_ungrab_pointer ();
913
priv->pressed = FALSE;
915
/* Note, no need to set the pseudo class here as clicking
916
* always results in being set active. */
919
e_mail_tab_set_active (tab, TRUE);
921
g_signal_emit (actor, signals[CLICKED], 0);
929
e_mail_tab_motion_event (ClutterActor *actor,
930
ClutterMotionEvent *event)
932
EMailTab *tab = E_MAIL_TAB (actor);
933
EMailTabPrivate *priv = tab->priv;
935
if (priv->pressed && priv->drag_enabled) {
936
if ((ABS (event->x - priv->press_x) >= priv->drag_threshold) ||
937
(ABS (event->y - priv->press_y) >= priv->drag_threshold)) {
938
/* Ungrab the pointer so that the MxDraggable code can take over */
939
clutter_ungrab_pointer ();
940
priv->pressed = FALSE;
943
mx_stylable_set_style_pseudo_class (
944
MX_STYLABLE (actor), "hover");
946
mx_stylable_set_style_pseudo_class (
947
MX_STYLABLE (actor), NULL);
956
e_mail_tab_enter_event (ClutterActor *actor,
957
ClutterCrossingEvent *event)
959
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
961
if (event->source != actor)
967
mx_stylable_set_style_pseudo_class (
968
MX_STYLABLE (actor), "active");
969
else if (!priv->active)
970
mx_stylable_set_style_pseudo_class (
971
MX_STYLABLE (actor), "hover");
977
e_mail_tab_leave_event (ClutterActor *actor,
978
ClutterCrossingEvent *event)
980
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
982
if ((event->source != actor) ||
983
(event->related == (ClutterActor *) priv->close_button))
966
989
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
975
e_mail_tab_enter_event (ClutterActor *actor,
976
ClutterCrossingEvent *event)
978
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
980
if (event->source != actor)
986
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "active");
987
else if (!priv->active)
988
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), "hover");
994
e_mail_tab_leave_event (ClutterActor *actor,
995
ClutterCrossingEvent *event)
997
EMailTabPrivate *priv = E_MAIL_TAB (actor)->priv;
999
if ((event->source != actor) ||
1000
(event->related == (ClutterActor *) priv->close_button))
1003
priv->hover = FALSE;
1006
mx_stylable_set_style_pseudo_class (MX_STYLABLE (actor), NULL);
1012
e_mail_tab_class_init (EMailTabClass *klass)
1014
GObjectClass *object_class = G_OBJECT_CLASS (klass);
1015
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
1017
g_type_class_add_private (klass, sizeof (EMailTabPrivate));
1019
object_class->get_property = e_mail_tab_get_property;
1020
object_class->set_property = e_mail_tab_set_property;
1021
object_class->dispose = e_mail_tab_dispose;
1022
object_class->finalize = e_mail_tab_finalize;
1024
actor_class->get_preferred_width = e_mail_tab_get_preferred_width;
1025
actor_class->get_preferred_height = e_mail_tab_get_preferred_height;
1026
actor_class->button_press_event = e_mail_tab_button_press_event;
1027
actor_class->button_release_event = e_mail_tab_button_release_event;
1028
actor_class->motion_event = e_mail_tab_motion_event;
1029
actor_class->enter_event = e_mail_tab_enter_event;
1030
actor_class->leave_event = e_mail_tab_leave_event;
1031
actor_class->allocate = e_mail_tab_allocate;
1032
actor_class->paint = e_mail_tab_paint;
1033
actor_class->pick = e_mail_tab_pick;
1034
actor_class->map = e_mail_tab_map;
1035
actor_class->unmap = e_mail_tab_unmap;
1037
g_object_class_install_property (object_class,
1039
g_param_spec_object ("icon",
1044
G_PARAM_STATIC_NAME |
1045
G_PARAM_STATIC_NICK |
1046
G_PARAM_STATIC_BLURB));
1048
g_object_class_install_property (object_class,
1050
g_param_spec_string ("text",
1055
G_PARAM_STATIC_NAME |
1056
G_PARAM_STATIC_NICK |
1057
G_PARAM_STATIC_BLURB));
1059
g_object_class_install_property (object_class,
1061
g_param_spec_boolean ("can-close",
1063
"Whether the tab can "
1067
G_PARAM_STATIC_NAME |
1068
G_PARAM_STATIC_NICK |
1069
G_PARAM_STATIC_BLURB));
1071
g_object_class_install_property (object_class,
1073
g_param_spec_int ("tab-width",
1078
G_PARAM_STATIC_NAME |
1079
G_PARAM_STATIC_NICK |
1080
G_PARAM_STATIC_BLURB));
1082
g_object_class_install_property (object_class,
1084
g_param_spec_boolean ("docking",
1087
"should dock to edges "
1091
G_PARAM_STATIC_NAME |
1092
G_PARAM_STATIC_NICK |
1093
G_PARAM_STATIC_BLURB));
1095
g_object_class_install_property (object_class,
1097
g_param_spec_object ("preview",
1099
"ClutterActor used "
1100
"when in preview mode.",
1103
G_PARAM_STATIC_NAME |
1104
G_PARAM_STATIC_NICK |
1105
G_PARAM_STATIC_BLURB));
1107
g_object_class_install_property (object_class,
1109
g_param_spec_boolean ("preview-mode",
1111
"Whether to display "
1115
G_PARAM_STATIC_NAME |
1116
G_PARAM_STATIC_NICK |
1117
G_PARAM_STATIC_BLURB));
1119
g_object_class_install_property (object_class,
1120
PROP_PREVIEW_DURATION,
1121
g_param_spec_uint ("preview-duration",
1123
"How long the transition "
1124
"between preview mode "
1125
"states lasts, in ms.",
1128
G_PARAM_STATIC_NAME |
1129
G_PARAM_STATIC_NICK |
1130
G_PARAM_STATIC_BLURB));
1132
g_object_class_install_property (object_class,
1134
g_param_spec_float ("spacing",
1141
G_PARAM_STATIC_NAME |
1142
G_PARAM_STATIC_NICK |
1143
G_PARAM_STATIC_BLURB));
1145
g_object_class_install_property (object_class,
1147
g_param_spec_boolean ("private",
1149
"Set if the tab is "
1153
G_PARAM_STATIC_NAME |
1154
G_PARAM_STATIC_NICK |
1155
G_PARAM_STATIC_BLURB));
1157
g_object_class_install_property (object_class,
1159
g_param_spec_boolean ("active",
1161
"Set if the tab is "
1165
G_PARAM_STATIC_NAME |
1166
G_PARAM_STATIC_NICK |
1167
G_PARAM_STATIC_BLURB));
1169
g_object_class_override_property (object_class,
1170
PROP_DRAG_THRESHOLD,
1172
g_object_class_override_property (object_class,
1175
// g_object_class_override_property (object_class,
1176
// PROP_DRAG_CONTAINMENT_TYPE,
1177
// "containment-type");
1178
g_object_class_override_property (object_class,
1179
PROP_DRAG_CONTAINMENT_AREA,
1180
"containment-area");
1181
g_object_class_override_property (object_class,
1184
g_object_class_override_property (object_class,
1189
g_signal_new ("clicked",
1190
G_TYPE_FROM_CLASS (klass),
1192
G_STRUCT_OFFSET (EMailTabClass, clicked),
1194
g_cclosure_marshal_VOID__VOID,
1198
g_signal_new ("closed",
1199
G_TYPE_FROM_CLASS (klass),
1201
G_STRUCT_OFFSET (EMailTabClass, closed),
1203
g_cclosure_marshal_VOID__VOID,
1206
signals[TRANSITION_COMPLETE] =
1207
g_signal_new ("transition-complete",
1208
G_TYPE_FROM_CLASS (klass),
1210
G_STRUCT_OFFSET (EMailTabClass, transition_complete),
1212
g_cclosure_marshal_VOID__VOID,
1217
e_mail_tab_close_clicked_cb (MxButton *button, EMailTab *self)
1219
g_signal_emit (self, signals[CLOSED], 0);
995
e_mail_tab_class_init (EMailTabClass *class)
997
GObjectClass *object_class = G_OBJECT_CLASS (class);
998
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (class);
1000
g_type_class_add_private (class, sizeof (EMailTabPrivate));
1002
object_class->get_property = e_mail_tab_get_property;
1003
object_class->set_property = e_mail_tab_set_property;
1004
object_class->dispose = e_mail_tab_dispose;
1006
actor_class->get_preferred_width = e_mail_tab_get_preferred_width;
1007
actor_class->get_preferred_height = e_mail_tab_get_preferred_height;
1008
actor_class->button_press_event = e_mail_tab_button_press_event;
1009
actor_class->button_release_event = e_mail_tab_button_release_event;
1010
actor_class->motion_event = e_mail_tab_motion_event;
1011
actor_class->enter_event = e_mail_tab_enter_event;
1012
actor_class->leave_event = e_mail_tab_leave_event;
1013
actor_class->allocate = e_mail_tab_allocate;
1014
actor_class->paint = e_mail_tab_paint;
1015
actor_class->pick = e_mail_tab_pick;
1016
actor_class->map = e_mail_tab_map;
1017
actor_class->unmap = e_mail_tab_unmap;
1019
g_object_class_install_property (
1022
g_param_spec_object (
1028
G_PARAM_STATIC_STRINGS));
1030
g_object_class_install_property (
1033
g_param_spec_string (
1039
G_PARAM_STATIC_STRINGS));
1041
g_object_class_install_property (
1044
g_param_spec_boolean (
1047
"Whether the tab can "
1051
G_PARAM_STATIC_STRINGS));
1053
g_object_class_install_property (
1062
G_PARAM_STATIC_STRINGS));
1064
g_object_class_install_property (
1067
g_param_spec_boolean (
1070
"Whether the tab should dock to edges when scrolled.",
1073
G_PARAM_STATIC_STRINGS));
1075
g_object_class_install_property (
1078
g_param_spec_object (
1081
"ClutterActor used "
1082
"when in preview mode.",
1085
G_PARAM_STATIC_STRINGS));
1087
g_object_class_install_property (
1090
g_param_spec_boolean (
1093
"Whether to display "
1097
G_PARAM_STATIC_STRINGS));
1099
g_object_class_install_property (
1101
PROP_PREVIEW_DURATION,
1105
"How long the transition "
1106
"between preview mode "
1107
"states lasts, in ms.",
1110
G_PARAM_STATIC_STRINGS));
1112
g_object_class_install_property (
1115
g_param_spec_float (
1123
G_PARAM_STATIC_STRINGS));
1125
g_object_class_install_property (
1128
g_param_spec_boolean (
1131
"Set if the tab is "
1135
G_PARAM_STATIC_STRINGS));
1137
g_object_class_install_property (
1140
g_param_spec_boolean (
1143
"Set if the tab is "
1147
G_PARAM_STATIC_STRINGS));
1149
g_object_class_override_property (
1151
PROP_DRAG_THRESHOLD,
1154
g_object_class_override_property (
1159
g_object_class_override_property (
1161
PROP_DRAG_CONTAINMENT_AREA,
1162
"containment-area");
1164
g_object_class_override_property (
1169
g_object_class_override_property (
1174
signals[CLICKED] = g_signal_new (
1176
G_TYPE_FROM_CLASS (class),
1178
G_STRUCT_OFFSET (EMailTabClass, clicked),
1180
g_cclosure_marshal_VOID__VOID,
1183
signals[CLOSED] = g_signal_new (
1185
G_TYPE_FROM_CLASS (class),
1187
G_STRUCT_OFFSET (EMailTabClass, closed),
1189
g_cclosure_marshal_VOID__VOID,
1192
signals[TRANSITION_COMPLETE] = g_signal_new (
1193
"transition-complete",
1194
G_TYPE_FROM_CLASS (class),
1196
G_STRUCT_OFFSET (EMailTabClass, transition_complete),
1198
g_cclosure_marshal_VOID__VOID,
1203
e_mail_tab_close_clicked_cb (MxButton *button,
1206
g_signal_emit (self, signals[CLOSED], 0);
1223
1210
e_mail_tab_anim_completed_cb (ClutterAnimation *animation,
1226
e_mail_tab_dispose_old_bg (tab);
1213
e_mail_tab_dispose_old_bg (tab);
1230
1217
e_mail_tab_style_changed_cb (MxWidget *widget)
1232
EMailTabPrivate *priv = E_MAIL_TAB (widget)->priv;
1234
/* Don't transition on hover */
1235
if (g_strcmp0 (mx_stylable_get_style_pseudo_class (MX_STYLABLE (widget)),
1241
if (!clutter_actor_get_parent (priv->old_bg))
1243
ClutterActorBox box;
1244
ClutterActor *background;
1245
ClutterActor *actor = CLUTTER_ACTOR (widget);
1247
clutter_actor_set_parent (priv->old_bg, actor);
1249
/* Try to allocate the same size as the background widget,
1250
* otherwise allocate the same size as the widget itself.
1252
background = mx_widget_get_border_image (widget);
1254
background = mx_widget_get_background_image (widget);
1257
clutter_actor_get_allocation_box (background, &box);
1260
clutter_actor_get_allocation_box (actor, &box);
1267
clutter_actor_allocate (priv->old_bg, &box, 0);
1219
EMailTabPrivate *priv = E_MAIL_TAB (widget)->priv;
1221
/* Don't transition on hover */
1222
if (g_strcmp0 (mx_stylable_get_style_pseudo_class (
1223
MX_STYLABLE (widget)), "hover") == 0)
1227
if (!clutter_actor_get_parent (priv->old_bg)) {
1228
ClutterActorBox box;
1229
ClutterActor *background;
1230
ClutterActor *actor = CLUTTER_ACTOR (widget);
1232
clutter_actor_set_parent (priv->old_bg, actor);
1234
/* Try to allocate the same size as the background
1235
* widget, otherwise allocate the same size as the
1237
background = mx_widget_get_border_image (widget);
1239
background = mx_widget_get_background_image (widget);
1242
clutter_actor_get_allocation_box (background, &box);
1244
clutter_actor_get_allocation_box (actor, &box);
1251
clutter_actor_allocate (priv->old_bg, &box, 0);
1254
clutter_actor_animate (
1255
priv->old_bg, CLUTTER_LINEAR, 150,
1256
"opacity", 0, "signal::completed",
1257
G_CALLBACK (e_mail_tab_anim_completed_cb),
1270
clutter_actor_animate (priv->old_bg,
1274
"signal::completed",
1275
G_CALLBACK (e_mail_tab_anim_completed_cb),
1282
1263
e_mail_tab_stylable_changed_cb (MxStylable *stylable)
1284
EMailTab *tab = E_MAIL_TAB (stylable);
1285
EMailTabPrivate *priv = tab->priv;
1287
e_mail_tab_dispose_old_bg (tab);
1289
priv->old_bg = mx_widget_get_border_image (MX_WIDGET (tab));
1291
g_object_ref (priv->old_bg);
1265
EMailTab *tab = E_MAIL_TAB (stylable);
1266
EMailTabPrivate *priv = tab->priv;
1268
e_mail_tab_dispose_old_bg (tab);
1270
priv->old_bg = mx_widget_get_border_image (MX_WIDGET (tab));
1272
g_object_ref (priv->old_bg);
1295
e_mail_tab_dnd_notify_cb (GObject *settings,
1276
e_mail_tab_dnd_notify_cb (GObject *settings,
1299
g_object_get (settings,
1300
"gtk-dnd-drag-threshold", &tab->priv->drag_threshold,
1282
"gtk-dnd-drag-threshold", &tab->priv->drag_threshold,
1305
1287
e_mail_tab_init (EMailTab *self)
1308
GtkSettings *settings;
1309
EMailTabPrivate *priv;
1290
GtkSettings *settings;
1291
EMailTabPrivate *priv;
1311
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (
1293
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (
1312
1294
self, E_MAIL_TYPE_TAB, EMailTabPrivate);
1315
priv->anim_length = 200;
1316
priv->spacing = 6.0;
1317
priv->can_close = TRUE;
1319
priv->label = mx_label_new ();
1320
g_object_set (G_OBJECT (priv->label), "clip-to-allocation", TRUE, NULL);
1321
text = mx_label_get_clutter_text (MX_LABEL (priv->label));
1322
clutter_text_set_ellipsize (CLUTTER_TEXT (text), PANGO_ELLIPSIZE_END);
1323
clutter_actor_set_parent (CLUTTER_ACTOR (priv->label),
1324
CLUTTER_ACTOR (self));
1326
priv->close_button = mx_button_new ();
1327
clutter_actor_set_name (CLUTTER_ACTOR (priv->close_button),
1328
"tab-close-button");
1329
clutter_actor_set_parent (CLUTTER_ACTOR (priv->close_button),
1330
CLUTTER_ACTOR (self));
1332
g_signal_connect (priv->close_button, "clicked",
1333
G_CALLBACK (e_mail_tab_close_clicked_cb), self);
1335
/* Connect up styling signals */
1336
g_signal_connect (self, "style-changed",
1337
G_CALLBACK (e_mail_tab_style_changed_cb), NULL);
1338
g_signal_connect (self, "stylable-changed",
1339
G_CALLBACK (e_mail_tab_stylable_changed_cb), NULL);
1341
clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
1343
settings = gtk_settings_get_default ();
1344
priv->drag_threshold_handler =
1345
g_signal_connect (settings, "notify::gtk-dnd-drag-threshold",
1346
G_CALLBACK (e_mail_tab_dnd_notify_cb), self);
1347
g_object_get (G_OBJECT (settings),
1348
"gtk-dnd-drag-threshold", &priv->drag_threshold,
1297
priv->anim_length = 200;
1298
priv->spacing = 6.0;
1299
priv->can_close = TRUE;
1301
priv->label = mx_label_new ();
1302
g_object_set (priv->label, "clip-to-allocation", TRUE, NULL);
1303
text = mx_label_get_clutter_text (MX_LABEL (priv->label));
1304
clutter_text_set_ellipsize (CLUTTER_TEXT (text), PANGO_ELLIPSIZE_END);
1305
clutter_actor_set_parent (
1306
CLUTTER_ACTOR (priv->label), CLUTTER_ACTOR (self));
1308
priv->close_button = mx_button_new ();
1309
clutter_actor_set_name (
1310
CLUTTER_ACTOR (priv->close_button), "tab-close-button");
1311
clutter_actor_set_parent (
1312
CLUTTER_ACTOR (priv->close_button), CLUTTER_ACTOR (self));
1315
priv->close_button, "clicked",
1316
G_CALLBACK (e_mail_tab_close_clicked_cb), self);
1318
/* Connect up styling signals */
1320
self, "style-changed",
1321
G_CALLBACK (e_mail_tab_style_changed_cb), NULL);
1323
self, "stylable-changed",
1324
G_CALLBACK (e_mail_tab_stylable_changed_cb), NULL);
1326
clutter_actor_set_reactive (CLUTTER_ACTOR (self), TRUE);
1328
settings = gtk_settings_get_default ();
1329
priv->drag_threshold_handler = g_signal_connect (
1330
settings, "notify::gtk-dnd-drag-threshold",
1331
G_CALLBACK (e_mail_tab_dnd_notify_cb), self);
1333
G_OBJECT (settings),
1334
"gtk-dnd-drag-threshold", &priv->drag_threshold,
1353
1339
e_mail_tab_new (void)
1355
return g_object_new (E_MAIL_TYPE_TAB, NULL);
1341
return g_object_new (E_MAIL_TYPE_TAB, NULL);
1359
e_mail_tab_new_full (const gchar *text, ClutterActor *icon, gint width)
1361
return g_object_new (E_MAIL_TYPE_TAB,
1364
"tab-width", width, NULL);
1368
e_mail_tab_set_text (EMailTab *tab, const gchar *text)
1370
EMailTabPrivate *priv = tab->priv;
1375
priv->has_text = (text[0] != '\0');
1378
mx_label_set_text (MX_LABEL (priv->label), text);
1380
g_object_notify (G_OBJECT (tab), "text");
1384
e_mail_tab_set_default_icon (EMailTab *tab,
1387
EMailTabPrivate *priv = tab->priv;
1388
gboolean changed = !priv->icon || (priv->icon == priv->default_icon);
1391
g_object_ref_sink (icon);
1393
if (priv->default_icon)
1394
g_object_unref (priv->default_icon);
1396
priv->default_icon = icon;
1399
e_mail_tab_set_icon (tab, NULL);
1403
e_mail_tab_set_icon (EMailTab *tab, ClutterActor *icon)
1405
EMailTabPrivate *priv = tab->priv;
1407
/* passing NULL for icon will use default icon if available */
1410
clutter_actor_unparent (priv->icon);
1415
priv->icon = priv->default_icon;
1419
clutter_actor_set_parent (priv->icon, CLUTTER_ACTOR (tab));
1422
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1424
g_object_notify (G_OBJECT (tab), "icon");
1345
e_mail_tab_new_full (const gchar *text,
1349
return g_object_new (
1358
e_mail_tab_set_text (EMailTab *tab,
1361
EMailTabPrivate *priv = tab->priv;
1366
priv->has_text = (text[0] != '\0');
1369
mx_label_set_text (MX_LABEL (priv->label), text);
1371
g_object_notify (G_OBJECT (tab), "text");
1375
e_mail_tab_set_default_icon (EMailTab *tab,
1378
EMailTabPrivate *priv = tab->priv;
1379
gboolean changed = !priv->icon || (priv->icon == priv->default_icon);
1382
g_object_ref_sink (icon);
1384
if (priv->default_icon)
1385
g_object_unref (priv->default_icon);
1387
priv->default_icon = icon;
1390
e_mail_tab_set_icon (tab, NULL);
1394
e_mail_tab_set_icon (EMailTab *tab,
1397
EMailTabPrivate *priv = tab->priv;
1399
/* passing NULL for icon will use default icon if available */
1402
clutter_actor_unparent (priv->icon);
1407
priv->icon = priv->default_icon;
1410
clutter_actor_set_parent (priv->icon, CLUTTER_ACTOR (tab));
1412
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1414
g_object_notify (G_OBJECT (tab), "icon");
1428
1418
e_mail_tab_get_text (EMailTab *tab)
1430
EMailTabPrivate *priv = tab->priv;
1420
EMailTabPrivate *priv = tab->priv;
1433
return mx_label_get_text (MX_LABEL (priv->label));
1423
return mx_label_get_text (MX_LABEL (priv->label));
1439
1429
e_mail_tab_get_icon (EMailTab *tab)
1441
EMailTabPrivate *priv = tab->priv;
1442
return priv->icon == priv->default_icon ? NULL : priv->icon;
1431
EMailTabPrivate *priv = tab->priv;
1432
return priv->icon == priv->default_icon ? NULL : priv->icon;
1446
e_mail_tab_set_can_close (EMailTab *tab, gboolean can_close)
1436
e_mail_tab_set_can_close (EMailTab *tab,
1448
EMailTabPrivate *priv = tab->priv;
1450
if (priv->can_close == can_close)
1453
priv->can_close = can_close;
1455
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1457
g_object_notify (G_OBJECT (tab), "can-close");
1439
EMailTabPrivate *priv = tab->priv;
1441
if (priv->can_close == can_close)
1444
priv->can_close = can_close;
1446
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1448
g_object_notify (G_OBJECT (tab), "can-close");
1461
1452
e_mail_tab_get_can_close (EMailTab *tab)
1463
return tab->priv->can_close;
1454
return tab->priv->can_close;
1467
1458
e_mail_tab_set_width (EMailTab *tab,
1470
EMailTabPrivate *priv = tab->priv;
1472
if (priv->width == width)
1475
priv->width = width;
1477
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1479
g_object_notify (G_OBJECT (tab), "tab-width");
1461
EMailTabPrivate *priv = tab->priv;
1463
if (priv->width == width)
1466
priv->width = width;
1468
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1470
g_object_notify (G_OBJECT (tab), "tab-width");
1483
1474
e_mail_tab_get_width (EMailTab *tab)
1485
EMailTabPrivate *priv = tab->priv;
1476
EMailTabPrivate *priv = tab->priv;
1490
e_mail_tab_set_docking (EMailTab *tab,
1481
e_mail_tab_set_docking (EMailTab *tab,
1493
EMailTabPrivate *priv = tab->priv;
1495
if (priv->docking == docking)
1498
priv->docking = docking;
1500
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1502
g_object_notify (G_OBJECT (tab), "docking");
1484
EMailTabPrivate *priv = tab->priv;
1486
if (priv->docking == docking)
1489
priv->docking = docking;
1491
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1493
g_object_notify (G_OBJECT (tab), "docking");
1506
1497
e_mail_tab_get_docking (EMailTab *tab)
1508
EMailTabPrivate *priv = tab->priv;
1509
return priv->docking;
1499
EMailTabPrivate *priv = tab->priv;
1500
return priv->docking;
1513
e_mail_tab_set_preview_actor (EMailTab *tab, ClutterActor *actor)
1504
e_mail_tab_set_preview_actor (EMailTab *tab,
1505
ClutterActor *actor)
1515
EMailTabPrivate *priv = tab->priv;
1518
clutter_actor_unparent (priv->preview);
1520
priv->preview = actor;
1524
clutter_actor_set_parent (actor, CLUTTER_ACTOR (tab));
1526
clutter_actor_set_opacity (actor, priv->preview_mode ? 0xff : 0x00);
1527
if (!priv->preview_mode)
1528
clutter_actor_hide (actor);
1531
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1533
g_object_notify (G_OBJECT (tab), "preview");
1507
EMailTabPrivate *priv = tab->priv;
1510
clutter_actor_unparent (priv->preview);
1512
priv->preview = actor;
1515
clutter_actor_set_parent (actor, CLUTTER_ACTOR (tab));
1517
clutter_actor_set_opacity (
1518
actor, priv->preview_mode ? 0xff : 0x00);
1519
if (!priv->preview_mode)
1520
clutter_actor_hide (actor);
1523
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1525
g_object_notify (G_OBJECT (tab), "preview");
1537
1529
e_mail_tab_get_preview_actor (EMailTab *tab)
1539
EMailTabPrivate *priv = tab->priv;
1540
return priv->preview;
1531
EMailTabPrivate *priv = tab->priv;
1532
return priv->preview;
1544
1536
preview_new_frame_cb (ClutterTimeline *timeline,
1549
EMailTabPrivate *priv = tab->priv;
1551
forwards = (clutter_timeline_get_direction (timeline) ==
1552
CLUTTER_TIMELINE_FORWARD) ? TRUE : FALSE;
1553
if (priv->preview_mode)
1554
forwards = !forwards;
1556
priv->preview_height_progress = clutter_timeline_get_progress (timeline);
1558
priv->preview_height_progress = 1.0 - priv->preview_height_progress;
1561
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1541
EMailTabPrivate *priv = tab->priv;
1544
(clutter_timeline_get_direction (timeline) ==
1545
CLUTTER_TIMELINE_FORWARD);
1546
if (priv->preview_mode)
1547
forwards = !forwards;
1549
priv->preview_height_progress =
1550
clutter_timeline_get_progress (timeline);
1552
priv->preview_height_progress =
1553
1.0 - priv->preview_height_progress;
1556
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1565
1560
preview_completed_cb (ClutterTimeline *timeline,
1568
EMailTabPrivate *priv = tab->priv;
1570
if (priv->preview_timeline)
1572
clutter_timeline_stop (priv->preview_timeline);
1573
g_object_unref (priv->preview_timeline);
1574
priv->preview_timeline = NULL;
1576
if (priv->preview_mode)
1577
priv->preview_height_progress = 1.0;
1580
priv->preview_height_progress = 0.0;
1582
clutter_actor_hide (priv->preview);
1583
if (priv->can_close)
1584
clutter_actor_set_reactive (CLUTTER_ACTOR (priv->close_button),
1563
EMailTabPrivate *priv = tab->priv;
1565
if (priv->preview_timeline) {
1566
clutter_timeline_stop (priv->preview_timeline);
1567
g_object_unref (priv->preview_timeline);
1568
priv->preview_timeline = NULL;
1570
if (priv->preview_mode)
1571
priv->preview_height_progress = 1.0;
1573
priv->preview_height_progress = 0.0;
1575
clutter_actor_hide (priv->preview);
1576
if (priv->can_close)
1577
clutter_actor_set_reactive (
1578
CLUTTER_ACTOR (priv->close_button),
1588
/* Remove style hint if we're not in preview mode */
1591
if (!priv->preview_mode)
1592
clutter_actor_set_name (CLUTTER_ACTOR (tab),
1593
priv->private ? "private-tab" : NULL);
1597
/* If there's no preview actor, disable the tab */
1598
clutter_actor_set_reactive (CLUTTER_ACTOR (tab), !priv->preview_mode);
1602
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1604
g_signal_emit (tab, signals[TRANSITION_COMPLETE], 0);
1582
/* Remove style hint if we're not in preview mode */
1583
if (priv->preview) {
1584
if (!priv->preview_mode)
1585
clutter_actor_set_name (
1586
CLUTTER_ACTOR (tab),
1587
priv->private ? "private-tab" : NULL);
1589
/* If there's no preview actor, disable the tab */
1590
clutter_actor_set_reactive (
1591
CLUTTER_ACTOR (tab), !priv->preview_mode);
1595
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1597
g_signal_emit (tab, signals[TRANSITION_COMPLETE], 0);
1609
1602
preview_s1_started_cb (ClutterTimeline *timeline,
1612
EMailTabPrivate *priv = tab->priv;
1605
EMailTabPrivate *priv = tab->priv;
1615
clutter_actor_animate_with_timeline (CLUTTER_ACTOR (priv->label),
1616
CLUTTER_EASE_IN_OUT_QUAD,
1608
clutter_actor_animate_with_timeline (
1609
CLUTTER_ACTOR (priv->label),
1610
CLUTTER_EASE_IN_OUT_QUAD,
1623
1617
preview_s2_started_cb (ClutterTimeline *timeline,
1626
EMailTabPrivate *priv = tab->priv;
1620
EMailTabPrivate *priv = tab->priv;
1629
clutter_actor_animate_with_timeline (CLUTTER_ACTOR (priv->label),
1630
CLUTTER_EASE_IN_OUT_QUAD,
1623
clutter_actor_animate_with_timeline (
1624
CLUTTER_ACTOR (priv->label),
1625
CLUTTER_EASE_IN_OUT_QUAD,
1637
e_mail_tab_set_preview_mode (EMailTab *tab, gboolean preview)
1632
e_mail_tab_set_preview_mode (EMailTab *tab,
1639
EMailTabPrivate *priv = tab->priv;
1641
if (priv->preview_mode != preview)
1643
ClutterTimeline *timeline, *timeline2;
1644
gdouble progress, total_duration, duration1, duration2;
1646
priv->preview_mode = preview;
1648
/* Disable the close button in preview mode */
1649
if (preview && priv->can_close)
1650
clutter_actor_set_reactive (CLUTTER_ACTOR (priv->close_button), FALSE);
1635
EMailTabPrivate *priv = tab->priv;
1637
if (priv->preview_mode != preview) {
1638
ClutterTimeline *timeline, *timeline2;
1639
gdouble progress, total_duration, duration1, duration2;
1641
priv->preview_mode = preview;
1643
/* Disable the close button in preview mode */
1644
if (preview && priv->can_close)
1645
clutter_actor_set_reactive (CLUTTER_ACTOR (priv->close_button), FALSE);
1652
1647
#define DEBUG_MULT 1
1653
if (priv->preview_timeline)
1656
clutter_timeline_get_progress (priv->preview_timeline);
1657
clutter_timeline_stop (priv->preview_timeline);
1658
g_object_unref (priv->preview_timeline);
1663
total_duration = priv->anim_length * (1.0 - progress) * DEBUG_MULT;
1664
duration1 = total_duration * TAB_S1_ANIM;
1665
duration2 = total_duration * TAB_S2_ANIM;
1667
priv->preview_timeline =
1668
clutter_timeline_new (priv->anim_length * DEBUG_MULT);
1669
clutter_timeline_skip (priv->preview_timeline,
1670
clutter_timeline_get_duration (priv->preview_timeline) * progress);
1672
g_signal_connect (priv->preview_timeline, "completed",
1648
if (priv->preview_timeline) {
1649
progress = 1.0 - clutter_timeline_get_progress (
1650
priv->preview_timeline);
1651
clutter_timeline_stop (priv->preview_timeline);
1652
g_object_unref (priv->preview_timeline);
1656
total_duration = priv->anim_length * (1.0 - progress) * DEBUG_MULT;
1657
duration1 = total_duration * TAB_S1_ANIM;
1658
duration2 = total_duration * TAB_S2_ANIM;
1660
priv->preview_timeline =
1661
clutter_timeline_new (priv->anim_length * DEBUG_MULT);
1662
clutter_timeline_skip (
1663
priv->preview_timeline, clutter_timeline_get_duration (
1664
priv->preview_timeline) * progress);
1667
priv->preview_timeline, "completed",
1673
1668
G_CALLBACK (preview_completed_cb), tab);
1675
clutter_timeline_start (priv->preview_timeline);
1679
clutter_actor_animate_with_timeline (CLUTTER_ACTOR (tab),
1680
CLUTTER_EASE_IN_OUT_QUAD,
1681
priv->preview_timeline,
1682
"opacity", preview ? 0x00 : 0xff,
1687
g_signal_connect (priv->preview_timeline, "new-frame",
1670
clutter_timeline_start (priv->preview_timeline);
1672
if (!priv->preview) {
1673
clutter_actor_animate_with_timeline (
1674
CLUTTER_ACTOR (tab),
1675
CLUTTER_EASE_IN_OUT_QUAD,
1676
priv->preview_timeline,
1677
"opacity", preview ? 0x00 : 0xff,
1683
priv->preview_timeline, "new-frame",
1688
1684
G_CALLBACK (preview_new_frame_cb), tab);
1690
timeline = clutter_timeline_new ((guint) duration1);
1691
timeline2 = clutter_timeline_new ((guint) duration2);
1686
timeline = clutter_timeline_new ((guint) duration1);
1687
timeline2 = clutter_timeline_new ((guint) duration2);
1693
g_signal_connect (timeline, "started",
1690
timeline, "started",
1694
1691
G_CALLBACK (preview_s1_started_cb), tab);
1695
g_signal_connect (timeline2, "started",
1693
timeline2, "started",
1696
1694
G_CALLBACK (preview_s2_started_cb), tab);
1699
clutter_timeline_set_delay (timeline2, duration1);
1701
clutter_timeline_set_delay (timeline, duration2);
1703
/* clutter_actor_animate_with_timeline will start the timelines */
1704
clutter_actor_animate_with_timeline (CLUTTER_ACTOR (priv->label),
1705
CLUTTER_EASE_IN_OUT_QUAD,
1706
preview ? timeline : timeline2,
1710
clutter_actor_animate_with_timeline (priv->icon,
1711
CLUTTER_EASE_IN_OUT_QUAD,
1713
"opacity", preview ? 0x00 : 0xff,
1715
if (priv->can_close)
1716
clutter_actor_animate_with_timeline (CLUTTER_ACTOR (priv->close_button),
1717
CLUTTER_EASE_IN_OUT_QUAD,
1719
"opacity", preview ? 0x00 : 0xff,
1724
clutter_actor_show (priv->preview);
1725
clutter_actor_animate_with_timeline (priv->preview,
1726
CLUTTER_EASE_IN_OUT_QUAD,
1728
"opacity", preview ? 0xff : 0x00,
1697
clutter_timeline_set_delay (timeline2, duration1);
1699
clutter_timeline_set_delay (timeline, duration2);
1701
/* clutter_actor_animate_with_timeline will start the timelines */
1702
clutter_actor_animate_with_timeline (
1703
CLUTTER_ACTOR (priv->label),
1704
CLUTTER_EASE_IN_OUT_QUAD,
1705
preview ? timeline : timeline2,
1706
"opacity", 0x00, NULL);
1709
clutter_actor_animate_with_timeline (
1711
CLUTTER_EASE_IN_OUT_QUAD,
1713
"opacity", preview ? 0x00 : 0xff,
1716
if (priv->can_close)
1717
clutter_actor_animate_with_timeline (
1718
CLUTTER_ACTOR (priv->close_button),
1719
CLUTTER_EASE_IN_OUT_QUAD,
1721
"opacity", preview ? 0x00 : 0xff,
1725
clutter_actor_show (priv->preview);
1726
clutter_actor_animate_with_timeline (
1728
CLUTTER_EASE_IN_OUT_QUAD,
1730
"opacity", preview ? 0xff : 0x00,
1733
/* The animations have references on these, drop ours */
1734
g_object_unref (timeline);
1735
g_object_unref (timeline2);
1737
/* Add an actor name, for style */
1738
clutter_actor_set_name (
1739
CLUTTER_ACTOR (tab),
1740
priv->private ? "private-preview-tab" :
1732
/* The animations have references on these, drop ours */
1733
g_object_unref (timeline);
1734
g_object_unref (timeline2);
1736
/* Add an actor name, for style */
1737
clutter_actor_set_name (CLUTTER_ACTOR (tab),
1738
priv->private ? "private-preview-tab" :
1744
1746
e_mail_tab_get_preview_mode (EMailTab *tab)
1746
EMailTabPrivate *priv = tab->priv;
1747
return priv->preview_mode;
1748
EMailTabPrivate *priv = tab->priv;
1749
return priv->preview_mode;
1751
e_mail_tab_set_preview_duration (EMailTab *tab, guint duration)
1753
e_mail_tab_set_preview_duration (EMailTab *tab,
1753
EMailTabPrivate *priv = tab->priv;
1756
EMailTabPrivate *priv = tab->priv;
1755
if (priv->anim_length != duration)
1757
priv->anim_length = duration;
1758
g_object_notify (G_OBJECT (tab), "preview-duration");
1758
if (priv->anim_length != duration) {
1759
priv->anim_length = duration;
1760
g_object_notify (G_OBJECT (tab), "preview-duration");
1763
1765
e_mail_tab_get_preview_duration (EMailTab *tab)
1765
EMailTabPrivate *priv = tab->priv;
1766
return priv->anim_length;
1767
EMailTabPrivate *priv = tab->priv;
1768
return priv->anim_length;
1770
e_mail_tab_set_spacing (EMailTab *tab, gfloat spacing)
1772
e_mail_tab_set_spacing (EMailTab *tab,
1772
EMailTabPrivate *priv = tab->priv;
1775
EMailTabPrivate *priv = tab->priv;
1774
if (priv->spacing != spacing)
1776
priv->spacing = spacing;
1777
g_object_notify (G_OBJECT (tab), "spacing");
1778
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1777
if (priv->spacing != spacing) {
1778
priv->spacing = spacing;
1779
g_object_notify (G_OBJECT (tab), "spacing");
1780
clutter_actor_queue_relayout (CLUTTER_ACTOR (tab));
1783
1785
e_mail_tab_get_spacing (EMailTab *tab)
1785
EMailTabPrivate *priv = tab->priv;
1786
return priv->spacing;
1787
EMailTabPrivate *priv = tab->priv;
1788
return priv->spacing;
1790
e_mail_tab_set_private (EMailTab *tab, gboolean private)
1792
e_mail_tab_set_private (EMailTab *tab,
1792
EMailTabPrivate *priv = tab->priv;
1794
if (priv->private == private)
1797
priv->private = private;
1799
if (!priv->preview_mode)
1800
clutter_actor_set_name (CLUTTER_ACTOR (tab),
1801
private ? "private-tab" : NULL);
1803
g_object_notify (G_OBJECT (tab), "private");
1795
EMailTabPrivate *priv = tab->priv;
1797
if (priv->private == private)
1800
priv->private = private;
1802
if (!priv->preview_mode)
1803
clutter_actor_set_name (
1804
CLUTTER_ACTOR (tab), private ? "private-tab" : NULL);
1806
g_object_notify (G_OBJECT (tab), "private");
1807
1810
e_mail_tab_get_private (EMailTab *tab)
1809
EMailTabPrivate *priv = tab->priv;
1810
return priv->private;
1812
EMailTabPrivate *priv = tab->priv;
1813
return priv->private;
1814
e_mail_tab_set_active (EMailTab *tab, gboolean active)
1817
e_mail_tab_set_active (EMailTab *tab,
1816
EMailTabPrivate *priv = tab->priv;
1818
if (priv->active == active)
1821
priv->active = active;
1823
g_object_notify (G_OBJECT (tab), "active");
1826
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "active");
1827
else if (!priv->pressed)
1830
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "hover");
1832
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), NULL);
1820
EMailTabPrivate *priv = tab->priv;
1822
if (priv->active == active)
1825
priv->active = active;
1827
g_object_notify (G_OBJECT (tab), "active");
1830
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "active");
1831
else if (!priv->pressed) {
1833
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), "hover");
1835
mx_stylable_set_style_pseudo_class (MX_STYLABLE (tab), NULL);
1837
1840
e_mail_tab_get_active (EMailTab *tab)
1839
EMailTabPrivate *priv = tab->priv;
1840
return priv->active;
1842
EMailTabPrivate *priv = tab->priv;
1843
return priv->active;
1843
1846
static gboolean
1844
1847
e_mail_tab_alert_cb (EMailTab *tab)
1847
EMailTabPrivate *priv = tab->priv;
1849
/* FIXME: Work in preview mode */
1851
/* Alternate between private mode and non-private to alert */
1852
name = (priv->private ^ (priv->alert_count % 2)) ? NULL : "private-tab";
1853
if (!priv->preview_mode)
1854
clutter_actor_set_name (CLUTTER_ACTOR (tab), name);
1855
priv->alert_count++;
1857
if (priv->alert_count < 4)
1860
/* This call isn't needed, it should be in the correct state as long as
1861
* the above check always checks for < (an even number)
1863
/*if (!priv->preview_mode)
1864
clutter_actor_set_name (CLUTTER_ACTOR (tab),
1865
priv->private ? "private-tab" : NULL);*/
1866
priv->alert_source = 0;
1850
EMailTabPrivate *priv = tab->priv;
1852
/* FIXME: Work in preview mode */
1854
/* Alternate between private mode and non-private to alert */
1855
name = (priv->private ^ (priv->alert_count % 2)) ? NULL : "private-tab";
1856
if (!priv->preview_mode)
1857
clutter_actor_set_name (CLUTTER_ACTOR (tab), name);
1858
priv->alert_count++;
1860
if (priv->alert_count < 4)
1863
/* This call isn't needed, it should be in the correct state as long as
1864
* the above check always checks for < (an even number)
1866
/*if (!priv->preview_mode)
1867
clutter_actor_set_name (CLUTTER_ACTOR (tab),
1868
priv->private ? "private-tab" : NULL);*/
1869
priv->alert_source = 0;
1872
1875
e_mail_tab_alert (EMailTab *tab)
1874
EMailTabPrivate *priv = tab->priv;
1877
EMailTabPrivate *priv = tab->priv;
1876
priv->alert_count = 0;
1877
if (!priv->alert_source)
1878
priv->alert_source =
1879
g_timeout_add_full (G_PRIORITY_HIGH,
1881
(GSourceFunc) e_mail_tab_alert_cb,
1879
priv->alert_count = 0;
1880
if (!priv->alert_source)
1881
priv->alert_source =
1882
g_timeout_add_full (G_PRIORITY_HIGH,
1884
(GSourceFunc) e_mail_tab_alert_cb,
1887
e_mail_tab_enable_drag (EMailTab *tab, gboolean enable)
1890
e_mail_tab_enable_drag (EMailTab *tab,
1889
EMailTabPrivate *priv = tab->priv;
1891
if (priv->drag_enabled == enable)
1894
priv->drag_enabled = enable;
1896
mx_draggable_enable (MX_DRAGGABLE (tab));
1898
mx_draggable_disable (MX_DRAGGABLE (tab));
1893
EMailTabPrivate *priv = tab->priv;
1895
if (priv->drag_enabled == enable)
1898
priv->drag_enabled = enable;
1900
mx_draggable_enable (MX_DRAGGABLE (tab));
1902
mx_draggable_disable (MX_DRAGGABLE (tab));