File Manager / src / view /
navigator.c
- /*
- * Copyright 2014 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
- #include "view/navigator.h"
- #include "view/main-view.h"
- #include "view/list-view.h"
- #include "utils/ui-utils.h"
- #include "utils/app-types.h"
- #include "utils/logger.h"
- #include "utils/common-utils.h"
- #include "model/navi-path-storage.h"
- #define FM_NAVI_ITEM_INDEX_MAIN 1
- #define FM_NAVI_ITEM_INDEX_ROOT 2
- #define FM_NAVI_ITEM_INDEX_PREV(navi) eina_list_count(navi->view_list) - 1
- struct _navigator {
- app_data *app; /**< Application data pointer */
- Eina_List *view_list; /**< List of views in stack */
- };
- static int _navigator_remove_items_to_index(navigator *navi, int index);
- navigator *navigator_create(app_data *data)
- {
- navigator *navi = calloc(1, sizeof(navigator));
- if (navi) {
- navi->app = data;
- }
- return navi;
- }
- void navigator_destroy(navigator *navi)
- {
- if (navi) {
- eina_list_free(navi->view_list);
- free(navi);
- }
- }
- int navigator_add_view(navigator *navi, const char *view_title, view_data *view)
- {
- RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
- RETVM_IF(!view, RESULT_TYPE_INVALID_ARG, "View data is NULL");
- view->navi_item = elm_naviframe_item_push(view->navi, view_title, NULL, NULL, view->navi_layout, NULL);
- RETVM_IF(!view->navi_item, RESULT_TYPE_FAIL, "Failed to add view to naviframe");
- navi->view_list = eina_list_append(navi->view_list, view);
- int list_size = eina_list_count(navi->view_list);
- if (list_size != FM_NAVI_ITEM_INDEX_MAIN) {
- const char *label_name = NULL;
- if (list_size == FM_NAVI_ITEM_INDEX_ROOT) {
- label_name = ui_utils_title_get(view->curr_path);
- } else {
- label_name = common_util_get_filename(view->curr_path);
- }
- int res = navi_path_storage_add_folder(navi->app->path_storage, label_name);
- RETVM_IF(res != RESULT_TYPE_OK , res, "Failed to add folder '%s' to storage", label_name);
- }
- return RESULT_TYPE_OK;
- }
- int navigator_goto_previous_view(navigator *navi)
- {
- RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
- return navigator_goto_view_by_index(navi, FM_NAVI_ITEM_INDEX_PREV(navi));
- }
- int navigator_goto_root_view(navigator *navi)
- {
- RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
- return navigator_goto_view_by_index(navi, FM_NAVI_ITEM_INDEX_ROOT);
- }
- int navigator_goto_view_by_index(navigator *navi, int index)
- {
- RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
- int res = RESULT_TYPE_FAIL;
- navi->app->status.curr_mode = MODE_DEFAULT;
- int list_size = eina_list_count(navi->view_list);
- RETVM_IF(list_size < index, RESULT_TYPE_INVALID_ARG, "Requested view index '%d' is to big", index);
- int path_index = index - FM_NAVI_ITEM_INDEX_MAIN;
- res = navi_path_storage_remove_path_to_index(navi->app->path_storage, path_index);
- RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to remove path_list to index '%d'", path_index);
- res = _navigator_remove_items_to_index(navi, index);
- RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to remove views_list to index '%d'", index);
- Eina_List *last_node = eina_list_last(navi->view_list);
- RETVM_IF(!last_node, RESULT_TYPE_FAIL, "Last node is NULL");
- view_data *item = eina_list_data_get(last_node);
- RETVM_IF(!item, RESULT_TYPE_FAIL, "Navi item is NULL");
- elm_naviframe_item_pop_to(item->navi_item);
- if (item->navi_item == elm_naviframe_bottom_item_get(navi->app->navi)) {
- navi->app->status.is_mainview = EINA_TRUE;
- res = main_view_update(item->navi_item);
- } else {
- res = list_view_update(item->navi_item, UPDATE_TYPE_VIEW);
- }
- RETVM_IF(res != RESULT_TYPE_OK, res, "Failed to update view");
- return res;
- }
- static int _navigator_remove_items_to_index(navigator *navi, int index)
- {
- RETVM_IF(!navi, RESULT_TYPE_INVALID_ARG, "Controller is NULL");
- int list_size = eina_list_count(navi->view_list);
- RETVM_IF(list_size < index, RESULT_TYPE_INVALID_ARG, "Requested view index '%d' is to big", index);
- while (list_size > index) {
- Eina_List *last_node = eina_list_last(navi->view_list);
- navi->view_list = eina_list_remove_list(navi->view_list, last_node);
- --list_size;
- }
- return RESULT_TYPE_OK;
- }