FilePropsDialog::FilePropsDialog(FmFileInfoList* files, QWidget* parent, Qt::WindowFlags f): QDialog(parent, f), fileInfos_(fm_file_info_list_ref(files)), singleType(fm_file_info_list_is_same_type(files)), singleFile(fm_file_info_list_get_length(files) == 1 ? true:false), fileInfo(fm_file_info_list_peek_head(files)), mimeType(NULL) { setAttribute(Qt::WA_DeleteOnClose); ui = new Ui::FilePropsDialog(); ui->setupUi(this); if(singleType) { mimeType = fm_mime_type_ref(fm_file_info_get_mime_type(fileInfo)); } FmPathList* paths = fm_path_list_new_from_file_info_list(files); deepCountJob = fm_deep_count_job_new(paths, FM_DC_JOB_DEFAULT); fm_path_list_unref(paths); initGeneralPage(); initPermissionsPage(); }
/** * fm_app_chooser_dlg_new * @mime_type: (allow-none): MIME type for list creation * @can_set_default: %TRUE if widget can set selected item as default for @mime_type * * Creates a widget for choosing an application either from tree of * existing ones or also allows to set up own command for it. * * Returns: (transfer full): a widget. * * Since: 0.1.0 */ GtkDialog *fm_app_chooser_dlg_new(FmMimeType* mime_type, gboolean can_set_default) { GtkContainer* scroll; GtkLabel *file_type, *file_type_header; GtkTreeSelection* tree_sel; GtkBuilder* builder = gtk_builder_new(); AppChooserData* data = g_slice_new0(AppChooserData); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/app-chooser.ui", NULL); data->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); data->notebook = GTK_NOTEBOOK(gtk_builder_get_object(builder, "notebook")); scroll = GTK_CONTAINER(gtk_builder_get_object(builder, "apps_scroll")); file_type = GTK_LABEL(gtk_builder_get_object(builder, "file_type")); file_type_header = GTK_LABEL(gtk_builder_get_object(builder, "file_type_header")); data->cmdline = GTK_ENTRY(gtk_builder_get_object(builder, "cmdline")); data->set_default = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "set_default")); data->use_terminal = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "use_terminal")); data->keep_open = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "keep_open")); data->browse_btn = GTK_WIDGET(gtk_builder_get_object(builder, "browse_btn")); data->app_name = GTK_ENTRY(gtk_builder_get_object(builder, "app_name")); /* FIXME: shouldn't verify if app-chooser.ui was correct? */ if(mime_type) data->mime_type = fm_mime_type_ref(mime_type); gtk_dialog_set_alternative_button_order(data->dlg, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); if(!can_set_default) gtk_widget_hide(GTK_WIDGET(data->set_default)); if(mime_type && fm_mime_type_get_desc(mime_type)) { if (file_type_header) { char *text = g_strdup_printf(_("<b>Select an application to open \"%s\" files</b>"), fm_mime_type_get_desc(mime_type)); gtk_label_set_markup(file_type_header, text); g_free(text); } else gtk_label_set_text(file_type, fm_mime_type_get_desc(mime_type)); } else { GtkWidget* hbox = GTK_WIDGET(gtk_builder_get_object(builder, "file_type_hbox")); gtk_widget_destroy(hbox); gtk_widget_hide(GTK_WIDGET(data->set_default)); } data->apps_view = fm_app_menu_view_new(); gtk_tree_view_set_headers_visible(data->apps_view, FALSE); gtk_widget_show(GTK_WIDGET(data->apps_view)); gtk_container_add(scroll, GTK_WIDGET(data->apps_view)); gtk_widget_grab_focus(GTK_WIDGET(data->apps_view)); g_object_unref(builder); g_signal_connect(data->browse_btn, "clicked", G_CALLBACK(on_browse_btn_clicked), data); g_object_set_qdata_full(G_OBJECT(data->dlg), fm_qdata_id, data, (GDestroyNotify)on_dlg_destroy); g_signal_connect(data->notebook, "switch-page", G_CALLBACK(on_switch_page), data); on_switch_page(data->notebook, NULL, 0, data); tree_sel = gtk_tree_view_get_selection(data->apps_view); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_apps_view_sel_changed), data); g_signal_connect(data->cmdline, "changed", G_CALLBACK(on_cmdline_changed), data); g_signal_connect(data->use_terminal, "toggled", G_CALLBACK(on_use_terminal_changed), data); gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, FALSE); return data->dlg; }
/** * fm_app_chooser_combo_box_setup * @combo: a #GtkComboBox * @mime_type: (allow-none): a #FmMimeType to select application * @apps: (allow-none) (element-type GAppInfo): custom list of applications * @sel: (allow-none): a selected application in @apps * * Setups a combobox for selecting default application either for * specified mime-type or from a list of pre-defined applications. * If @mime_type is %NULL, and @sel is provided and found in the @apps, * then it will be selected. If @mime_type is not %NULL then default * application for the @mime_type will be selected. * When set up, the combobox will contain a list of available applications. * * Since: 0.1.5 */ void fm_app_chooser_combo_box_setup(GtkComboBox* combo, FmMimeType* mime_type, GList* apps, GAppInfo* sel) { FmAppChooserComboBoxData* data = g_slice_new0(FmAppChooserComboBoxData); GtkListStore* store = gtk_list_store_new(3, G_TYPE_ICON, G_TYPE_STRING, G_TYPE_APP_INFO); GtkTreeIter it; GList* l; GtkCellRenderer* render; gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo)); render = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), render, "gicon", 0); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), render, "text", 1); if(mime_type) { data->mime_type = fm_mime_type_ref(mime_type); apps = g_app_info_get_all_for_type(fm_mime_type_get_type(data->mime_type)); sel = g_app_info_get_default_for_type(fm_mime_type_get_type(data->mime_type), FALSE); } for(l = apps; l; l = l->next) { GAppInfo* app = G_APP_INFO(l->data); gtk_list_store_insert_with_values(store, &it, -1, 0, g_app_info_get_icon(app), 1, g_app_info_get_name(app), 2, app, -1); if(sel && g_app_info_equal(app, sel)) { /* this is the initially selected app */ data->initial_sel_iter = it; data->initial_sel_app = (GAppInfo*)g_object_ref(app); } } if(mime_type) /* if this list is retrived with g_app_info_get_all_for_type() */ { if(apps) { g_list_foreach(apps, (GFunc)g_object_unref, NULL); g_list_free(apps); } if(sel) g_object_unref(sel); } gtk_list_store_append(store, &it); /* separator */ data->separator_iter = it; /* other applications */ gtk_list_store_insert_with_values(store, &it, -1, 0, NULL, 1, _("Customize"), // FIXME: should be "Customize..." 2, NULL, -1); data->other_apps_iter = it; gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store)); if(data->initial_sel_iter.user_data) /* intital selection is set */ { data->prev_sel_iter = data->initial_sel_iter; gtk_combo_box_set_active_iter(combo, &data->initial_sel_iter); } gtk_combo_box_set_row_separator_func(combo, is_row_separator, data, NULL); g_object_unref(store); g_signal_connect(combo, "changed", G_CALLBACK(on_app_selected), data); g_object_set_qdata_full(G_OBJECT(combo), fm_qdata_id, data, free_data); }