- add metadata structs to icons

- add metadata per dir
- small theme change

- bug: i have something wrong with saving the eet list. can anyone find out what it is?


SVN revision: 18411
This commit is contained in:
codewarrior 2005-11-10 09:12:58 +00:00 committed by codewarrior
parent 4ff58f81fc
commit 2f3a16acdc
6 changed files with 553 additions and 43 deletions

View File

@ -100,6 +100,7 @@ group { \
signal: "clicked"; \
source: ""; \
action: STATE_SET "clicked" 0.0; \
transition: LINEAR 0.1; \
target: "icon"; \
} \
program { \
@ -107,6 +108,7 @@ group { \
signal: "unclicked"; \
source: ""; \
action: STATE_SET "default" 0.0; \
transition: LINEAR 0.1; \
target: "icon"; \
} \
program { \

View File

@ -3,6 +3,26 @@
*/
#include "e.h"
#define NEWD(str, typ) \
eet_data_descriptor_new(str, sizeof(typ), \
(void *(*) (void *))evas_list_next, \
(void *(*) (void *, void *))evas_list_append, \
(void *(*) (void *))evas_list_data, \
(void *(*) (void *))evas_list_free, \
(void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach, \
(void *(*) (void *, const char *, void *))evas_hash_add, \
(void (*) (void *))evas_hash_free)
#define FREED(eed) \
if (eed) \
{ \
eet_data_descriptor_free((eed)); \
(eed) = NULL; \
}
#define NEWI(str, it, type) \
EET_DATA_DESCRIPTOR_ADD_BASIC(_e_fm_icon_meta_edd, E_Fm_Icon_Metadata, str, it, type)
typedef struct _E_Smart_Data E_Smart_Data;
struct _E_Smart_Data
@ -46,6 +66,7 @@ static int _e_fm_icon_thumb_cb_exe_exit(void *data, int type, void *event);
static void _e_fm_icon_type_set(E_Smart_Data *sd);
static void _e_fm_icon_meta_fill(E_Fm_Icon_Metadata *m, E_Smart_Data *sd);
/* local subsystem globals */
static Evas_Smart *e_smart = NULL;
@ -55,10 +76,19 @@ static Evas_List *thumb_files = NULL;
static Evas_List *event_handlers = NULL;
static Eet_Data_Descriptor *_e_fm_icon_meta_edd = NULL;
/* externally accessible functions */
int
e_fm_icon_init(void)
{
_e_fm_icon_meta_edd = NEWD("E_Fm_Icon_Metadata", E_Fm_Icon_Metadata);
NEWI("x", x, EET_T_INT);
NEWI("y", y, EET_T_INT);
NEWI("w", w, EET_T_INT);
NEWI("h", h, EET_T_INT);
NEWI("nm", name, EET_T_STRING);
event_handlers = evas_list_append(event_handlers,
ecore_event_handler_add(ECORE_EVENT_EXE_EXIT,
_e_fm_icon_thumb_cb_exe_exit,
@ -69,6 +99,7 @@ e_fm_icon_init(void)
int
e_fm_icon_shutdown(void)
{
FREED(_e_fm_icon_meta_edd);
while (event_handlers)
{
ecore_event_handler_del(event_handlers->data);
@ -109,7 +140,10 @@ void
e_fm_icon_type_set(Evas_Object *obj, int type)
{
E_Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->type == type)
return;
@ -136,7 +170,8 @@ e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
e_object_ref(E_OBJECT(file));
if(!sd->file)
e_object_ref(E_OBJECT(file));
sd->file = file;
file->icon_object = obj;
@ -186,6 +221,51 @@ e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file)
evas_object_resize(sd->obj, 80, icon_h);
}
void
e_fm_icon_appear_cb(Evas_Object *obj, void *data)
{
E_Smart_Data *sd;
evas_object_show(obj);
return;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->visible) return;
sd->visible = 1;
sd->icon_object = edje_object_add(sd->evas);
evas_object_smart_member_add(sd->icon_object, obj);
sd->event_object = evas_object_rectangle_add(sd->evas);
evas_object_color_set(sd->event_object, 0, 0, 0, 0);
evas_object_smart_member_add(sd->event_object, obj);
evas_object_smart_data_set(obj, sd);
e_fm_icon_file_set(obj, sd->file);
evas_object_show(obj);
}
void
e_fm_icon_disappear_cb(Evas_Object *obj, void *data)
{
E_Smart_Data *sd;
evas_object_hide(obj);
return;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(!sd->visible) return;
sd->visible = 0;
if (sd->event_object) evas_object_del(sd->event_object);
if (sd->icon_object) evas_object_del(sd->icon_object);
if (sd->image_object) evas_object_del(sd->image_object);
if (sd->thumb_object) evas_object_del(sd->thumb_object);
E_FREE(sd->saved_title);
}
void
e_fm_icon_title_set(Evas_Object *obj, const char *title)
{
@ -256,6 +336,32 @@ e_fm_icon_signal_emit(Evas_Object *obj, const char *source, const char *emission
if (sd->image_object) edje_object_signal_emit(sd->image_object, source, emission);
}
E_Fm_Icon_Metadata *
e_fm_icon_meta_generate(Evas_Object *obj)
{
E_Smart_Data *sd;
E_Fm_Icon_Metadata *m;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
m = calloc(1, sizeof(E_Fm_Icon_Metadata));
if (!m) return NULL;
_e_fm_icon_meta_fill(m, sd);
return m;
}
void
e_fm_icon_meta_free(E_Fm_Icon_Metadata *m)
{
if (!m) return;
E_FREE(m->name);
free(m);
}
int
e_fm_icon_assoc_set(Evas_Object *obj, const char *assoc)
{
@ -282,6 +388,7 @@ _e_fm_icon_smart_add(Evas_Object *obj)
sd->h = 64;
sd->iw = 48;
sd->ih = 48;
sd->file = NULL;
sd->icon_object = edje_object_add(sd->evas);
evas_object_smart_member_add(sd->icon_object, obj);
@ -321,8 +428,10 @@ _e_fm_icon_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
if ((sd->x == x) && (sd->y == y)) return;
sd->x = x;
sd->y = y;
evas_object_move(sd->event_object, x, y);
evas_object_move(sd->icon_object, x, y);
if(sd->event_object)
evas_object_move(sd->event_object, x, y);
if(sd->icon_object)
evas_object_move(sd->icon_object, x, y);
}
static void
@ -335,7 +444,9 @@ _e_fm_icon_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
if ((sd->w == w) && (sd->h == h)) return;
sd->w = w;
sd->h = h;
evas_object_resize(sd->event_object, sd->w, sd->h);
if(sd->event_object)
evas_object_resize(sd->event_object, sd->w, sd->h);
if(sd->icon_object)
evas_object_resize(sd->icon_object, sd->w, sd->h);
}
@ -346,7 +457,9 @@ _e_fm_icon_smart_show(Evas_Object *obj)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
evas_object_show(sd->icon_object);
if(sd->event_object)
evas_object_show(sd->icon_object);
if(sd->icon_object)
evas_object_show(sd->event_object);
}
@ -357,8 +470,10 @@ _e_fm_icon_smart_hide(Evas_Object *obj)
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if(sd->event_object)
evas_object_hide(sd->icon_object);
evas_object_hide(sd->event_object);
if(sd->icon_object)
evas_object_hide(sd->event_object);
}
static void
@ -583,3 +698,13 @@ _e_fm_icon_type_set(E_Smart_Data *sd)
edje_object_part_text_set(sd->icon_object, "icon_title", sd->file->name);
}
}
static void
_e_fm_icon_meta_fill(E_Fm_Icon_Metadata *m, E_Smart_Data *sd)
{
m->x = sd->x;
m->y = sd->y;
m->w = sd->w;
m->h = sd->h;
m->name = strdup(sd->file->name);
}

View File

@ -4,6 +4,7 @@
#ifdef E_TYPEDEFS
typedef enum _E_Fm_Icon_Type E_Fm_Icon_Type;
typedef struct _E_Fm_Icon_Metadata E_Fm_Icon_Metadata;
#else
#ifndef E_FILEMAN_FILE_SMART_H
@ -15,18 +16,25 @@ enum E_Fm_Icon_Type
E_FM_ICON_LIST
};
EAPI int e_fm_icon_init(void);
EAPI int e_fm_icon_shutdown(void);
EAPI Evas_Object *e_fm_icon_add(Evas *evas);
EAPI E_Fm_File *e_fm_icon_file_get(Evas_Object *obj);
EAPI void e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file);
EAPI void e_fm_icon_title_set(Evas_Object *obj, const char *title);
EAPI void e_fm_icon_type_set(Evas_Object *obj, int type);
EAPI void e_fm_icon_edit_entry_set(Evas_Object *obj, Evas_Object *entry);
EAPI void e_fm_icon_signal_emit(Evas_Object *obj, const char *source, const char *emission);
EAPI void e_fm_icon_image_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_fm_icon_size_min_calc(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
struct _E_Fm_Icon_Metadata
{
Evas_Coord x, y, w, h; /* geometry */
char *name; /* filename */
};
EAPI int e_fm_icon_init(void);
EAPI int e_fm_icon_shutdown(void);
EAPI Evas_Object *e_fm_icon_add(Evas *evas);
EAPI E_Fm_File *e_fm_icon_file_get(Evas_Object *obj);
EAPI void e_fm_icon_file_set(Evas_Object *obj, E_Fm_File *file);
EAPI void e_fm_icon_appear_cb(Evas_Object *obj, void *data);
EAPI void e_fm_icon_disappear_cb(Evas_Object *obj, void *data);
EAPI void e_fm_icon_title_set(Evas_Object *obj, const char *title);
EAPI void e_fm_icon_type_set(Evas_Object *obj, int type);
EAPI void e_fm_icon_edit_entry_set(Evas_Object *obj, Evas_Object *entry);
EAPI void e_fm_icon_signal_emit(Evas_Object *obj, const char *source, const char *emission);
EAPI E_Fm_Icon_Metadata *e_fm_icon_meta_generate(Evas_Object *obj);
EAPI void e_fm_icon_meta_free(E_Fm_Icon_Metadata *m);
#endif
#endif

View File

@ -52,10 +52,34 @@ int E_EVENT_FM_DIRECTORY_CHANGE;
# define D(x) ((void) 0)
#endif
#define NEWD(str, typ) \
eet_data_descriptor_new(str, sizeof(typ), \
(void *(*) (void *))evas_list_next, \
(void *(*) (void *, void *))evas_list_append, \
(void *(*) (void *))evas_list_data, \
(void *(*) (void *))evas_list_free, \
(void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach, \
(void *(*) (void *, const char *, void *))evas_hash_add, \
(void (*) (void *))evas_hash_free)
#define FREED(eed) \
if (eed) \
{ \
eet_data_descriptor_free((eed)); \
(eed) = NULL; \
}
#define INEWI(str, it, type) \
EET_DATA_DESCRIPTOR_ADD_BASIC(_e_fm_icon_meta_edd, E_Fm_Icon_Metadata, str, it, type)
#define NEWI(str, it, type) \
EET_DATA_DESCRIPTOR_ADD_BASIC(_e_fm_dir_meta_edd, E_Fm_Dir_Metadata, str, it, type)
#define NEWL(str, it, type) \
EET_DATA_DESCRIPTOR_ADD_LIST(_e_fm_icon_meta_edd, E_Fm_Dir_Metadata, str, it, type)
typedef struct _E_Fm_Smart_Data E_Fm_Smart_Data;
typedef struct _E_Fm_Icon E_Fm_Icon;
typedef struct _E_Fm_Icon_CFData E_Fm_Icon_CFData;
typedef struct _E_Fm_Config E_Fm_Config;
typedef struct _E_Fm_Dir_Metadata E_Fm_Dir_Metadata;
typedef struct _E_Fm_Fake_Mouse_Up_Info E_Fm_Fake_Mouse_Up_Info;
typedef enum _E_Fm_Arrange E_Fm_Arrange;
@ -65,6 +89,17 @@ struct _E_Fm_Config
int height;
};
struct _E_Fm_Dir_Metadata
{
char *name; /* dir name */
char *bg; /* dir's custom bg */
int view; /* dir's saved view type */
Evas_List *files; /* files in dir */
/* these are generated post-load */
Evas_Hash *files_hash; /* quick lookup hash */
};
struct _E_Fm_Icon
{
E_Fm_File *file;
@ -119,6 +154,8 @@ struct _E_Fm_Smart_Data
Evas_Object *object;
Evas_Object *entry_object;
E_Fm_Dir_Metadata *meta;
char *dir;
DIR *dir2;
@ -259,14 +296,39 @@ static int _e_fm_files_sort_layout_name_cb (void *d1, void *d
static void _e_fm_selector_send_file (E_Fm_Icon *icon);
static char *_e_fm_dir_meta_dir_id(char *dir);
static int _e_fm_dir_meta_load(E_Fm_Smart_Data *sd);
static int _e_fm_dir_meta_generate(E_Fm_Smart_Data *sd);
static void _e_fm_dir_meta_free(E_Fm_Dir_Metadata *m);
static int _e_fm_dir_meta_save(E_Fm_Smart_Data *sd);
static void _e_fm_dir_meta_fill(E_Fm_Dir_Metadata *m, E_Fm_Smart_Data *sd);
static Ecore_Event_Handler *e_fm_mouse_up_handler = NULL;
static double e_fm_grab_time = 0;
static Evas_Smart *e_fm_smart = NULL;
static char *meta_path = NULL;
static Eet_Data_Descriptor *_e_fm_dir_meta_edd = NULL;
static Eet_Data_Descriptor *_e_fm_icon_meta_edd = NULL;
/* externally accessible functions */
int
e_fm_init(void)
{
char *homedir;
char path[PATH_MAX];
homedir = e_user_homedir_get();
if (homedir)
{
snprintf(path, sizeof(path), "%s/.e/e/fileman/metadata", homedir);
if (!ecore_file_exists(path))
ecore_file_mkpath(path);
meta_path = strdup(path);
free(homedir);
}
else return 0;
e_fm_smart = evas_smart_new("e_fm",
_e_fm_smart_add, /* add */
_e_fm_smart_del, /* del */
@ -280,6 +342,19 @@ e_fm_init(void)
_e_fm_smart_clip_unset, /* clip_unset */
NULL); /* data*/
_e_fm_icon_meta_edd = NEWD("E_Fm_Icon_Metadata", E_Fm_Icon_Metadata);
INEWI("x", x, EET_T_INT);
INEWI("y", y, EET_T_INT);
INEWI("w", w, EET_T_INT);
INEWI("h", h, EET_T_INT);
INEWI("nm", name, EET_T_STRING);
_e_fm_dir_meta_edd = NEWD("E_Fm_Dir_Metadata", E_Fm_Dir_Metadata);
NEWI("nm", name, EET_T_STRING);
NEWI("bg", bg, EET_T_STRING);
NEWI("vw", view, EET_T_INT);
NEWL("fl", files, _e_fm_icon_meta_edd);
E_EVENT_FM_RECONFIGURE = ecore_event_type_new();
E_EVENT_FM_DIRECTORY_CHANGE = ecore_event_type_new();
return 1;
@ -288,6 +363,8 @@ e_fm_init(void)
int
e_fm_shutdown(void)
{
FREED(_e_fm_dir_meta_edd);
FREED(_e_fm_icon_meta_edd);
evas_smart_free(e_fm_smart);
return 1;
}
@ -510,6 +587,8 @@ _e_fm_smart_add(Evas_Object *object)
if (!sd) return;
sd->object = object;
sd->meta = NULL;
sd->icon_info.w = 64;
sd->icon_info.h = 64;
sd->icon_info.x_space = 12;
@ -542,6 +621,7 @@ _e_fm_smart_add(Evas_Object *object)
_e_fm_mouse_move_cb, sd);
sd->layout = e_icon_layout_add(sd->evas);
e_icon_layout_viewport_set(sd->layout, sd->edje_obj);
e_icon_layout_spacing_set(sd->layout, sd->icon_info.x_space, sd->icon_info.y_space);
evas_object_show(sd->layout);
@ -1357,6 +1437,28 @@ _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir)
if (sd->dir) free (sd->dir);
sd->dir = strdup(dir);
if(sd->meta)
{
_e_fm_dir_meta_free(sd->meta);
sd->meta = NULL;
}
_e_fm_dir_meta_load(sd);
if(sd->meta)
{
Evas_List *l;
printf("Loaded meta! (%s) %p\n", sd->meta->name, sd->meta->files);
for(l = sd->meta->files; l; l = l->next)
{
E_Fm_Icon_Metadata *im;
im = l->data;
printf("META: file = %s\n", im->name);
}
}
/* Reset position */
sd->position = 0.0;
@ -1393,6 +1495,7 @@ _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir)
e_fm_icon_file_set(icon->icon_object, icon->file);
sd->files = evas_list_prepend(sd->files, icon);
e_icon_layout_pack(sd->layout, icon->icon_object);
e_icon_layout_icon_callbacks_set(icon->icon_object, e_fm_icon_appear_cb, e_fm_icon_disappear_cb, NULL);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
@ -1452,7 +1555,8 @@ _e_fm_dir_files_get(void *data)
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_MOVE, _e_fm_icon_mouse_move_cb, sd);
evas_object_show(icon->icon_object);
e_icon_layout_pack(sd->layout, icon->icon_object);
e_icon_layout_pack(sd->layout, icon->icon_object);
e_icon_layout_icon_callbacks_set(icon->icon_object, e_fm_icon_appear_cb, e_fm_icon_disappear_cb, NULL);
}
i++;
}
@ -1478,10 +1582,19 @@ _e_fm_dir_files_get(void *data)
{
icon = l->data;
e_icon_layout_pack(sd->layout, icon->icon_object);
e_icon_layout_icon_callbacks_set(icon->icon_object, e_fm_icon_appear_cb, e_fm_icon_disappear_cb, NULL);
}
e_icon_layout_thaw(sd->layout);
sd->timer = NULL;
if(!sd->meta)
{
printf("Generating Meta!\n");
_e_fm_dir_meta_generate(sd);
_e_fm_dir_meta_save(sd);
}
return 0;
}
else
@ -1560,6 +1673,7 @@ _e_fm_dir_monitor_cb(void *data, Ecore_File_Monitor *ecore_file_monitor,
//evas_object_resize(icon->icon_object, sd->icon_info.w, sd->icon_info.h);
evas_object_show(icon->icon_object);
e_icon_layout_pack(sd->layout, icon->icon_object);
e_icon_layout_icon_callbacks_set(icon->icon_object, e_fm_icon_appear_cb, e_fm_icon_disappear_cb, NULL);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
evas_object_event_callback_add(icon->icon_object, EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
@ -3055,3 +3169,152 @@ _e_fm_selector_send_file(E_Fm_Icon *icon)
{
icon->sd->selector_func(icon->sd->object, strdup(icon->file->path), icon->sd->selector_data);
}
static char *
_e_fm_dir_meta_dir_id(char *dir)
{
char s[256], *sp;
const char *chmap =
"0123456789abcdef"
"ghijklmnopqrstuv"
"wxyz~!@#$%^&*()"
"[];',.{}<>?-=_+|";
unsigned int id[4], i;
struct stat st;
if (stat(dir, &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);
}
static int
_e_fm_dir_meta_load(E_Fm_Smart_Data *sd)
{
E_Fm_Dir_Metadata *m;
Eet_File *ef;
char buf[PATH_MAX];
char *hash;
if (!sd->dir) return 0;
hash = _e_fm_dir_meta_dir_id(sd->dir);
snprintf(buf, sizeof(buf), "%s/%s", meta_path, hash);
ef = eet_open(buf, EET_FILE_MODE_READ);
if (!ef) return 0;
m = eet_data_read(ef, _e_fm_dir_meta_edd, "metadata");
eet_close(ef);
if (m)
{
Evas_List *l;
for (l = m->files; l; l = l->next)
{
E_Fm_Icon_Metadata *im;
im = l->data;
printf("loading %s\n", im->name);
m->files = evas_list_append(m->files, im);
m->files_hash = evas_hash_add(m->files_hash, im->name, im);
}
}
free(hash);
sd->meta = m;
return 1;
}
static int
_e_fm_dir_meta_generate(E_Fm_Smart_Data *sd)
{
E_Fm_Dir_Metadata *m;
Evas_List *l;
if (!sd->dir) return 0;
m = calloc(1, sizeof(E_Fm_Dir_Metadata));
if (!m) return 0;
_e_fm_dir_meta_fill(m, sd);
for (l = sd->files; l; l = l->next)
{
E_Fm_Icon_Metadata *im;
E_Fm_Icon *icon;
icon = l->data;
im = e_fm_icon_meta_generate(icon->icon_object);
if (im)
{
printf("adding %s\n", im->name);
m->files = evas_list_append(m->files, im);
m->files_hash = evas_hash_add(m->files_hash, icon->file->name, im);
}
}
sd->meta = m;
return 1;
}
static void
_e_fm_dir_meta_free(E_Fm_Dir_Metadata *m)
{
if (!m) return;
E_FREE(m->name);
while (m->files)
{
E_Fm_Icon_Metadata *im;
im = m->files->data;
m->files = evas_list_remove_list(m->files, m->files);
e_fm_icon_meta_free(im);
}
evas_hash_free(m->files_hash);
free(m);
}
static int
_e_fm_dir_meta_save(E_Fm_Smart_Data *sd)
{
Eet_File *ef;
char *hash;
char buf[4096];
int ret;
if (!sd->meta) return 0;
hash = _e_fm_dir_meta_dir_id(sd->dir);
snprintf(buf, sizeof(buf), "%s/%s", meta_path, hash);
ef = eet_open(buf, EET_FILE_MODE_WRITE);
if (!ef) return 0;
ret = eet_data_write(ef, _e_fm_dir_meta_edd, "metadata", sd->meta, 1);
eet_close(ef);
free(hash);
return ret;
}
static void
_e_fm_dir_meta_fill(E_Fm_Dir_Metadata *m, E_Fm_Smart_Data *sd)
{
m->name = strdup(sd->dir);
m->bg = NULL;
m->view = 1;
}

View File

@ -1,8 +1,4 @@
#include <Evas.h>
#include <Ecore.h>
#include <Ecore_Evas.h>
#include <stdlib.h>
#include <stdio.h>
#include "e.h"
typedef struct _E_Smart_Data E_Smart_Data;
typedef struct _E_Icon_Layout_Item E_Icon_Layout_Item;
@ -20,7 +16,12 @@ struct _E_Smart_Data
int clip_frozen;
int fixed;
unsigned char changed : 1;
Evas_List *items;
Evas_List *items;
struct {
Evas_Object *obj;
Evas_Coord x, y, w, h;
} viewport;
};
struct _E_Icon_Layout_Item
@ -28,6 +29,9 @@ struct _E_Icon_Layout_Item
E_Smart_Data *sd;
Evas_Coord x, y, w, h;
Evas_Object *obj;
void (*appear_func)(Evas_Object *obj, void *data);
void (*disappear_func)(Evas_Object *obj, void *data);
void *data;
};
/* local subsystem functions */
@ -144,6 +148,17 @@ e_icon_layout_sort(Evas_Object *obj, int (*func)(void *d1, void *d2))
_e_icon_layout_smart_reconfigure(sd);
}
void e_icon_layout_icon_callbacks_set(Evas_Object *child, void (*appear)(Evas_Object *obj, void *data), void (*disappear)(Evas_Object *obj, void *data), void *data)
{
E_Icon_Layout_Item *li;
li = evas_object_data_get(child, "e_icon_layout_data");
if (!li) return;
li->appear_func = appear;
li->disappear_func = disappear;
li->data = data;
}
void
e_icon_layout_pack(Evas_Object *obj, Evas_Object *child)
@ -191,6 +206,27 @@ e_icon_layout_pack(Evas_Object *obj, Evas_Object *child)
sd->yc += li->h + sd->ys;
sd->vw = sd->xc - sd->x;
}
if(sd->viewport.obj && li->appear_func && li->disappear_func)
{
if(E_INTERSECTS(sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h))
{
li->appear_func(obj, li->data);
printf("appear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h);
}
else
{
li->disappear_func(obj, li->data);
printf("disappear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h);
}
}
_e_icon_layout_smart_move_resize_item(li);
}
@ -301,6 +337,28 @@ e_icon_layout_clip_thaw(Evas_Object *obj)
sd->clip_frozen = 0;
}
void
e_icon_layout_viewport_set(Evas_Object *obj, Evas_Object *viewport)
{
E_Smart_Data *sd;
if ((!obj) || !(sd = evas_object_smart_data_get(obj)))
return;
if(!viewport) return;
sd->viewport.obj = viewport;
evas_object_geometry_get(sd->viewport.obj, &(sd->viewport.x), &(sd->viewport.y),
&(sd->viewport.w), &(sd->viewport.h));
if (sd->frozen <= 0) _e_icon_layout_smart_reconfigure(sd);
}
Evas_Object *
e_icon_layout_viewport_get(Evas_Object *obj)
{
/* TODO */
}
/* local subsystem functions */
static E_Icon_Layout_Item *
_e_icon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj)
@ -312,6 +370,9 @@ _e_icon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj)
if (!li) return NULL;
li->sd = sd;
li->obj = obj;
li->appear_func = NULL;
li->disappear_func = NULL;
li->data = NULL;
evas_object_geometry_get(obj, NULL, NULL, &li->w, &li->h);
/* defaults */
li->x = 0;
@ -390,7 +451,26 @@ _e_icon_layout_smart_reconfigure(E_Smart_Data *sd)
li->x = x;
li->y = y;
if(sd->viewport.obj && li->appear_func && li->disappear_func)
{
if(E_INTERSECTS(sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h))
{
printf("appear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h);
li->appear_func(obj, li->data);
}
else
{
li->disappear_func(obj, li->data);
printf("disappear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h);
}
}
_e_icon_layout_smart_move_resize_item(li);
x += li->w + sd->xs;
@ -509,6 +589,7 @@ _e_icon_layout_smart_add(Evas_Object *obj)
sd->mw = 0;
sd->mh = 0;
sd->fixed = 0;
sd->viewport.obj = NULL;
sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
evas_object_move(sd->clip, 0, 0);
evas_object_resize(sd->clip, 0, 0);
@ -546,6 +627,10 @@ _e_icon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
if (!sd) return;
if ((x == sd->x) && (y == sd->y)) return;
if ((x == sd->x) && (y == sd->y)) return;
if(sd->viewport.obj)
evas_object_geometry_get(sd->viewport.obj,
&(sd->viewport.x), &(sd->viewport.y),
&(sd->viewport.w), &(sd->viewport.h));
/* FIXME: this will get slow with 1000's of objects. be smarter. */
{
@ -560,9 +645,30 @@ _e_icon_layout_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
for (l = sd->items; l; l = l->next)
{
Evas_Coord ox, oy;
E_Icon_Layout_Item *li;
evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL);
li = evas_object_data_get(l->data, "e_icon_layout_data");
evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL);
evas_object_move(l->data, ox + dx, oy + dy);
if(sd->viewport.obj && li->appear_func && li->disappear_func)
{
if(E_INTERSECTS(sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
ox + dx, oy + dy, li->w, li->h))
{
printf("appear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
li->x, li->y, li->w, li->h);
li->appear_func(li->obj, li->data);
}
else
{
li->disappear_func(li->obj, li->data);
printf("disappear! %d %d %d %d - %d %d %d %d\n",sd->viewport.x, sd->viewport.y,
sd->viewport.w, sd->viewport.h,
ox + dx, oy + dy, li->w, li->h);
}
}
}
}
sd->x = x;
@ -581,6 +687,10 @@ _e_icon_layout_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
sd->w = w;
sd->h = h;
sd->changed = 1;
if(sd->viewport.obj)
evas_object_geometry_get(sd->viewport.obj,
&(sd->viewport.x), &(sd->viewport.y),
&(sd->viewport.w), &(sd->viewport.h));
_e_icon_layout_smart_reconfigure(sd);
}

View File

@ -6,21 +6,23 @@
#ifndef E_ICON_LAYOUT_H
#define E_ICON_LAYOUT_H
EAPI Evas_Object *e_icon_layout_add (Evas *evas);
EAPI int e_icon_layout_freeze (Evas_Object *obj);
EAPI int e_icon_layout_thaw (Evas_Object *obj);
EAPI void e_icon_layout_virtual_size_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_icon_layout_virtual_size_get (Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
EAPI void e_icon_layout_width_fix (Evas_Object *obj, Evas_Coord w);
EAPI void e_icon_layout_height_fix (Evas_Object *obj, Evas_Coord h);
EAPI void e_icon_layout_pack (Evas_Object *obj, Evas_Object *child);
EAPI void e_icon_layout_child_resize (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_icon_layout_unpack (Evas_Object *obj);
EAPI void e_icon_layout_spacing_set(Evas_Object *obj, Evas_Coord xs, Evas_Coord ys);
EAPI void e_icon_layout_redraw_force (Evas_Object *obj);
EAPI void e_icon_layout_clip_freeze (Evas_Object *obj);
EAPI void e_icon_layout_clip_thaw (Evas_Object *obj);
EAPI void e_icon_layout_sort (Evas_Object *obj, int (*func)(void *d1, void *d2));
EAPI Evas_Object *e_icon_layout_add (Evas *evas);
EAPI int e_icon_layout_freeze (Evas_Object *obj);
EAPI int e_icon_layout_thaw (Evas_Object *obj);
EAPI void e_icon_layout_virtual_size_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_icon_layout_virtual_size_get (Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
EAPI void e_icon_layout_width_fix (Evas_Object *obj, Evas_Coord w);
EAPI void e_icon_layout_height_fix (Evas_Object *obj, Evas_Coord h);
EAPI void e_icon_layout_pack (Evas_Object *obj, Evas_Object *child);
EAPI void e_icon_layout_child_resize (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_icon_layout_unpack (Evas_Object *obj);
EAPI void e_icon_layout_spacing_set (Evas_Object *obj, Evas_Coord xs, Evas_Coord ys);
EAPI void e_icon_layout_redraw_force (Evas_Object *obj);
EAPI void e_icon_layout_clip_freeze (Evas_Object *obj);
EAPI void e_icon_layout_clip_thaw (Evas_Object *obj);
EAPI void e_icon_layout_viewport_set (Evas_Object *obj, Evas_Object *viewport);
EAPI void e_icon_layout_sort (Evas_Object *obj, int (*func)(void *d1, void *d2));
EAPI void e_icon_layout_icon_callbacks_set (Evas_Object *child, void (*appear)(Evas_Object *obj, void *data), void (*disappear)(Evas_Object *obj, void *data), void *data);
#endif
#endif