Bundles / src /
view.c
- /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://floralicense.org/license/
- *
- * 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 <app.h>
- #include <efl_extension.h>
- #include "$(appName).h"
- #include "view_defines.h"
- #include "view.h"
- #include "view/view_common.h"
- #include "view/view_source.h"
- #include "view/view_sink.h"
- #define CHAR_BUFFER_SIZE 256
- static struct view_info {
- Evas_Object *win;
- Evas_Object *conform;
- Evas_Object *scroller;
- Evas_Object *layout;
- } s_info = {
- .win = NULL,
- .conform = NULL,
- .scroller = NULL,
- .layout = NULL,
- };
- static void _delete_win_request_cb(void *data, Evas_Object *obj, void *event_info);
- static bool _create_main_view(void);
- static void _switch_view_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
- static bool _create_scroller(void);
- static void _back_button_clicked_cb(void *data, Evas_Object *obj, void *event_info);
- /**
- * @brief Creates essential objects: window, conformant and layout.
- * @param[in] user_data User data.
- * @return EINA_TRUE on success or EINA_FALSE on error.
- */
- Eina_Bool view_create(void *user_data)
- {
- /* Create the window */
- s_info.win = view_create_win(PACKAGE);
- if (s_info.win == NULL) {
- dlog_print(DLOG_ERROR, LOG_TAG, "failed to create a window.");
- return EINA_FALSE;
- }
- /* Create the conformant */
- s_info.conform = view_create_conformant(s_info.win);
- if (s_info.conform == NULL)
- return EINA_FALSE;
- if (!_create_scroller()) {
- dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] Function _create_scroller() failed", __FILE__, __LINE__);
- return EINA_FALSE;
- }
- if (!_create_main_view())
- return EINA_FALSE;
- if (!view_source_create(s_info.layout))
- return EINA_FALSE;
- if (!view_sink_create(s_info.layout))
- return EINA_FALSE;
- elm_layout_content_set(s_info.layout, PART_VIEW, view_source_get());
- evas_object_show(s_info.win);
- return EINA_TRUE;
- }
- /**
- * @brief Creates a basic window named package
- * @param[in] pkg_name Name of the window
- * @return The function returns window object if it was created successfully,
- * otherwise 'NULL' is returned.
- */
- Evas_Object *view_create_win(const char *pkg_name)
- {
- Evas_Object *win = NULL;
- /*
- * Window
- * Create and initialize elm_win.
- * elm_win is mandatory to manipulate the window.
- */
- win = elm_win_util_standard_add(pkg_name, pkg_name);
- elm_win_conformant_set(win, EINA_TRUE);
- elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW);
- elm_win_indicator_opacity_set(win, ELM_WIN_INDICATOR_OPAQUE);
- elm_win_autodel_set(win, EINA_TRUE);
- evas_object_smart_callback_add(win, "delete,request", _delete_win_request_cb, NULL);
- eext_object_event_callback_add(win, EEXT_CALLBACK_BACK, _back_button_clicked_cb, NULL);
- return win;
- }
- /**
- * @brief Creates a conformant object for parent object.
- * @param[in] parent The parent object for conformant object.
- * @return The function returns conformant object if it was created successfully,
- * otherwise 'NULL' is returned.
- */
- Evas_Object *view_create_conformant(Evas_Object *parent)
- {
- Evas_Object *conform = NULL;
- if (!parent) {
- dlog_print(DLOG_ERROR, LOG_TAG, "Wrong input arguments.");
- return NULL;
- }
- conform = elm_conformant_add(parent);
- if (!conform) {
- dlog_print(DLOG_ERROR, LOG_TAG, "Function elm_conformant_add() failed.");
- return NULL;
- }
- evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_win_resize_object_add(parent, conform);
- elm_object_signal_emit(conform, "elm,state,indicator,overlap", "elm");
- evas_object_show(conform);
- return conform;
- }
- /**
- * @brief Internal function that creates a scroller and ads it to the conformant.
- * @return true on success or false on fail.
- */
- static bool _create_scroller(void)
- {
- s_info.scroller = elm_scroller_add(s_info.conform);
- if (!s_info.scroller) {
- dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] s_info.scroller == NULL", __FILE__, __LINE__);
- return false;
- }
- elm_scroller_bounce_set(s_info.scroller, EINA_FALSE, EINA_TRUE);
- elm_scroller_policy_set(s_info.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
- elm_scroller_movement_block_set(s_info.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL);
- elm_object_content_set(s_info.conform, s_info.scroller);
- return true;
- }
- /**
- * @brief Internal function that creates the main view layout.
- * @return true on success or false on fail.
- */
- static bool _create_main_view(void)
- {
- s_info.layout = view_create_layout(s_info.conform, EDJ_MAIN_FILE_NAME, GROUP_MAIN);
- if (!s_info.layout) {
- dlog_print(DLOG_ERROR, LOG_TAG, "[%s:%d] s_info.layout == NULL", __FILE__, __LINE__);
- return false;
- }
- elm_layout_signal_callback_add(s_info.layout, SIGNAL_SWITCH_SOURCE_VIEW, "", _switch_view_cb, (void *)false);
- elm_layout_signal_callback_add(s_info.layout, SIGNAL_SWITCH_SINK_VIEW, "", _switch_view_cb, (void *)true);
- evas_object_size_hint_weight_set(s_info.layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_object_content_set(s_info.scroller, s_info.layout);
- return true;
- }
- /**
- * @brief Destroys window and frees its resources.
- */
- void view_destroy(void)
- {
- if (s_info.win == NULL)
- return;
- view_source_finalize();
- evas_object_del(s_info.win);
- }
- /**
- * @brief Internal callback function invoked when the main window needs to be destroyed.
- * @param[in] data The user data passed to the evas_object_smart_callback_add() function.
- * @param[in] obj The object invoking this callback function.
- * @param[in] event_info The structure containing the information on this event.
- */
- static void _delete_win_request_cb(void *data, Evas_Object *obj, void *event_info)
- {
- ui_app_exit();
- }
- /**
- * @brief Internal callback function invoked when the user clicks on one of the top buttons. It is used to switch the displayed view.
- * @param[in] data The user data (true - switch to sink view, false switch to source view).
- * @param[in] obj The main layout.
- * @param[in] emission The emitted signal.
- * @param[in] source The signal's source.
- */
- static void _switch_view_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
- {
- bool to_sink = (bool)data;
- Evas_Object *content = elm_layout_content_get(s_info.layout, PART_VIEW);
- Evas_Object *switch_to = NULL;
- if (content) {
- elm_layout_content_unset(s_info.layout, PART_VIEW);
- evas_object_hide(content);
- }
- if (to_sink)
- switch_to = view_sink_get();
- else
- switch_to = view_source_get();
- elm_layout_content_set(s_info.layout, PART_VIEW, switch_to);
- }
- /**
- * @brief Internal callback function invoked when the back button is pressed. It is used to minimalize the application's window.
- * @param[in] data User data
- * @param[in] obj The window object.
- * @param[in] event_info Event information.
- */
- static void _back_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
- {
- elm_win_lower(s_info.win);
- }