File Manager / src / view /
ctrl-bar-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/ctrl-bar-view.h"
#include "view/list-view.h"
#include "view/popup.h"
#include "view/window.h"
#include "utils/config.h"
#include "utils/logger.h"
#include "utils/app-types.h"
#include "main-app.h"
#include "model/clipboard.h"
#include <app.h>
#include <efl_extension.h>
#define FM_CTXPOPUP_HEIGHT ELM_SCALE_SIZE(80)
#define FM_CTXPOPUP_WIDTH ELM_SCALE_SIZE(140)
#define FM_CTXPOPUP_TEXT_PASTE "Paste Here"
#define FM_CTXPOPUP_TEXT_CREATE "Create New Folder"
#define FM_TOOLBAR_TEXT_EDIT "EDIT"
#define FM_TOOLBAR_TEXT_MORE "MORE"
#define FM_TOOLBAR_TEXT_EXIT "EXIT"
#define FM_TOOLBAR_TEXT_DELETE "DELETE"
#define FM_TOOLBAR_TEXT_MOVE "MOVE"
#define FM_TOOLBAR_TEXT_COPY "COPY"
#define FM_TOOLBAR_TEXT_CANCEL "CANCEL"
static int _ctrl_bar_widget_fill(ctrl_bar_widget *widget);
static void _ctrl_bar_widget_add_update_buttons(ctrl_bar_widget *widget);
static void _ctrl_bar_widget_btns_state_update(ctrl_bar_widget *widget);
static void _ctrl_bar_widget_destroy(ctrl_bar_widget *data);
static void _ctrl_bar_widget_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _ctrl_bar_widget_edit_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_more_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_delete_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_move_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_copy_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_cancel_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_exit_btn_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_ctxpopup_past_here_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_ctxpopup_create_folder_cb(void *data, Evas_Object *obj, void *eventInfo);
static void _ctrl_bar_widget_ctxpopup_back_button_cb(void *data, Evas_Object *obj, void *event_info);
ctrl_bar_widget *ctrl_bar_widget_add(view_data *view)
{
RETVM_IF(!view, NULL, "View object is NULL");
ctrl_bar_widget *data = calloc(1, sizeof(ctrl_bar_widget));
RETVM_IF(!data, NULL, "Fail allocate memory");
data->view = view;
data->ctxpopup = NULL;
if (_ctrl_bar_widget_fill(data) != RESULT_TYPE_OK) {
ERR("Fail to initialise ctrl bar");
_ctrl_bar_widget_destroy(data);
return NULL;
}
evas_object_event_callback_add(data->ctrl_bar, EVAS_CALLBACK_FREE, _ctrl_bar_widget_delete_cb, data);
return data;
}
int ctrl_bar_widget_mode_update(ctrl_bar_widget *widget)
{
RETVM_IF(!widget, RESULT_TYPE_FAIL, "Widget object is NULL");
RETVM_IF(!widget->view, RESULT_TYPE_FAIL, "View object is NULL");
RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_FAIL, "Ctrl bar object is NULL");
_ctrl_bar_widget_add_update_buttons(widget);
return RESULT_TYPE_OK;
}
int ctrl_bar_widget_state_update(ctrl_bar_widget *widget)
{
RETVM_IF(!widget, RESULT_TYPE_FAIL, "Widget object is NULL");
RETVM_IF(!widget->view, RESULT_TYPE_FAIL, "View object is NULL");
RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_FAIL, "Ctrl bar object is NULL");
_ctrl_bar_widget_btns_state_update(widget);
return RESULT_TYPE_OK;
}
static int _ctrl_bar_widget_fill(ctrl_bar_widget *widget)
{
widget->ctrl_bar = elm_toolbar_add(widget->view->navi_layout);
RETVM_IF(!widget->ctrl_bar, RESULT_TYPE_INVALID_ARG, "Ctrl bar object is NULL");
elm_object_focus_set(widget->ctrl_bar, EINA_FALSE);
elm_toolbar_shrink_mode_set(widget->ctrl_bar, ELM_TOOLBAR_SHRINK_EXPAND);
elm_toolbar_transverse_expanded_set(widget->ctrl_bar, EINA_TRUE);
elm_toolbar_select_mode_set(widget->ctrl_bar, ELM_OBJECT_SELECT_MODE_NONE);
evas_object_size_hint_weight_set(widget->ctrl_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(widget->ctrl_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_item_part_content_set(widget->view->navi_item, "toolbar", widget->ctrl_bar);
_ctrl_bar_widget_add_update_buttons(widget);
return RESULT_TYPE_OK;
}
static void _ctrl_bar_widget_add_update_buttons(ctrl_bar_widget *widget)
{
app_data *app = widget->view->app;
if (app->status.is_mainview || widget->view->is_root) {
elm_toolbar_item_append(widget->ctrl_bar, NULL, "EXIT", _ctrl_bar_widget_exit_btn_cb, widget);
} else {
app_data *app = widget->view->app;
Elm_Object_Item *item_del = elm_toolbar_first_item_get(widget->ctrl_bar);
if (item_del) {
Elm_Object_Item *item = elm_toolbar_item_next_get(item_del);
while (item_del) {
elm_object_item_del(item_del);
item_del = item;
item = elm_toolbar_item_next_get(item_del);
}
}
if (app->status.curr_mode == MODE_DEFAULT) {
Elm_Object_Item *edit_item = elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_EDIT, _ctrl_bar_widget_edit_btn_cb, widget);
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_MORE, _ctrl_bar_widget_more_btn_cb, widget);
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_EXIT, _ctrl_bar_widget_exit_btn_cb, widget);
if (list_view_items_count_get(widget->view) < 1) {
elm_object_item_disabled_set(edit_item, EINA_TRUE);
}
} else if (app->status.curr_mode == MODE_EDIT) {
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_DELETE, _ctrl_bar_widget_delete_btn_cb, widget);
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_MOVE, _ctrl_bar_widget_move_btn_cb, widget);
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_COPY, _ctrl_bar_widget_copy_btn_cb, widget);
elm_toolbar_item_append(widget->ctrl_bar, NULL, FM_TOOLBAR_TEXT_CANCEL, _ctrl_bar_widget_cancel_btn_cb, widget);
}
}
}
static void _ctrl_bar_widget_btns_state_update(ctrl_bar_widget *widget)
{
Eina_Bool disabled = (widget->view->edit.checked_count > 0) ? EINA_FALSE
: EINA_TRUE;
Elm_Object_Item *item = elm_toolbar_first_item_get(widget->ctrl_bar);
Elm_Object_Item *last_item = elm_toolbar_last_item_get(widget->ctrl_bar);
while (item != last_item) {
elm_object_item_disabled_set(item, disabled);
item = elm_toolbar_item_next_get(item);
}
}
static void _ctrl_bar_widget_destroy(ctrl_bar_widget *data)
{
free(data);
}
static void _ctrl_bar_widget_ctxpopup_back_button_cb(void *data, Evas_Object *obj, void *event_info)
{
ctrl_bar_widget *widget = data;
evas_object_del(widget->ctxpopup);
widget->ctxpopup = NULL;
}
static void _ctrl_bar_create_context_popup(ctrl_bar_widget *widget)
{
app_data *app = widget->view->app;
widget->ctxpopup = elm_ctxpopup_add(widget->view->navi);
eext_object_event_callback_add(widget->ctxpopup,
EEXT_CALLBACK_BACK,
_ctrl_bar_widget_ctxpopup_back_button_cb,
widget);
evas_object_smart_callback_add(widget->ctxpopup,
"dismissed",
_ctrl_bar_widget_ctxpopup_back_button_cb,
widget);
RETM_IF(!widget->ctxpopup, "Fail to create ctxpopup");
Eina_Bool is_cb_empty = EINA_TRUE;
clipboard_is_empty(app->clipboard, &is_cb_empty);
if (!is_cb_empty) {
elm_ctxpopup_item_append(widget->ctxpopup, FM_CTXPOPUP_TEXT_PASTE, NULL, _ctrl_bar_widget_ctxpopup_past_here_cb, widget);
}
elm_ctxpopup_item_append(widget->ctxpopup, FM_CTXPOPUP_TEXT_CREATE, NULL, _ctrl_bar_widget_ctxpopup_create_folder_cb, widget);
evas_object_size_hint_min_set(widget->ctxpopup, FM_CTXPOPUP_WIDTH, FM_CTXPOPUP_HEIGHT);
int tb_height = 0;
Evas_Object *tb = elm_object_part_content_get(widget->view->navi, "toolbar");
if (tb) {
evas_object_geometry_get(tb, NULL, NULL, NULL, &tb_height);
} else {
ERR("Toolbar is NULL");
}
int w = 0;
int h = 0;
evas_object_geometry_get(widget->view->app->win->win, NULL, NULL, &w, &h);
evas_object_move(widget->ctxpopup, w / 2, h - tb_height);
evas_object_show(widget->ctxpopup);
}
static void _ctrl_bar_widget_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
_ctrl_bar_widget_destroy(data);
}
static void _ctrl_bar_widget_edit_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
widget->view->app->status.curr_mode = MODE_EDIT;
int res = list_view_update(widget->view->navi_item,
UPDATE_TYPE_GENLIST |
UPDATE_TYPE_CTRL_BAR_MODE |
UPDATE_TYPE_CTRL_BAR_STATE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
}
static void _ctrl_bar_widget_cancel_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
widget->view->app->status.curr_mode = MODE_DEFAULT;
int res = list_view_update(widget->view->navi_item,
UPDATE_TYPE_GENLIST |
UPDATE_TYPE_CTRL_BAR_MODE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
}
static void _ctrl_bar_widget_exit_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
ui_app_exit();
}
static void _ctrl_bar_widget_delete_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
int res = popup_create(widget->view, POPUP_TYPE_DELETE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
}
static void _ctrl_bar_widget_move_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
widget->view->app->status.curr_mode = MODE_DEFAULT;
int res = list_view_move_items(widget->view);
RETM_IF(res != RESULT_TYPE_OK, "Fail to move file");
res = list_view_update(widget->view->navi_item, UPDATE_TYPE_GENLIST | UPDATE_TYPE_CTRL_BAR_MODE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
res = popup_create(widget->view, POPUP_TYPE_COPY_MOVE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
}
static void _ctrl_bar_widget_copy_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
widget->view->app->status.curr_mode = MODE_DEFAULT;
int res = list_view_copy_items(widget->view);
RETM_IF(res != RESULT_TYPE_OK, "Fail to copy file");
res = list_view_update(widget->view->navi_item, UPDATE_TYPE_GENLIST | UPDATE_TYPE_CTRL_BAR_MODE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to update view");
res = popup_create(widget->view, POPUP_TYPE_COPY_MOVE);
RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
}
static void _ctrl_bar_widget_ctxpopup_past_here_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
elm_ctxpopup_dismiss(widget->ctxpopup);
int res = list_view_past_items(widget->view);
RETM_IF(res != RESULT_TYPE_OK, "Fail to past file");
}
static void _ctrl_bar_widget_ctxpopup_create_folder_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
elm_ctxpopup_dismiss(widget->ctxpopup);
int res = popup_create(widget->view, POPUP_TYPE_NEW_FOLDER);
RETM_IF(res != RESULT_TYPE_OK, "Fail to create popup");
}
static void _ctrl_bar_widget_more_btn_cb(void *data, Evas_Object *obj, void *eventInfo)
{
RETM_IF(!data, "Data is NULL");
ctrl_bar_widget *widget = data;
elm_ctxpopup_dismiss(widget->ctxpopup);
_ctrl_bar_create_context_popup(widget);
}