listen to on-disk theme changes in the details tabs, too

2007-06-23  Jens Granseuer  <jensgr@gmx.net>

	* appearance-style.c: (add_to_treeview), (remove_from_treeview),
	(update_in_treeview), (changed_on_disk_cb), (style_init):
	* appearance-themes.c: (theme_select_name),
	(theme_set_custom_from_theme), (theme_changed_on_disk_cb),
	(theme_thumbnail_done_cb):
	* theme-installer.c: (gnome_theme_installer_run):
	* theme-util.c: (theme_find_in_model):
	* theme-util.h: listen to on-disk theme changes in the details tabs, too

svn path=/trunk/; revision=7762
This commit is contained in:
Jens Granseuer 2007-06-23 11:08:21 +00:00 committed by Jens Granseuer
parent 6b8520facc
commit 68466d1c27
6 changed files with 180 additions and 37 deletions

View file

@ -1,3 +1,14 @@
2007-06-23 Jens Granseuer <jensgr@gmx.net>
* appearance-style.c: (add_to_treeview), (remove_from_treeview),
(update_in_treeview), (changed_on_disk_cb), (style_init):
* appearance-themes.c: (theme_select_name),
(theme_set_custom_from_theme), (theme_changed_on_disk_cb),
(theme_thumbnail_done_cb):
* theme-installer.c: (gnome_theme_installer_run):
* theme-util.c: (theme_find_in_model):
* theme-util.h: listen to on-disk theme changes in the details tabs, too
2007-06-22 Jens Granseuer <jensgr@gmx.net>
* appearance-style.c: (gtk_theme_changed), (window_theme_changed),

View file

@ -168,6 +168,134 @@ icon_theme_delete_cb (GtkWidget *button, AppearanceData *data)
generic_theme_delete ("icon_themes_list", THEME_TYPE_ICON, data);
}
static void
add_to_treeview (const gchar *tv_name,
const gchar *theme_name,
const gchar *theme_label,
GdkPixbuf *theme_thumbnail,
AppearanceData *data)
{
GtkTreeView *treeview;
GtkListStore *model;
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
model = GTK_LIST_STORE (
gtk_tree_model_sort_get_model (
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
gtk_list_store_insert_with_values (model, NULL, 0,
COL_LABEL, theme_label,
COL_NAME, theme_name,
COL_THUMBNAIL, theme_thumbnail,
-1);
}
static void
remove_from_treeview (const gchar *tv_name,
const gchar *theme_name,
AppearanceData *data)
{
GtkTreeView *treeview;
GtkListStore *model;
GtkTreeIter iter;
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
model = GTK_LIST_STORE (
gtk_tree_model_sort_get_model (
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
if (theme_find_in_model (GTK_TREE_MODEL (model), theme_name, &iter))
gtk_list_store_remove (model, &iter);
}
static void
update_in_treeview (const gchar *tv_name,
const gchar *theme_name,
const gchar *theme_label,
GdkPixbuf *theme_thumbnail,
AppearanceData *data)
{
GtkTreeView *treeview;
GtkListStore *model;
GtkTreeIter iter;
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
model = GTK_LIST_STORE (
gtk_tree_model_sort_get_model (
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
if (theme_find_in_model (GTK_TREE_MODEL (model), theme_name, &iter)) {
gtk_list_store_set (model, &iter,
COL_LABEL, theme_label,
COL_NAME, theme_name,
COL_THUMBNAIL, theme_thumbnail,
-1);
}
}
static void
changed_on_disk_cb (GnomeThemeType type,
gpointer theme,
GnomeThemeChangeType change_type,
GnomeThemeElement element,
AppearanceData *data)
{
if (type == GNOME_THEME_TYPE_REGULAR) {
GnomeThemeInfo *info = theme;
if (change_type == GNOME_THEME_CHANGE_DELETED) {
if (info->has_gtk)
remove_from_treeview ("gtk_themes_list", info->name, data);
if (info->has_metacity)
remove_from_treeview ("metacity_themes_list", info->name, data);
} else {
GdkPixbuf *thumbnail;
if (info->has_gtk) {
thumbnail = generate_gtk_theme_thumbnail (info);
if (change_type == GNOME_THEME_CHANGE_CREATED)
add_to_treeview ("gtk_themes_list", info->name, info->name, thumbnail, data);
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
update_in_treeview ("gtk_themes_list", info->name, info->name, thumbnail, data);
if (thumbnail)
g_object_unref (thumbnail);
}
if (info->has_metacity) {
thumbnail = generate_metacity_theme_thumbnail (info);
if (change_type == GNOME_THEME_CHANGE_CREATED)
add_to_treeview ("metacity_themes_list", info->name, info->name, thumbnail, data);
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
update_in_treeview ("metacity_themes_list", info->name, info->name, thumbnail, data);
if (thumbnail)
g_object_unref (thumbnail);
}
}
} else if (type == GNOME_THEME_TYPE_ICON) {
GnomeThemeIconInfo *info = theme;
if (change_type == GNOME_THEME_CHANGE_DELETED) {
remove_from_treeview ("icon_themes_list", info->name, data);
} else {
GdkPixbuf *thumbnail = generate_icon_theme_thumbnail (info);
if (change_type == GNOME_THEME_CHANGE_CREATED)
add_to_treeview ("icon_themes_list", info->name, info->readable_name, thumbnail, data);
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
update_in_treeview ("icon_themes_list", info->name, info->readable_name, thumbnail, data);
if (thumbnail)
g_object_unref (thumbnail);
}
}
}
void
style_init (AppearanceData *data)
{
@ -209,6 +337,8 @@ style_init (AppearanceData *data)
g_signal_connect (glade_xml_get_widget (data->xml, "gtk_themes_delete"), "clicked", (GCallback) gtk_theme_delete_cb, data);
g_signal_connect (glade_xml_get_widget (data->xml, "window_themes_delete"), "clicked", (GCallback) window_theme_delete_cb, data);
g_signal_connect (glade_xml_get_widget (data->xml, "icon_themes_delete"), "clicked", (GCallback) icon_theme_delete_cb, data);
gnome_theme_info_register_theme_change ((ThemeChangedCallback) changed_on_disk_cb, data);
}
static void

View file

@ -56,36 +56,6 @@ is_locked_down (GConfClient *client)
return gconf_client_get_bool (client, LOCKDOWN_KEY, NULL);
}
static gboolean
find_in_model (GtkTreeModel *model, const gchar *value, gint column, GtkTreeIter *hit)
{
GtkTreeIter iter;
gboolean valid;
gchar *test;
if (!value)
return FALSE;
for (valid = gtk_tree_model_get_iter_first (model, &iter); valid;
valid = gtk_tree_model_iter_next (model, &iter))
{
gtk_tree_model_get (model, &iter, column, &test, -1);
if (test) {
gint cmp = strcmp (test, value);
g_free (test);
if (!cmp) {
if (hit)
*hit = iter;
return TRUE;
}
}
}
return FALSE;
}
static void
theme_load_from_gconf (GConfClient *client, GnomeThemeMetaInfo *theme)
{
@ -192,7 +162,7 @@ theme_select_name (GtkIconView *icon_view, const gchar *theme)
GtkTreeIter iter;
GtkTreeModel *model = gtk_icon_view_get_model (icon_view);
if (find_in_model (model, theme, COL_NAME, &iter))
if (theme_find_in_model (model, theme, &iter))
theme_select_iter (icon_view, &iter);
}
@ -264,7 +234,7 @@ theme_set_custom_from_theme (const GnomeThemeMetaInfo *info, AppearanceData *dat
/* select the custom theme */
model = gtk_icon_view_get_model (icon_view);
if (!find_in_model (model, custom->name, COL_NAME, &iter)) {
if (!theme_find_in_model (model, custom->name, &iter)) {
GtkTreeIter child;
gtk_list_store_insert_with_values (data->theme_store, &child, 0,
@ -294,8 +264,6 @@ theme_changed_on_disk_cb (GnomeThemeType type,
GnomeThemeElement element,
AppearanceData *data)
{
/* TODO: add/change/remove themes from the model as appropriate */
if (type == GNOME_THEME_TYPE_METATHEME) {
GnomeThemeMetaInfo *meta = theme;
@ -310,7 +278,7 @@ theme_changed_on_disk_cb (GnomeThemeType type,
} else if (change_type == GNOME_THEME_CHANGE_DELETED) {
GtkTreeIter iter;
if (find_in_model (GTK_TREE_MODEL (data->theme_store), meta->name, COL_NAME, &iter))
if (theme_find_in_model (GTK_TREE_MODEL (data->theme_store), meta->name, &iter))
gtk_list_store_remove (data->theme_store, &iter);
} else if (change_type == GNOME_THEME_CHANGE_CHANGED) {
@ -331,7 +299,7 @@ theme_thumbnail_done_cb (GdkPixbuf *pixbuf, AppearanceData *data)
GtkTreeIter iter;
GtkTreeModel *model = GTK_TREE_MODEL (data->theme_store);
if (find_in_model (model, info->name, COL_NAME, &iter))
if (theme_find_in_model (model, info->name, &iter))
gtk_list_store_set (data->theme_store, &iter, COL_THUMBNAIL, pixbuf, -1);
g_object_unref (pixbuf);

View file

@ -618,7 +618,10 @@ gnome_theme_installer_run (GtkWindow *parent, gchar *filename)
g_strlcpy (old_folder, folder, 255);
g_free (folder);
/* FIXME: refresh GUI from disk here */
/*
* we're relying on the gnome theme info module to pick up changes
* to the themes so we don't need to update the model here
*/
gtk_widget_destroy (dialog);

View file

@ -113,3 +113,33 @@ theme_model_iter_last (GtkTreeModel *model, GtkTreeIter *iter)
}
return FALSE;
}
gboolean
theme_find_in_model (GtkTreeModel *model, const gchar *name, GtkTreeIter *iter)
{
GtkTreeIter walk;
gboolean valid;
gchar *test;
if (!name)
return FALSE;
for (valid = gtk_tree_model_get_iter_first (model, &walk); valid;
valid = gtk_tree_model_iter_next (model, &walk))
{
gtk_tree_model_get (model, &walk, COL_NAME, &test, -1);
if (test) {
gint cmp = strcmp (test, name);
g_free (test);
if (!cmp) {
if (iter)
*iter = walk;
return TRUE;
}
}
}
return FALSE;
}

View file

@ -42,3 +42,4 @@ typedef enum {
gboolean theme_delete (const gchar *name, ThemeType type);
gboolean theme_model_iter_last (GtkTreeModel *model, GtkTreeIter *iter);
gboolean theme_find_in_model (GtkTreeModel *model, const gchar *name, GtkTreeIter *iter);