static void tree_folder_view_init ( TreeFolderView *tfview, TreeFolderViewClass *klass ) { GType *types; GtkCellRenderer *renderer; GtkTreeModel *model; GtkTreeStore *store; GtkTreeView *tview; GtkTreeViewColumn *col; tview = GTK_TREE_VIEW (tfview); /* Setting up TreeView properties */ gtk_tree_view_set_headers_visible (tview, FALSE); gtk_tree_view_set_enable_tree_lines (tview, TRUE); /* Setting up only column */ col = gtk_tree_view_column_new (); /* Filename renderer */ renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_end (col, renderer, TRUE); gtk_tree_view_column_set_attributes ( col, renderer, "text", STORE_COLUMN_FILE_NAME, NULL ); /* Filetype renderer */ renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_end (col, renderer, FALSE); gtk_tree_view_column_set_attributes ( col, renderer, "gicon", STORE_COLUMN_FILE_ICON, NULL ); gtk_tree_view_append_column (tview, col); /* Setting up TreeStore */ types = g_new (GType, STORE_COLUMN_COUNT); types [STORE_COLUMN_FILE_NAME] = G_TYPE_STRING; types [STORE_COLUMN_FILE_ICON] = G_TYPE_ICON; types [STORE_COLUMN_FILE_INFO] = G_TYPE_FILE_INFO; types [STORE_COLUMN_IS_FOLDER] = G_TYPE_BOOLEAN; types [STORE_COLUMN_WAS_EXPANDED] = G_TYPE_BOOLEAN; store = gtk_tree_store_newv (STORE_COLUMN_COUNT, types); g_free(types); gtk_tree_sortable_set_sort_func ( GTK_TREE_SORTABLE (store), STORE_COLUMN_FILE_NAME, (GtkTreeIterCompareFunc) tree_store_iter_compare_func, NULL, NULL ); gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE (store), STORE_COLUMN_FILE_NAME, GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID ); /* Setting up TreeModelFilter */ model = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL); gtk_tree_model_filter_set_visible_func ( GTK_TREE_MODEL_FILTER (model), (GtkTreeModelFilterVisibleFunc) tree_model_filter_file_visible_func, (gpointer) tview, NULL ); gtk_tree_view_set_model (tview, model); /* Setting up private */ tfview->priv = G_TYPE_INSTANCE_GET_PRIVATE ( tfview, TYPE_TREE_FOLDER_VIEW, TreeFolderViewPrivate ); } static void tree_folder_view_set_property ( GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec ) { TreeFolderView *tfview = TREE_FOLDER_VIEW (object); switch (prop_id) { case PROP_FILTER: tree_folder_view_set_filter ( tfview, GTK_FILE_FILTER (g_value_get_object (value)) ); break; case PROP_FILENAME: tree_folder_view_set_filename ( tfview, g_value_get_string (value) ); break; case PROP_MODEL: g_warning( "\"model\" property of GtkTreeView is overriden " "in TreeFolderView and shouldn't be changed" ); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void tree_folder_view_get_property ( GObject *object, guint prop_id, GValue *value, GParamSpec *pspec ) { TreeFolderView *tfview = TREE_FOLDER_VIEW (object); switch (prop_id) { case PROP_FILTER: g_value_set_object ( value, tree_folder_view_get_filter (tfview) ); break; case PROP_FILENAME: g_value_set_string ( value, tree_folder_view_get_filename (tfview) ); break; case PROP_MODEL: g_value_set_object ( value, gtk_tree_view_get_model (GTK_TREE_VIEW (tfview)) ); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void tree_folder_view_class_init ( TreeFolderViewClass *klass, gpointer class_data ) { GObjectClass *object_class; GtkTreeViewClass *tree_view_class; object_class = G_OBJECT_CLASS (klass); tree_view_class = GTK_TREE_VIEW_CLASS (klass); tree_view_class->row_activated = tree_folder_view_row_activated; tree_view_class->row_expanded = tree_folder_view_row_expanded; tfview_signals [SIGNAL_FILE_ACTIVATED] = g_signal_new ( "file-activated", TYPE_TREE_FOLDER_VIEW, G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (TreeFolderViewClass, file_activated), NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_STRING ); g_type_class_add_private (klass, sizeof (TreeFolderViewPrivate)); object_class->set_property = tree_folder_view_set_property; object_class->get_property = tree_folder_view_get_property; g_object_class_install_property ( object_class, PROP_FILTER, g_param_spec_object ( "filter", "File filter", "File filter for selecting " "which files should be displayed.", GTK_TYPE_FILE_FILTER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT ) ); g_object_class_install_property ( object_class, PROP_FILENAME, g_param_spec_string ( "filename", "Folder filename", "Full path to a folder " "which contents are displayed.", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT ) ); g_object_class_override_property ( object_class, PROP_MODEL, "model" ); } GType tree_folder_view_get_type (void) { static GType tfview_type = 0; if (tfview_type == 0) { const GTypeInfo tfview_info = { sizeof (TreeFolderViewClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) tree_folder_view_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (TreeFolderView), 0, /* n_preallocs */ (GInstanceInitFunc) tree_folder_view_init, NULL, /* value_table */ }; tfview_type = g_type_register_static ( GTK_TYPE_TREE_VIEW, "TreeFolderView", &tfview_info, 0 ); } return tfview_type; } GtkWidget * tree_folder_view_new (void) { GtkWidget *tfview = GTK_WIDGET ( g_object_new (TYPE_TREE_FOLDER_VIEW, NULL) ); return tfview; }