cluster view edit animation & fix bug (allpage reposition) 82/71982/1 submit/tizen/20160530.055150
authorYoungHun Cho <hoon.cho@samsung.com>
Mon, 30 May 2016 05:40:29 +0000 (14:40 +0900)
committerYoungHun Cho <hoon.cho@samsung.com>
Mon, 30 May 2016 05:40:29 +0000 (14:40 +0900)
Change-Id: Ic37a86fa2521e9d3b39a62d7a5af57de1a2697a5
Signed-off-by: YoungHun Cho <hoon.cho@samsung.com>
17 files changed:
.sdk_delta.info
.sign/.manifest.tmp
.sign/author-signature.xml
.sign/signature1.xml
inc/apps_data.h
inc/apps_view.h
inc/cluster_page.h
inc/cluster_view.h
inc/conf.h
src/add_widget_viewer/add_widget_viewer.c
src/apps_data.c
src/apps_view.c
src/cluster_page.c
src/cluster_view.c
src/homescreen-efl.c
src/widget_viewer.c
tizen-manifest.xml

index a61d4ea30eae94fb9a07c7b6cb9fd3f1bb8ba377..6d039b28685338f98542abcd1b039be4fbe8ea3c 100644 (file)
Binary files a/.sdk_delta.info and b/.sdk_delta.info differ
index 0d660b03b4c9aa73ae3b1f9ec8a73964a2207729..2dbae78a1c2b7c54e9ba8d305d72e619e597b213 100644 (file)
@@ -1,4 +1,4 @@
-bin/homescreen-efl__DEL__eTq3efsJy3ZZoKNlLaZ9YAEzn/s5GNn8Ld3OAWbZ6yw=
+bin/homescreen-efl__DEL__ipNhMGA9YdCS9WORWvE96K43jMicxNCwjm21OChmqWk=
 res/edje/add_widget_viewer.edj__DEL__KaDoUUh0Qg+t+Cw1qHJXA6PUxIh2xuIQHnCu9OV4/hc=
 res/edje/app_icon.edj__DEL__Eu43j1+2+ea+oxjufrHtApUvLicZcONCnpZkQFMLZUs=
 res/edje/apps_chooser_btn.edj__DEL__pAJeOFkfFmGw5h4Uvur4s7KUUVSRScqAnG8rBBiF/b8=
@@ -91,5 +91,5 @@ res/locale/zh_CN/LC_MESSAGES/homescreen-efl.mo__DEL__RIZ1KIFfGF2e+0IkBlDIut/N5Y8
 res/locale/zh_HK/LC_MESSAGES/homescreen-efl.mo__DEL__XbmoPGvpjZD09qMkipbn/N/GNg/T74qcAmfZ09aTVIM=
 res/locale/zh_TW/LC_MESSAGES/homescreen-efl.mo__DEL__oV3fIhDtXRMBjVuLETwBwYVDwiCHWvpDVpgtektLlM4=
 shared/res/homescreen-efl.png__DEL__1d0oEZHqPn+QzNzGIHwj9ODby6x9ggFs9uOsav6jPNs=
-tizen-manifest.xml__DEL__HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo=
-author-signature.xml__DEL__qBw3ojaI9mHXmStXQqj6UheMnUNxYh2vLEsp1lW17ng=
+tizen-manifest.xml__DEL__n71/oOsgirvYilXhpF4alQgL4lw91QqnbgS1i/ve70M=
+author-signature.xml__DEL__X+8Jrm6O6fvHlWPM947dQtNm06dzUhr2o2QQvz8rbJQ=
index 709ab03f821c0d4faa57952254f6e99476dcb150..a50129ca670a66d9a0be7d3788e533a80b9450bf 100644 (file)
@@ -4,7 +4,7 @@
 <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod>
 <Reference URI="bin%2Fhomescreen-efl">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
-<DigestValue>eTq3efsJy3ZZoKNlLaZ9YAEzn/s5GNn8Ld3OAWbZ6yw=</DigestValue>
+<DigestValue>ipNhMGA9YdCS9WORWvE96K43jMicxNCwjm21OChmqWk=</DigestValue>
 </Reference>
 <Reference URI="res%2Fedje%2Fadd_widget_viewer.edj">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
 </Reference>
 <Reference URI="tizen-manifest.xml">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
-<DigestValue>HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo=</DigestValue>
+<DigestValue>n71/oOsgirvYilXhpF4alQgL4lw91QqnbgS1i/ve70M=</DigestValue>
 </Reference>
 <Reference URI="#prop">
 <Transforms>
 </Reference>
 </SignedInfo>
 <SignatureValue>
-d6OHq4Nq3I1jnehuAEg9cUpAahMi3ddhrop/NS3AuN9u7rKnllR3OJRcfkSRlFvodPyPVt2VhuhG
-wCzgAvUvOxODuHCdT0lwoNrJ2GtVRNVHJAYsgv6zofvvRLmJ+d77w9XtMaehYx+1pKv7d/RL5CpB
-OuqHAY2pFA7UkLpXyhE=
+LdNqJQBfp75uvgHwUBy36Q1xSOuRaswzhY9hwJ4uAzb91/H5gUuZnLwV7PoN5mzki76xM0wEAOv1
+UGGHPcwWtYUTWMfUIyBWICNYmosRIgyymEJAodRwwywP4zixMgB5Da+CviFzED4J0I2Q2CtToSqQ
+pAfWzwF451kqwNBXYRk=
 </SignatureValue>
 <KeyInfo>
 <X509Data>
index bbd76b28bc76e5d61eb0e2d8cd00eb903dc74a30..3c886783adb2bf7b5aad45c8a74738b3cf598537 100644 (file)
@@ -4,11 +4,11 @@
 <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod>
 <Reference URI="author-signature.xml">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
-<DigestValue>qBw3ojaI9mHXmStXQqj6UheMnUNxYh2vLEsp1lW17ng=</DigestValue>
+<DigestValue>X+8Jrm6O6fvHlWPM947dQtNm06dzUhr2o2QQvz8rbJQ=</DigestValue>
 </Reference>
 <Reference URI="bin%2Fhomescreen-efl">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
-<DigestValue>eTq3efsJy3ZZoKNlLaZ9YAEzn/s5GNn8Ld3OAWbZ6yw=</DigestValue>
+<DigestValue>ipNhMGA9YdCS9WORWvE96K43jMicxNCwjm21OChmqWk=</DigestValue>
 </Reference>
 <Reference URI="res%2Fedje%2Fadd_widget_viewer.edj">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
 </Reference>
 <Reference URI="tizen-manifest.xml">
 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
-<DigestValue>HlwQmaFXgrNH4ygDj7kH+fT/9cUP7JE60jlK1v0pnlo=</DigestValue>
+<DigestValue>n71/oOsgirvYilXhpF4alQgL4lw91QqnbgS1i/ve70M=</DigestValue>
 </Reference>
 <Reference URI="#prop">
 <Transforms>
 </Reference>
 </SignedInfo>
 <SignatureValue>
-WBzVKlIahWHYeFKhjahxiS/GhfPjYxFRZclUVLelXGbJ9whOfFvUpzs0D13oLsjqYam+u/woz1An
-T640+CIxwKcZpdnHeW10HRomDXuptNM2VY8PWHo0ZXeOW6i8cI4r8i1TRT8NDCzFokxTIOKLKB3k
-APG31joACyxHygafuz0=
+WsBEmp+6nWUTg/LhM0fltpiZ5Q/ZGaHwhGmQP//ULH+BJf507I8pyd0B1X5vW6BhWOH/FZg2nHFD
+I9n0/kA45DpoLtEaJE2Hv/E76MjDrEMJVGZfTHP32OpVQ+rEpuTUlzBNaE6xPOiFbtFCHR5CjahX
+MbklcMzpsOa10/2+kNY=
 </SignatureValue>
 <KeyInfo>
 <X509Data>
index fb63dc5be65c57d3f494fda67f36b4a243afbf75..0a6d0ec27d0fa8776dd51c9921a5af7c316716a5 100755 (executable)
@@ -61,5 +61,6 @@ void apps_data_update_folder(app_data_t *folder_item);
 void apps_data_delete_item(app_data_t *item);
 void apps_data_delete_list(Eina_List *list);
 app_data_t *apps_data_find_item_by_index(int index);
+int apps_data_get_folder_item_count(app_data_t *folder);
 
 #endif /* __APPS_DATA_H__ */
index 27cb582e411e74cae37b4e0e003120af1b5cf419..97aebf16b27d4cd9c590799c7be6a7e51e521b96 100755 (executable)
@@ -40,7 +40,7 @@ void apps_view_icon_unset(app_data_t *item);
 void apps_view_icon_add(app_data_t *item);
 
 void apps_view_hw_menu_key(void);
-void apps_view_hw_home_key(void);
+bool apps_view_hw_home_key(void);
 bool apps_view_hw_back_key(void);
 view_state_t apps_view_get_state(void);
 void apps_view_set_state(view_state_t state);
index e04965fe53529652c37c1c5cb20a7fb12f6c3f6e..276052713b67d91ef8c2845326fdd6f999938772 100755 (executable)
@@ -42,9 +42,11 @@ bool cluster_page_set_widget(cluster_page_t *page, widget_data_t *item);
 bool cluster_page_unset(cluster_page_t *page, widget_data_t *item);
 bool cluster_page_check_empty_space(cluster_page_t *page, widget_size_type_e type,
         int pos_x, int pos_y, int *empty_x, int *empty_y);
+void cluster_page_check_empty_space_pos(cluster_page_t *page, widget_data_t *item, int *out_x, int *out_y);
 Evas_Object *cluster_page_thumbnail(cluster_page_t *page);
 void cluster_page_drag_cancel(cluster_page_t *page);
 void cluster_page_drag_widget(cluster_page_t *page, widget_size_type_e type, int pos_x, int pos_y);
 bool cluster_page_drop_widget(cluster_page_t *page, widget_data_t *widget);
+void cluster_page_get_highlight_xy(cluster_page_t *page, int *x, int *y);
 
 #endif /* __CLUSTER_VIEW_PAGE_H__ */
index 3b0ddcbf73c9b6e2428d4875529f4b93532cc886..3e1f6712ba6334c796070cc9d584d09382df8dd4 100755 (executable)
@@ -31,10 +31,10 @@ void cluster_view_show_anim(double pos);
 void cluster_view_hide_anim(double pos);
 
 void cluster_view_hw_menu_key(void);
-void cluster_view_hw_home_key(void);
+bool cluster_view_hw_home_key(void);
 bool cluster_view_hw_back_key(void);
 view_state_t cluster_view_get_state(void);
-void cluster_view_set_state(view_state_t state);
+bool cluster_view_set_state(view_state_t state);
 void cluster_view_delete_widget(widget_data_t *item);
 bool cluster_view_add_widget(widget_data_t *item, bool scroll);
 
index 4ab597c8c226cf857e474e81b0b70bffa2e188c2..b3f1bef9a9de42202257d089cd82e20aeca880a6 100755 (executable)
@@ -79,6 +79,7 @@ extern int __conf_get_window_w();
 #define CLUSTER_COL 4
 #define CLUSTER_HOME_PAGE 0
 #define CLUSTER_MAX_PAGE 6
+#define CLUSTER_VIEW_ALLPAGE_MOVE_GAP 10000
 
 #define PAGE_INDICATOR_PADDING_BOTTON ((16) * (__conf_get_resolution_scale_h()))
 #define PAGE_INDICATOR_H ((76) * (__conf_get_resolution_scale_h()))
index 42116d43b6c55d1abb4395e0d0cff86487643174..9485c72e443866f8e691fb84d1380acf196a82d1 100755 (executable)
@@ -571,9 +571,12 @@ static void __add_widget_viewer_preview_clicked_cb(void *data, Evas_Object *obj,
         return;
     }
 
-    cluster_data_insert_widget(widget->widget_id, widget->widget_id, *size);
-
+    int type = *size;
     free(size);
+    char *widget_id = strdup(widget->widget_id);
 
     cluster_view_set_state(VIEW_STATE_NORMAL);
+
+    cluster_data_insert_widget(widget_id, widget_id, type);
+    free(widget_id);
 }
index 23fefb02a7538641438c02b1926f323de85e845b..196cc741ba6c56b35316b785a5fc92c7bfb9142a 100755 (executable)
@@ -29,7 +29,7 @@ static struct {
     .data_list = NULL
 };
 
-void __apps_data_print(Eina_List *list);
+static void __apps_data_print(Eina_List *list);
 static int __apps_data_sort_cb(const void *a , const void *b);
 static void __apps_data_item_free(app_data_t *item);
 app_data_t *__apps_data_find_item(int db_id);
@@ -359,7 +359,7 @@ static void __apps_data_item_free(app_data_t *item)
         free(item);
 }
 
-void __apps_data_print(Eina_List *list)
+static void __apps_data_print(Eina_List *list)
 {
     app_data_t *item = NULL;
     Eina_List *find_list;
@@ -370,3 +370,15 @@ void __apps_data_print(Eina_List *list)
     }
     LOGD("========================================");
 }
+
+int apps_data_get_folder_item_count(app_data_t *folder)
+{
+    int cnt = 0;
+    app_data_t *item = NULL;
+    Eina_List *find_list;
+    EINA_LIST_FOREACH(apps_data_s.data_list, find_list, item) {
+        if (item->parent_db_id == folder->db_id)
+            cnt += 1;
+    }
+    return cnt;
+}
index c1fdb020a2f089681dc73f2ce417e2768d451ec0..30b91cc860d6a5c97c95f2c61981144caf584a05 100755 (executable)
@@ -704,16 +704,20 @@ static void __apps_view_icon_uninstall_btn_clicked_cb(void *data, Evas_Object *o
 
     LOGD("Uninstall :: %s", item->pkg_str);
     if (item->is_folder) {
-        Evas_Smart_Cb func[3] = { __apps_view_delete_folder_cb, NULL, NULL };
-        void *data[3] = { item, NULL, NULL };
-        char btn_text[3][STR_MAX] = { "", "", "" };
-        char title_text[STR_MAX] = { "" };
-        char popup_text[STR_MAX] = { "" };
-        snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_ST_BUTTON_REMOVE_ABB2"));
-        snprintf(btn_text[1], sizeof(btn_text[1]), "%s", _("IDS_CAM_SK_CANCEL"));
-        snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_REMOVE_FOLDER_ABB"));
-        snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED"));
-        popup_show(2, func, data, btn_text, title_text, popup_text);
+        if (apps_data_get_folder_item_count(item) > 0) {
+            Evas_Smart_Cb func[3] = { __apps_view_delete_folder_cb, NULL, NULL };
+            void *data[3] = { item, NULL, NULL };
+            char btn_text[3][STR_MAX] = { "", "", "" };
+            char title_text[STR_MAX] = { "" };
+            char popup_text[STR_MAX] = { "" };
+            snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_ST_BUTTON_REMOVE_ABB2"));
+            snprintf(btn_text[1], sizeof(btn_text[1]), "%s", _("IDS_CAM_SK_CANCEL"));
+            snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_REMOVE_FOLDER_ABB"));
+            snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_BODY_FOLDER_WILL_BE_REMOVED_APPLICATIONS_IN_THIS_FOLDER_WILL_NOT_BE_UNINSTALLED"));
+            popup_show(2, func, data, btn_text, title_text, popup_text);
+        } else {
+            apps_data_delete_folder(item);
+        }
     } else if (item->type >= APPS_DATA_TYPE_APP_SHORTCUT) {
         LOGD("Delete shortcut");
         apps_data_delete_item(item);
@@ -800,13 +804,15 @@ void apps_view_hw_menu_key(void)
         menu_change_state_on_hw_menu_key(apps_menu_table);
 }
 
-void apps_view_hw_home_key(void)
+bool apps_view_hw_home_key(void)
 {
     if (apps_view_s.opened_folder != NULL) {
         __apps_view_close_folder_popup(apps_view_s.opened_folder);
     }
 
     apps_view_set_state(VIEW_STATE_NORMAL);
+
+    return false;
 }
 
 bool apps_view_hw_back_key(void)
@@ -994,6 +1000,11 @@ void apps_view_icon_add(app_data_t *item)
 
 static void __apps_view_open_folder_popup(app_data_t *item)
 {
+    if (apps_view_s.animator != NULL) {
+        LOGE("apps_view_s.animator != NULL");
+        return ;
+    }
+
     char edj_path[PATH_MAX] = {0, };
     snprintf(edj_path, sizeof(edj_path), "%s", util_get_res_file_path(EDJE_DIR"/apps_folder_popup.edj"));
 
@@ -1061,8 +1072,12 @@ static Eina_Bool __apps_view_hide_folder_anim(void *data, double pos)
 
 static void __apps_view_close_folder_popup(app_data_t *item)
 {
-    if (apps_view_s.animator == NULL)
-        apps_view_s.animator = ecore_animator_timeline_add(HOME_FOLDR_ANIMATION_TIME, __apps_view_hide_folder_anim, NULL);
+    if (apps_view_s.animator != NULL) {
+        LOGE("apps_view_s.animator != NULL");
+        return ;
+    }
+
+    apps_view_s.animator = ecore_animator_timeline_add(HOME_FOLDR_ANIMATION_TIME, __apps_view_hide_folder_anim, NULL);
 }
 
 static void __apps_view_close_folder_popup_done(void)
index 265f51977333c7ac3e734e7b85ca7800e316cdcb..d0e97f75035b09e0cb854b85f264407230bcb635 100755 (executable)
@@ -147,6 +147,39 @@ bool cluster_page_check_empty_space(cluster_page_t *page, widget_size_type_e typ
     return false;
 }
 
+void cluster_page_check_empty_space_pos(cluster_page_t *page, widget_data_t *item, int *out_x, int *out_y)
+{
+    int x, y;
+    *out_x = INIT_VALUE;
+    *out_y = INIT_VALUE;
+
+    int gx, gy, w, h;
+    evas_object_geometry_get(page->grid, &gx, &gy, &w, &h);
+    if (cluster_page_check_empty_space(page, item->type, item->pos_x, item->pos_y, &x, &y)) {
+        *out_x = gx + x * (w / CLUSTER_COL);
+        *out_y = gy + y * (h / CLUSTER_ROW);
+    } else if (cluster_page_check_empty_space(page, item->type, INIT_VALUE, INIT_VALUE, &x, &y)) {
+        *out_x = gx + x * (w / CLUSTER_COL);
+        *out_y = gy + y * (h / CLUSTER_ROW);
+    } else {
+        *out_x = gx + item->pos_x * (w / CLUSTER_COL);
+        *out_y = gy + item->pos_y * (h / CLUSTER_ROW);
+    }
+}
+
+void cluster_page_get_highlight_xy(cluster_page_t *page, int *x, int *y)
+{
+    int gx, gy, w, h;
+    evas_object_geometry_get(page->grid, &gx, &gy, &w, &h);
+    if (page->highlight_pos_x == INIT_VALUE || page->highlight_pos_y == INIT_VALUE) {
+        *x = INIT_VALUE;
+        *y = INIT_VALUE;
+    } else {
+        *x = gx + page->highlight_pos_x * (w / CLUSTER_COL);
+        *y = gy + page->highlight_pos_y * (h / CLUSTER_ROW);
+    }
+}
+
 void __cluster_page_set(cluster_page_t *page, widget_data_t *item)
 {
     int w, h;
@@ -194,6 +227,8 @@ void cluster_page_drag_cancel(cluster_page_t *page)
     if (page->highlight) {
         evas_object_del(page->highlight);
         page->highlight = NULL;
+        page->highlight_pos_x = INIT_VALUE;
+        page->highlight_pos_y = INIT_VALUE;
     }
 }
 
@@ -232,8 +267,18 @@ void cluster_page_drag_widget(cluster_page_t *page, widget_size_type_e type, int
 
 bool cluster_page_drop_widget(cluster_page_t *page, widget_data_t *widget)
 {
-    if (!page->highlight || page->highlight_pos_x == INIT_VALUE || page->highlight_pos_y == INIT_VALUE)
+    if (!page->highlight || page->highlight_pos_x == INIT_VALUE || page->highlight_pos_y == INIT_VALUE) {
+        int x, y;
+        if (cluster_page_check_empty_space(page, widget->type, widget->pos_x, widget->pos_y, &x, &y) ||
+                cluster_page_check_empty_space(page, widget->type, INIT_VALUE, INIT_VALUE, &x, &y)) {
+            widget->page_idx = page->page_index;
+            widget->pos_x = x;
+            widget->pos_y = y;
+            __cluster_page_set(page, widget);
+            return true;
+        }
         return false;
+    }
 
     elm_grid_unpack(page->grid, page->highlight);
     evas_object_del(page->highlight);
@@ -243,6 +288,9 @@ bool cluster_page_drop_widget(cluster_page_t *page, widget_data_t *widget)
     widget->pos_x = page->highlight_pos_x;
     widget->pos_y = page->highlight_pos_y;
     __cluster_page_set(page, widget);
+
+    page->highlight_pos_x = INIT_VALUE;
+    page->highlight_pos_y = INIT_VALUE;
     return true;
 }
 
index dd07a3c39e447647bc766e851c6172027a363de3..5f6043a52246e3ca2b0fff876b012056c1193171 100755 (executable)
@@ -46,6 +46,11 @@ static struct {
     widget_data_t *picked_widget;
     Ecore_Timer *edit_mode_scroll_timer;
     bool is_srolling;
+    Ecore_Animator *edit_animator;
+    int animation_from_x;
+    int animation_from_y;
+    int animation_to_x;
+    int animation_to_y;
 } cluster_view_s = {
     .scroller = NULL,
     .box = NULL,
@@ -61,6 +66,11 @@ static struct {
     .picked_widget = NULL,
     .edit_mode_scroll_timer = NULL,
     .is_srolling = false,
+    .edit_animator = NULL,
+    .animation_from_x = INIT_VALUE,
+    .animation_from_y = INIT_VALUE,
+    .animation_to_x = INIT_VALUE,
+    .animation_to_y = INIT_VALUE,
 };
 
 static int cluster_menu_list[4] = {
@@ -128,10 +138,12 @@ static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data);
 static void __cluster_view_edit_pick_up_widget(void *data);
 static void __cluster_view_edit_drag_widget(void *data);
 static void __cluster_view_edit_drop_widget(void *data);
-
+static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos);
+static void __cluster_view_edit_move_anim_done(void *data);
 
 static Eina_Bool __cluster_view_scroll_timer_cb(void *data);
 
+static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info);
 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info);
 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h);
 static int __cluster_view_allpage_get_page_index(int x, int y);
@@ -218,6 +230,7 @@ Evas_Object *__cluster_view_create_base_gui(Evas_Object *win)
     evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb, NULL);
 
     evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL);
+    evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb, NULL);
 
     cluster_view_s.box = elm_box_add(cluster_view_s.scroller);
     elm_box_horizontal_set(cluster_view_s.box, EINA_TRUE);
@@ -324,7 +337,7 @@ void cluster_view_hw_menu_key(void)
         menu_change_state_on_hw_menu_key(cluster_menu_table);
 }
 
-void cluster_view_hw_home_key(void)
+bool cluster_view_hw_home_key(void)
 {
     if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
         __cluster_view_scroll_to_home();
@@ -335,13 +348,13 @@ void cluster_view_hw_home_key(void)
     } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
         cluster_view_set_state(VIEW_STATE_NORMAL);
     }
+
+    return false;
 }
 
 bool cluster_view_hw_back_key(void)
 {
-    if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
-        return true;
-    } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
+    if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
         cluster_view_set_state(VIEW_STATE_NORMAL);
     } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
         cluster_view_set_state(VIEW_STATE_NORMAL);
@@ -357,8 +370,19 @@ view_state_t cluster_view_get_state(void)
     return cluster_view_s.view_state;
 }
 
-void cluster_view_set_state(view_state_t state)
+bool cluster_view_set_state(view_state_t state)
 {
+    if (cluster_view_s.is_srolling) {
+        LOGE("cannot change view-state");
+        return false;
+    }
+
+    if (cluster_view_s.edit_animator) {
+        ecore_animator_del(cluster_view_s.edit_animator);
+        cluster_view_s.edit_animator = NULL;
+        __cluster_view_edit_move_anim_done(cluster_view_s.picked_widget);
+    }
+
     if (state == VIEW_STATE_EDIT) {
         homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
 
@@ -413,6 +437,7 @@ void cluster_view_set_state(view_state_t state)
             Eina_List *find_list = NULL;
 
             cluster_page_t *page_item = NULL;
+            elm_box_unpack_all(cluster_view_s.box);
             EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
                 if (page_item->page_layout) {
                     elm_box_pack_end(cluster_view_s.box, page_item->page_layout);
@@ -435,6 +460,8 @@ void cluster_view_set_state(view_state_t state)
     }
 
     cluster_view_s.view_state = state;
+
+    return true;
 }
 
 bool cluster_view_add_widget(widget_data_t *item, bool scroll)
@@ -454,7 +481,7 @@ bool cluster_view_add_widget(widget_data_t *item, bool scroll)
     cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, page_idx);
     set_on = cluster_page_set_widget(page, item);
 
-    if (!set_on && !cluster_page_set_widget(page, item)) {
+    if (!set_on) {
         Eina_List *find_list = NULL;
         cluster_page_t *page_item = NULL;
         bool set_on = false;
@@ -532,7 +559,6 @@ static void __cluster_view_scroll_to_home(void)
 static void __cluster_view_scroll_to_page(int page_idx, bool animation)
 {
     if (animation) {
-        cluster_view_s.is_srolling = true;
         elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0);
     } else {
         page_indicator_set_current_page(cluster_view_s.indicator, page_idx);
@@ -677,27 +703,31 @@ static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h)
 
 static int __cluster_view_allpage_get_page_index(int x, int y)
 {
-    double row, col;
-    int int_row, int_col;
-    int start_y = 0;
-    int index = 0;
+    int idx = 0;
+    int sx = CLUSTER_ALL_PAGE_PADDING_SIDE;
+    int sy = 0;
     if (cluster_view_s.page_count < 2) {
-        start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
+        sy = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
     } else if (cluster_view_s.page_count < 4) {
-        start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
+        sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
     } else {
-        start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
+        sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
     }
-    col = (double)(x - CLUSTER_ALL_PAGE_PADDING_SIDE) / (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W);
-    int_col = (int)(col + 0.5);
-    row = (double)(y - start_y)/(CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H);
-    int_row = (int)(row + 0.5);
-
-    if (((int_col - ALLPAGE_MOVE_GAP) < col && (int_col + ALLPAGE_MOVE_GAP) > col) &&
-            ((int_row - ALLPAGE_MOVE_GAP) < row && (int_row + ALLPAGE_MOVE_GAP) > row)) {
-        index = int_row * 2 + int_col;
-        return index;
+    int w = CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W;
+    int h = CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H;
+
+    for (idx=0; idx < cluster_view_s.page_count; idx++) {
+        int row = idx / 2;
+        int col = idx % 2;
+        int ny = sy + (row * h);
+        int nx = sx + (col * w);
+
+        int d = (ny - y) * (ny - y) + (nx - x) * (nx - x);
+        if (d < CLUSTER_VIEW_ALLPAGE_MOVE_GAP) {
+            return (row * 2) + col;
+        }
     }
+
     return INIT_VALUE;
 }
 
@@ -766,6 +796,9 @@ static void __cluster_view_page_delete(cluster_page_t *page)
 
 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
+    if (cluster_view_s.page_count <= 1)
+        return ;
+
     cluster_page_t *page_item = (cluster_page_t *)data;
     if (eina_list_count(page_item->widget_list) > 0) {
         Evas_Smart_Cb func[3] = { __cluster_view_allpage_delete_page_cb, NULL, NULL };
@@ -1033,7 +1066,8 @@ static void __cluster_view_allpage_pick_up_page(void *data)
 static void __cluster_view_allpage_drop_page(void *data)
 {
     if (cluster_view_s.picked_page) {
-        elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
+        if (cluster_view_s.page_count > 1)
+            elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
         elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_HIDE, SIGNAL_SOURCE);
 
         int x, y;
@@ -1043,6 +1077,16 @@ static void __cluster_view_allpage_drop_page(void *data)
     }
     cluster_view_s.page_list = eina_list_sort(cluster_view_s.page_list,
             eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb);
+
+    Eina_List *find_list = NULL, *widget_list = NULL;
+    cluster_page_t *page_item = NULL;
+    widget_data_t *widget_item = NULL;
+    EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
+        EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
+            widget_item->page_idx = page_item->page_index;
+            cluster_data_update(widget_item);
+        }
+    }
 }
 
 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
@@ -1050,6 +1094,11 @@ static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj,
     Evas_Event_Mouse_Down* ev = event_info;
     LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
 
+    if (cluster_view_s.edit_animator) {
+        LOGE("edit animator is running");
+        return ;
+    }
+
     cluster_mouse_info.pressed = true;
     cluster_mouse_info.pressed_obj = obj;
 
@@ -1093,8 +1142,6 @@ static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, v
 
     if (cluster_view_s.picked_widget) {
         __cluster_view_edit_drop_widget(data);
-
-        cluster_view_s.picked_widget = NULL;
     }
 }
 
@@ -1228,20 +1275,63 @@ static void __cluster_view_edit_drag_widget(void *data)
 
 static void __cluster_view_edit_drop_widget(void *data)
 {
-    Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
-    elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
-    elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
-
     if (cluster_view_s.edit_mode_scroll_timer) {
         ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
         cluster_view_s.edit_mode_scroll_timer = NULL;
     }
 
+    if (cluster_view_s.edit_animator) {
+        ecore_animator_del(cluster_view_s.edit_animator);
+        cluster_view_s.edit_animator = NULL;
+    }
+
+    int to_x, to_y;
+    cluster_view_s.animation_from_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
+    cluster_view_s.animation_from_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
+
+    cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
+    cluster_page_get_highlight_xy(page, &to_x, &to_y);
+    if (to_x == INIT_VALUE || to_y == INIT_VALUE) {
+        cluster_page_check_empty_space_pos(page, cluster_view_s.picked_widget, &to_x, &to_y);
+    }
+
+    cluster_view_s.animation_to_x = to_x;
+    cluster_view_s.animation_to_y = to_y;
+
+    cluster_view_s.edit_animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __cluster_view_edit_move_anim, NULL);
+}
+static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos)
+{
+    evas_object_move(cluster_view_s.picked_widget->widget_layout,
+            (cluster_view_s.animation_to_x - cluster_view_s.animation_from_x) * pos + cluster_view_s.animation_from_x,
+            (cluster_view_s.animation_to_y - cluster_view_s.animation_from_y) * pos + cluster_view_s.animation_from_y);
+
+    if (pos >= 1.0 - (1e-10)) {
+        __cluster_view_edit_move_anim_done(data);
+
+        cluster_view_s.edit_animator = NULL;
+        return ECORE_CALLBACK_DONE;
+    }
+
+    return ECORE_CALLBACK_RENEW;
+}
+
+static void __cluster_view_edit_move_anim_done(void *data)
+{
+    Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
+    elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
+    elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
+
     cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
 
     if (!cluster_page_drop_widget(page, cluster_view_s.picked_widget)) {
-        cluster_view_add_widget(cluster_view_s.picked_widget, false);
+        cluster_view_s.current_page = cluster_view_s.picked_widget->page_idx;
+        __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
+
+        cluster_view_add_widget(cluster_view_s.picked_widget, true);
     }
+
+    cluster_view_s.picked_widget = NULL;
 }
 
 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
@@ -1251,6 +1341,11 @@ static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *ob
     if (cluster_view_s.view_state != VIEW_STATE_NORMAL)
         return ;
 
+    if (cluster_view_s.edit_animator) {
+        LOGE("edit animator is running");
+        return ;
+    }
+
     LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
 
     cluster_mouse_info.pressed = true;
@@ -1328,6 +1423,10 @@ static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data)
 
     return ECORE_CALLBACK_CANCEL;
 }
+static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+    cluster_view_s.is_srolling = true;
+}
 
 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
 {
@@ -1353,4 +1452,3 @@ static Eina_Bool __cluster_view_scroll_timer_cb(void *data)
     __cluster_view_scroll_to_page(next_page_idx, true);
     return ECORE_CALLBACK_RENEW;
 }
-
index 5f4fc9c2e814aa49a553850b6248411f98c2e536..38dc3dd8bb17170a5e150f574bc48ed1f219e803 100755 (executable)
@@ -50,7 +50,7 @@ static struct {
     .root_width = 0,
     .root_height = 0,
     .view_type = HOMESCREEN_VIEW_HOME,
-    .animator = NULL
+    .animator = NULL,
 };
 
 static void __homescreen_efl_get_window_size(Evas_Object *win);
@@ -340,8 +340,8 @@ void homescreen_efl_hw_home_key_release(void)
     if (main_info.view_type == HOMESCREEN_VIEW_HOME) {
         cluster_view_hw_home_key();
     } else if (main_info.view_type == HOMESCREEN_VIEW_APPS) {
-        apps_view_hw_home_key();
-        __homescreen_efl_change_view();
+        if (apps_view_hw_home_key() == false)
+            __homescreen_efl_change_view();
     }
 }
 
index df8f64eb218548ab2315aac3895f4c946748176d..1dcf348d01ab3089eabf8d2109fe779824a1af51 100755 (executable)
 #include "conf.h"
 #include "edc_conf.h"
 
+//#define _TEST_
+#ifdef _TEST_
+static Eina_Bool __widget_viewer_test_timer_cb(void *data)
+{
+    Evas_Object *widget = (Evas_Object*) data;
+    evas_object_color_set(widget, rand()%255, rand()%255, rand()%255, 100);
+    return ECORE_CALLBACK_RENEW;
+}
+static int count = 0;
+#endif
 static void __widget_viewer_delete_btn_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
 
 void widget_viewer_init(Evas_Object *win)
@@ -49,17 +59,29 @@ Evas_Object *widget_viewer_add_widget(Evas_Object *parent, widget_data_t *item,
     evas_object_show(rect);
     elm_object_part_content_set(widget_layout, SIZE_SETTER, rect);
 
-#if 1
+#ifndef _TEST_
     Evas_Object *widget = widget_viewer_evas_add_widget(widget_layout, item->pkg_name, NULL, item->period);
     evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL);
     evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_color_set(widget, 255, 255, 255, 255);
 #else // for TEST
-    Evas_Object *widget = evas_object_rectangle_add(evas_object_evas_get(widget_layout));
+/*    Evas_Object *widget = evas_object_rectangle_add(evas_object_evas_get(widget_layout));
     evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL);
     evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_color_set(widget, 0, 0, 255, 100);
     evas_object_show(widget);
+*/
+    char number[1000];
+    sprintf(number, "<font_size=50>%s_%d</font_size>", item->pkg_name, count++);
+    Evas_Object *widget = elm_label_add(evas_object_evas_get(widget_layout));
+    elm_object_style_set(widget, "popup/default");
+    evas_object_size_hint_weight_set(widget, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    elm_object_text_set(widget, number);
+    evas_object_color_set(widget, 0, 0, 255, 100);
+    evas_object_show(widget);
+
+    Ecore_Timer *timer = ecore_timer_add(1, __widget_viewer_test_timer_cb, widget);
 #endif
     elm_object_part_content_set(widget_layout, WIDGET_CONTENT, widget);
 
index 03aa5336de9e2ac0fe74f213c55b88bd0db6d3b7..6e9472fda4ac0eda0d69c71a0d5883945a23e0c0 100755 (executable)
@@ -13,6 +13,7 @@
         <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
         <privilege>http://tizen.org/privilege/packagemanager.admin</privilege>
         <privilege>http://tizen.org/privilege/shortcut</privilege>
+        <privilege>http://tizen.org/privilege/notification</privilege>
         <privilege>http://tizen.org/privilege/packagemanager.info</privilege>
         <privilege>http://tizen.org/privilege/widget.viewer</privilege>
     </privileges>