diff options
author | Simon Steinbeiß <ochosi@xfce.org> | 2020-11-25 00:22:19 +0100 |
---|---|---|
committer | Simon Steinbeiß <ochosi@xfce.org> | 2020-11-25 00:22:19 +0100 |
commit | bc43331dbba0a1291cd7bd21a5a14f3d5ebe7b2e (patch) | |
tree | 60a77eec63a8149961e0507e52eb0f02197a90fa | |
parent | 16d53cea75b7bc1eb3277e271b2e9bc11ec421a0 (diff) | |
download | xfce4-settings-bc43331dbba0a1291cd7bd21a5a14f3d5ebe7b2e.tar.gz |
appearance: Add 'Add' button to install themes (Fixes #193)
Previously it was already possible to easily install themes by DnD, but
having a dedicated button is more discoverable.
-rw-r--r-- | dialogs/appearance-settings/appearance-dialog.glade | 141 | ||||
-rw-r--r-- | dialogs/appearance-settings/main.c | 72 |
2 files changed, 193 insertions, 20 deletions
diff --git a/dialogs/appearance-settings/appearance-dialog.glade b/dialogs/appearance-settings/appearance-dialog.glade index f35b445e..f4cd64cd 100644 --- a/dialogs/appearance-settings/appearance-dialog.glade +++ b/dialogs/appearance-settings/appearance-dialog.glade @@ -3,6 +3,12 @@ <interface> <requires lib="gtk+" version="3.20"/> <requires lib="libxfce4ui-2" version="4.13"/> + <object class="GtkFileFilter" id="filefilter1"> + <patterns> + <pattern>*.tar</pattern> + <pattern>*.zip</pattern> + </patterns> + </object> <object class="GtkImage" id="image1"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -13,6 +19,16 @@ <property name="can_focus">False</property> <property name="icon_name">help-browser</property> </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">list-add-symbolic</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">list-add-symbolic</property> + </object> <object class="GtkListStore" id="liststore1"> <columns> <!-- column-name title --> @@ -151,21 +167,71 @@ <property name="can_focus">True</property> <property name="border_width">6</property> <child> - <object class="GtkScrolledWindow" id="scrolledwindow2"> + <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="shadow_type">etched-in</property> + <property name="orientation">vertical</property> <child> - <object class="GtkTreeView" id="gtk_theme_treeview"> + <object class="GtkScrolledWindow" id="scrolledwindow2"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="headers_visible">False</property> - <property name="show_expanders">False</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection1"/> + <property name="vexpand">True</property> + <property name="shadow_type">etched-in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTreeView" id="gtk_theme_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="install_gtk_theme"> + <property name="label" translatable="yes">_Add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">start</property> + <property name="image">image3</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> + <style> + <class name="inline-toolbar"/> + </style> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> </child> @@ -181,21 +247,64 @@ </packing> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> + <object class="GtkBox"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="shadow_type">etched-in</property> + <property name="orientation">vertical</property> <child> - <object class="GtkTreeView" id="icon_theme_treeview"> + <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="headers_visible">False</property> - <property name="show_expanders">False</property> - <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection2"/> + <property name="shadow_type">etched-in</property> + <child> + <object class="GtkTreeView" id="icon_theme_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + <property name="show_expanders">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection2"/> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="install_icon_theme"> + <property name="label" translatable="yes">_Add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">start</property> + <property name="image">image4</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> + <style> + <class name="inline-toolbar"/> + </style> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> diff --git a/dialogs/appearance-settings/main.c b/dialogs/appearance-settings/main.c index a6d3be46..cc8f2478 100644 --- a/dialogs/appearance-settings/main.c +++ b/dialogs/appearance-settings/main.c @@ -118,6 +118,8 @@ typedef struct } preview_data; +static void install_theme (GtkWidget *widget, gchar **uris, GtkBuilder *builder); + static preview_data * preview_data_new (GtkListStore *list_store, GtkTreeView *tree_view) @@ -836,6 +838,18 @@ cb_theme_uri_dropped (GtkWidget *widget, GtkBuilder *builder) { gchar **uris; + + uris = gtk_selection_data_get_uris (data); + + if (uris) + install_theme (widget, uris, builder); + else + return; +} + +static void +install_theme (GtkWidget *widget, gchar **uris, GtkBuilder *builder) +{ gchar *argv[3]; guint i; GError *error = NULL; @@ -849,10 +863,6 @@ cb_theme_uri_dropped (GtkWidget *widget, GtkTreeModel *model; preview_data *pd; - uris = gtk_selection_data_get_uris (data); - if (uris == NULL) - return; - argv[0] = HELPERDIR G_DIR_SEPARATOR_S "appearance-install-theme"; argv[2] = NULL; @@ -947,6 +957,53 @@ cb_theme_uri_dropped (GtkWidget *widget, } static void +appearance_settings_install_theme_cb (GtkButton *widget, GtkBuilder *builder) +{ + GtkWidget *window; + GtkWidget *dialog; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; + GtkFileFilter *filter; + gint res; + gchar *theme; + gchar *title; + + window = gtk_widget_get_toplevel (GTK_WIDGET (widget)); + g_object_get (G_OBJECT (widget), "name", &theme, NULL); + title = g_strdup_printf (_("Install %s theme"), theme); + dialog = gtk_file_chooser_dialog_new (title, + GTK_WINDOW (window), + action, + _("_Cancel"), + GTK_RESPONSE_CANCEL, + _("_Open"), + GTK_RESPONSE_ACCEPT, + NULL); + filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.tar*"); + gtk_file_filter_add_pattern (filter, "*.zip"); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), FALSE); + + res = gtk_dialog_run (GTK_DIALOG (dialog)); + if (res == GTK_RESPONSE_ACCEPT) + { + gchar *filename; + gchar **uris; + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + + uris = g_new0 (gchar *, 1); + filename = gtk_file_chooser_get_filename (chooser); + uris[0] = g_filename_to_uri (filename, NULL, NULL); + install_theme (window, uris, builder); + g_free (filename); + } + + gtk_widget_destroy (dialog); + g_free (title); + g_free (theme); +} + +static void appearance_settings_dialog_configure_widgets (GtkBuilder *builder) { GObject *object, *object2; @@ -958,6 +1015,10 @@ appearance_settings_dialog_configure_widgets (GtkBuilder *builder) preview_data *pd; /* Icon themes list */ + object = gtk_builder_get_object (builder, "install_icon_theme"); + g_object_set (object, "name", "icon", NULL); + g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (appearance_settings_install_theme_cb), builder); + object = gtk_builder_get_object (builder, "icon_theme_treeview"); list_store = gtk_list_store_new (N_THEME_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN); @@ -1042,6 +1103,9 @@ appearance_settings_dialog_configure_widgets (GtkBuilder *builder) theme_drop_targets, G_N_ELEMENTS (theme_drop_targets), GDK_ACTION_COPY); g_signal_connect (G_OBJECT (object), "drag-data-received", G_CALLBACK (cb_theme_uri_dropped), builder); + object = gtk_builder_get_object (builder, "install_gtk_theme"); + g_object_set (object, "name", "Gtk", NULL); + g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (appearance_settings_install_theme_cb), builder); /* Subpixel (rgba) hinting Combo */ object = gtk_builder_get_object (builder, "xft_rgba_store"); |