gboolean populate_files (gpointer data) //TODO:: show an spinner while loading { FilebrowserBackend *filebackend= FILEBROWSER_BACKEND(data); FilebrowserBackendDetails *directory = FILEBROWSER_BACKEND_GET_PRIVATE(filebackend); GDK_THREADS_ENTER(); if (g_cancellable_is_cancelled (directory->cancellable)){ GDK_THREADS_LEAVE(); return FALSE; /* remove source */ } GError *error=NULL; GFileInfo *info = g_file_enumerator_next_file (directory->enumerator, directory->cancellable, &error); if (info){ const gchar *mime= g_file_info_get_content_type (info); if (!g_file_info_get_is_hidden (info) && !g_file_info_get_is_backup (info)){ if (MIME_ISDIR(mime)){ //if has dot in name pos 0 don't process const gchar *folder=g_file_info_get_display_name(info); if(folder[0]!='.'){ FOLDERFILE *current; current=new_folderfile(); current->mime=g_strdup(mime); GIcon *icon =g_file_info_get_icon(info); current->icon= g_icon_to_string (icon); current->display_name=g_strdup(folder); /* add to list */ directory->filesinfolder = g_slist_append(directory->filesinfolder, current); } } else { if (IS_TEXT(mime) && !IS_APPLICATION(mime)){ //files FOLDERFILE *current; current=new_folderfile(); current->mime=g_strdup(mime); GIcon *icon =g_file_info_get_icon(info); current->icon= g_icon_to_string (icon); current->display_name=g_strdup(g_file_info_get_display_name(info)); /* add to list */ directory->filesinfolder = g_slist_append(directory->filesinfolder, current); } } } g_object_unref(info); } else { if (error){ g_print(_("Error::%s"),error->message); g_error_free (error); } GDK_THREADS_LEAVE(); return FALSE; /* remove source */ } GDK_THREADS_LEAVE(); return TRUE; }
void filefilter_gui(Tfilter * filter) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GList *tmplist, *reglist; GtkWidget *table, *hbox, *but, *vbox, *scrolwin; #ifdef WIN32 GList *mimelist = NULL; gchar *last_mime = NULL; #endif Tfilefiltergui *ffg = g_new0(Tfilefiltergui, 1); ffg->curfilter = filter; if (filter) { ffg->origname = g_strdup(filter->name); } if (!filter) { ffg->curfilter = g_new0(Tfilter, 1); ffg->curfilter->name = g_strdup(_("New filter")); } DEBUG_MSG("filefilter_gui, editing filter %p\n", ffg->curfilter); ffg->win = window_full2(_("Edit filter"), GTK_WIN_POS_MOUSE, 10, G_CALLBACK(filefiltergui_destroy_lcb), ffg, TRUE, NULL); gtk_window_set_default_size(GTK_WINDOW(ffg->win), 400, 400); ffg->lstore = gtk_list_store_new(3, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN); /* fill the list model from the currently known filetypes */ reglist = g_content_types_get_registered(); #ifdef WIN32 tmplist = g_list_first(reglist); while (tmplist) { mimelist = g_list_prepend(mimelist, g_content_type_get_mime_type(tmplist->data)); tmplist = g_list_next(tmplist); } mimelist = g_list_reverse(g_list_sort(mimelist, (GCompareFunc) g_strcmp0)); tmplist = g_list_first(mimelist); while (tmplist) { if (!last_mime || g_strcmp0(last_mime, tmplist->data) != 0) { GtkTreeIter it; last_mime = tmplist->data; if (MIME_ISDIR(tmplist->data)) { gtk_list_store_prepend(ffg->lstore, &it); gtk_list_store_set(ffg->lstore, &it, 0, tmplist->data, 2, 0, -1); } } tmplist = g_list_next(tmplist); } /* GList *winlist = NULL; gchar *mimetype; gint llen, lpos; while(reglist) { mimetype = g_content_type_get_mime_type(reglist->data); if ((llen = g_list_length(winlist))) { tmplist = g_list_copy(winlist); for (lpos = 0; llen != -1 && lpos < llen; lpos++) { if (!g_strcmp0(mimetype, tmplist->data)) llen = -1; else tmplist = g_list_next(tmplist); } g_list_free(tmplist); } if (llen != -1) winlist = g_list_append(winlist, mimetype); reglist = g_list_next(reglist); } tmplist = g_list_first(g_list_reverse(g_list_sort(winlist, (GCompareFunc) g_strcmp0)));*/ free_stringlist(mimelist); #else tmplist = g_list_first(g_list_sort(reglist, (GCompareFunc) g_strcmp0)); while (tmplist) { GtkTreeIter it; if (!MIME_ISDIR(tmplist->data)) { gtk_list_store_prepend(ffg->lstore, &it); gtk_list_store_set(ffg->lstore, &it, 0, tmplist->data, 2, 0, -1); } tmplist = g_list_next(tmplist); } #endif g_list_foreach(reglist, (GFunc) g_free, NULL); g_list_free(reglist); /* add the patterns from the current filter */ tmplist = g_list_first(ffg->curfilter->patterns); while (tmplist) { GtkTreeIter it; Tfilterpattern *pat = (Tfilterpattern *) tmplist->data; gtk_list_store_prepend(ffg->lstore, &it); gtk_list_store_set(ffg->lstore, &it, 0, pat->pattern, 1, NULL, 2, 1, -1); tmplist = g_list_next(tmplist); } ffg->in_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(ffg->lstore), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(ffg->in_model), filefiltergui_infilter_visiblefunc, ffg, NULL); ffg->out_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(ffg->lstore), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(ffg->out_model), filefiltergui_outfilter_visiblefunc, ffg, NULL); table = gtk_table_new(5, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); ffg->nameentry = dialog_entry_in_table(ffg->curfilter->name, table, 0, 1, 0, 1); ffg->inversecheck = dialog_check_button_in_table(_("Hide files that match the filter"), !ffg->curfilter->mode, table, 0, 1, 1, 2); ffg->patentry = dialog_entry_in_table("*.*", table, 2, 3, 1, 2); but = gtk_button_new_with_label(_("Add pattern")); g_signal_connect(but, "clicked", G_CALLBACK(filefiltergui_addpattern_clicked_lcb), ffg); gtk_table_attach(GTK_TABLE(table), but, 3, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0); ffg->in_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ffg->in_model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Mime type"), renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ffg->in_view), column); renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes(_("Icon"), renderer, "pixbuf", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ffg->in_view), column); scrolwin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scrolwin), ffg->in_view); gtk_table_attach_defaults(GTK_TABLE(table), scrolwin, 2, 4, 2, 3); ffg->out_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ffg->out_model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Mime type"), renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ffg->out_view), column); renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes(_("Icon"), renderer, "pixbuf", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ffg->out_view), column); scrolwin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scrolwin), ffg->out_view); gtk_table_attach_defaults(GTK_TABLE(table), scrolwin, 0, 1, 2, 3); vbox = gtk_vbox_new(TRUE, 5); but = gtk_button_new_with_label("->"); g_signal_connect(but, "clicked", G_CALLBACK(filefiltergui_2right_clicked), ffg); gtk_box_pack_start(GTK_BOX(vbox), but, TRUE, TRUE, 0); but = gtk_button_new_with_label("<-"); g_signal_connect(but, "clicked", G_CALLBACK(filefiltergui_2left_clicked), ffg); gtk_box_pack_start(GTK_BOX(vbox), but, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 5, 5); #if GTK_CHECK_VERSION(3,0,0) hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); #else hbox = gtk_hbutton_box_new(); #endif gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_set_spacing(GTK_BOX(hbox), 12); but = bf_stock_cancel_button(G_CALLBACK(filefiltergui_cancel_clicked), ffg); gtk_box_pack_start(GTK_BOX(hbox), but, FALSE, FALSE, 0); but = bf_stock_ok_button(G_CALLBACK(filefiltergui_ok_clicked), ffg); gtk_box_pack_start(GTK_BOX(hbox), but, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 4, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0); gtk_container_add(GTK_CONTAINER(ffg->win), table); gtk_widget_show_all(ffg->win); }