File Manager / src / view /

main-view.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/main-view.h"
#include "view/ctrl-bar-view.h"
#include "view/genlist-widget.h"
#include "view/navigator.h"
#include "view/view.h"
#include "utils/config.h"
#include "utils/logger.h"
#include "utils/ui-utils.h"
#include "utils/common-utils.h"
#include "utils/app-types.h"
#include "model/fs-manager.h"
#include "main-app.h"

#define FM_MAIN_VIEW_TITLE "Storages"

typedef struct {
	view_data view;
	genlist_widget *genlist_widget;
	ctrl_bar_widget *ctrl_widget;
	Eina_List *storage_list;
} main_view_data;

static int _main_view_fill(main_view_data *data);
static int _main_view_create_widgets(main_view_data *data);
static void _main_view_destroy(main_view_data *data);

static void _main_view_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);

int main_view_add(app_data *app, Evas_Object *parent)
{
	RETVM_IF(!app, RESULT_TYPE_INVALID_ARG, "App object is NULL");
	RETVM_IF(!parent, RESULT_TYPE_INVALID_ARG, "Parent object is NULL");

	app->status.is_mainview = EINA_TRUE;

	main_view_data *data = calloc(1, sizeof(main_view_data));
	RETVM_IF(!data, RESULT_TYPE_FAIL_ALLOCATE_MEMORY, "Fail allocate memory");

	data->view.app = app;
	data->view.navi = parent;

	data->storage_list = NULL;
	data->view.is_root = EINA_FALSE;

	data->view.navi_layout = ui_utils_layout_add(data->view.navi, _main_view_del_cb, data);
	if (!data->view.navi_layout) {
		ERR("Fail to create layout");
		_main_view_destroy(data);
		return RESULT_TYPE_FAIL;
	}

	elm_layout_file_set(data->view.navi_layout, ui_utils_get_resource(FM_LAYOUT_EDJ), "navi_layout");

	int result = navigator_add_view(data->view.app->navigator, FM_MAIN_VIEW_TITLE, &data->view);
	if (result != RESULT_TYPE_OK) {
		ERR("Fail to add view to naviframe");
		evas_object_del(data->view.navi_layout);
		return result;
	}

	result = _main_view_create_widgets(data);
	if (result != RESULT_TYPE_OK) {
		ERR("Fail to create widgets");
		evas_object_del(data->view.navi_layout);
		return result;
	}

	result = _main_view_fill(data);
	if (result != RESULT_TYPE_OK) {
		ERR("Fail to initialize main view");
		evas_object_del(data->view.navi_layout);
		return result;
	}

	elm_object_item_data_set(data->view.navi_item, data);

	return RESULT_TYPE_OK;
}

int main_view_update(Elm_Object_Item *navi_item)
{
	RETVM_IF(!navi_item, RESULT_TYPE_INVALID_ARG, "View object is NULL");

	main_view_data *data = elm_object_item_data_get(navi_item);
	RETVM_IF(!data, RESULT_TYPE_INVALID_ARG, "Data is NULL");
	RETVM_IF(!data->genlist_widget, RESULT_TYPE_INVALID_ARG, "Genlist widget is NULL");

	common_util_clear_storage_list(&data->storage_list);
	genlist_widget_clear(data->genlist_widget);

	return _main_view_fill(data);
}

static int _main_view_create_widgets(main_view_data *data)
{
	data->genlist_widget = genlist_widget_add((view_data *)data);
	RETVM_IF(!data->genlist_widget, RESULT_TYPE_INVALID_ARG, "Fail to create genlist widget");

	data->ctrl_widget = ctrl_bar_widget_add((view_data *)data);
	RETVM_IF(!data->ctrl_widget, RESULT_TYPE_INVALID_ARG, "Fail to create ctrl bar widget");

	return RESULT_TYPE_OK;
}

static int _main_view_fill(main_view_data *data)
{
	int res = fs_manager_get_storage_list(data->view.app->manager, &data->storage_list);
	RETVM_IF(res != RESULT_TYPE_OK, res, "Fail to get storage list");

	genlist_widget_content_set(data->genlist_widget, data->storage_list);
	return RESULT_TYPE_OK;
}

static void _main_view_destroy(main_view_data *data)
{
	if (data) {
		common_util_clear_storage_list(&data->storage_list);
		free(data);
	}
}

static void _main_view_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
	_main_view_destroy(data);
}