File Manager / src / view /
  1. /*
  2. * Copyright 2014 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. *
  16. */
  17.  
  18. #include "view/navi-path-widget.h"
  19. #include "view/list-view.h"
  20. #include "view/navigator.h"
  21. #include "utils/ui-utils.h"
  22. #include "utils/app-types.h"
  23. #include "utils/common-utils.h"
  24. #include "utils/config.h"
  25. #include "utils/logger.h"
  26.  
  27. #define FM_DEF_TEXT_COLOR 43, 58, 175, 255
  28. #define FM_NAVIFRAME_ITEM_INDEX_MAIN 1
  29. #define FM_DEF_COLUMN_NUMBER 0
  30. #define FM_DEF_COLUMN_SPAN 1
  31. #define FM_DEF_ROW_SPAN 1
  32.  
  33. #define FM_CLICK_MAX_DURATION_MS 150
  34. #define FM_CLICK_MIN_X_DISTANCE_PIX 50
  35.  
  36. static void _navi_path_widget_destroy(navi_path_widget *widget);
  37. static void _navi_path_widget_append_label(navi_path_widget *widget, const char *label_name);
  38.  
  39. static void _navi_path_widget_label_clicked(navi_path_widget *widget, Evas_Object *label);
  40. static void _navi_path_widget_label_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
  41. static void _navi_path_widget_label_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
  42. static void _navi_path_widget_delete_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
  43.  
  44. navi_path_widget *navi_path_widget_add(view_data *view)
  45. {
  46. RETVM_IF(!view, NULL, "View object is NULL");
  47.  
  48. navi_path_widget *widget = calloc(1, sizeof(navi_path_widget));
  49. RETVM_IF(!widget, NULL, "Fail allocate memory");
  50.  
  51. widget->table_size = 0;
  52. widget->view = view;
  53.  
  54. widget->navi_path_layout = ui_utils_genlist_add(widget->view->navi_layout, _navi_path_widget_delete_cb, widget);
  55. if (!widget->navi_path_layout) {
  56. ERR("Layout is NULL");
  57. _navi_path_widget_destroy(widget);
  58. return NULL;
  59. }
  60.  
  61. evas_object_size_hint_weight_set(widget->navi_path_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
  62. evas_object_size_hint_align_set(widget->navi_path_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
  63.  
  64. elm_layout_file_set(widget->navi_path_layout, ui_utils_get_resource(FM_LAYOUT_EDJ), "path_info");
  65.  
  66. evas_object_show(widget->navi_path_layout);
  67.  
  68. widget->navi_path_scroller = elm_scroller_add(widget->navi_path_layout);
  69. if (!widget->navi_path_scroller) {
  70. ERR("Scroller is NULL");
  71. evas_object_del(widget->navi_path_layout);
  72. return NULL;
  73. }
  74.  
  75. elm_scroller_bounce_set(widget->navi_path_scroller, EINA_TRUE, EINA_FALSE);
  76. elm_scroller_policy_set(widget->navi_path_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
  77.  
  78. evas_object_size_hint_weight_set(widget->navi_path_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
  79. evas_object_size_hint_align_set(widget->navi_path_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
  80. evas_object_show(widget->navi_path_scroller);
  81.  
  82. widget->navi_path_table = elm_table_add(widget->navi_path_layout);
  83. if (!widget->navi_path_table) {
  84. ERR("Table is NULL");
  85. evas_object_del(widget->navi_path_layout);
  86. return NULL;
  87. }
  88.  
  89. evas_object_size_hint_weight_set(widget->navi_path_table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
  90. evas_object_size_hint_align_set(widget->navi_path_table, EVAS_HINT_FILL, EVAS_HINT_FILL);
  91. evas_object_show(widget->navi_path_table);
  92.  
  93. elm_object_content_set(widget->navi_path_scroller, widget->navi_path_table);
  94. elm_object_part_content_set(widget->navi_path_layout, "info", widget->navi_path_scroller);
  95.  
  96. elm_object_part_content_set(widget->view->navi_layout, "header_box", widget->navi_path_layout);
  97.  
  98. return widget;
  99. }
  100.  
  101. void navi_path_widget_content_set(navi_path_widget *widget, Eina_List *path_list)
  102. {
  103. RETM_IF(!widget, "Widget object is NULL");
  104.  
  105. Eina_List *list = NULL;
  106. char *data = NULL;
  107. EINA_LIST_FOREACH(path_list, list, data) {
  108. _navi_path_widget_append_label(widget, data);
  109. }
  110. }
  111.  
  112. static void _navi_path_widget_append_label(navi_path_widget *widget, const char *label_name)
  113. {
  114. RETM_IF(!widget, "Widget object is NULL");
  115. RETM_IF(!widget->view, "View object is NULL");
  116. RETM_IF(!label_name, "Label name is NULL");
  117.  
  118. Evas_Object *label = elm_label_add(widget->navi_path_layout);
  119. RETM_IF(!label, "Label object is NULL");
  120.  
  121. char *label_markup = elm_entry_utf8_to_markup(label_name);
  122. char *lable_text = common_util_strconcat(label_markup, "/", NULL);
  123.  
  124. elm_object_text_set(label, lable_text);
  125.  
  126. free(lable_text);
  127. free(label_markup);
  128.  
  129. evas_object_color_set(label, FM_DEF_TEXT_COLOR);
  130. evas_object_event_callback_add(label, EVAS_CALLBACK_MOUSE_DOWN, _navi_path_widget_label_down_cb, widget);
  131. evas_object_event_callback_add(label, EVAS_CALLBACK_MOUSE_UP, _navi_path_widget_label_up_cb, widget);
  132. evas_object_show(label);
  133.  
  134. elm_table_pack(widget->navi_path_table,
  135. label,
  136. ++widget->table_size,
  137. FM_DEF_COLUMN_NUMBER,
  138. FM_DEF_COLUMN_SPAN,
  139. FM_DEF_ROW_SPAN);
  140.  
  141. widget->labels_list = eina_list_append(widget->labels_list, label);
  142. }
  143.  
  144. static void _navi_path_widget_destroy(navi_path_widget *widget)
  145. {
  146. free(widget);
  147. }
  148.  
  149. static void _navi_path_widget_label_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
  150. {
  151. RETM_IF(!data, "Data is NULL");
  152. RETM_IF(!event_info, "Event info is NULL");
  153.  
  154. navi_path_widget *widget = data;
  155. Evas_Event_Mouse_Down *ei = event_info;
  156.  
  157. widget->was_down = EINA_TRUE;
  158. widget->down_time_ms = ei->timestamp;
  159. widget->down_pos_x = ei->canvas.x;
  160. }
  161. static void _navi_path_widget_label_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
  162. {
  163. RETM_IF(!data, "Data is NULL");
  164. RETM_IF(!obj, "Object is NULL");
  165. RETM_IF(!event_info, "Event info is NULL");
  166.  
  167. navi_path_widget *widget = data;
  168. Evas_Event_Mouse_Down *event = event_info;
  169.  
  170. if (!widget->was_down) {
  171. return;
  172. }
  173. widget->was_down = EINA_FALSE;
  174.  
  175. if ((event->timestamp - widget->down_time_ms) > FM_CLICK_MAX_DURATION_MS) {
  176. return;
  177. }
  178.  
  179. if (abs(event->canvas.x - widget->down_pos_x) > FM_CLICK_MIN_X_DISTANCE_PIX) {
  180. return;
  181. }
  182.  
  183. _navi_path_widget_label_clicked(widget, obj);
  184. }
  185.  
  186. static void _navi_path_widget_label_clicked(navi_path_widget *widget, Evas_Object *label)
  187. {
  188. int pos = 0;
  189. elm_table_pack_get(label, &pos, NULL, NULL, NULL);
  190.  
  191. int view_index = pos + FM_NAVIFRAME_ITEM_INDEX_MAIN;
  192. int res = navigator_goto_view_by_index(widget->view->app->navigator, view_index);
  193. RETM_IF(res != RESULT_TYPE_OK, "Failed to navigate to view by index '%d'", view_index);
  194. }
  195.  
  196. static void _navi_path_widget_delete_cb(void *data, Evas *evas, Evas_Object *obj,
  197. void *event_info)
  198. {
  199. _navi_path_widget_destroy(data);
  200. }