X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftint2conf%2Ftheme_view.c;h=4e169c19cae8c0207d8b7b8403eee136e68bfa74;hb=f9b3fb96571db1b9f67000a907e540888097cf11;hp=f8f4df5bcc7a4e3cb1879c8907593133667a29bc;hpb=e92c129cb3795408bcb0a305e4d52c03e39af56b;p=chaz%2Ftint2 diff --git a/src/tint2conf/theme_view.c b/src/tint2conf/theme_view.c index f8f4df5..4e169c1 100644 --- a/src/tint2conf/theme_view.c +++ b/src/tint2conf/theme_view.c @@ -1,233 +1,144 @@ - +/************************************************************************** +* +* Tint2conf +* +* Copyright (C) 2009 Thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License version 2 +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**************************************************************************/ + + +#include "main.h" #include "theme_view.h" +// The data columns that we export via the tree model interface +GtkWidget *g_theme_view; +GtkListStore *g_store; +int g_width_list, g_height_list; +GtkCellRenderer *g_renderer; -enum { PROP_PERCENTAGE = 1, PROP_THEME, PROP_SNAPSHOT, }; - -static gpointer parent_class = NULL; - -static void custom_list_init(CustomList *cellprogress); -static void custom_list_class_init(CustomListClass *klass); -static void custom_list_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *pspec); -static void custom_list_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); -static void custom_list_finalize(GObject *gobject); - - -// These functions are the heart of our custom cell renderer -static void custom_list_get_size(GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height); -static void custom_list_render(GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, guint flags); - -// register our type with the GObject type system if we haven't done so yet. -// Everything else is done in the callbacks. -GType custom_list_get_type() +GtkWidget *create_view() { - static GType type = 0; - - if (type) - return type; - - if (1) { - static const GTypeInfo cell_info = - { - sizeof (CustomListClass), - NULL, - NULL, - (GClassInitFunc)custom_list_class_init, - NULL, - NULL, - sizeof (CustomList), - 0, - (GInstanceInitFunc)custom_list_init, - }; - - // Derive from GtkCellRenderer - type = g_type_register_static(GTK_TYPE_CELL_RENDERER, "CustomList", &cell_info, 0); - } - - return type; + GtkTreeViewColumn *col; + GtkCellRenderer *renderer; + GtkWidget *view; + + g_store = gtk_list_store_new(NB_COL, G_TYPE_STRING, GDK_TYPE_PIXBUF); + + view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(g_store)); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + + g_object_unref(g_store); // destroy store automatically with view + + renderer = gtk_cell_renderer_text_new(); + col = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_add_attribute(col, renderer, "text", COL_THEME_FILE); + gtk_tree_view_column_set_visible(col, FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(view),col); + + g_width_list = 200; + g_height_list = 30; + g_renderer = gtk_cell_renderer_pixbuf_new(); + g_object_set(g_renderer, "xalign", 0.0, NULL); + gtk_cell_renderer_set_fixed_size(g_renderer, g_width_list, g_height_list); + // specific to gtk-2.18 or higher + //gtk_cell_renderer_set_padding(g_renderer, 5, 5); + col = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(col, g_renderer, TRUE); + gtk_tree_view_column_add_attribute(col, g_renderer, "pixbuf", COL_SNAPSHOT); + gtk_tree_view_append_column(GTK_TREE_VIEW(view),col); + + GtkTreeSortable *sortable; + sortable = GTK_TREE_SORTABLE(g_store); + gtk_tree_sortable_set_sort_column_id(sortable, COL_THEME_FILE, GTK_SORT_ASCENDING); + return view; } -// klass initialisation -// - override the parent's functions that we need to implement. -// - declare our property -// - If you want cells that are editable, you need to override 'activate' and 'start_editing'. -static void custom_list_class_init(CustomListClass *klass) +void custom_list_append(const gchar *name) { - GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(klass); - GObjectClass *object_class = G_OBJECT_CLASS(klass); - -printf("custom_list_class_init : deb\n"); - parent_class = g_type_class_peek_parent (klass); - - cell_class->render = custom_list_render; - cell_class->get_size = custom_list_get_size; - object_class->get_property = custom_list_get_property; - object_class->set_property = custom_list_set_property; - object_class->finalize = custom_list_finalize; - - // Install our very own properties - g_object_class_install_property(object_class, PROP_PERCENTAGE, g_param_spec_double("percentage", "Percentage", "The fractional progress to display", 0.0, 1.0, 0.0, G_PARAM_READWRITE)); - g_object_class_install_property(object_class, PROP_THEME, g_param_spec_string("theme", "Theme", "Theme file name", NULL, G_PARAM_READWRITE)); - g_object_class_install_property(object_class, PROP_SNAPSHOT, g_param_spec_string("snapshot", "Snapshot", "Snapshot file name", NULL, G_PARAM_READWRITE)); -} - - -// CustomList renderer initialisation -static void custom_list_init(CustomList *custom_list) -{ - printf("custom_list_init : deb\n"); - // set some default properties of the parent (GtkCellRenderer). - GTK_CELL_RENDERER(custom_list)->mode = GTK_CELL_RENDERER_MODE_INERT; - GTK_CELL_RENDERER(custom_list)->xpad = 2; - GTK_CELL_RENDERER(custom_list)->ypad = 2; -} - - -static void custom_list_finalize(GObject *object) -{ -/* - CustomList *cellrendererprogress = CUSTOM_LIST(object); -*/ - -printf("custom_list_finalize\n"); - // Free any dynamically allocated resources here + GtkTreeIter iter; - (* G_OBJECT_CLASS (parent_class)->finalize) (object); + gtk_list_store_append(g_store, &iter); + gtk_list_store_set(g_store, &iter, COL_THEME_FILE, name, -1); } -static void custom_list_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *pspec) +gboolean update_snapshot() { - CustomList *custom_list = CUSTOM_LIST(object); - - switch (param_id) { - case PROP_PERCENTAGE: - printf("custom_list_set_property : PROP_PERCENTAGE\n"); - custom_list->progress = g_value_get_double(value); - break; - - case PROP_THEME: - printf("custom_list_set_property : PROP_THEME\n"); - //if (custom_list->nameTheme) g_free(custom_list->nameTheme); - custom_list->nameTheme = g_strdup(g_value_get_string(value)); - break; - - case PROP_SNAPSHOT: - printf("custom_list_set_property : PROP_SNAPSHOT\n"); - custom_list->nameSnapshot = g_strdup(g_value_get_string(value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec); - break; - } -} - - -static void custom_list_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *psec) -{ - CustomList *custom_list = CUSTOM_LIST(object); - - switch (param_id) { - case PROP_PERCENTAGE: - printf("custom_list_get_property : PROP_PERCENTAGE\n"); - g_value_set_double(value, custom_list->progress); - break; - - case PROP_THEME: - printf("custom_list_get_property : PROP_THEME\n"); - g_value_set_string(value, g_strdup(custom_list->nameTheme)); - break; - - case PROP_SNAPSHOT: - printf("custom_list_get_property : PROP_SNAPSHOT\n"); - g_value_set_string(value, g_strdup(custom_list->nameSnapshot)); - break; - //g_value_set_object (value, (GObject *)priv->image); - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, psec); + GtkTreeModel *model; + GtkTreeIter iter; + GdkPixbuf *icon; + gboolean have_iter, found = FALSE; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(g_theme_view)); + have_iter = gtk_tree_model_get_iter_first(model, &iter); + while (have_iter) { + gtk_tree_model_get(model, &iter, COL_SNAPSHOT, &icon, -1); + if (icon != NULL) { + g_object_unref(icon); + have_iter = gtk_tree_model_iter_next(model, &iter); + } + else { + found = TRUE; break; + } } -} - - -GtkCellRenderer *custom_list_new() -{ - return g_object_new(CUSTOM_LIST_TYPE, NULL); -} - - -/*************************************************************************** - * - * custom_cell_renderer_progress_get_size: crucial - calculate the size - * of our cell, taking into account - * padding and alignment properties - * of parent. - * - ***************************************************************************/ - -#define FIXED_WIDTH 100 -#define FIXED_HEIGHT 20 - -static void custom_list_get_size(GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) -{ - gint calc_width; - gint calc_height; - calc_width = (gint) cell->xpad * 2 + FIXED_WIDTH; - calc_height = (gint) cell->ypad * 2 + FIXED_HEIGHT; - - if (width) - *width = calc_width; - - if (height) - *height = calc_height; - - if (cell_area) { - if (x_offset) { - *x_offset = cell->xalign * (cell_area->width - calc_width); - *x_offset = MAX (*x_offset, 0); + if (found) { + // build panel's snapshot + GdkPixbuf *pixbuf; + gchar *name, *snap, *cmd; + gint pixWidth, pixHeight; + gboolean changeSize = FALSE; + + snap = g_build_filename (g_get_user_config_dir(), "tint2", "snap.jpg", NULL); + g_remove(snap); + + gtk_tree_model_get(model, &iter, COL_THEME_FILE, &name, -1); + cmd = g_strdup_printf("tint2 -c \'%s\' -s \'%s\'", name, snap); + system(cmd); + + // load + pixbuf = gdk_pixbuf_new_from_file(snap, NULL); + if (pixbuf == NULL) { + printf("snapshot NULL : %s\n", cmd); + found = FALSE; } - - if (y_offset) { - *y_offset = cell->yalign * (cell_area->height - calc_height); - *y_offset = MAX (*y_offset, 0); + g_free(snap); + g_free(cmd); + g_free(name); + + pixWidth = gdk_pixbuf_get_width(pixbuf); + pixHeight = gdk_pixbuf_get_height(pixbuf); + if (g_width_list != pixWidth) { + g_width_list = pixWidth; + changeSize = TRUE; } - } -} - - -/*************************************************************************** - * - * custom_cell_renderer_progress_render: crucial - do the rendering. - * - ***************************************************************************/ - -static void custom_list_render(GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, guint flags) -{ - CustomList *custom_list = CUSTOM_LIST(cell); - GtkStateType state; - gint width, height; - gint x_offset, y_offset; - - //printf("custom_list_render\n"); - custom_list_get_size (cell, widget, cell_area, &x_offset, &y_offset, &width, &height); - - if (GTK_WIDGET_HAS_FOCUS (widget)) - state = GTK_STATE_ACTIVE; - else - state = GTK_STATE_NORMAL; - - width -= cell->xpad*2; - height -= cell->ypad*2; - - gtk_paint_box (widget->style, window, GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, widget, "trough", cell_area->x + x_offset + cell->xpad, cell_area->y + y_offset + cell->ypad, width - 1, height - 1); + if (g_height_list != (pixHeight+30)) { + g_height_list = pixHeight+30; + changeSize = TRUE; + } + if (changeSize) + gtk_cell_renderer_set_fixed_size(g_renderer, g_width_list, g_height_list); - gtk_paint_box (widget->style, window, state, GTK_SHADOW_OUT, NULL, widget, "bar", cell_area->x + x_offset + cell->xpad, cell_area->y + y_offset + cell->ypad, width * custom_list->progress, height - 1); + gtk_list_store_set(g_store, &iter, COL_SNAPSHOT, pixbuf, -1); + } + return found; }