Hello,

Following the new changes for the scrollbars, here's an updated eThemes that uses the new scrollframe.
plus, the theme buttons are now thumbnails that are cached in the fileman cache (I had to borrow some of the code)

enjoy.

--
Chady 'Leviathan' Kassouf
http://chady.net/
Index: E_Preview.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/E_Preview.h,v
retrieving revision 1.1
diff -u -r1.1 E_Preview.h
--- E_Preview.h	12 Oct 2005 14:56:41 -0000	1.1
+++ E_Preview.h	9 Nov 2005 16:34:54 -0000
@@ -23,5 +23,36 @@
 void e_preview_theme_set(Evas_Object *object, const char * theme);
 
 
+int e_preview_is_theme(Evas * evas, const char * theme);
+
+/**
+ * initialize thumb generation.
+ */
+int e_preview_thumb_init(void);
+
+/**
+ * Get the full path of the thumbnail
+ */
+char * e_preview_thumb_file_get(const char * theme);
+
+/**
+ * Check the validity of the thumbnail
+ * @theme - the name of the theme file.
+ */
+int e_preview_thumb_check(const char * theme);
+
+/**
+ * Create a thumbnail for the current theme
+ * @theme - the name of the theme file.
+ */
+int e_preview_thumb_generate(const char * theme);
+
+/**
+ * Set an evas object's data to the thumbnail's image
+ * @theme - the name of the theme file
+ * @obj - the evas image object
+ */
+int e_preview_thumb_image(const char * theme, Evas_Object * obj);
+
 #endif
 
Index: Makefile.am
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/Makefile.am,v
retrieving revision 1.3
diff -u -r1.3 Makefile.am
--- Makefile.am	23 Oct 2005 11:51:18 -0000	1.3
+++ Makefile.am	9 Nov 2005 16:34:54 -0000
@@ -9,6 +9,7 @@
 	@ECORE_CFLAGS@ \
 	@EVAS_CFLAGS@ \
 	@ESMART_CFLAGS@ \
+	@[EMAIL PROTECTED]
 	@EDJE_CFLAGS@ \
 	@ENLIGHTENMENT_CFLAGS@
 
@@ -26,6 +27,7 @@
 	@EDJE_LIBS@ \
 	@ESMART_LIBS@ \
 	-lesmart_container \
+	@EET_LIBS@ \
 	@ENLIGHTENMENT_LIBS@
 
 EXTRA_DIST = \
Index: e_preview.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/e_preview.c,v
retrieving revision 1.2
diff -u -r1.2 e_preview.c
--- e_preview.c	24 Oct 2005 10:51:19 -0000	1.2
+++ e_preview.c	9 Nov 2005 16:34:54 -0000
@@ -4,11 +4,14 @@
 #include <limits.h>
 #include <Edje.h>
 #include <Evas.h>
+#include <Ecore_Evas.h>
+#include <Eet.h>
 #include <E_Lib.h>
 #include <sys/stat.h>
 
 #include "E_Preview.h"
 
+  
 
 typedef struct _e_preview E_Preview; 
 struct _e_preview {
@@ -34,19 +37,13 @@
 static void _e_preview_redraw(Evas_Object *);
 static void _e_preview_add(Evas_Object *);
 static void _e_preview_del(Evas_Object *);
-static void _e_preview_layer_set(Evas_Object *, int);
-static void _e_preview_raise(Evas_Object *);
-static void _e_preview_lower(Evas_Object *);
-static void _e_preview_stack_above(Evas_Object *, Evas_Object *);
-static void _e_preview_stack_below(Evas_Object *, Evas_Object *);
 static void _e_preview_move(Evas_Object *, Evas_Coord, Evas_Coord);
 static void _e_preview_resize(Evas_Object *, Evas_Coord, Evas_Coord);
 static void _e_preview_show(Evas_Object *);
 static void _e_preview_hide(Evas_Object *);
-static void _e_preview_color_set(Evas_Object *, int, int, int, int);
 static void _e_preview_clip_set(Evas_Object *, Evas_Object *);
-static void _e_preview_clip_unset(Evas_Object *);
 
+static char * _e_thumb_file_id(char *file);
 
 
 Evas_Object * e_preview_new(Evas *evas) {
@@ -86,18 +83,14 @@
 			"e_preview",
 			_e_preview_add,
 			_e_preview_del,
-			_e_preview_layer_set,
-			_e_preview_raise,
-			_e_preview_lower,
-			_e_preview_stack_above,
-			_e_preview_stack_below,
+			NULL, NULL, NULL, NULL, NULL,
 			_e_preview_move,
 			_e_preview_resize,
 			_e_preview_show,
 			_e_preview_hide,
-			_e_preview_color_set,
+			NULL, 
 			_e_preview_clip_set,
-			_e_preview_clip_unset,
+			NULL,
 			NULL
 			);
 	return smart;
@@ -151,77 +144,6 @@
 	}
 }
 
-static void _e_preview_layer_set(Evas_Object *o, int l) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_layer_set(data->wallpaper, l);
-		evas_object_layer_set(data->window, l);
-		evas_object_layer_set(data->clock, l);
-		evas_object_layer_set(data->start, l);
-		evas_object_layer_set(data->pager[0], l);
-		evas_object_layer_set(data->pager[1], l);
-		evas_object_layer_set(data->pager[2], l);
-	}
-}
-
-static void _e_preview_raise(Evas_Object *o) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_raise(data->wallpaper);
-		evas_object_raise(data->window);
-		evas_object_raise(data->clock);
-		evas_object_raise(data->start);
-		evas_object_raise(data->pager[0]);
-		evas_object_raise(data->pager[1]);
-		evas_object_raise(data->pager[2]);
-	}
-}
-
-static void _e_preview_lower(Evas_Object *o) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_lower(data->wallpaper);
-		evas_object_lower(data->window);
-		evas_object_lower(data->clock);
-		evas_object_lower(data->start);
-		evas_object_lower(data->pager[0]);
-		evas_object_lower(data->pager[1]);
-		evas_object_lower(data->pager[2]);
-	}
-}
-
-static void _e_preview_stack_above(Evas_Object *o, Evas_Object * above) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_stack_above(data->wallpaper, above);
-		evas_object_stack_above(data->window, above);
-		evas_object_stack_above(data->clock, above);
-		evas_object_stack_above(data->start, above);
-		evas_object_stack_above(data->pager[0], above);
-		evas_object_stack_above(data->pager[1], above);
-		evas_object_stack_above(data->pager[2], above);
-	}
-}
-	
-static void _e_preview_stack_below(Evas_Object *o, Evas_Object * below) {
-	E_Preview * data;
-
-	if ((data = evas_object_smart_data_get(o))) {
-		evas_object_stack_below(data->wallpaper, below);
-		evas_object_stack_below(data->window, below);
-		evas_object_stack_below(data->clock, below);
-		evas_object_stack_below(data->start, below);
-		evas_object_stack_below(data->pager[0], below);
-		evas_object_stack_below(data->pager[1], below);
-		evas_object_stack_below(data->pager[2], below);
-	}
-}
-
-
 static void _e_preview_move(Evas_Object *o, Evas_Coord x, Evas_Coord y) {
 	E_Preview *data;
 
@@ -273,6 +195,21 @@
 	}
 }
 
+int e_preview_is_theme(Evas * evas, const char * theme) {
+
+	char * file = malloc(sizeof(char) * PATH_MAX);
+	snprintf(file, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+
+	Evas_Object * o = NULL;
+	o = edje_object_add(evas);
+	edje_object_file_set(o, file, "widgets/border/default/border");
+	if (edje_object_part_exists(o, "widgets/border/default/border")) 
+		return 1;
+
+	return 0;
+			 
+}
+
 void e_preview_theme_set(Evas_Object *object, const char * theme) {
 
 	E_Preview *data;
@@ -418,22 +355,145 @@
 	}
 }
 
+int e_preview_thumb_image(const char * theme, Evas_Object * obj) {
 
+	char * thumb;
+	thumb = e_preview_thumb_file_get(theme);
 
-static void _e_preview_color_set(Evas_Object *o, 
-		int r, int g, int b, int a) {}
+	Eet_File * ef;
+	ef = eet_open(thumb, EET_FILE_MODE_READ);
+	if (ef) {
+		int * pixels;
+		pixels = (int *) eet_data_image_read(ef, "/thumbnail/data", 
+				NULL, NULL, NULL, NULL, NULL, NULL);
+		evas_object_image_data_set(obj, pixels);
+		eet_close(ef);
+	}
+
+	return 1;
+
+}
+
+int e_preview_thumb_init(void) {
+
+	char  path[PATH_MAX];
+	snprintf(path, sizeof(path), "%s/.e/e/fileman/thumbnails", getenv("HOME"));
+	if (!ecore_file_exists(path))
+		ecore_file_mkpath(path);
+	else
+		return 0;
+	
+	return 1;
+
+}
+
+int e_preview_thumb_check(const char * theme) {
+
+	struct stat themestatus;
+	struct stat thumbstatus;
+	char themefile[PATH_MAX];
+	snprintf(themefile, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+
+	char * thumb = e_preview_thumb_file_get(theme);
+
+	if (stat(themefile, &themestatus) == 0)
+		if (stat(thumb, &thumbstatus) == 0) {
+			if (themestatus.st_mtime > thumbstatus.st_mtime) /* not uptodate */
+				return 1;
+		} else {
+			return 1;
+		}
+		
+
+	
+	return 0;
+}
+
+char * e_preview_thumb_file_get(const char * theme) {
+
+	char * file = (char *)malloc(sizeof(char) * PATH_MAX);
+	snprintf(file, PATH_MAX, "%s/.e/e/themes/%s", getenv("HOME"), theme);
+	
+	char * thumb = (char *)malloc(sizeof(char) * PATH_MAX);
+	snprintf(thumb, PATH_MAX, "%s/.e/e/fileman/thumbnails/%s", getenv("HOME"), _e_thumb_file_id(file));
+
+	return thumb;
+}
+
+int e_preview_thumb_generate(const char * theme) {
+
+	printf("Generating thumb.\n");
+	Ecore_Evas *ee = NULL;
+	Evas *e = NULL;
+	Evas_Object * preview;
+	
+	ee = ecore_evas_buffer_new(640, 480);
+	e = ecore_evas_get(ee);
+	preview = e_preview_new(e);
+	e_preview_theme_set(preview, theme);
+	evas_object_move(preview, 0, 0);
+	evas_object_resize(preview, 640, 480);
+	evas_object_show(preview);
+
+	const int *pixels;
+	pixels = ecore_evas_buffer_pixels_get(ee);
+	char * out = e_preview_thumb_file_get(theme);
+	
+	Eet_File * ef;
+	ef = eet_open(out, EET_FILE_MODE_WRITE);
+	if (ef) {
+		eet_data_image_write(ef, "/thumbnail/data", (void *) pixels, 640, 480, 1, 0, 91, 1);
+		eet_close(ef);
+	}
+	
+	return 1;
+}
 
 static void _e_preview_clip_set(Evas_Object *o, Evas_Object *clip){
 	E_Preview *data;
 	if ((data = evas_object_smart_data_get(o))) {
 		evas_object_clip_set(data->wallpaper, clip);
-
 	}
-
-
 }
 
-static void _e_preview_clip_unset(Evas_Object *o) {}
-
 
+/* return hash for a file  (from E) */
+static char * _e_thumb_file_id(char *file) {
+   char                s[256], *sp;
+   const char         *chmap =
+     "0123456789abcdef"
+     "ghijklmnopqrstuv"
+     "[EMAIL PROTECTED]&*()"
+     "[];',.{}<>?-=_+|";
+   unsigned int        id[4], i;
+   struct stat         st;
+
+   if (stat(file, &st) < 0)
+     return NULL;
+
+   id[0] = st.st_ino;
+   id[1] = st.st_dev;
+   id[2] = (st.st_size & 0xffffffff);
+   id[3] = (st.st_mtime & 0xffffffff);
+
+   sp = s;
+   for (i = 0; i < 4; i++)
+     {
+        unsigned int t, tt;
+        int j;
+
+        t = id[i];
+        j = 32;
+        while (j > 0)
+          {
+             tt = t & ((1 << 6) - 1);
+             *sp = chmap[tt];
+             t >>= 6;
+             j -= 6;
+             sp++;
+          }
+     }
+   *sp = 0;
+   return strdup(s);
+}
 
Index: main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/ethemes/main.c,v
retrieving revision 1.7
diff -u -r1.7 main.c
--- main.c	23 Oct 2005 11:51:18 -0000	1.7
+++ main.c	9 Nov 2005 16:34:54 -0000
@@ -1,6 +1,5 @@
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <dirent.h>
 #include <limits.h>
 #include <Ecore.h>
@@ -33,10 +32,16 @@
 Evas_Object * scrollbar;
 
 Evas_Object ** buttons;
+Evas_Object ** thumbs;
 Evas_Object * preview;
 Evas_Object * preview_clip;
 Evas_Object * background;
 
+typedef struct {
+	int i;
+} _int;
+
+int last_theme;
 
 void _resize_cb(Ecore_Evas * ee) {
 
@@ -52,15 +57,20 @@
 	evas_object_move(background, 0, 0);
 	evas_object_resize(background, barwidth, h);
 	evas_object_show(background);
+		
+	evas_object_resize(container_outer, barwidth, h - 100);
 
 	int length = (int) esmart_container_elements_length_get(container);
-	if (length > h - 100) {
-		evas_object_resize(container_outer, barwidth - 19, h - 100);
-		evas_object_show(scrollbar);
-	} else {
-		evas_object_resize(container_outer, barwidth, h - 100);
-		evas_object_hide(scrollbar);
-	}
+
+	double size;
+	size = (double)(h - 100) / (double)length;
+
+	edje_object_part_drag_size_set(container_outer, "vbar_bar", 1.0, size);
+
+	if (length > h - 100)
+		edje_object_signal_emit(container_outer, "vbar", "show");
+	else
+		edje_object_signal_emit(container_outer, "vbar", "hide");
 
 	int n = evas_list_count(themes);
 	evas_object_move(buttons[n], 0, h - 100 + 10);
@@ -73,9 +83,24 @@
 
 static void _preview_theme(void *data, Evas_Object *o, const char *emission, const char *source) {
 
-	selected_theme = (char *) data;
+	_int * i;
+	i = (_int *) data;
+
+	int n = evas_list_count(themes);
+	if (i->i >= n)
+		selected_theme = (char *)strdup("default.edj");
+	else
+		selected_theme = (char *) evas_list_nth(themes, i->i);
 
 	e_preview_theme_set(preview, selected_theme);
+
+	if (last_theme >= 0)
+		edje_object_signal_emit(buttons[last_theme], "unclicked", "");
+	if (i->i >= 0)
+		edje_object_signal_emit(buttons[i->i], "clicked", "");
+
+	last_theme = i->i;
+	
 	_resize_cb(ee);
 
 }
@@ -97,30 +122,14 @@
 
 }
 
-static void _scrollup(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_start(container, 1);
-}
-
-static void _scrolldown(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_start(container, -1);
-}
-
 static void _scrolldrag(void *data, Evas_Object *o, const char *emission, const char *source) { 
 	        
-	double x, y;
-	edje_object_part_drag_value_get(scrollbar, "drag", &x, &y);
+	double y;
+	edje_object_part_drag_value_get(container_outer, "vbar_bar", NULL,  &y);
 	esmart_container_scroll_percent_set(container, y);
 
 }
 
-static void _scrollstop(void *data, Evas_Object *o, const char *emission, const char *source) { 
-	esmart_container_scroll_stop(container);
-	double s;
-	s = esmart_container_scroll_percent_get(container);
-	edje_object_part_drag_value_set(scrollbar, "drag", 1, s);
-
-}
-
 void read_theme_list() {
 
 	char * path;
@@ -133,7 +142,7 @@
 	ecore_list_goto_first(list);
 	char * data;
 	themes = NULL;
-	while ((data = (char *)ecore_list_next(list)))
+	while (data = (char *)ecore_list_next(list))
 		if (strstr(data, ".edj") != NULL) {
 			char * file = (char *) strdup(data);
 			themes = evas_list_append(themes, file);
@@ -149,27 +158,19 @@
 	int n = evas_list_count(themes);
 	
 	buttons = calloc(n + 3, sizeof(Evas_Object *));
+	thumbs = calloc(n , sizeof(Evas_Object *));
 	
 	container_outer = edje_object_add(evas);
-	edje_object_file_set(container_outer, current_theme, "modules/ibar/main");
+	edje_object_file_set(container_outer, current_theme, "widgets/scrollframe");
 	evas_object_move(container_outer, 0, 0);
+	edje_object_signal_emit(container_outer, "hbar", "hide");
 	evas_object_resize(container_outer, barwidth - 19, container_height);
 	evas_object_show(container_outer);
 
-	scrollbar = edje_object_add(evas);
-	edje_object_file_set(scrollbar, current_theme, "widgets/vscrollbar");
-	evas_object_move(scrollbar, barwidth - 19, 0);
-	evas_object_resize(scrollbar, 16, container_height);
-	evas_object_show(scrollbar);
-
-	edje_object_signal_callback_add(scrollbar, "scroll_top_start", "", _scrollup, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_bottom_start", "", _scrolldown, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_top_stop", "", _scrollstop, NULL);
-	edje_object_signal_callback_add(scrollbar, "scroll_bottom_stop", "", _scrollstop, NULL);
-	edje_object_signal_callback_add(scrollbar, "drag", "*", _scrolldrag, NULL);
+	edje_object_signal_callback_add(container_outer, "drag*", "vbar_bar", _scrolldrag, NULL);
 	
 	container = esmart_container_new(evas);
-	edje_object_part_swallow(container_outer, "items", container);
+	edje_object_part_swallow(container_outer, "item", container);
 	esmart_container_direction_set(container, CONTAINER_DIRECTION_VERTICAL);
 	
 
@@ -182,27 +183,54 @@
 	evas_object_resize(buttons[A], D, 24);\
 	edje_object_part_text_set(buttons[A], "label", C);\
 	evas_object_show(buttons[A]);
-	
+
 	int i;
 	for (i=0; i<n; i++) {
 			
-		char * n;
-		n = evas_list_nth(themes, i);
+		char * nm;
+		nm = evas_list_nth(themes, i);
 		char * name;
-		int size = strlen(n) - 4; /* without .edj */
+		int size = strlen(nm) - 4; /* without .edj */
+
+//		if (! e_preview_is_theme(evas, nm))
+//			continue;
+		
 		name = malloc(sizeof(char) * size);
-		name = strncpy(name, n, size);
+		name = strncpy(name, nm, size);
 		name[size] = 0;
 		
-		ADD_BUTTON(i, 20, name, 100);
+		buttons[i] = edje_object_add(evas);
+		edje_object_file_set(buttons[i], current_theme, "fileman/icon_normal");
+		evas_object_resize(buttons[i], 100, 120);
+		edje_object_part_text_set(buttons[i], "icon_title" , name);
+		
 		esmart_container_element_append(container, buttons[i]);
-		BUTTON_EVENTS(i, _preview_theme, evas_list_nth(themes, i));
+	
+		if (e_preview_thumb_check(nm))
+			e_preview_thumb_generate(nm);
+		
+		thumbs[i] = evas_object_image_add(evas);
+		evas_object_image_size_set(thumbs[i], 640, 480);
+		evas_object_image_fill_set(thumbs[i], 0, 0, 85, 85);
+		e_preview_thumb_image(nm, thumbs[i]);
+
+		edje_object_part_swallow(buttons[i], "icon_swallow", thumbs[i]);
+
+		evas_object_show(buttons[i]);
+
+		_int * o = (_int *) malloc(sizeof(_int));
+		o->i = i;
+
+		edje_object_signal_callback_add(buttons[i], "mouse,up,1", "icon_event",
+				_preview_theme, o);
 		
 	}
 	
 	ADD_BUTTON(n, 40, "Default Theme", 120);
 	evas_object_move(buttons[n], 5, container_height + 10);
-	BUTTON_EVENTS(n, _preview_theme, "default.edj");
+	_int * o = (_int *) malloc(sizeof(_int));
+	o->i = n; 
+	BUTTON_EVENTS(n, _preview_theme, o);
 	 
 	ADD_BUTTON(n + 1, 60, "Apply", 120);
 	evas_object_move(buttons[n+1], 5, container_height + 40);
@@ -273,6 +301,8 @@
 	evas_object_resize(background, barwidth, HEIGHT);
 	evas_object_show(background);
 
+	e_preview_thumb_init();
+
 	preview = e_preview_new(evas);
 	
 	preview_clip = evas_object_rectangle_add(evas);
@@ -282,6 +312,7 @@
 	evas_object_clip_set (preview, preview_clip);
 	
 	read_theme_list();
+	last_theme = -1;
 
 	ecore_evas_callback_resize_set(ee, _resize_cb);
 	        
@@ -298,4 +329,3 @@
 }
 
 
-



Reply via email to