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

« back to all changes in this revision

Viewing changes to shell/rb-source-header.c

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

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* 
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
 
2
 * 
2
3
 *  arch-tag: Implementation of search entry/browse toggle container
3
4
 *
4
5
 *  Copyright (C) 2003 Jorn Baayen <jorn@nl.linux.org>
20
21
 *
21
22
 */
22
23
 
23
 
#include <gtk/gtk.h>
24
24
#include <config.h>
25
25
#include <unistd.h>
26
26
#include <stdlib.h>
27
27
#include <string.h>
28
 
#include <libgnome/gnome-i18n.h>
 
28
 
 
29
#include <glib/gi18n.h>
 
30
#include <gtk/gtk.h>
29
31
 
30
32
#include "disclosure-widget.h"
31
33
#include "rb-source-header.h"
58
60
                                                    gpointer data);
59
61
static void rb_source_header_search_activate_cb (RBSearchEntry *search,
60
62
                                                 RBSourceHeader *header);
61
 
static void rb_source_header_gconf_disclosure_changed_cb (GConfClient *client,
62
 
                                                          guint cnxn_id,
63
 
                                                          GConfEntry *entry,
64
 
                                                          RBSourceHeader *header);
65
63
static void rb_source_header_view_browser_changed_cb (GtkAction *action,
66
64
                                                      RBSourceHeader *header);
67
65
static void rb_source_header_source_weak_destroy_cb (RBSourceHeader *header, RBSource *source);
80
78
        guint browser_notify_id;
81
79
        guint search_notify_id;
82
80
        gboolean have_search;
 
81
        gboolean have_browser;
 
82
        gboolean disclosed;
83
83
        const char *browser_key;
84
84
 
85
85
        GHashTable *source_search_text;
86
86
};
87
87
 
 
88
#define RB_SOURCE_HEADER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_SOURCE_HEADER, RBSourceHeaderPrivate))
 
89
 
88
90
enum
89
91
{
90
92
        PROP_0,
127
129
                                                              "GtkActionGroup object",
128
130
                                                              GTK_TYPE_ACTION_GROUP,
129
131
                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
132
 
 
133
        g_type_class_add_private (klass, sizeof (RBSourceHeaderPrivate));
130
134
}
131
135
 
132
136
static void
134
138
{
135
139
        GtkWidget *align;
136
140
        GtkEventBox *ebox;
137
 
        header->priv = g_new0 (RBSourceHeaderPrivate, 1);
 
141
 
 
142
        header->priv = RB_SOURCE_HEADER_GET_PRIVATE (header);
138
143
 
139
144
        header->priv->tooltips = gtk_tooltips_new ();
140
145
        gtk_tooltips_enable (header->priv->tooltips);
202
207
                              header);
203
208
        g_hash_table_destroy (header->priv->source_search_text);
204
209
 
205
 
        g_free (header->priv);
206
 
 
207
210
        G_OBJECT_CLASS (rb_source_header_parent_class)->finalize (object);
208
211
}
209
212
 
220
223
        case PROP_SOURCE:
221
224
                if (header->priv->selected_source != NULL)
222
225
                {
223
 
                        if (header->priv->browser_key)
224
 
                                eel_gconf_notification_remove (header->priv->browser_notify_id);
225
226
                        g_signal_handlers_disconnect_by_func (G_OBJECT (header->priv->selected_source),
226
227
                                                              G_CALLBACK (rb_source_header_filter_changed_cb),
227
228
                                                              header);
230
231
                header->priv->selected_source = g_value_get_object (value);
231
232
                rb_debug ("selected source %p", g_value_get_object (value));
232
233
 
233
 
                if (header->priv->selected_source != NULL)
234
 
                {
 
234
                if (header->priv->selected_source != NULL) {
235
235
                        const char *text = g_hash_table_lookup (header->priv->source_search_text,
236
236
                                                                header->priv->selected_source);
237
237
                        
238
238
                        header->priv->browser_key = rb_source_get_browser_key (header->priv->selected_source);
239
 
                        if (header->priv->browser_key)
240
 
                                header->priv->browser_notify_id
241
 
                                        = eel_gconf_notification_add (header->priv->browser_key,
242
 
                                                                      (GConfClientNotifyFunc) rb_source_header_gconf_disclosure_changed_cb,
243
 
                                                                      header);
 
239
        
244
240
                        rb_search_entry_set_text (RB_SEARCH_ENTRY (header->priv->search), text);
245
241
                        g_signal_connect_object (G_OBJECT (header->priv->selected_source),
246
242
                                                 "filter_changed",
247
243
                                                 G_CALLBACK (rb_source_header_filter_changed_cb),
248
244
                                                 header, 0);
 
245
        
249
246
                        gtk_widget_set_sensitive (GTK_WIDGET (header->priv->search),
250
247
                                                  rb_source_can_search (header->priv->selected_source));
251
248
                        header->priv->have_search = rb_source_can_search (header->priv->selected_source);
252
 
                        if (!header->priv->browser_key && !header->priv->have_search)
 
249
                        header->priv->have_browser = rb_source_can_browse (header->priv->selected_source);
 
250
                        if (!header->priv->have_browser)
 
251
                                header->priv->disclosed = FALSE;
 
252
                        else if (header->priv->browser_key)
 
253
                                header->priv->disclosed = eel_gconf_get_boolean (header->priv->browser_key);
 
254
                        else
 
255
                                /* FIXME: remember the previous state of the source*/
 
256
                                header->priv->disclosed = FALSE;
 
257
        
 
258
                        if (!header->priv->have_browser && !header->priv->have_search)
253
259
                                gtk_widget_hide (GTK_WIDGET (header));
254
260
                        else
255
261
                                gtk_widget_show (GTK_WIDGET (header));
256
262
                }
257
263
                rb_source_header_sync_control_state (header);
258
 
                
259
264
                break;
260
265
        case PROP_ACTION_GROUP:
261
266
                header->priv->actiongroup = g_value_get_object (value);
377
382
{
378
383
        RBSourceHeader *header = RB_SOURCE_HEADER (data);
379
384
        GtkExpander *expander = GTK_EXPANDER (object);
380
 
        gboolean disclosed = gtk_expander_get_expanded (expander);
381
 
 
382
 
        rb_debug ("disclosed: %s", disclosed ? "TRUE" : "FALSE");
383
 
        
384
 
        if (header->priv->selected_source != NULL)
385
 
                eel_gconf_set_boolean (header->priv->browser_key, disclosed);
386
 
}
387
 
 
388
 
static void
389
 
rb_source_header_gconf_disclosure_changed_cb (GConfClient *client,
390
 
                                              guint cnxn_id,
391
 
                                              GConfEntry *entry,
392
 
                                              RBSourceHeader *header)
393
 
{
394
 
        rb_debug ("gconf disclosure changed");
395
 
 
396
 
        g_return_if_fail (header->priv->browser_key != NULL);
 
385
 
 
386
        header->priv->disclosed = gtk_expander_get_expanded (expander);
 
387
 
 
388
        if (header->priv->browser_key)
 
389
                eel_gconf_set_boolean (header->priv->browser_key, 
 
390
                                       header->priv->disclosed);
397
391
 
398
392
        rb_source_header_sync_control_state (header);
399
393
}
403
397
                                          RBSourceHeader *header)
404
398
{
405
399
        rb_debug ("got view browser toggle");
406
 
        eel_gconf_set_boolean (header->priv->browser_key,
407
 
                               gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
 
400
        gtk_expander_set_expanded (GTK_EXPANDER (header->priv->disclosure),
 
401
                                   gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
408
402
}
409
403
 
410
404
void
413
407
        GtkAction *viewbrowser_action;
414
408
        GtkAction *viewstatusbar_action;
415
409
        GtkAction *viewall_action;
416
 
        gboolean have_browser = header->priv->selected_source != NULL
417
 
                && header->priv->browser_key != NULL;
418
410
        gboolean not_small = !eel_gconf_get_boolean (CONF_UI_SMALL_DISPLAY);
419
411
 
420
412
        gtk_widget_set_sensitive (header->priv->disclosure,
421
 
                                  have_browser);
 
413
                                  header->priv->have_browser);
422
414
        viewbrowser_action = gtk_action_group_get_action (header->priv->actiongroup,
423
415
                                                          "ViewBrowser");
424
416
        g_object_set (G_OBJECT (viewbrowser_action), "sensitive",
425
 
                      have_browser && not_small, NULL);
 
417
                      header->priv->have_browser && not_small, NULL);
426
418
        viewstatusbar_action = gtk_action_group_get_action (header->priv->actiongroup,
427
419
                                                            "ViewStatusbar");
428
420
        g_object_set (G_OBJECT (viewstatusbar_action), "sensitive",
430
422
        viewall_action = gtk_action_group_get_action (header->priv->actiongroup,
431
423
                                                      "ViewAll");
432
424
        g_object_set (G_OBJECT (viewall_action), "sensitive",
433
 
                      have_browser && not_small, NULL);
434
 
        if (have_browser) {
435
 
                gboolean shown = eel_gconf_get_boolean (header->priv->browser_key);
436
 
                gtk_expander_set_expanded    (GTK_EXPANDER (header->priv->disclosure),
437
 
                                              shown);
438
 
                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (viewbrowser_action),
439
 
                                              shown);
440
 
        }
 
425
                      header->priv->have_browser && not_small, NULL);
 
426
 
 
427
        gtk_expander_set_expanded (GTK_EXPANDER (header->priv->disclosure),
 
428
                                   header->priv->disclosed);
 
429
        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (viewbrowser_action),
 
430
                                      header->priv->disclosed);
441
431
}
442
432
 
443
433
static void