File Manager / src / view /

ctrl-bar-view.c

  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/ctrl-bar-view.h"
  19. #include "view/list-view.h"
  20. #include "view/popup.h"
  21. #include "view/window.h"
  22. #include "utils/config.h"
  23. #include "utils/logger.h"
  24. #include "utils/app-types.h"
  25. #include "main-app.h"
  26. #include "model/clipboard.h"
  27.  
  28. #include <app.h>
  29. #include <efl_extension.h>
  30.  
  31. #define FM_CTXPOPUP_HEIGHT ELM_SCALE_SIZE(80)
  32. #define FM_CTXPOPUP_WIDTH ELM_SCALE_SIZE(140)
  33. #define FM_CTXPOPUP_TEXT_PASTE "Paste Here"
  34. #define FM_CTXPOPUP_TEXT_CREATE "Create New Folder"
  35.  
  36. #define FM_TOOLBAR_TEXT_EDIT "EDIT"
  37. #define FM_TOOLBAR_TEXT_MORE "MORE"
  38. #define FM_TOOLBAR_TEXT_EXIT "EXIT"
  39.  
  40. #define FM_TOOLBAR_TEXT_DELETE "DELETE"
  41. #define FM_TOOLBAR_TEXT_MOVE "MOVE"
  42. #define FM_TOOLBAR_TEXT_COPY "COPY"
  43. #define FM_TOOLBAR_TEXT_CANCEL "CANCEL"
  44.  
  45. static int _ctrl_bar_widget_fill(ctrl_bar_widget *widget);
  46. static void _ctrl_bar_widget_add_update_buttons(ctrl_bar_widget *widget);
  47. static void _ctrl_bar_widget_btns_state_update(ctrl_bar_widget *widget);
  48. static void _ctrl_bar_widget_destroy(ctrl_bar_widget *data);
  49.  
  50. static void _ctrl_bar_widget_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
  51. static void _ctrl_bar_widget_edit_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  52. static void _ctrl_bar_widget_more_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  53. static void _ctrl_bar_widget_delete_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  54. static void _ctrl_bar_widget_move_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  55. static void _ctrl_bar_widget_copy_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  56. static void _ctrl_bar_widget_cancel_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  57. static void _ctrl_bar_widget_exit_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
  58.  
  59. static void _ctrl_bar_widget_ctxpopup_past_here_cb(void *data, Evas_Object *obj, void *eventInfo);
  60. static void _ctrl_bar_widget_ctxpopup_create_folder_cb(void *data, Evas_Object *obj, void *eventInfo);
  61. static void _ctrl_bar_widget_ctxpopup_back_button_cb(void *data, Evas_Object *obj, void *event_info);
  62.  
  63. ctrl_bar_widget *ctrl_bar_widget_add(view_data *view)
  64. {
  65. RETVM_IF(!view, NULL, "View object is NULL");
  66.  
  67. ctrl_bar_widget *data = calloc(1, sizeof(ctrl_bar_widget));
  68. RETVM_IF(!data, NULL, "Fail allocate memory");
  69.  
  70. data->view = view;
  71. data->ctxpopup = NULL;
  72.  
  73. if (_ctrl_bar_widget_fill(data) != RESULT_TYPE_OK) {
  74. ERR("Fail to initialise ctrl bar");
  75. _ctrl_bar_widget_destroy(data);
  76. return NULL;
  77. }
  78.  
  79. evas_object_event_callback_add(data->ctrl_bar, EVAS_CALLBACK_FREE, _ctrl_bar_widget_delete_cb, data);
  80.  
  81. return data;
  82. }
  83.  
  84. int ctrl_bar_widget_mode_update(ctrl_bar_widget *widget)
  85. {
  86. RETVM_IF(!widget, RESULT_TYPE_FAIL, "Widget object is NULL");
  87. RETVM_IF(!widget->view, RESULT_TYPE_FAIL, "View object is NULL");
  88. RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_FAIL, "Ctrl bar object is NULL");
  89.  
  90. _ctrl_bar_widget_add_update_buttons(widget);
  91.  
  92. return RESULT_TYPE_OK;
  93. }
  94.  
  95. int ctrl_bar_widget_state_update(ctrl_bar_widget *widget)
  96. {
  97. RETVM_IF(!widget, RESULT_TYPE_FAIL, "Widget object is NULL");
  98. RETVM_IF(!widget->view, RESULT_TYPE_FAIL, "View object is NULL");
  99. RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_FAIL, "Ctrl bar object is NULL");
  100.  
  101. _ctrl_bar_widget_btns_state_update(widget);
  102.  
  103. return RESULT_TYPE_OK;
  104. }
  105.  
  106. static int _ctrl_bar_widget_fill(ctrl_bar_widget *widget)
  107. {
  108. widget->ctrl_bar = elm_toolbar_add(widget->view->navi_layout);
  109. RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_INVALID_ARG, "Ctrl bar object is NULL");
  110.  
  111. elm_object_focus_set(widget->ctrl_bar, EINA_FALSE);
  112. elm_toolbar_shrink_mode_set(widget->ctrl_bar, ELM_TOOLBAR_SHRINK_EXPAND);
  113. elm_toolbar_transverse_expanded_set(widget->ctrl_bar, EINA_TRUE);
  114.  
  115. elm_toolbar_select_mode_set(widget->ctrl_bar, ELM_OBJECT_SELECT_MODE_NONE);
  116.  
  117. evas_object_size_hint_weight_set(widget->ctrl_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
  118. evas_object_size_hint_align_set(widget->ctrl_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
  119.  
  120. elm_object_item_part_content_set(widget->view->navi_item, "toolbar", widget->ctrl_bar);
  121.  
  122. _ctrl_bar_widget_add_update_buttons(widget);
  123.  
  124. return RESULT_TYPE_OK;
  125. }
  126.  
  127. static void _ctrl_bar_widget_add_update_buttons(ctrl_bar_widget *widget)
  128. {
  129. app_data *app = widget->view->app;
  130. if (app->status.is_mainview || widget->view->is_root) {
  131. elm_toolbar_item_append(widget->ctrl_bar, NULL, "EXIT", _ctrl_bar_widget_exit_btn_cb, widget);
  132. } else {
  133. app_data *app = widget->view->app;
  134. Elm_Object_Item *item_del = elm_toolbar_first_item_get(widget->ctrl_bar);
  135. if (item_del) {
  136. Elm_Object_Item *item = elm_toolbar_item_next_get(item_del);
  137. while (item_del) {
  138. elm_object_item_del(item_del);
  139. item_del = item;
  140. item = elm_toolbar_item_next_get(item_del);
  141. }
  142. }
  143.  
  144. if (app->status.curr_mode == MODE_DEFAULT) {
  145. Elm_Object_Item *edit_item = elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_EDIT, _ctrl_bar_widget_edit_btn_cb, widget);
  146. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_MORE, _ctrl_bar_widget_more_btn_cb, widget);
  147. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_EXIT, _ctrl_bar_widget_exit_btn_cb, widget);
  148.  
  149. if (list_view_items_count_get(widget->view) < 1) {
  150. elm_object_item_disabled_set(edit_item, EINA_TRUE);
  151. }
  152. } else if (app->status.curr_mode == MODE_EDIT) {
  153. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_DELETE, _ctrl_bar_widget_delete_btn_cb, widget);
  154. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_MOVE, _ctrl_bar_widget_move_btn_cb, widget);
  155. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_COPY, _ctrl_bar_widget_copy_btn_cb, widget);
  156. elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_CANCEL, _ctrl_bar_widget_cancel_btn_cb, widget);
  157. }
  158. }
  159. }
  160.  
  161. static void _ctrl_bar_widget_btns_state_update(ctrl_bar_widget *widget)
  162. {
  163. Eina_Bool disabled = (widget->view->edit.checked_count > 0) ? EINA_FALSE
  164. : EINA_TRUE;
  165. Elm_Object_Item *item = elm_toolbar_first_item_get(widget->ctrl_bar);
  166. Elm_Object_Item *last_item = elm_toolbar_last_item_get(widget->ctrl_bar);
  167. while (item != last_item) {
  168. elm_object_item_disabled_set(item, disabled);
  169. item = elm_toolbar_item_next_get(item);
  170. }
  171. }
  172.  
  173. static void _ctrl_bar_widget_destroy(ctrl_bar_widget *data)
  174. {
  175. free(data);
  176. }
  177.  
  178. static void _ctrl_bar_widget_ctxpopup_back_button_cb(void *data, Evas_Object *obj, void *event_info)
  179. {
  180. ctrl_bar_widget *widget = data;
  181. evas_object_del(widget->ctxpopup);
  182. widget->ctxpopup = NULL;
  183. }
  184.  
  185. static void _ctrl_bar_create_context_popup(ctrl_bar_widget *widget)
  186. {
  187. app_data *app = widget->view->app;
  188.  
  189. widget->ctxpopup = elm_ctxpopup_add(widget->view->navi);
  190.  
  191. eext_object_event_callback_add(widget->ctxpopup,
  192. EEXT_CALLBACK_BACK,
  193. _ctrl_bar_widget_ctxpopup_back_button_cb,
  194. widget);
  195.  
  196. evas_object_smart_callback_add(widget->ctxpopup,
  197. "dismissed",
  198. _ctrl_bar_widget_ctxpopup_back_button_cb,
  199. widget);
  200.  
  201. RETM_IF(!widget->ctxpopup, "Fail to create ctxpopup");
  202.  
  203. Eina_Bool is_cb_empty = EINA_TRUE;
  204. clipboard_is_empty(app->clipboard, &is_cb_empty);
  205.  
  206. if (!is_cb_empty) {
  207. elm_ctxpopup_item_append(widget->ctxpopup, FM_CTXPOPUP_TEXT_PASTE, NULL, _ctrl_bar_widget_ctxpopup_past_here_cb, widget);
  208. }
  209.  
  210. elm_ctxpopup_item_append(widget->ctxpopup, FM_CTXPOPUP_TEXT_CREATE, NULL, _ctrl_bar_widget_ctxpopup_create_folder_cb, widget);
  211.  
  212. evas_object_size_hint_min_set(widget->ctxpopup, FM_CTXPOPUP_WIDTH, FM_CTXPOPUP_HEIGHT);
  213.  
  214. int tb_height = 0;
  215. Evas_Object *tb = elm_object_part_content_get(widget->view->navi, "toolbar");
  216.  
  217. if (tb) {
  218. evas_object_geometry_get(tb, NULL, NULL, NULL, &tb_height);
  219. } else {
  220. ERR("Toolbar is NULL");
  221. }
  222.  
  223. int w = 0;
  224. int h = 0;
  225. evas_object_geometry_get(widget->view->app->win->win, NULL, NULL, &w, &h);
  226. evas_object_move(widget->ctxpopup, w / 2, h - tb_height);
  227.  
  228. evas_object_show(widget->ctxpopup);
  229. }
  230.  
  231. static void _ctrl_bar_widget_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
  232. {
  233. _ctrl_bar_widget_destroy(data);
  234. }
  235.  
  236. static void _ctrl_bar_widget_edit_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  237. {
  238. RETM_IF(!data, "Data is NULL");
  239.  
  240. ctrl_bar_widget *widget = data;
  241. widget->view->app->status.curr_mode = MODE_EDIT;
  242.  
  243. int res = list_view_update(widget->view->navi_item,
  244. UPDATE_TYPE_GENLIST |
  245. UPDATE_TYPE_CTRL_BAR_MODE |
  246. UPDATE_TYPE_CTRL_BAR_STATE);
  247.  
  248. RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
  249. }
  250.  
  251. static void _ctrl_bar_widget_cancel_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  252. {
  253. RETM_IF(!data, "Data is NULL");
  254.  
  255. ctrl_bar_widget *widget = data;
  256. widget->view->app->status.curr_mode = MODE_DEFAULT;
  257.  
  258. int res = list_view_update(widget->view->navi_item,
  259. UPDATE_TYPE_GENLIST |
  260. UPDATE_TYPE_CTRL_BAR_MODE);
  261.  
  262. RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
  263. }
  264.  
  265. static void _ctrl_bar_widget_exit_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  266. {
  267. ui_app_exit();
  268. }
  269.  
  270. static void _ctrl_bar_widget_delete_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  271. {
  272. RETM_IF(!data, "Data is NULL");
  273.  
  274. ctrl_bar_widget *widget = data;
  275.  
  276. int res = popup_create(widget->view, POPUP_TYPE_DELETE);
  277. RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
  278. }
  279.  
  280. static void _ctrl_bar_widget_move_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  281. {
  282. RETM_IF(!data, "Data is NULL");
  283.  
  284. ctrl_bar_widget *widget = data;
  285. widget->view->app->status.curr_mode = MODE_DEFAULT;
  286.  
  287. int res = list_view_move_items(widget->view);
  288. RETM_IF(res != RESULT_TYPE_OK, "Fail to move file");
  289.  
  290. res = list_view_update(widget->view->navi_item, UPDATE_TYPE_GENLIST | UPDATE_TYPE_CTRL_BAR_MODE);
  291. RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
  292.  
  293. res = popup_create(widget->view, POPUP_TYPE_COPY_MOVE);
  294. RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
  295. }
  296.  
  297. static void _ctrl_bar_widget_copy_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  298. {
  299. RETM_IF(!data, "Data is NULL");
  300.  
  301. ctrl_bar_widget *widget = data;
  302. widget->view->app->status.curr_mode = MODE_DEFAULT;
  303.  
  304. int res = list_view_copy_items(widget->view);
  305. RETM_IF(res != RESULT_TYPE_OK, "Fail to copy file");
  306.  
  307. res = list_view_update(widget->view->navi_item, UPDATE_TYPE_GENLIST | UPDATE_TYPE_CTRL_BAR_MODE);
  308. RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
  309.  
  310. res = popup_create(widget->view, POPUP_TYPE_COPY_MOVE);
  311. RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
  312. }
  313.  
  314. static void _ctrl_bar_widget_ctxpopup_past_here_cb(void *data, Evas_Object *obj, void *eventInfo)
  315. {
  316. RETM_IF(!data, "Data is NULL");
  317.  
  318. ctrl_bar_widget *widget = data;
  319.  
  320. elm_ctxpopup_dismiss(widget->ctxpopup);
  321.  
  322. int res = list_view_past_items(widget->view);
  323. RETM_IF(res != RESULT_TYPE_OK, "Fail to past file");
  324. }
  325.  
  326. static void _ctrl_bar_widget_ctxpopup_create_folder_cb(void *data, Evas_Object *obj, void *eventInfo)
  327. {
  328. RETM_IF(!data, "Data is NULL");
  329.  
  330. ctrl_bar_widget *widget = data;
  331.  
  332. elm_ctxpopup_dismiss(widget->ctxpopup);
  333.  
  334. int res = popup_create(widget->view, POPUP_TYPE_NEW_FOLDER);
  335. RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
  336. }
  337.  
  338. static void _ctrl_bar_widget_more_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
  339. {
  340. RETM_IF(!data, "Data is NULL");
  341.  
  342. ctrl_bar_widget *widget = data;
  343.  
  344. elm_ctxpopup_dismiss(widget->ctxpopup);
  345.  
  346. _ctrl_bar_create_context_popup(widget);
  347. }