~ubuntu-branches/ubuntu/oneiric/rhythmbox/oneiric

« back to all changes in this revision

Viewing changes to widgets/rb-property-view.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2006-06-26 19:06:10 UTC
  • mto: (2.1.1 lenny) (1.1.37 upstream)
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20060626190610-08x8lgvvfs0gr619
Tags: upstream-0.9.5
ImportĀ upstreamĀ versionĀ 0.9.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 *
17
17
 *  You should have received a copy of the GNU General Public License
18
18
 *  along with this program; if not, write to the Free Software
19
 
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
19
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
20
20
 *
21
21
 */
22
22
 
37
37
#include "rhythmdb-property-model.h"
38
38
#include "rb-stock-icons.h"
39
39
#include "eel-gconf-extensions.h"
 
40
#include "rb-util.h"
40
41
 
41
42
static void rb_property_view_class_init (RBPropertyViewClass *klass);
42
43
static void rb_property_view_init (RBPropertyView *view);
62
63
static void rb_property_view_post_row_deleted_cb (GtkTreeModel *model,
63
64
                                                  GtkTreePath *path,
64
65
                                                  RBPropertyView *view);
 
66
static gboolean rb_property_view_popup_menu_cb (GtkTreeView *treeview,
 
67
                                                RBPropertyView *view);
 
68
static gboolean rb_property_view_button_press_cb (GtkTreeView *tree,
 
69
                                                  GdkEventButton *event,
 
70
                                                  RBPropertyView *view);
65
71
 
66
72
struct RBPropertyViewPrivate
67
73
{
88
94
        PROPERTIES_SELECTED,
89
95
        PROPERTY_ACTIVATED,
90
96
        SELECTION_RESET,
 
97
        SHOW_POPUP,
91
98
        LAST_SIGNAL
92
99
};
93
100
 
150
157
                                         g_param_spec_enum ("prop",
151
158
                                                            "PropertyId",
152
159
                                                            "RhythmDBPropType",
153
 
                                                            RHYTHMDB_TYPE_PROP,
 
160
                                                            RHYTHMDB_TYPE_PROP_TYPE,
154
161
                                                            RHYTHMDB_PROP_TYPE,
155
162
                                                            G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
156
163
 
217
224
                              NULL, NULL,
218
225
                              g_cclosure_marshal_VOID__VOID,
219
226
                              G_TYPE_NONE,
220
 
                              0); 
 
227
                              0);
 
228
        rb_property_view_signals[SHOW_POPUP] =
 
229
                g_signal_new ("show_popup",
 
230
                              G_OBJECT_CLASS_TYPE (object_class),
 
231
                              G_SIGNAL_RUN_LAST,
 
232
                              G_STRUCT_OFFSET (RBPropertyViewClass, show_popup),
 
233
                              NULL, NULL,
 
234
                              g_cclosure_marshal_VOID__VOID,
 
235
                              G_TYPE_NONE,
 
236
                              0);
 
237
 
221
238
 
222
239
        g_type_class_add_private (klass, sizeof (RBPropertyViewPrivate));
223
240
}
303
320
                                                 G_CALLBACK (rb_property_view_selection_changed_cb),
304
321
                                                 view);
305
322
                
306
 
                gtk_tree_model_get_iter_first (GTK_TREE_MODEL (view->priv->prop_model), &iter);
307
323
                gtk_tree_selection_unselect_all (view->priv->selection);
308
 
                gtk_tree_selection_select_iter (view->priv->selection, &iter);
 
324
                if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (view->priv->prop_model), &iter))
 
325
                        gtk_tree_selection_select_iter (view->priv->selection, &iter);
309
326
                g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
310
327
                                                   G_CALLBACK (rb_property_view_selection_changed_cb),
311
328
                                                   view);
429
446
        if (gtk_tree_selection_count_selected_rows (view->priv->selection) == 0) {
430
447
                GtkTreeIter first_iter;
431
448
                rb_debug ("no rows selected, signalling reset");
432
 
                gtk_tree_model_get_iter_first (GTK_TREE_MODEL (view->priv->prop_model),
433
 
                                               &first_iter);
434
 
                g_signal_handlers_block_by_func (G_OBJECT (view->priv->selection),
435
 
                                                 G_CALLBACK (rb_property_view_selection_changed_cb),
436
 
                                                 view);
437
 
                gtk_tree_selection_select_iter (view->priv->selection, &first_iter);
438
 
                g_signal_emit (G_OBJECT (view), rb_property_view_signals[SELECTION_RESET], 0);
439
 
                g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
440
 
                                                   G_CALLBACK (rb_property_view_selection_changed_cb),
441
 
                                                   view);
 
449
                if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (view->priv->prop_model), &first_iter)) {
 
450
                        g_signal_handlers_block_by_func (G_OBJECT (view->priv->selection),
 
451
                                                         G_CALLBACK (rb_property_view_selection_changed_cb),
 
452
                                                         view);
 
453
                        gtk_tree_selection_select_iter (view->priv->selection, &first_iter);
 
454
                        g_signal_emit (G_OBJECT (view), rb_property_view_signals[SELECTION_RESET], 0);
 
455
                        g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
 
456
                                                           G_CALLBACK (rb_property_view_selection_changed_cb),
 
457
                                                           view);
 
458
                }
442
459
        }
443
460
}
444
461
 
536
553
                                 G_CALLBACK (rb_property_view_selection_changed_cb),
537
554
                                 view,
538
555
                                 0);
 
556
        g_signal_connect_object (G_OBJECT (view->priv->treeview),
 
557
                                 "popup_menu",
 
558
                                 G_CALLBACK (rb_property_view_popup_menu_cb),
 
559
                                 view,
 
560
                                 0);
 
561
        
 
562
        g_signal_connect_object (G_OBJECT (view->priv->treeview),
 
563
                                 "button_press_event",
 
564
                                 G_CALLBACK (rb_property_view_button_press_cb),
 
565
                                 view,
 
566
                                 0);
 
567
 
539
568
 
540
569
        gtk_container_add (GTK_CONTAINER (view), view->priv->treeview);
541
570
 
567
596
        gboolean is_all;
568
597
 
569
598
        rb_debug ("row activated");
570
 
        gtk_tree_model_get_iter (GTK_TREE_MODEL (view->priv->prop_model), &iter, path);
 
599
        g_return_if_fail (gtk_tree_model_get_iter (GTK_TREE_MODEL (view->priv->prop_model),
 
600
                          &iter, path));
571
601
 
572
602
        gtk_tree_model_get (GTK_TREE_MODEL (view->priv->prop_model), &iter,
573
603
                            RHYTHMDB_PROPERTY_MODEL_COLUMN_TITLE, &val,
611
641
rb_property_view_selection_changed_cb (GtkTreeSelection *selection,
612
642
                                       RBPropertyView *view)
613
643
{
614
 
        const char *selected_prop;
615
 
        gboolean is_all;
 
644
        char *selected_prop = NULL;
 
645
        gboolean is_all = TRUE;
616
646
        GtkTreeModel *model;
617
647
        GtkTreeIter iter;
618
648
 
647
677
                                                         G_CALLBACK (rb_property_view_selection_changed_cb),
648
678
                                                         view);
649
679
                        gtk_tree_selection_unselect_all (selection);
650
 
                        gtk_tree_model_get_iter_first (model, &iter);
651
 
                        gtk_tree_selection_select_iter (selection, &iter);
 
680
                        if (gtk_tree_model_get_iter_first (model, &iter))
 
681
                                gtk_tree_selection_select_iter (selection, &iter);
652
682
                        g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
653
683
                                                           G_CALLBACK (rb_property_view_selection_changed_cb),
654
684
                                                           view);
655
685
                }
656
686
                g_signal_emit (G_OBJECT (view), rb_property_view_signals[PROPERTIES_SELECTED], 0,
657
687
                               selected_properties);
 
688
                rb_list_deep_free (selected_properties);
658
689
        } else {
659
690
                if (gtk_tree_selection_get_selected (view->priv->selection, &model, &iter)) {
660
691
                        gtk_tree_model_get (model, &iter,
664
695
                                       is_all ? NULL : selected_prop);
665
696
                }
666
697
        }
667
 
}
668
 
 
669
 
GtkWidget*
670
 
rb_property_view_get_treeview   (RBPropertyView *view)
671
 
{
672
 
        return view->priv->treeview;
673
 
}
 
698
 
 
699
        g_free (selected_prop);
 
700
}
 
701
 
 
702
static gboolean 
 
703
rb_property_view_popup_menu_cb (GtkTreeView *treeview,
 
704
                                RBPropertyView *view)
 
705
{
 
706
        g_signal_emit (G_OBJECT (view), rb_property_view_signals[SHOW_POPUP], 0);
 
707
        return TRUE;
 
708
}
 
709
 
 
710
void            
 
711
rb_property_view_append_column_custom (RBPropertyView *view,
 
712
                                       GtkTreeViewColumn *column)
 
713
{
 
714
        gtk_tree_view_append_column (GTK_TREE_VIEW (view->priv->treeview), column);
 
715
}
 
716
 
 
717
static gboolean
 
718
rb_property_view_button_press_cb (GtkTreeView *tree,
 
719
                                  GdkEventButton *event,
 
720
                                  RBPropertyView *view)
 
721
{
 
722
 
 
723
        if (event->button == 3) {
 
724
                GtkTreeSelection *selection;
 
725
                GtkTreePath *path;
 
726
 
 
727
                selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view->priv->treeview));
 
728
 
 
729
                gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view->priv->treeview), event->x, event->y, &path, NULL, NULL, NULL);
 
730
                if (path == NULL) {
 
731
                        gtk_tree_selection_unselect_all (selection);
 
732
                } else {
 
733
                        GtkTreeModel *model;
 
734
                        GtkTreeIter iter;
 
735
                        const char *val;
 
736
                        GList *lst = NULL;
 
737
                        
 
738
                        model = gtk_tree_view_get_model (GTK_TREE_VIEW (view->priv->treeview));
 
739
                        if (gtk_tree_model_get_iter (model, &iter, path)) {
 
740
                                gtk_tree_model_get (model, &iter, 0, &val, -1);
 
741
                                lst = g_list_prepend (lst, (gpointer) val);
 
742
                                rb_property_view_set_selection (view, lst);
 
743
                        }
 
744
                }
 
745
                g_signal_emit (G_OBJECT (view), rb_property_view_signals[SHOW_POPUP], 0);
 
746
                return TRUE;
 
747
        }
 
748
 
 
749
        return FALSE;
 
750
}
 
751
 
 
752
void
 
753
rb_property_view_set_search_func (RBPropertyView *view,
 
754
                                  GtkTreeViewSearchEqualFunc func,
 
755
                                  gpointer func_data,
 
756
                                  GtkDestroyNotify notify)
 
757
{
 
758
        gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (view->priv->treeview),
 
759
                                             func, func_data,
 
760
                                             notify);
 
761
}
 
762
 
674
763