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:
parent
6b8520facc
commit
68466d1c27
6 changed files with 180 additions and 37 deletions
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue