~ubuntu-branches/ubuntu/precise/rhythmbox/precise-201203091205

« back to all changes in this revision

Viewing changes to shell/rb-statusbar.c

Tags: upstream-0.9.2cvs20060102
ImportĀ upstreamĀ versionĀ 0.9.2cvs20060102

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 *
22
22
 */
23
23
 
24
 
#include <gtk/gtk.h>
25
24
#include <config.h>
 
25
 
26
26
#include <unistd.h>
27
27
#include <stdlib.h>
28
28
#include <string.h>
29
 
#include <libgnome/gnome-i18n.h>
 
29
 
 
30
#include <glib/gi18n.h>
 
31
#include <gtk/gtk.h>
30
32
 
31
33
#include "rb-statusbar.h"
32
34
#include "rb-preferences.h"
62
64
 
63
65
static void rb_statusbar_sync_status (RBStatusbar *status);
64
66
static gboolean poll_status (RBStatusbar *status);
65
 
static void rb_statusbar_toggle_changed_cb (GtkToggleButton *toggle,
66
 
                                            RBStatusbar *statusbar);
67
67
static void rb_statusbar_view_statusbar_changed_cb (GtkAction *action,
68
68
                                                    RBStatusbar *statusbar);
69
 
static void rb_statusbar_entry_view_changed_cb (RBEntryView *view,
70
 
                                                RBStatusbar *statusbar);
 
69
static void rb_statusbar_source_status_changed_cb (RBSource *source,
 
70
                                                   RBStatusbar *statusbar);
71
71
 
72
72
static GtkToggleActionEntry rb_statusbar_toggle_entries [] =
73
73
{
90
90
 
91
91
        GtkTooltips *tooltips;
92
92
 
93
 
        GtkWidget *shuffle;
94
 
        GtkWidget *repeat;
95
93
        GtkWidget *status;
96
94
 
97
95
        GtkWidget *progress;
109
107
        guint notify_id;
110
108
};
111
109
 
 
110
#define RB_STATUSBAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_STATUSBAR, RBStatusbarPrivate))
 
111
 
112
112
enum
113
113
{
114
114
        PROP_0,
165
165
                                                              RB_TYPE_SHELL_PLAYER,
166
166
                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
167
167
 
168
 
 
 
168
        g_type_class_add_private (klass, sizeof (RBStatusbarPrivate));
169
169
}
170
170
 
171
171
static GObject*
200
200
static void
201
201
rb_statusbar_init (RBStatusbar *statusbar)
202
202
{
203
 
        statusbar->priv = g_new0 (RBStatusbarPrivate, 1);
 
203
        statusbar->priv = RB_STATUSBAR_GET_PRIVATE (statusbar);
204
204
 
205
205
        statusbar->priv->tooltips = gtk_tooltips_new ();
206
206
        gtk_tooltips_enable (statusbar->priv->tooltips);
207
207
 
208
208
        gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), TRUE);
209
209
 
210
 
        statusbar->priv->shuffle = gtk_check_button_new_with_mnemonic (_("Sh_uffle"));
211
 
        gtk_tooltips_set_tip (GTK_TOOLTIPS (statusbar->priv->tooltips), 
212
 
                              GTK_WIDGET (statusbar->priv->shuffle), 
213
 
                              _("Play songs in a random order"), NULL);
214
 
 
215
 
        statusbar->priv->repeat = gtk_check_button_new_with_mnemonic (_("_Repeat"));
216
 
        gtk_tooltips_set_tip (GTK_TOOLTIPS (statusbar->priv->tooltips), 
217
 
                              GTK_WIDGET (statusbar->priv->repeat), 
218
 
                              _("Play first song again after all songs are played"), NULL);
219
 
        g_signal_connect_object (G_OBJECT (statusbar->priv->shuffle), "toggled",
220
 
                                 G_CALLBACK (rb_statusbar_toggle_changed_cb), statusbar, 0);
221
 
        g_signal_connect_object (G_OBJECT (statusbar->priv->repeat), "toggled",
222
 
                                 G_CALLBACK (rb_statusbar_toggle_changed_cb), statusbar, 0);
223
 
 
224
210
        statusbar->priv->progress = gtk_progress_bar_new ();
225
211
        statusbar->priv->progress_fraction = 1.0;
226
212
 
230
216
        gtk_widget_hide (statusbar->priv->progress);
231
217
 
232
218
        gtk_box_pack_start (GTK_BOX (statusbar),
233
 
                            GTK_WIDGET (statusbar->priv->repeat), FALSE, TRUE, 0);
234
 
        gtk_box_pack_start (GTK_BOX (statusbar),
235
 
                            GTK_WIDGET (statusbar->priv->shuffle), FALSE, TRUE, 0);
236
 
        gtk_box_pack_start (GTK_BOX (statusbar),
237
219
                            GTK_WIDGET (statusbar->priv->progress), FALSE, TRUE, 0);
238
220
 
239
221
        statusbar->priv->notify_id = 
263
245
        if (statusbar->priv->status_poll_id)
264
246
                g_source_remove (statusbar->priv->status_poll_id);
265
247
        
266
 
        g_free (statusbar->priv);
267
 
 
268
248
        G_OBJECT_CLASS (parent_class)->finalize (object);
269
249
}
270
250
 
352
332
                break;
353
333
        case PROP_SOURCE:
354
334
                if (statusbar->priv->selected_source != NULL) {
355
 
                        RBEntryView *songs = rb_source_get_entry_view (statusbar->priv->selected_source);
356
 
 
357
 
                        g_signal_handlers_disconnect_by_func (G_OBJECT (songs),
358
 
                                                              G_CALLBACK (rb_statusbar_entry_view_changed_cb),
359
 
                                                              statusbar);
 
335
                        g_signal_handlers_disconnect_by_func (G_OBJECT (statusbar->priv->selected_source),
 
336
                                                              G_CALLBACK (rb_statusbar_source_status_changed_cb),
 
337
                                                              statusbar);
360
338
                }
361
339
                
362
340
                statusbar->priv->selected_source = g_value_get_object (value);
363
341
                rb_debug ("selected source %p", g_value_get_object (value));
364
342
 
365
343
                if (statusbar->priv->selected_source != NULL) {
366
 
                        RBEntryView *songs = rb_source_get_entry_view (statusbar->priv->selected_source);
367
 
 
368
 
                        g_signal_connect_object (G_OBJECT (songs),
369
 
                                                 "changed",
370
 
                                                 G_CALLBACK (rb_statusbar_entry_view_changed_cb),
371
 
                                                 statusbar, 0);
372
 
 
 
344
                        g_signal_connect_object (G_OBJECT (statusbar->priv->selected_source),
 
345
                                                 "status-changed",
 
346
                                                 G_CALLBACK (rb_statusbar_source_status_changed_cb),
 
347
                                                 statusbar, 0);
373
348
                }
374
349
                rb_statusbar_sync_with_source (statusbar);
375
350
 
490
465
                pulse_progress = TRUE;
491
466
        }
492
467
 
493
 
        /* 3. entry view busy? */
 
468
        /* 3. query model busy? */
494
469
        if (status_text == NULL && status->priv->selected_source) {
495
 
                RBEntryView *view;
496
 
                view = rb_source_get_entry_view (status->priv->selected_source);
497
 
                if (rb_entry_view_busy (view))
 
470
                RhythmDBQueryModel *model;
 
471
 
 
472
                g_object_get (G_OBJECT (status->priv->selected_source), "query-model", &model, NULL);
 
473
                if (rhythmdb_query_model_has_pending_changes (model))
498
474
                        pulse_progress = TRUE;
499
475
                else
500
476
                        show_progress = FALSE;
 
477
                g_object_unref (G_OBJECT (model));
501
478
        }
502
479
 
503
480
        /* set up the status text */
606
583
rb_statusbar_sync_state (RBStatusbar *statusbar)
607
584
{
608
585
        GtkAction *action;
609
 
        gboolean hidden, consistent;
610
 
        int shuffle, repeat;
 
586
        gboolean hidden;
611
587
 
612
588
        rb_debug ("syncing state");
613
589
 
614
590
        statusbar->priv->syncing_state = TRUE;
615
 
        consistent = rb_shell_player_get_playback_state (statusbar->priv->player,
616
 
                                                         &shuffle, &repeat);
617
 
        if (consistent) {
618
 
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (statusbar->priv->shuffle),
619
 
                                              shuffle);
620
 
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (statusbar->priv->repeat),
621
 
                                              repeat);
622
 
        } 
623
 
        gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (statusbar->priv->shuffle),
624
 
                                            !consistent);
625
 
        gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (statusbar->priv->repeat),
626
 
                                            !consistent);
627
591
        
628
592
        hidden = eel_gconf_get_boolean (CONF_UI_STATUSBAR_HIDDEN);
629
593
        if (hidden)
662
626
}
663
627
 
664
628
static void
665
 
rb_statusbar_toggle_changed_cb (GtkToggleButton *toggle,
666
 
                                RBStatusbar *statusbar)
667
 
{
668
 
        RBShellPlayer *player = statusbar->priv->player;
669
 
        gboolean shuffle, repeat;
670
 
 
671
 
        if (statusbar->priv->syncing_state)
672
 
                return;
673
 
        statusbar->priv->syncing_state = TRUE;
674
 
 
675
 
        rb_debug ("toggle changed");
676
 
 
677
 
        shuffle = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (statusbar->priv->shuffle));
678
 
        repeat = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (statusbar->priv->repeat));
679
 
 
680
 
        rb_shell_player_set_playback_state (player, shuffle, repeat);
681
 
        statusbar->priv->syncing_state = FALSE;
682
 
}
683
 
 
684
 
static void
685
629
rb_statusbar_view_statusbar_changed_cb (GtkAction *action,
686
630
                                        RBStatusbar *statusbar)
687
631
{
693
637
}
694
638
 
695
639
static void
696
 
rb_statusbar_entry_view_changed_cb (RBEntryView *view,
697
 
                                    RBStatusbar *statusbar)
 
640
rb_statusbar_source_status_changed_cb (RBSource *source, RBStatusbar *statusbar)
698
641
{
699
 
        rb_debug ("entry view changed");
700
 
        if (statusbar->priv->idle)
701
 
                rb_statusbar_sync_with_source (statusbar);
 
642
        rb_debug ("source status changed");
 
643
        if (statusbar->priv->idle)
 
644
                rb_statusbar_sync_with_source (statusbar);
702
645
}