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/navigator.h"
  19. #include "view/main-view.h"
  20. #include "view/list-view.h"
  21. #include "utils/ui-utils.h"
  22. #include "utils/app-types.h"
  23. #include "utils/logger.h"
  24. #include "utils/common-utils.h"
  25. #include "model/navi-path-storage.h"
  26.  
  27. #define FM_NAVI_ITEM_INDEX_MAIN 1
  28. #define FM_NAVI_ITEM_INDEX_ROOT 2
  29. #define FM_NAVI_ITEM_INDEX_PREV(navi) eina_list_count(navi->view_list) - 1
  30.  
  31. struct _navigator {
  32. app_data *app; /**< Application data pointer */
  33. Eina_List *view_list; /**< List of views in stack */
  34. };
  35.  
  36. static int _navigator_remove_items_to_index(navigator *navi, int index);
  37.  
  38. navigator *navigator_create(app_data *data)
  39. {
  40. navigator *navi = calloc(1, sizeof(navigator));
  41. if (navi) {
  42. navi->app = data;
  43. }
  44. return navi;
  45. }
  46.  
  47. void navigator_destroy(navigator *navi)
  48. {
  49. if (navi) {
  50. eina_list_free(navi->view_list);
  51. free(navi);
  52. }
  53. }
  54.  
  55. int navigator_add_view(navigator *navi, const char *view_title, view_data *view)
  56. {
  57. RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
  58. RETVM_IF(!view, RESULT_TYPE_INVALID_ARG, "View data is NULL");
  59.  
  60. view->navi_item = elm_naviframe_item_push(view->navi, view_title, NULL, NULL, view->navi_layout, NULL);
  61. RETVM_IF(!view->navi_item, RESULT_TYPE_FAIL, "Failed to add view to naviframe");
  62.  
  63. navi->view_list = eina_list_append(navi->view_list, view);
  64. int list_size = eina_list_count(navi->view_list);
  65.  
  66. if (list_size != FM_NAVI_ITEM_INDEX_MAIN) {
  67. const char *label_name = NULL;
  68. if (list_size == FM_NAVI_ITEM_INDEX_ROOT) {
  69. label_name = ui_utils_title_get(view->curr_path);
  70. } else {
  71. label_name = common_util_get_filename(view->curr_path);
  72. }
  73.  
  74. int res = navi_path_storage_add_folder(navi->app->path_storage, label_name);
  75. RETVM_IF(res != RESULT_TYPE_OK , res, "Failed to add folder '%s' to storage", label_name);
  76. }
  77.  
  78. return RESULT_TYPE_OK;
  79. }
  80.  
  81. int navigator_goto_previous_view(navigator *navi)
  82. {
  83. RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
  84.  
  85. return navigator_goto_view_by_index(navi, FM_NAVI_ITEM_INDEX_PREV(navi));
  86. }
  87.  
  88. int navigator_goto_root_view(navigator *navi)
  89. {
  90. RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
  91.  
  92. return navigator_goto_view_by_index(navi, FM_NAVI_ITEM_INDEX_ROOT);
  93. }
  94.  
  95. int navigator_goto_view_by_index(navigator *navi, int index)
  96. {
  97. RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
  98.  
  99. int res = RESULT_TYPE_FAIL;
  100.  
  101. navi->app->status.curr_mode = MODE_DEFAULT;
  102.  
  103. int list_size = eina_list_count(navi->view_list);
  104. RETVM_IF(list_size < index, RESULT_TYPE_INVALID_ARG, "Requested view index '%d' is to big", index);
  105.  
  106. int path_index = index - FM_NAVI_ITEM_INDEX_MAIN;
  107. res = navi_path_storage_remove_path_to_index(navi->app->path_storage, path_index);
  108. RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to remove path_list to index '%d'", path_index);
  109.  
  110. res = _navigator_remove_items_to_index(navi, index);
  111. RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to remove views_list to index '%d'", index);
  112.  
  113. Eina_List *last_node = eina_list_last(navi->view_list);
  114. RETVM_IF(!last_node, RESULT_TYPE_FAIL, "Last node is NULL");
  115.  
  116. view_data *item = eina_list_data_get(last_node);
  117. RETVM_IF(!item, RESULT_TYPE_FAIL, "Navi item is NULL");
  118.  
  119. elm_naviframe_item_pop_to(item->navi_item);
  120. if (item->navi_item == elm_naviframe_bottom_item_get(navi->app->navi)) {
  121. navi->app->status.is_mainview = EINA_TRUE;
  122. res = main_view_update(item->navi_item);
  123. } else {
  124. res = list_view_update(item->navi_item, UPDATE_TYPE_VIEW);
  125. }
  126. RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to update view");
  127.  
  128. return res;
  129. }
  130.  
  131. static int _navigator_remove_items_to_index(navigator *navi, int index)
  132. {
  133. RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
  134.  
  135. int list_size = eina_list_count(navi->view_list);
  136. RETVM_IF(list_size < index, RESULT_TYPE_INVALID_ARG, "Requested view index '%d' is to big", index);
  137.  
  138. while (list_size > index) {
  139. Eina_List *last_node = eina_list_last(navi->view_list);
  140. navi->view_list = eina_list_remove_list(navi->view_list, last_node);
  141. --list_size;
  142. }
  143.  
  144. return RESULT_TYPE_OK;
  145. }