summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Steinbeiß <ochosi@xfce.org>2020-11-25 00:22:19 +0100
committerSimon Steinbeiß <ochosi@xfce.org>2020-11-25 00:22:19 +0100
commitbc43331dbba0a1291cd7bd21a5a14f3d5ebe7b2e (patch)
tree60a77eec63a8149961e0507e52eb0f02197a90fa
parent16d53cea75b7bc1eb3277e271b2e9bc11ec421a0 (diff)
downloadxfce4-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.glade141
-rw-r--r--dialogs/appearance-settings/main.c72
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");