From 56111ff1bf9b6a4c491971e31d919d9952050d06 Mon Sep 17 00:00:00 2001 From: Aharon Hillel Date: Mon, 18 Jun 2012 07:22:43 +0000 Subject: [PATCH] clouseau: Finilise save,load bmp file including GUI Signed-off-by: Aharon Hillel SVN revision: 72344 --- src/bin/clouseau.c | 217 +++++++++++++++++++++++++++++++++++++-------- src/lib/eet_data.c | 73 ++++++++++++++- src/lib/eet_data.h | 16 +++- 3 files changed, 263 insertions(+), 43 deletions(-) diff --git a/src/bin/clouseau.c b/src/bin/clouseau.c index 4eb5cec..17d2fc9 100644 --- a/src/bin/clouseau.c +++ b/src/bin/clouseau.c @@ -32,7 +32,8 @@ struct _gui_elements Evas_Object *gl; Evas_Object *lb; /* Label showing backtrace */ Evas_Object *prop_list; - Evas_Object *inwin; + Evas_Object *connect_inwin; + Evas_Object *save_inwin; Evas_Object *en; Evas_Object *pb; /* Progress wheel shown when waiting for TREE_DATA */ char *address; @@ -139,22 +140,22 @@ _work_offline_popup(void) { Evas_Object *bxx, *lb, *bt_bx, *bt_ofl, *bt_exit; /* START - Popup asking user to close client or work offline */ - gui->inwin = elm_win_inwin_add(gui->win); - evas_object_show(gui->inwin); + gui->connect_inwin = elm_win_inwin_add(gui->win); + evas_object_show(gui->connect_inwin); - bxx = elm_box_add(gui->inwin); - elm_object_style_set(gui->inwin, "minimal_vertical"); + bxx = elm_box_add(gui->connect_inwin); + elm_object_style_set(gui->connect_inwin, "minimal_vertical"); evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bxx); - lb = elm_label_add(gui->inwin); + lb = elm_label_add(gui->connect_inwin); evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0); elm_object_text_set(lb, "Connection to server failed."); elm_box_pack_end(bxx, lb); evas_object_show(lb); - bt_bx = elm_box_add(gui->inwin); + bt_bx = elm_box_add(gui->connect_inwin); elm_box_horizontal_set(bt_bx, EINA_TRUE); elm_box_homogeneous_set(bt_bx, EINA_TRUE); evas_object_size_hint_align_set(bt_bx, 0.5, 0.5); @@ -163,7 +164,7 @@ _work_offline_popup(void) elm_box_pack_end(bxx, bt_bx); /* Add the exit button */ - bt_exit = elm_button_add(gui->inwin); + bt_exit = elm_button_add(gui->connect_inwin); elm_object_text_set(bt_exit, "Exit"); evas_object_smart_callback_add(bt_exit, "clicked", _cancel_bt_clicked, (void *) gui); @@ -171,7 +172,7 @@ _work_offline_popup(void) elm_box_pack_end(bt_bx, bt_exit); evas_object_show(bt_exit); - bt_ofl = elm_button_add(gui->inwin); + bt_ofl = elm_button_add(gui->connect_inwin); elm_object_text_set(bt_ofl, "Work Offline"); evas_object_smart_callback_add(bt_ofl, "clicked", _ofl_bt_clicked, (void *) gui); @@ -179,7 +180,7 @@ _work_offline_popup(void) elm_box_pack_end(bt_bx, bt_ofl); evas_object_show(bt_ofl); - elm_win_inwin_content_set(gui->inwin, bxx); + elm_win_inwin_content_set(gui->connect_inwin, bxx); /* END - Popup asking user to close client or work offline */ } @@ -327,7 +328,7 @@ _set_selected_app(void *data, Evas_Object *pobj, } if (svr) - { /* Enable/Desable buttons only if we are online */ + { /* Enable/Disable buttons only if we are online */ elm_object_disabled_set(gui->bt_load, (gui->sel_app == NULL)); elm_object_disabled_set(gui->bt_save, (gui->sel_app == NULL)); } @@ -792,10 +793,19 @@ item_icon_get(void *data, Evas_Object *parent, const char *part) "Show App Screenshot", EINA_FALSE); } else - { /* Set to Download */ - _set_button(parent, bt, - "/images/gtk-refresh.png", - "Download Screenshot", EINA_FALSE); + { /* Set to Download or not available if offline */ + if (svr) + { + _set_button(parent, bt, + "/images/gtk-refresh.png", + "Download Screenshot", EINA_FALSE); + } + else + { /* Make button display: screenshot NOT available */ + _set_button(parent, bt, + "/images/gtk-close.png", + "Screenshot not available", EINA_TRUE); + } } } @@ -1098,26 +1108,157 @@ _bt_load_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) } } +static void +_dismiss_save_dialog(void *data, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ /* Just close save file save_inwin, do nothing */ + gui_elements *g = data; + evas_object_del(g->save_inwin); + g->save_inwin = NULL; +} + static void _bt_save_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { - gui_elements *g = data; - app_info_st *app = g->sel_app->app->data; - tree_data_st *ftd = g->sel_app->td->data; + app_info_st *app = gui->sel_app->app->data; + tree_data_st *ftd = gui->sel_app->td->data; if (event_info) { /* FIXME: Handle failure. */ - eet_info_save(event_info, app, ftd); + Eina_Bool s; + s = eet_info_save(event_info, app, ftd, data); } + + eina_list_free(data); + + if (event_info) /* Dismiss save dialog after saving */ + _dismiss_save_dialog(gui, NULL, NULL); } static void _dismiss_inwin(gui_elements *g) { g->address = (g->en) ? strdup(elm_entry_entry_get(g->en)) : NULL; - evas_object_del(g->inwin); + evas_object_del(g->connect_inwin); g->en = NULL; - g->inwin = NULL; + g->connect_inwin = NULL; +} + +static void +_save_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck_bx = data; + Evas_Object *ck; + Eina_List *l; + Eina_List *ck_list = elm_box_children_get(ck_bx); + Eina_Bool val = elm_check_state_get(obj); + + EINA_LIST_FOREACH(ck_list, l, ck) + { /* Run through checkoxes, set / unset marks for all */ + if (!elm_object_disabled_get(ck)) + elm_check_state_set(ck, val); + } + + eina_list_free(ck_list); +} + +static void +_save_file_dialog(void *data, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ /* START - Popup to save eet file */ + gui_elements *g = data; + Evas_Object *scr, *bt_bx, *bx, *ck_bx, + *lb, *ck, *bt_cancel, *bt_save; + g->save_inwin = elm_win_inwin_add(g->win); + evas_object_show(g->save_inwin); + + + bx = elm_box_add(g->save_inwin); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(g->save_inwin); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0); + elm_object_text_set(lb, "Select Screeenshots to save:"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + /* Add checkboxes to select screenshots to save */ + ck_bx = elm_box_add(g->save_inwin); + + Eina_List *l; + app_info_st *a = g->sel_app->app->data; + tree_data_st *td = g->sel_app->td->data; + bmp_info_st *bmp; + Tree_Item *treeit; + char buf[256]; + EINA_LIST_FOREACH(td->tree, l, treeit) + { /* First search app->view list if already have the window bmp */ + Variant_st *v = (Variant_st *) + eina_list_search_unsorted(a->view, _bmp_object_ptr_cmp, + (void *) (uintptr_t) treeit->ptr); + + bmp = (v) ? v->data : NULL; + + ck = elm_check_add(g->save_inwin); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 1.0); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(ck_bx, ck); + elm_object_disabled_set(ck, !(bmp && bmp->bmp)); + evas_object_data_set(ck, BMP_FIELD, bmp); /* Associate ck with bmp */ + snprintf(buf, sizeof(buf), "%p %s", treeit->ptr, treeit->name); + elm_object_text_set(ck, buf); + + evas_object_show(ck); + } + + evas_object_show(ck_bx); + scr = elm_scroller_add(g->save_inwin); + elm_object_content_set(scr, ck_bx); + evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(scr); + elm_box_pack_end(bx, scr); + + /* Add the save all checkbox */ + ck = elm_check_add(g->save_inwin); + elm_object_text_set(ck, "Save All"); + evas_object_smart_callback_add(ck, "changed", _save_all, ck_bx); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + bt_bx = elm_box_add(g->save_inwin); + elm_box_horizontal_set(bt_bx, EINA_TRUE); + elm_box_homogeneous_set(bt_bx, EINA_TRUE); + evas_object_size_hint_align_set(bt_bx, 0.5, 1.0); + evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt_bx); + elm_box_pack_end(bx, bt_bx); + + /* Add the cancel button */ + bt_cancel = elm_button_add(g->save_inwin); + elm_object_text_set(bt_cancel, "Cancel"); + evas_object_smart_callback_add(bt_cancel, "clicked", + _dismiss_save_dialog, g); + + elm_box_pack_end(bt_bx, bt_cancel); + evas_object_show(bt_cancel); + + /* Add the Save fileselector button */ + bt_save = elm_fileselector_button_add(g->save_inwin); + elm_fileselector_button_is_save_set(bt_save, EINA_TRUE); + elm_box_pack_end(bt_bx, bt_save); + elm_object_text_set(bt_save, "Save File"); + elm_fileselector_button_path_set(bt_save, getenv("HOME")); + evas_object_smart_callback_add(bt_save, "file,chosen", + _bt_save_file, elm_box_children_get(ck_bx)); + + elm_box_pack_end(bt_bx, bt_save); + evas_object_show(bt_save); + + elm_win_inwin_content_set(g->save_inwin, bx); + /* END - Popup to save eet file */ } static void @@ -1171,14 +1312,14 @@ _show_gui(gui_elements *g, Eina_Bool work_offline) elm_object_text_set(g->bt_load, "Load Tree"); evas_object_smart_callback_add(g->bt_load, "clicked", _bt_clicked, g); + /* Add the Save button to open save dialog */ + g->bt_save = elm_button_add(g->win); + elm_object_text_set(g->bt_save, "SAVE"); + evas_object_smart_callback_add(g->bt_save, "clicked", + _save_file_dialog, (void *) gui); - g->bt_save = elm_fileselector_button_add(g->win); - elm_fileselector_button_is_save_set(g->bt_save, EINA_TRUE); elm_box_pack_end(g->hbx, g->bt_save); - elm_object_text_set(g->bt_save, "Save File"); - elm_fileselector_button_path_set(g->bt_save, getenv("HOME")); - evas_object_smart_callback_add(g->bt_save, "file,chosen", - _bt_save_file, g); + evas_object_show(g->bt_save); elm_object_disabled_set(g->bt_load, (g->sel_app == NULL)); elm_object_disabled_set(g->bt_save, (g->sel_app == NULL)); @@ -1373,14 +1514,14 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) ecore_ipc_init(); /* START - Popup to get IP, PORT from user */ - gui->inwin = elm_win_inwin_add(win); - evas_object_show(gui->inwin); + gui->connect_inwin = elm_win_inwin_add(win); + evas_object_show(gui->connect_inwin); - bxx = elm_box_add(gui->inwin); + bxx = elm_box_add(gui->connect_inwin); evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bxx); - lb = elm_label_add(gui->inwin); + lb = elm_label_add(gui->connect_inwin); evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0); elm_object_text_set(lb, "Enter remote address[:port]"); @@ -1388,12 +1529,12 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) evas_object_show(lb); /* Single line selected entry */ - gui->en = elm_entry_add(gui->inwin); + gui->en = elm_entry_add(gui->connect_inwin); elm_entry_scrollable_set(gui->en, EINA_TRUE); evas_object_size_hint_weight_set(gui->en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gui->en, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_object_style_set(gui->inwin, "minimal_vertical"); + elm_object_style_set(gui->connect_inwin, "minimal_vertical"); elm_entry_scrollbar_policy_set(gui->en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); elm_object_text_set(gui->en, LOCALHOST); @@ -1402,7 +1543,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) elm_box_pack_end(bxx, gui->en); evas_object_show(gui->en); - bt_bx = elm_box_add(gui->inwin); + bt_bx = elm_box_add(gui->connect_inwin); elm_box_horizontal_set(bt_bx, EINA_TRUE); elm_box_homogeneous_set(bt_bx, EINA_TRUE); evas_object_size_hint_align_set(bt_bx, 0.5, 0.5); @@ -1411,7 +1552,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) elm_box_pack_end(bxx, bt_bx); /* Add the cancel button */ - bt_cancel = elm_button_add(gui->inwin); + bt_cancel = elm_button_add(gui->connect_inwin); elm_object_text_set(bt_cancel, "Cancel"); evas_object_smart_callback_add(bt_cancel, "clicked", _cancel_bt_clicked, (void *) gui); @@ -1420,7 +1561,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) evas_object_show(bt_cancel); /* Add the OK button */ - bt_ok = elm_button_add(gui->inwin); + bt_ok = elm_button_add(gui->connect_inwin); elm_object_text_set(bt_ok, "OK"); evas_object_smart_callback_add(bt_ok, "clicked", _ok_bt_clicked, (void *) gui); @@ -1428,7 +1569,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) elm_box_pack_end(bt_bx, bt_ok); evas_object_show(bt_ok); - bt_ofl = elm_button_add(gui->inwin); + bt_ofl = elm_button_add(gui->connect_inwin); elm_object_text_set(bt_ofl, "Work Offline"); evas_object_smart_callback_add(bt_ofl, "clicked", _ofl_bt_clicked, (void *) gui); @@ -1436,7 +1577,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) elm_box_pack_end(bt_bx, bt_ofl); evas_object_show(bt_ofl); - elm_win_inwin_content_set(gui->inwin, bxx); + elm_win_inwin_content_set(gui->connect_inwin, bxx); /* END - Popup to get IP, PORT from user */ elm_run(); diff --git a/src/lib/eet_data.c b/src/lib/eet_data.c index e2caa6d..5669502 100644 --- a/src/lib/eet_data.c +++ b/src/lib/eet_data.c @@ -207,6 +207,21 @@ bmp_info_desc_make(void) return d; } +Eet_Data_Descriptor * +shot_list_desc_make(void) +{ + Eet_Data_Descriptor *d; + + Eet_Data_Descriptor_Class eddc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, shot_list_st); + d = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_LIST (d, shot_list_st, + "view", view, desc->bmp_info); /* Carefull - init this first */ + + return d; +} + Eet_Data_Descriptor * tree_data_desc_make(void) { @@ -318,6 +333,7 @@ data_descriptors_init(void) desc->bmp_req = bmp_req_desc_make(); desc->bmp_info = bmp_info_desc_make(); + desc->shot_list = shot_list_desc_make(); desc->obj_info = Obj_Information_desc_make(); desc->tree = tree_item_desc_make(); desc->connect = connect_desc_make(); @@ -388,6 +404,7 @@ data_descriptors_shutdown(void) eet_data_descriptor_free(desc->_variant_unified_descriptor); eet_data_descriptor_free(desc->bmp_req); eet_data_descriptor_free(desc->bmp_info); + eet_data_descriptor_free(desc->shot_list); free(desc); desc = NULL; @@ -500,8 +517,9 @@ packet_info_get(void *data, int size) } } -Eina_Bool eet_info_save(const char *filename, - app_info_st *a, tree_data_st *ftd) +Eina_Bool +eet_info_save(const char *filename, + app_info_st *a, tree_data_st *ftd, Eina_List *ck_list) { data_desc *d = data_descriptors_init(); Eet_File *fp = eet_open(filename, EET_FILE_MODE_WRITE); @@ -510,6 +528,31 @@ Eina_Bool eet_info_save(const char *filename, eet_data_write(fp, d->app_add, APP_ADD_ENTRY, a, EINA_TRUE); eet_data_write(fp, d->tree_data, TREE_DATA_ENTRY, ftd, EINA_TRUE); + /* Build list of (bmp_info_st *) according to user selection */ + shot_list_st t; + Eina_List *l; + Evas_Object *ck; + t.view = NULL; + EINA_LIST_FOREACH(ck_list, l , ck) + if (elm_check_state_get(ck) && evas_object_data_get(ck, BMP_FIELD)) + t.view = eina_list_append(t.view, + evas_object_data_get(ck, BMP_FIELD)); + + if (t.view) + { /* Write list and bitmaps */ + char buf[1024]; + bmp_info_st *st = NULL; + eet_data_write(fp, d->shot_list, BMP_LIST_ENTRY, &t, EINA_TRUE); + EINA_LIST_FOREACH(t.view, l , st) + { + sprintf(buf, "%s/%llx", BMP_DATA_ENTRY, st->object); + eet_data_image_write(fp, buf, + st->bmp, st->w, st->h, 1, 0, 100, 0); + } + + eina_list_free(t.view); + } + eet_close(fp); return EINA_TRUE; @@ -527,7 +570,33 @@ Eina_Bool eet_info_read(const char *filename, { *a = eet_data_read(fp, d->app_add, APP_ADD_ENTRY); *ftd = eet_data_read(fp, d->tree_data, TREE_DATA_ENTRY); + shot_list_st *t = eet_data_read(fp, d->shot_list, BMP_LIST_ENTRY); + if (t->view) + { + Eina_List *l; + bmp_info_st *st = NULL; + EINA_LIST_FOREACH(t->view, l , st) + { + char buf[1024]; + int alpha; + int compress; + int quality; + int lossy; + sprintf(buf, "%s/%llx", BMP_DATA_ENTRY, st->object); + st->bmp = eet_data_image_read(fp, buf, + (unsigned int *) &st->w, (unsigned int *) &st->h, + &alpha, &compress, &quality, &lossy); + + /* Add the bitmaps to the actuall app data struct */ + Variant_st *v = variant_alloc(BMP_DATA, sizeof(*st), st); + (*a)->view = eina_list_append((*a)->view, v); + } + + eina_list_free(t->view); + } + + free(t); eet_close(fp); return EINA_TRUE; diff --git a/src/lib/eet_data.h b/src/lib/eet_data.h index 9f143de..29265e9 100644 --- a/src/lib/eet_data.h +++ b/src/lib/eet_data.h @@ -2,8 +2,11 @@ #define EET_DATA_H #include "libclouseau.h" /* Global constants */ -#define APP_ADD_ENTRY "add_add_entry" -#define TREE_DATA_ENTRY "tree_data_entry" +#define APP_ADD_ENTRY "/clouseau/app" +#define TREE_DATA_ENTRY "/clouseau/app/tree" +#define BMP_LIST_ENTRY "/clouseau/app/shot_list" +#define BMP_DATA_ENTRY "/clouseau/app/screenshot" +#define BMP_FIELD "bmp" #define PORT (22522) #define MAX_LINE (1023) @@ -136,12 +139,18 @@ struct _eet_message_type_mapping }; typedef struct _eet_message_type_mapping eet_message_type_mapping; +struct _shot_list_st +{ /* This will be used to write a shot list to eet file */ + Eina_List *view; /* Screen views eahc is (bmp_info_st *) ptr */ +}; +typedef struct _shot_list_st shot_list_st; struct _data_desc { Eet_Data_Descriptor *bmp_data; Eet_Data_Descriptor *bmp_req; Eet_Data_Descriptor *bmp_info; + Eet_Data_Descriptor *shot_list; Eet_Data_Descriptor *connect; Eet_Data_Descriptor *app_add; Eet_Data_Descriptor *data_req; @@ -162,6 +171,7 @@ Eet_Data_Descriptor *data_req_desc_make(void); Eet_Data_Descriptor *bmp_req_desc_make(void); Eet_Data_Descriptor *bmp_data_desc_make(void); Eet_Data_Descriptor *bmp_info_desc_make(void); +Eet_Data_Descriptor *shot_list_desc_make(void); Eet_Data_Descriptor *tree_data_desc_make(void); Eet_Data_Descriptor *app_closed_desc_make(void); Eet_Data_Descriptor *highlight_desc_make(void); @@ -180,7 +190,7 @@ message_type packet_mapping_type_get(const char *name); const char *packet_mapping_type_str_get(message_type t); void *packet_compose(message_type t, void *data, int data_size, int *size, void *blob, int blob_size); Variant_st *packet_info_get(void *data, int size); -Eina_Bool eet_info_save(const char *filename, app_info_st *app, tree_data_st *ftd); +Eina_Bool eet_info_save(const char *filename, app_info_st *a, tree_data_st *ftd, Eina_List *ck_list); Eina_Bool eet_info_read(const char *filename, app_info_st **app, tree_data_st **ftd); /* Highlight code, we may choose to move this to other file later */