+++ /dev/null
-ADD_SUBDIRECTORY(src)
+++ /dev/null
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
+++ /dev/null
-SET(HEADER_FILES
- efl_extension_events.h
- )
-
-SET(COMMON_HEADERS
- ${HEADER_FILES}
- CACHE
- INTERNAL
- "COMMON_HEADERS"
- )
-
-FOREACH(files ${HEADER_FILES})
- GET_FILENAME_COMPONENT(dir ${files} PATH)
- INSTALL(FILES ${files} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_H__
-#define __EFL_EXTENSION_H__
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-@HEADER_INCS@
-
-/**
- * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This group provides functionalities to grab hardware key events.
- * @since_tizen 2.4
- *
- * @{
- */
-
-/**
- * @brief Set the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_set.
- * Key callback is only called when the window located in topmost(top of the window stack).
- *
- * @param[in] obj object to set the keygrab
- * The widget type of this object should be elm_win
- * @param[in] key keyname string to set keygrab
- *
- * @return The result of keygrab set
- *
- * @since_tizen 2.4
- */
-EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
-
-/**
- * @brief Unset the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_unset.
- *
- * @param[in] obj object to unset the keygrab
- * The widget type of this object should be elm_win
- * @param[in] key keyname string to unset keygrab
- *
- * @return The result of keygrab unset
- *
- * @since_tizen 2.4
- */
-EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_H__ */
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_EVENTS_H__
-#define __EFL_EXTENSION_EVENTS_H__
-
-#include <Elementary.h>
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup EFL_EXTENSION_EVENTS_GROUP Efl Extension Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle back/send key events.
- * @since_tizen 2.3
- *
- * @{
- */
-
-/**
- * @brief Convenient macro function that sends back key events to the popup
- * to be removed.
- *
- * @details Popup will be removed when it has the back key event with
- * eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- evas_object_del(obj);
-}
-
-/**
- * @brief Convenient macro function that sends back key events to the ctxpopup
- * to be dismissed.
- *
- * @details Ctxpopup will be dismissed when it has the back key event with
- * eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- elm_ctxpopup_dismiss(obj);
-}
-
-/**
- * @brief Convenient macro function that sends more key events to the naviframe
- * top item.
- *
- * @details More key action of naviframe will be executed when naviframe has the
- * more key event with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
- if (!top) return;
- Evas_Object *more_btn = elm_object_item_part_content_get(top,
- "toolbar_more_btn");
- if (more_btn)
- evas_object_smart_callback_call(more_btn, "clicked", NULL);
- else
- elm_object_item_signal_emit(top, "elm,action,more_event", "");
-}
-
-/**
- * @brief Convenient macro function that pop the naviframe item.
- *
- * @details Naviframe will be popped when naviframe has the back key event
- * with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- elm_naviframe_item_pop(obj);
-}
-
-/**
- * Identifier of callbacks to be set for Ea events.
- *
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Callback_Type
-{
- EEXT_CALLBACK_BACK, /**< H/W Back Key Event */
- EEXT_CALLBACK_MORE, /**< H/W More Key Event */
- EEXT_CALLBACK_LAST /**< Reserved value. Acutally This is not matched to
- any meaningful behavior. */
-} Eext_Callback_Type;
-
-/**
- * @brief Ea event callback function signature.
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information (if the event passes an additional in
- formation.)
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
-
-/**
- * @brief Delete a callback function from an object.
- *
- * @details This function removes the most recently added callback from the
- * object @p obj which was triggered by the type @p type and
- * was calling the function @p func when triggered. If the removal is
- * successful it will also return the data pointer that was passed to
- * eext_object_event_callback_add() when the callback was added to
- * the object. If not successful @c NULl will be returned.
- *
- * @param[in] obj Object to remove a callback from.
- * @param[in] type The type of event that was triggering the callback.
- * @param[in] func The function that was to be called when the event was
- * triggered
- * @return data The data pointer that was to be passed to the callback.
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
-
-/**
- * @brief Add (register) a callback function to a given evas object.
- *
- * @details This function adds a function callback to an object when the key
- * event occurs on object @p obj. The key event on the object is only
- * triggered when the object is the most top in objects stack and
- * visible. This means, like the naviframe widget, if your application
- * needs to have the events based on the view but not focus, you can
- * use this callback. A callback function must have the Eext_Event_Cb
- * prototype definition. The first parameter (@p data) in this
- * definition will have the same value passed to
- * eext_object_event_callback_add() as the @p data parameter, at
- * runtime. The second parameter @p obj is the evas object on which
- * event occurred. Finally, the third parameter @p event_info is a
- * pointer to a data structure that may or may not be passed to the
- * callback, depending on the event type that triggered the callback.
- * This is so because some events don't carry extra context with them,
- * but others do.
- *
- * @param[in] obj evas object.
- * @param[in] type The type of event that will trigger the callback.
- * @param[in] func The function to be called when the key event is triggered.
- * @param[in] data The data pointer to be passed to @p func.
- *
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
-
-/**
- * @brief Convenient macro function that cancels the selection of the entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (elm_entry_selection_get(obj))
- elm_entry_select_none(obj);
-
- eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
- evas_object_data_set(obj, "eext_entry", NULL);
-}
-
-/**
- * @brief Convenient macro function that registers back key callback for entry.
- *
- * @details If the selection handler should be canceled when back key event is
- * triggered, then use this API.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (!evas_object_data_get(obj, "eext_entry"))
- {
- evas_object_data_set(obj, "eext_entry", (void *) 1);
- eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
- NULL);
- }
-}
-
-/**
- * @brief Convenient macro function that clears back key callback for entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (evas_object_data_get(obj, "eext_entry"))
- {
- eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
- evas_object_data_set(obj, "eext_entry", NULL);
- }
-}
-
-/**
- * @brief Convenient macro function that handle the back event to cancel the
- * selection handler of the entry.
- * @details If the selection handler should be canceled (or not) when back key
- * event is triggered, then use this API.
- * @param[in] obj Entry object.
- * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
- * otherwise.
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
-{
- if (allow)
- {
- evas_object_smart_callback_add(obj, "selection,start",
- eext_entry_selection_start_cb, NULL);
- evas_object_smart_callback_add(obj, "selection,cleared",
- eext_entry_selection_cleared_cb, NULL);
- }
- else
- {
- evas_object_smart_callback_del(obj, "selection,start",
- eext_entry_selection_start_cb);
- evas_object_smart_callback_del(obj, "selection,cleared",
- eext_entry_selection_cleared_cb);
- }
-}
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_EVENTS_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_PRIVATE_H__
-#define __EFL_EXTENSION_PRIVATE_H__
-
-#include <syslog.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <dlog.h>
-#include <unistd.h>
-#include <fontconfig/fontconfig.h>
-#include <fontconfig/fcfreetype.h>
-#include <glib.h>
-
-#define _(str) (gettext(str))
-#define LOCALE_DIR "/usr/share/locale"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @internal
- *
- * @ {
- */
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-
-extern int _eext_log_dom;
-#define CRI(...) EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
-#define ERR(...) EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
-#define WRN(...) EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
-#define INF(...) EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
-#define DBG(...) EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
-
-#define LOG_TAG "efl-extension"
-#define __CONSTRUCTOR__ __attribute__ ((constructor))
-#define __DESTRUCTOR__ __attribute__ ((destructor))
-
-/* eina magic types */
-#define EEXT_MAGIC_NONE 0x87657890
-
-typedef unsigned int eext_magic;
-#define EEXT_MAGIC eext_magic __magic
-
-#define EEXT_MAGIC_SET(d, m) (d)->__magic = (m)
-#define EEXT_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
-#define EEXT_MAGIC_FAIL(d, m, fn) \
- _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_PRIVATE_H__ */
+++ /dev/null
-add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
-
-SET(LIB_SRCS
- ${COMMON_DIR}/lib/efl_extension.c
- ${COMMON_DIR}/lib/eext_events.c
- CACHE
- INTERNAL
- "LIB_SRCS"
- )
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-
-typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
-
-struct _Eext_Event_Mgr
-{
- Eina_List *obj_events;
- Evas *e;
- Evas_Object *key_grab_rect;
-};
-
-typedef struct _Eext_Object_Event
-{
- Evas_Object *obj;
- Evas_Object *parent;
- Eina_List *callbacks;
- Eina_Bool delete_me : 1;
- Eina_Bool on_callback : 1;
-} Eext_Object_Event;
-
-typedef struct _Eext_Event_Callback
-{
- Eext_Callback_Type type;
- void (*func)(void *data, Evas_Object *obj, void *event_info);
- void *data;
-} Eext_Event_Callback;
-
-const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
-const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
-const char *EEXT_KEY_BACK = "XF86Back";
-const char *EEXT_KEY_BACK2 = "XF86Stop";
-const char *EEXT_KEY_BACK3 = "Escape";
-const char *EEXT_KEY_MENU = "XF86Menu";
-const char *EEXT_KEY_MENU2 = "XF86Send";
-const char *EEXT_KEY_MENU3 = "Menu";
-
-
-static Eina_List *event_mgrs = NULL;
-
-static void
-_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
-{
- if (event_mgr->obj_events) return;
-
- //Redundant Event Mgr. Remove it.
- evas_object_del(event_mgr->key_grab_rect);
- event_mgrs = eina_list_remove(event_mgrs, event_mgr);
- free(event_mgr);
-}
-
-static void
-_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
- Eext_Object_Event *obj_event = data;
- Eina_List *l;
- Eext_Event_Callback *callback;
-
- l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
- if (!l) return;
-
- event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
-
- EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
- obj_event->callbacks = NULL;
-
- if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
- else free(obj_event);
-
- _eext_event_mgr_del(event_mgr);
-}
-
-static int
-_eext_layer_sort_cb(const void *data1, const void *data2)
-{
- const Eext_Object_Event *obj_event = data1;
- const Eext_Object_Event *obj_event2 = data2;
-
- //1. Layer Compare
- int layer1 = evas_object_layer_get(obj_event->obj);
- int layer2 = evas_object_layer_get(obj_event2->obj);
-
- return (layer1 < layer2) ? -1 : 1;
-}
-
-static Evas_Object *
-_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
-{
- Evas_Object *temp;
- Evas_Object *parent;
- Eina_List *l, *l_next;
- Eext_Object_Event *obj_event;
- Eina_List *_candidates = *candidates;
- Eina_Bool found = EINA_FALSE;
-
- //Get the top parent lists
- EINA_LIST_FOREACH(_candidates, l, obj_event)
- {
- temp = obj_event->obj;
- parent = obj_event->obj;
- while (temp)
- {
- parent = temp;
- temp = evas_object_smart_parent_get(temp);
- }
- obj_event->parent = parent;
- }
-
- //Leave only parent candidates.
- parent = evas_object_top_get(e);
-
- while (parent)
- {
- EINA_LIST_FOREACH(_candidates, l, obj_event)
- {
- if (parent == obj_event->parent)
- {
- found = EINA_TRUE;
- obj_event->parent = NULL;
- }
- }
- if (found) break;
- parent = evas_object_below_get(parent);
- }
-
- //Redundant parents (no candidates)
- EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
- {
- if (!obj_event->parent) continue;
- _candidates = eina_list_remove_list(_candidates, l);
- }
-
- *candidates = _candidates;
- return parent;
-}
-
-static Eext_Object_Event *
-_eext_find_event_target(Eina_List *candidates, Evas_Object *parent, Eext_Callback_Type type)
-{
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l, *ll;
- Evas_Object *obj;
- Eina_List *members = NULL;
- Eext_Event_Callback *callback;
-
- if (eo_isa(parent, EVAS_OBJECT_SMART_CLASS))
- members = evas_object_smart_members_get(parent);
-
- if (members)
- {
- EINA_LIST_REVERSE_FOREACH(members, l, obj)
- {
- obj_event = _eext_find_event_target(candidates, obj, type);
- //got you!
- if (obj_event)
- {
- EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
- {
- if (callback->type == type)
- {
- eina_list_free(members);
- return obj_event;
- }
- }
- }
- }
- eina_list_free(members);
- }
-
- EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
- {
- //got you!
- if (parent == obj_event->obj)
- {
- EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
- {
- if (callback->type == type)
- return obj_event;
- }
- }
- }
-
- return NULL;
-}
-
-static Eext_Object_Event *
-_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr, Eext_Callback_Type type)
-{
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l, *l_next;
- Eina_List *candidates = NULL;
- Evas_Object *parent;
- int top_layer;
- Eina_Bool invisible;
-
- //1. filter the invisible objs
- EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
- {
- parent = obj_event->obj;
- invisible = EINA_FALSE;
-
- while (parent)
- {
- if (!evas_object_visible_get(parent))
- {
- invisible = EINA_TRUE;
- break;
- }
- parent = evas_object_smart_parent_get(parent);
- }
- if (invisible) continue;
- candidates = eina_list_append(candidates, obj_event);
- }
- if (!candidates) return NULL; //no visible objects.
- if (eina_list_count(candidates) == 1) goto found;
-
- //2.1. sort by layer order
- candidates = eina_list_sort(candidates, eina_list_count(candidates),
- _eext_layer_sort_cb);
-
- //2.2. leave the only top layer
- obj_event = eina_list_data_get(eina_list_last(candidates));
- top_layer = evas_object_layer_get(obj_event->obj);
-
- EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
- {
- if (evas_object_layer_get(obj_event->obj) < top_layer)
- candidates = eina_list_remove_list(candidates, l);
- }
- if (eina_list_count(candidates) == 1) goto found;
-
- //3. find the top parent candidate.
- parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
- if (eina_list_count(candidates) == 1) goto found;
-
- //4. find the target in this parent tree.
- obj_event = _eext_find_event_target(candidates, parent, type);
- eina_list_free(candidates);
- return obj_event;
-
-found:
- obj_event = eina_list_data_get(candidates);
- eina_list_free(candidates);
- return obj_event;
-}
-
-static void
-_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
- void *event_info)
-{
- Evas_Event_Key_Down *ev = event_info;
- Eext_Event_Mgr *event_mgr = data;
- Eext_Object_Event *obj_event;
- Eext_Event_Callback *callback;
- Eext_Callback_Type type;
- Eina_List *l;
-
- if (!strcmp(ev->keyname, EEXT_KEY_BACK) ||
- !strcmp(ev->keyname, EEXT_KEY_BACK2) ||
- !strcmp(ev->keyname, EEXT_KEY_BACK3))
- type = EEXT_CALLBACK_BACK;
- else if (!strcmp(ev->keyname, EEXT_KEY_MENU) ||
- !strcmp(ev->keyname, EEXT_KEY_MENU2) ||
- !strcmp(ev->keyname, EEXT_KEY_MENU3))
- type = EEXT_CALLBACK_MORE;
- else return;
-
- obj_event = _eext_top_obj_event_find(event_mgr, type);
- if (!obj_event) return;
-
- obj_event->on_callback = EINA_TRUE;
- EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
- {
- if (callback->type != type) continue;
- callback->func(callback->data, obj_event->obj, (void*) type);
- if (obj_event->delete_me) break;
- }
- if (obj_event->delete_me) free(obj_event);
- else obj_event->on_callback = EINA_FALSE;
-}
-
-static void
-_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
-{
- Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
-
- evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
- _eext_key_grab_rect_key_up_cb, event_mgr);
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE))
- LOGE("Failed to grab BACK KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE))
- LOGE("Failed to grab BACK KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE))
- LOGE("Failed to grab BACK KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE))
- LOGE("Failed to grab MENU KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE))
- LOGE("Failed to grab MENU KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE))
- LOGE("Failed to grab MENU KEY\n");
-
- event_mgr->key_grab_rect = key_grab_rect;
-}
-
-static Eext_Event_Mgr *
-_eext_event_mgr_new(Evas *e)
-{
- Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
- if (!event_mgr)
- {
- LOGE("Failed to allocate event manager");
- return NULL;
- }
- event_mgr->e = e;
- _eext_key_grab_obj_create(event_mgr);
-
- return event_mgr;
-}
-
-EAPI void *
-eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
-{
- Eext_Object_Event *obj_event;
- Eext_Event_Mgr *event_mgr;
- Eina_List *l;
- Eext_Event_Callback *callback;
- void *data;
-
- //Check the validation
- event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
- obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
- if (!event_mgr || !obj_event)
- {
- LOGW("This object(%p) hasn't been registered before", obj);
- return NULL;
- }
-
- //Remove the callback data
- EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
- {
- if ((callback->func == func) && (callback->type == type)) break;
- }
-
- if (!callback)
- {
- LOGW("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
- return NULL;
- }
-
- data = callback->data;
- obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
- free(callback);
-
- //This object is not managed anymore.
- if (!obj_event->callbacks)
- {
- evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
- evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
- Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
- obj_event);
- if (l)
- event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
- l);
- if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
- else free(obj_event);
-
- evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
- }
-
- _eext_event_mgr_del(event_mgr);
-
- return data;
-}
-
-EAPI void
-eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
-{
- Eext_Event_Mgr *event_mgr;
- Evas *e;
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l;
- Eext_Event_Callback *callback;
- Eina_Bool new_event_mgr = EINA_TRUE;
-
- //Check the registered event manager for this Evas.
- e = evas_object_evas_get(obj);
-
- EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
- {
- if (event_mgr->e == e)
- {
- new_event_mgr = EINA_FALSE;
- break;
- }
- }
-
- //New Evas comes. Create new event manager for this Evas.
- if (new_event_mgr)
- {
- if (!(event_mgr = _eext_event_mgr_new(e))) return;
- event_mgrs = eina_list_append(event_mgrs, event_mgr);
- }
-
- obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
- //New Object Event. Probably user adds eext_object_event_callback first time.
- if (!obj_event)
- {
- obj_event = calloc(1, sizeof(Eext_Object_Event));
- if (!obj_event)
- {
- LOGE("Failed to allocate object event");
- return;
- }
- evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
- evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
- _eext_object_del_cb,
- obj_event);
- event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
- obj_event);
- obj_event->obj = obj;
- }
-
- //Append this callback.
- callback = calloc(1, sizeof(Eext_Event_Callback));
- if (!callback)
- {
- LOGE("Failed to allocate event callback");
- return;
- }
- callback->type = type;
- callback->func = func;
- callback->data = data;
-
- obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-
-/*===========================================================================*
- * Local *
- *===========================================================================*/
-
-static const char *
-_magic_string_get(eext_magic m)
-{
- switch (m) {
- case EEXT_MAGIC_NONE:
- return "None (Freed Object)";
-
- default:
- return "<UNKNOWN>";
- }
-}
-
-__CONSTRUCTOR__ static void
-eext_mod_init(void)
-{
-}
-
-__DESTRUCTOR__ static void
-eext_mod_shutdown(void)
-{
-}
-
-
-/*===========================================================================*
- * Global *
- *===========================================================================*/
-
-void
-_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
-{
- LOGE("\n*** MAGIC FAIL (%s) ***\n", fname);
-
- if (!d)
- LOGE(" Input handle pointer is NULL!");
- else if (m == EEXT_MAGIC_NONE)
- LOGE(" Input handle has already been freed!");
- else if (m != req_m)
- LOGE(" Input handle is wrong type\n"
- " Expected: %08x - %s\n"
- " Supplied: %08x - %s",
- (unsigned int)req_m, _magic_string_get(req_m),
- (unsigned int)m, _magic_string_get(m));
-
- gchar **envp = g_get_environ();
- if (g_environ_getenv(envp, "EEXT_ERROR_ABORT")) abort();
-}
-
-/*===========================================================================*
- * API *
- *===========================================================================*/
-#if 0 //This API will be not used. For history, keep this codes
-
-EAPI tzsh_native_window
-eext_win_tzsh_native_window_get(const Elm_Win *obj)
-{
- Evas *e = evas_object_evas_get(obj);
- Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
- const char *engine_name = ecore_evas_engine_name_get(ee);
-
- if (strcmp(elm_object_widget_type_get(obj), "Elm_Win"))
- {
- LOGE(" Input object is not elm_win widget");
- return 0;
- }
- if (engine_name &&
- ((!strcmp(engine_name, "opengl_x11")) ||
- (!strcmp(engine_name, "software_x11"))))
- return (tzsh_native_window) elm_win_xwindow_get(obj);
-#ifdef HAVE_ELEMENTARY_WAYLAND
- else if (engine_name &&
- ((!strcmp(engine_name, "wayland_shm")) ||
- (!strcmp(engine_name, "wayland_egl"))))
- {
- Ecore_Wl_Window wl_win;
- wl_win = elm_win_wl_window_get(obj);
- return (tzsh_native_window)ecore_wl_window_surface_get(wl_win);
- }
-#endif
- LOGE(" Do not support %s window system", engine_name);
- return 0;
-}
-#endif
-
-EAPI Eina_Bool
-eext_win_keygrab_set(Elm_Win *obj, const char *key)
-{
- Eina_Bool ret = EINA_FALSE;
- ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
- if (!ret)
- LOGE(" Can't set keygrab of [%s].", key);
- return ret;
-}
-
-EAPI Eina_Bool
-eext_win_keygrab_unset(Elm_Win *obj, const char *key)
-{
- Eina_Bool ret = EINA_FALSE;
- ret = elm_win_keygrab_unset(obj, key, 0, 0);
- if (!ret)
- LOGE(" Can't unset keygrab of [%s].", key);
- return ret;
-}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#define BASE_SCALE_INC 2.6
+
+//****************************************************************************//
+// Floatingbutton
+//****************************************************************************//
+#define FLOATINGBUTTON_LAYOUT_LR_WIDTH 64
+#define FLOATINGBUTTON_LR_WIDTH 50
+#define FLOATINGBUTTON_LR_MAX_VARIATION 20
+#define FLOATINGBUTTON_MID_WIDTH 20
+#define FLOATINGBUTTON_1BTN_WIDTH 180
+#define FLOATINGBUTTON_2BTN_WIDTH 280
+#define FLOATINGBUTTON_HEIGHT 120
+#define FLOATINGBUTTON_HANDLER_SIZE 32
+#define FLOATINGBUTTON_SIDE_MARGIN 20
+#define FLOATINGBUTTON_LAYOUT_SIDE_MARGIN 34
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "HD-inc.edc"
+
+collections {
+ base_scale: BASE_SCALE_INC;
+@EDC_INCS@
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+ group { name: "elm/floatingbutton/base/default";
+ script {
+ public mouse_down, g_prev_x, g_width, g_btns;
+ public left_timer, right_timer;
+ public g_visible;
+ public g_expand;
+
+ public message(Msg_Type:type, id, ...) {
+ if ((type == MSG_INT) && (id == 0)) {
+ new width;
+ width = getarg(2);
+ set_int(g_width, width);
+ }
+ }
+ public left_anim_go() {
+ run_program(PROGRAM:"left_spacer_animation");
+ }
+ public right_anim_go() {
+ run_program(PROGRAM:"right_spacer_animation");
+ }
+ }
+ parts {
+ part { name: "elm.swallow.vg";
+ type: SWALLOW;
+ scale: 1;
+ clip_to: "vg_clipper";
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ rel1.to: "left_expand";
+ rel2.to: "right_expand";
+ }
+ description { state: "hidden" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "vg_clipper";
+ type: RECT;
+ clip_to: "clipper";
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ color: 78 97 173 255;
+ rel1.to: "elm.swallow.vg";
+ rel2.to: "elm.swallow.vg";
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default";
+ color: 131 145 201 255;
+ }
+ }
+ part { name: "elm.track.left_hidden";
+ type: SPACER;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+ fixed: 1 1;
+ align: 1.0 0.5;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 0.0 1.0;
+ }
+ description { state: "2buttons" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+ }
+ }
+ part { name: "elm.track.right_hidden";
+ type: SPACER;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ rel1.relative: 1.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ description { state: "2buttons" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+ }
+ }
+ part { name: "elm.track.fb";
+ type: SPACER;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.to: "elm.track.left_hidden";
+ rel2.to: "elm.track.right_hidden";
+ }
+ }
+ part { name: "left_expand";
+ type: SPACER;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 1.0 0.5;
+ rel1 { to: "left_spacer"; relative: 0.0 0.0; }
+ rel2 { to: "left_spacer"; relative: 0.0 1.0; }
+ }
+ }
+ part { name: "right_expand";
+ type: SPACER;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ rel1 { to: "right_spacer"; relative: 1.0 0.0; }
+ rel2 { to: "right_spacer"; relative: 1.0 1.0; }
+ }
+ }
+ part { name: "left_spacer";
+ type: SPACER;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: FLOATINGBUTTON_LR_WIDTH 0;
+ fixed: 1 1;
+ align: 1.0 0.5;
+ rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 0.0; }
+ rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 1.0; }
+ }
+ description { state: "expand" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
+ }
+ }
+ part { name: "right_spacer";
+ type: SPACER;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: FLOATINGBUTTON_LR_WIDTH 0;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 0.0; }
+ rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 1.0; }
+ }
+ description { state: "expand" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
+ }
+ }
+ part { name: "elm.swallow.box";
+ type: SWALLOW;
+ scale: 1;
+ clip_to: "clipper";
+ description { state: "default" 0.0;
+ min: 0 0;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
+ rel2 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
+ }
+ description { state: "hidden" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "elm.dragable.fb";
+ type: RECT;
+ scale: 1;
+ clip_to: "clipper";
+ repeat_events: 1;
+ description { state: "default" 0.0;
+ min: FLOATINGBUTTON_1BTN_WIDTH FLOATINGBUTTON_HEIGHT;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
+ rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
+ color: 0 0 0 0;
+ }
+ description { state: "expand" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
+ }
+ description { state: "2buttons" 0.0;
+ inherit: "default" 0.0;
+ min: FLOATINGBUTTON_2BTN_WIDTH FLOATINGBUTTON_HEIGHT;
+ }
+ description { state: "2buttons_expand" 0.0;
+ inherit: "default" 0.0;
+ min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
+ }
+ description { state: "hidden" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ dragable {
+ x: 1 1 0;
+ y: 0 0 0;
+ confine: "elm.track.fb";
+ threshold: "elm.threshold.fb";
+ }
+ }
+ part { name : "elm.threshold.fb";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ min: 0 FLOATINGBUTTON_HEIGHT;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
+ rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
+ color: 0 0 0 0;
+ }
+ }
+ part { name: "clipper";
+ type: RECT;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "load";
+ script {
+ custom_state(PART:"left_expand", "default", 0.0);
+ custom_state(PART:"right_expand", "default", 0.0);
+ custom_state(PART:"elm.threshold.fb", "default", 0.0);
+ set_state(PART:"elm.threshold.fb", "custom", 0.0);
+ set_int(g_visible, 1);
+ }
+ }
+ program {
+ signal: "elm,state,floatingbutton,*,1btn";
+ source: "elm";
+ script {
+ set_state(PART:"elm.track.left_hidden", "default", 0.0);
+ set_state(PART:"elm.track.right_hidden", "default", 0.0);
+ set_int(g_btns, 1);
+ }
+ }
+ program {
+ signal: "elm,state,floatingbutton,*,2btn";
+ source: "elm";
+ script {
+ set_state(PART:"elm.track.left_hidden", "2buttons", 0.0);
+ set_state(PART:"elm.track.right_hidden", "2buttons", 0.0);
+ set_int(g_btns, 2);
+ }
+ }
+ program {
+ signal: "elm,floatingbutton,threshold,update";
+ source: "elm";
+ script {
+ new width, Float:pos;
+ new x, y, w, h;
+ new x1, y1, w1, h1;
+
+ width = get_int(g_width);
+ set_state_val(PART:"elm.threshold.fb", STATE_MIN, width, 0);
+
+ get_geometry(PART:"elm.track.fb", x, y, w, h);
+ get_geometry(PART:"elm.dragable.fb", x1, y1, w1, h1);
+
+ pos = ((x1 - x) + float(w1) / 2) / w;
+
+ set_state_val(PART:"elm.threshold.fb", STATE_REL1, pos, 0.0);
+ set_state_val(PART:"elm.threshold.fb", STATE_REL2, pos, 1.0);
+ }
+ }
+ program { name: "mouse_down";
+ signal: "mouse,down,1";
+ source: "elm.dragable.fb";
+ script {
+ new x, y, w, h;
+ get_geometry(PART:"elm.dragable.fb", x, y, w, h);
+ set_int(g_prev_x, x);
+ set_int(mouse_down, 1);
+ }
+ }
+ program { name: "mouse_up";
+ signal: "mouse,up,1";
+ source: "elm.dragable.fb";
+ script {
+ set_int(mouse_down, 0);
+ }
+ }
+ program { name: "mouse_move";
+ signal: "mouse,move";
+ source: "elm.dragable.fb";
+ script {
+ new prev_x;
+ prev_x = get_int(g_prev_x);
+
+ if (get_int(mouse_down) == 1) {
+ new x, y, w, h;
+ new x1, y1, w1, h1;
+
+ get_geometry(PART:"elm.dragable.fb", x, y, w, h);
+
+ if (prev_x < x)
+ {
+ get_geometry(PART:"left_expand", x1, y1, w1, h1);
+
+ if ((w1 + x - prev_x) < FLOATINGBUTTON_LR_MAX_VARIATION)
+ set_state_val(PART:"left_expand", STATE_MIN, (w1 + x - prev_x), 0);
+ else
+ set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+
+ set_state(PART:"left_expand", "custom", 0.0);
+
+ new id;
+ id = get_int(left_timer);
+ cancel_timer(id);
+
+ id = timer(0.01, "left_anim_go", 1);
+ set_int(left_timer, id);
+ }
+ else if (prev_x > x)
+ {
+ get_geometry(PART:"right_expand", x1, y1, w1, h1);
+
+ if ((w1 + prev_x - x) < FLOATINGBUTTON_LR_MAX_VARIATION)
+ set_state_val(PART:"right_expand", STATE_MIN, (w1 + prev_x - x), 0);
+ else
+ set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+
+ set_state(PART:"right_expand", "custom", 0.0);
+
+ new id;
+ id = get_int(right_timer);
+ cancel_timer(id);
+
+ id = timer(0.01, "right_anim_go", 1);
+ set_int(right_timer, id);
+ }
+ set_int(g_prev_x, x);
+ }
+ }
+ }
+ program { name: "left_spacer_animation";
+ action: STATE_SET "default" 0.0;
+ transition: DECEL 0.4;
+ target: "left_expand";
+ }
+ program { name: "right_spacer_animation";
+ action: STATE_SET "default" 0.0;
+ transition: DECEL 0.4;
+ target: "right_expand";
+ }
+ program { name: "left_spacer_stretch";
+ action: STATE_SET "custom" 0.0;
+ transition: ACCEL 0.2;
+ target: "left_expand";
+ after: "left_spacer_animation";
+ }
+ program { name: "right_spacer_stretch";
+ action: STATE_SET "custom" 0.0;
+ transition: ACCEL 0.2;
+ target: "right_expand";
+ after: "right_spacer_animation";
+ }
+ program { name: "block";
+ signal: "elm,state,floatingbutton,block";
+ source: "elm";
+ script {
+ set_mouse_events(PART:"elm.dragable.fb", 0);
+ }
+ }
+ program { name: "unblock";
+ signal: "elm,state,floatingbutton,unblock";
+ source: "elm";
+ script {
+ set_mouse_events(PART:"elm.dragable.fb", 1);
+ }
+ }
+ program {
+ signal: "elm,state,floatingbutton,freeze";
+ source: "elm";
+ script {
+ set_mask_flags(PART:"elm.dragable.fb", 1);
+ }
+ }
+ program {
+ signal: "elm,state,floatingbutton,thaw";
+ source: "elm";
+ script {
+ set_mask_flags(PART:"elm.dragable.fb", 0);
+ }
+ }
+ program {
+ signal: "elm,state,show";
+ source: "";
+ script {
+ set_int(g_visible, 1);
+ run_program(PROGRAM:"visible");
+ }
+ }
+ program {
+ signal: "elm,state,hide";
+ source: "";
+ script {
+ set_int(g_visible, 0);
+ run_program(PROGRAM:"hidden");
+ }
+ }
+ program { name: "visible";
+ signal: "elm,state,floatingbutton,visible";
+ source: "elm";
+ script {
+ if (get_int(g_visible) == 1) {
+ set_state(PART:"elm.swallow.vg", "default", 0.0);
+ set_state(PART:"elm.swallow.box", "default", 0.0);
+ if (get_int(g_btns) < 2) {
+ if (get_int(g_expand) == 0) {
+ set_state(PART:"elm.dragable.fb", "default", 0.0);
+ }
+ else {
+ set_state(PART:"elm.dragable.fb", "expand", 0.0);
+ }
+ }
+ else {
+ if (get_int(g_expand) == 0) {
+ set_state(PART:"elm.dragable.fb", "2buttons", 0.0);
+ }
+ else {
+ set_state(PART:"elm.dragable.fb", "2buttons_expand", 0.0);
+ }
+ }
+ }
+ }
+ }
+ program { name: "hidden";
+ signal: "elm,state,floatingbutton,hidden";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.vg", "hidden", 0.0);
+ set_state(PART:"elm.swallow.box", "hidden", 0.0);
+ set_state(PART:"elm.dragable.fb", "hidden", 0.0);
+ }
+ }
+ program { name: "left_bring_in";
+ signal: "elm,action,floatingbutton,left";
+ source: "elm";
+ script {
+ set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+ run_program(PROGRAM:"right_spacer_stretch");
+ }
+ }
+ program { name: "right_bring_in";
+ signal: "elm,action,floatingbutton,right";
+ source: "elm";
+ script {
+ set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+ run_program(PROGRAM:"left_spacer_stretch");
+ }
+ }
+ program { name: "move_to_left";
+ signal: "elm,state,floatingbutton,left,*";
+ source: "elm";
+ action: STATE_SET "expand" 0.0;
+ target: "left_spacer";
+ transition: DECEL 0.4;
+ }
+ program {
+ signal: "elm,state,floatingbutton,left,*";
+ source: "elm";
+ script {
+ set_int(g_expand, 1);
+ }
+ }
+ program { name: "move_to_left_1btn";
+ signal: "elm,state,floatingbutton,left,1btn";
+ source: "elm";
+ action: STATE_SET "expand" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ program { name: "move_to_left_2btn";
+ signal: "elm,state,floatingbutton,left,2btn";
+ source: "elm";
+ action: STATE_SET "2buttons_expand" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ program { name: "move_to_right";
+ signal: "elm,state,floatingbutton,right,*";
+ source: "elm";
+ action: STATE_SET "expand" 0.0;
+ target: "right_spacer";
+ transition: DECEL 0.4;
+ }
+ program {
+ signal: "elm,state,floatingbutton,right,*";
+ source: "elm";
+ script {
+ set_int(g_expand, 1);
+ }
+ }
+ program { name: "move_to_right_1btn";
+ signal: "elm,state,floatingbutton,right,1btn";
+ source: "elm";
+ action: STATE_SET "expand" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ program { name: "move_to_right_2btn";
+ signal: "elm,state,floatingbutton,right,2btn";
+ source: "elm";
+ action: STATE_SET "2buttons_expand" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ program { name: "move_to_center";
+ signal: "elm,state,floatingbutton,center,*";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "left_spacer";
+ target: "right_spacer";
+ transition: DECEL 0.4;
+ }
+ program {
+ signal: "elm,state,floatingbutton,center,*";
+ source: "elm";
+ script {
+ set_int(g_expand, 0);
+ }
+ }
+ program { name: "move_to_center_1btn";
+ signal: "elm,state,floatingbutton,center,1btn";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ program { name: "move_to_center_2btn";
+ signal: "elm,state,floatingbutton,center,2btn";
+ source: "elm";
+ action: STATE_SET "2buttons" 0.0;
+ target: "elm.dragable.fb";
+ transition: DECEL 0.4;
+ }
+ }
+ }
+
+ group { name: "elm/floatingbutton/base/white_bg";
+ inherit: "elm/floatingbutton/base/default";
+ parts {
+ part { name: "vg_clipper";
+ type: RECT;
+ clip_to: "clipper";
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ color: 250 250 250 255;
+ rel1.to: "elm.swallow.vg";
+ rel2.to: "elm.swallow.vg";
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default";
+ color: 250 250 250 77;
+ }
+ }
+ }
+ }
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_H__
+#define __EFL_EXTENSION_H__
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@HEADER_INCS@
+
+/**
+ * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This group provides functionalities to grab hardware key events.
+ * @since_tizen 2.4
+ *
+ * @{
+ */
+
+/**
+ * @brief Set the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_set.
+ * Key callback is only called when the window located in topmost(top of the window stack).
+ *
+ * @param[in] obj object to set the keygrab
+ * The widget type of this object should be elm_win
+ * @param[in] key keyname string to set keygrab
+ *
+ * @return The result of keygrab set
+ *
+ * @since_tizen 2.4
+ */
+EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
+
+/**
+ * @brief Unset the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_unset.
+ *
+ * @param[in] obj object to unset the keygrab
+ * The widget type of this object should be elm_win
+ * @param[in] key keyname string to unset keygrab
+ *
+ * @return The result of keygrab unset
+ *
+ * @since_tizen 2.4
+ */
+EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_H__ */
+
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_EVENTS_H__
+#define __EFL_EXTENSION_EVENTS_H__
+
+#include <Elementary.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup EFL_EXTENSION_EVENTS_GROUP Efl Extension Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle back/send key events.
+ * @since_tizen 2.3
+ *
+ * @{
+ */
+
+/**
+ * @brief Convenient macro function that sends back key events to the popup
+ * to be removed.
+ *
+ * @details Popup will be removed when it has the back key event with
+ * eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends back key events to the ctxpopup
+ * to be dismissed.
+ *
+ * @details Ctxpopup will be dismissed when it has the back key event with
+ * eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_ctxpopup_dismiss(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends more key events to the naviframe
+ * top item.
+ *
+ * @details More key action of naviframe will be executed when naviframe has the
+ * more key event with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
+ if (!top) return;
+ Evas_Object *more_btn = elm_object_item_part_content_get(top,
+ "toolbar_more_btn");
+ if (more_btn)
+ evas_object_smart_callback_call(more_btn, "clicked", NULL);
+ else
+ elm_object_item_signal_emit(top, "elm,action,more_event", "");
+}
+
+/**
+ * @brief Convenient macro function that pop the naviframe item.
+ *
+ * @details Naviframe will be popped when naviframe has the back key event
+ * with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_pop(obj);
+}
+
+/**
+ * Identifier of callbacks to be set for Ea events.
+ *
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Callback_Type
+{
+ EEXT_CALLBACK_BACK, /**< H/W Back Key Event */
+ EEXT_CALLBACK_MORE, /**< H/W More Key Event */
+ EEXT_CALLBACK_LAST /**< Reserved value. Acutally This is not matched to
+ any meaningful behavior. */
+} Eext_Callback_Type;
+
+/**
+ * @brief Ea event callback function signature.
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information (if the event passes an additional in
+ formation.)
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
+
+/**
+ * @brief Delete a callback function from an object.
+ *
+ * @details This function removes the most recently added callback from the
+ * object @p obj which was triggered by the type @p type and
+ * was calling the function @p func when triggered. If the removal is
+ * successful it will also return the data pointer that was passed to
+ * eext_object_event_callback_add() when the callback was added to
+ * the object. If not successful @c NULl will be returned.
+ *
+ * @param[in] obj Object to remove a callback from.
+ * @param[in] type The type of event that was triggering the callback.
+ * @param[in] func The function that was to be called when the event was
+ * triggered
+ * @return data The data pointer that was to be passed to the callback.
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
+
+/**
+ * @brief Add (register) a callback function to a given evas object.
+ *
+ * @details This function adds a function callback to an object when the key
+ * event occurs on object @p obj. The key event on the object is only
+ * triggered when the object is the most top in objects stack and
+ * visible. This means, like the naviframe widget, if your application
+ * needs to have the events based on the view but not focus, you can
+ * use this callback. A callback function must have the Eext_Event_Cb
+ * prototype definition. The first parameter (@p data) in this
+ * definition will have the same value passed to
+ * eext_object_event_callback_add() as the @p data parameter, at
+ * runtime. The second parameter @p obj is the evas object on which
+ * event occurred. Finally, the third parameter @p event_info is a
+ * pointer to a data structure that may or may not be passed to the
+ * callback, depending on the event type that triggered the callback.
+ * This is so because some events don't carry extra context with them,
+ * but others do.
+ *
+ * @param[in] obj evas object.
+ * @param[in] type The type of event that will trigger the callback.
+ * @param[in] func The function to be called when the key event is triggered.
+ * @param[in] data The data pointer to be passed to @p func.
+ *
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
+
+/**
+ * @brief Convenient macro function that cancels the selection of the entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_entry_selection_get(obj))
+ elm_entry_select_none(obj);
+
+ eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+ evas_object_data_set(obj, "eext_entry", NULL);
+}
+
+/**
+ * @brief Convenient macro function that registers back key callback for entry.
+ *
+ * @details If the selection handler should be canceled when back key event is
+ * triggered, then use this API.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (!evas_object_data_get(obj, "eext_entry"))
+ {
+ evas_object_data_set(obj, "eext_entry", (void *) 1);
+ eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
+ NULL);
+ }
+}
+
+/**
+ * @brief Convenient macro function that clears back key callback for entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (evas_object_data_get(obj, "eext_entry"))
+ {
+ eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+ evas_object_data_set(obj, "eext_entry", NULL);
+ }
+}
+
+/**
+ * @brief Convenient macro function that handle the back event to cancel the
+ * selection handler of the entry.
+ * @details If the selection handler should be canceled (or not) when back key
+ * event is triggered, then use this API.
+ * @param[in] obj Entry object.
+ * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
+ * otherwise.
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
+{
+ if (allow)
+ {
+ evas_object_smart_callback_add(obj, "selection,start",
+ eext_entry_selection_start_cb, NULL);
+ evas_object_smart_callback_add(obj, "selection,cleared",
+ eext_entry_selection_cleared_cb, NULL);
+ }
+ else
+ {
+ evas_object_smart_callback_del(obj, "selection,start",
+ eext_entry_selection_start_cb);
+ evas_object_smart_callback_del(obj, "selection,cleared",
+ eext_entry_selection_cleared_cb);
+ }
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_EVENTS_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_PRIVATE_H__
+#define __EFL_EXTENSION_PRIVATE_H__
+
+#include <syslog.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <dlog.h>
+#include <unistd.h>
+#include <fontconfig/fontconfig.h>
+#include <fontconfig/fcfreetype.h>
+#include <glib.h>
+
+#define _(str) (gettext(str))
+#define LOCALE_DIR "/usr/share/locale"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @internal
+ *
+ * @ {
+ */
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+extern int _eext_log_dom;
+#define CRI(...) EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
+
+#define LOG_TAG "efl-extension"
+#define __CONSTRUCTOR__ __attribute__ ((constructor))
+#define __DESTRUCTOR__ __attribute__ ((destructor))
+
+/* eina magic types */
+#define EEXT_MAGIC_NONE 0x87657890
+
+typedef unsigned int eext_magic;
+#define EEXT_MAGIC eext_magic __magic
+
+#define EEXT_MAGIC_SET(d, m) (d)->__magic = (m)
+#define EEXT_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
+#define EEXT_MAGIC_FAIL(d, m, fn) \
+ _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_PRIVATE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @defgroup Floatingbutton Floatingbutton
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ *
+ * @brief Widget to add floating area for buttons
+ *
+ * The Floatingbutton widget is not a real button, but only provides areas
+ * where application adds (maximum 2) buttons to.
+ *
+ * This widget inherits from the Layout one, so that all the Layout functions
+ * can be used on it. However, it includes not only visible floating area,
+ * but invisible track for moving floating area, so there is a possibility that
+ * it works differently from that you intended.
+ *
+ * Default content parts of the floatingbutton widget that you can use for are:
+ * @li "button1" - left area for button
+ * @li "button2" - right area for button
+ *
+ * Floatingbutton can be hidden by siganl emission.
+ * @li show - elm_object_signal_emit(fb, "elm,state,show", "");
+ * @li hide - elm_object_signal_emit(fb, "elm,state,hide", "");
+ */
+
+/**
+ * addtogroup Floatingbutton
+ * @{
+ */
+#include "eext_floatingbutton_common.h"
+#ifdef EFL_EO_API_SUPPORT
+#include "eext_floatingbutton_eo.h"
+#endif
+#ifndef EFL_NOLEGACY_API_SUPPORT
+#include "eext_floatingbutton_legacy.h"
+#endif
+/**
+ * @}
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @addtogroup Floatingbutton
+ *
+ * @{
+ */
+
+/**
+ * Positions where floatingbutton can be placed on
+ */
+typedef enum {
+ EEXT_FLOATINGBUTTON_LEFT_OUT = 0, /**< hides in the left, but small handler will show only */
+ EEXT_FLOATINGBUTTON_LEFT, /**< shows all of buttons, but lies on the left */
+ EEXT_FLOATINGBUTTON_CENTER, /**< shows all of buttons, but lies on the center */
+ EEXT_FLOATINGBUTTON_RIGHT, /**< shows all of buttons, but lies on the right */
+ EEXT_FLOATINGBUTTON_RIGHT_OUT, /**< hides in the right, but small handler will show only */
+ EEXT_FLOATINGBUTTON_LAST /**< indicates the last, do not use this **/
+} Eext_Floatingbutton_Pos;
+
+typedef enum {
+ EEXT_FLOATINGBUTTON_MODE_DEFAULT = 0, /**< allows all positions */
+ EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES, /**< allows LEFT and RIGHT positions only */
+ EEXT_FLOATINGBUTTON_MODE_LAST /**< indicates the last, do not use this **/
+} Eext_Floatingbutton_Mode;
+
+/**
+ * @}
+ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "eext_floatingbutton.eo.h"
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+/**
+ * @MOBILE_ONLY
+ *
+ * @brief Add a new floatingbutton to the parent
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @endif
+ *
+ * @param[in] parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup Floatingbutton
+ */
+EAPI Evas_Object *eext_floatingbutton_add(Evas_Object *parent);
+
+#include "eext_floatingbutton.eo.legacy.h"
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE Efl Extension Circle Object
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle object is used for circular design of circular ui-controls.
+ * It can be combined with elementary widgets and be a part of design.
+ * Or it can make itself as a ui-control which is operated by rotary event.
+ *
+ * @details A Circle object extends elementary widgets in a form of circular design.
+ * It can be rendered either independently or by @ref Eext_Circle_Surface.
+ * When a circle object handle is added with surface parameter of @c NULL,
+ * it is rendered independently along with Evas_Object. On the other hand,
+ * if a circle object is created with surface parameter of @ref Eext_Circle_Surface,
+ * passed surface will render the circle object.
+ *
+ * eext_circle_object functions are same with eext_circle_object_item functions
+ * with "default" for item_name parameter. You can check what is the meaning of "default" item
+ * in each circle object's documentation.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the line width of the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] line_width The line width value of the circle object
+ *
+ * @see eext_circle_line_width_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_line_width_set(Evas_Object *obj, int line_width);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the line width of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The line width value of the circle object
+ *
+ * @see eext_circle_line_width_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI int eext_circle_object_line_width_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle in degree of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] angle The angle in degree of the circle object
+ *
+ * @see eext_circle_angle_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_set(Evas_Object *obj, double angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle in degree of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The angle of circle
+ *
+ * @see eext_circle_angle_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_angle_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle offset of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] angle_offset The angle offset value of the circle object
+ *
+ * @see eext_circle_angle_offset_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle offset of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The angle offset of the circle object
+ *
+ * @see eext_circle_angle_offset_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_angle_offset_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum angle for the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] min_angle The minimum angle in degree
+ * @param[in] max_angle The maximum angle in degree
+ *
+ * @see eext_circle_angle_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum angle of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out] min_angle The pointer to store the minimum angle in degree
+ * @param[out] max_angle The pointer to store the minimum angle in degree
+ *
+ * @see eext_circle_angle_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum value for the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] min_value The minimum value
+ * @param[in] max_value The maximum value
+ *
+ * @see eext_circle_value_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out] min_value The pointer to store the minimum value
+ * @param[out] max_value The pointer to store the minimum value
+ *
+ * @see eext_circle_value_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] value The value of circle object
+ *
+ * @see eext_circle_object_value_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_set(Evas_Object *obj, double value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The value of circle
+ *
+ * @see eext_circle_object_value_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_value_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the color of circle line and font in a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] r The red component of the given color
+ * @param[in] g The green component of the given color
+ * @param[in] b The blue component of the given color
+ * @param[in] a The alpha component of the given color
+ *
+ * @see eext_circle_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get color of circle line and font color in a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out] r The pointer to an integer in which to store the red component
+ * of the color
+ * @param[out] g The pointer to an integer in which to store the green
+ * component of the color
+ * @param[out] b The pointer to an integer in which to store the blue component
+ * of the color
+ * @param[out] a The pointer to an integer in which to store the alpha
+ * component of the color
+ *
+ * @see eext_circle_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set circle radius of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] radius The radius value of a given circle object
+ *
+ * @see eext_circle_radius_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_radius_set(Evas_Object *obj, double radius);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get circle radius of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The radius of circle
+ *
+ * @see eext_circle_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_radius_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the disabled state of the circle object.
+ *
+ * @details This sets the disabled state of the circle object.
+ * If @c EINA_TRUE, circle object will be disabled
+ * and will not recieve any event. If @c EINA_FALSE,
+ * circle object will be enabled.
+ *
+ * @param[in] obj The circle object
+ * @param[in] disabled The disabled state
+ *
+ * @see eext_circle_object_disabled_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the disabled state of the circle object.
+ *
+ * @param[in] obj The circle object
+ * @return Disabled state. If @c EINA_TRUE, circle object will be disabled
+ * and will not recieve any event. If @c EINA_FALSE, circle object
+ * will be enabled.
+ *
+ * @see eext_circle_object_disabled_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_circle_object_disabled_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle object.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ *
+ * @return A new circle object handle, otherwise
+ * @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the line width of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] line_width The line width value of the circle object
+ *
+ * @see eext_circle_object_item_line_width_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the line width of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The line width value of the circle object if it succeeds to find the item,
+ * otherwise -1 if it fails to find the item.
+ *
+ * @see eext_circle_object_item_line_width_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI int eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle in degree of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] angle The angle in degree of the circle object
+ *
+ * @see eext_circle_object_item_angle_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle in degree of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The angle of circle
+ *
+ * @see eext_circle_object_item_angle_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle offset of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] angle_offset The angle offset value of the circle object
+ *
+ * @see eext_circle_object_item_angle_offset_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle offset of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The angle offset of the circle object
+ *
+ * @see eext_circle_object_item_angle_offset_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum angle for the item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] min_angle The minimum angle in degree
+ * @param[in] max_angle The maximum angle in degree
+ *
+ * @see eext_circle_object_item_angle_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum angle of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out] min_angle The pointer to store the minimum angle in degree
+ * @param[out] max_angle The pointer to store the minimum angle in degree
+ *
+ * @see eext_circle_object_item_angle_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum value for the item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] min_value The minimum value
+ * @param[in] max_value The maximum value
+ *
+ * @see eext_circle_object_item_value_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out] min_value The pointer to store the minimum value
+ * @param[out] max_value The pointer to store the minimum value
+ *
+ * @see eext_circle_object_item_value_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] value The value of circle object
+ *
+ * @see eext_circle_object_item_value_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The value of circle
+ *
+ * @see eext_circle_object_item_value_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the color of circle line and font in a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] r The red component of the given color
+ * @param[in] g The green component of the given color
+ * @param[in] b The blue component of the given color
+ * @param[in] a The alpha component of the given color
+ *
+ * @see eext_circle_object_item_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get color of circle line and font color in a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out] r The pointer to an integer in which to store the red component
+ * of the color
+ * @param[out] g The pointer to an integer in which to store the green
+ * component of the color
+ * @param[out] b The pointer to an integer in which to store the blue component
+ * of the color
+ * @param[out] a The pointer to an integer in which to store the alpha
+ * component of the color
+ *
+ * @see eext_circle_object_item_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set circle radius of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] radius The radius value of a given circle object
+ *
+ * @see eext_circle_object_item_radius_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get circle radius of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The radius of the circle object if it succeeds to find the item,
+ * otherwise -1.0 if it fails to find the item.
+ *
+ * @see eext_circle_object_item_radius_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_DATETIME_MODULE Efl Extension Circle Datetime
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle datetime is based on elm_datetime and is operated by rotary event.
+ *
+ * @details Circle datetime is to utilize selected field in elm_datetime.
+ * If rotary event is activated by eext_rotary_object_event_activated_set(),
+ * circle datetime increases/decreases value of selected field in elm_datetime
+ * by the clockwise/counter clockwise rotary event.
+ *
+ * The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws a marker.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle datetime object.
+ *
+ * @param[in] datetime The datetime object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_GENLIST_MODULE Efl Extension Circle Genlist
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle genlist is based on elm_genlist and is scrolled by rotary event.
+ *
+ * @details Circle genlist is to visualize and utilize scroll effect for elm_genlist.
+ * While elm_genlist provides scrollbar with straight horizontal/vertical
+ * movement, circle genlist provides scrollbar with circular movement.
+ * Rotary event can be activated by eext_rotary_object_event_activated_set(),
+ * circle genlist scrolls genlist items upward/leftward responding to
+ * counter clockwise rotary event, and scrolls downward/rightward responding
+ * to clockwise rotary event.
+ *
+ * The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws vertical scroll bar.
+ * @li @c "vertical,scroll,bg": Vertical scroll background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle genlist object.
+ *
+ * @param[in] genlist The genlist object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the scrollbar visibility policy.
+ *
+ * @details This sets the scrollbar visibility policy for a given scroller.
+ * @c ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it is
+ * needed, and otherwise kept hidden. @c ELM_SCROLLER_POLICY_ON turns it on all
+ * the time, and @c ELM_SCROLLER_POLICY_OFF always keeps it off. This applies
+ * respectively for the vertical scrollbars.
+ *
+ * @param[in] obj The circle genlist object
+ * @param[in] policy_h The horizontal scrollbar policy
+ * @param[in] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_genlist_scroller_policy_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the scrollbar visibility policy.
+ *
+ * @param[in] obj The circle genlist object
+ * @param[out] policy_h The horizontal scrollbar policy
+ * @param[out] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_genlist_scroller_policy_set();
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_PROGRESSBAR_MODULE Efl Extension Circle Progressbar
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle progressbar aims to show the progress status of a given task with circular design.
+ * It visualizes progress status within a range set by eext_circle_object_angle_min_max_set()
+ * as an arc of a circle.
+ *
+ * @details The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws progress bar.
+ * @li @c "bg": Progress bar background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle progressbar to a given surface.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL in case of an error
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SCROLLER_MODULE Efl Extension Circle Scroller
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle scroller is based on elm_scroller and is scrolled by rotary event.
+ *
+ * @details Circle scroller is to visualize and utilize scroll effect for elm_scroller.
+ * While elm_scroller provides scrollbar with straight horizontal/vertical
+ * movement, circle scroller provides scrollbar with circular movement.
+ * Rotary event can be activated by eext_rotary_object_event_activated_set(),
+ * circle scroller scrolls items upward/leftward responding to counter clockwise
+ * rotary event, and scrolls downward/rightward responding to clockwise rotary event.
+ *
+ * The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws vertical scroll bar.
+ * @li @c "vertical,scroll,bg": Vertical scroll background circle item.
+ * @li @c "horizontal,scroll,bar": Horizontal scroll bar circle item.
+ * @li @c "horizontal,scroll,bg": Horizontal scroll background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle scroller object.
+ *
+ * @param[in] scroller The scroller object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the scrollbar visibility policy.
+ *
+ * @details This sets the scrollbar visibility policy of a given scroller.
+ * @c ELM_SCROLLER_POLICY_AUTO indicates the scrollbar is made visible
+ * if it is needed, and otherwise is kept hidden. @c ELM_SCROLLER_POLICY_ON
+ * turns the scrollbar on all the time, and @c ELM_SCROLLER_POLICY_OFF
+ * turns it off. This applies to the horizontal and vertical scrollbars
+ * respectively.
+ *
+ * @param[in] obj The circle scroller object
+ * @param[in] policy_h The horizontal scrollbar policy
+ * @param[in] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_scroller_policy_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_scroller_policy_set(Evas_Object *obj,
+ Elm_Scroller_Policy policy_h,
+ Elm_Scroller_Policy policy_v);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the scrollbar visibility policy.
+ *
+ * @param[in] obj The circle scroller object
+ * @param[out] policy_h The horizontal scrollbar policy
+ * @param[out] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_scroller_policy_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_scroller_policy_get(const Evas_Object *obj,
+ Elm_Scroller_Policy *policy_h,
+ Elm_Scroller_Policy *policy_v);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SLIDER_MODULE Efl Extension Circle Slider
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle slider is circular designed widget to select a value in a range
+ * by rotary event.
+ *
+ * @details Circle slider visualizes and utilizess slider as an arc of a circle.
+ * Length of an arc indicates a value in a range set by
+ * eext_circle_object_angle_min_max_set(). If rotary event is activated
+ * by eext_rotary_object_event_activated_set(), Circle slider increases
+ * its value by step value from eext_circle_object_slider_step_set()
+ * when clockwise rotary event is received, vice versa.
+ *
+ * This widget emits the following signals:
+ * @li "value,changed": Whenever the slider value is changed by the user.
+ *
+ * The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws slider bar.
+ * @li @c "bg": Background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle slider object.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL in case of an error
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the step value of the circle slider object.
+ *
+ * @details This value is used when circle slider object's value is changed
+ * by an event. The value of eext_circle_object_slider is increased/decreased
+ * by the step value.
+ *
+ * @param[in] obj The circle slider object
+ * @param[in] step The step value of the eext_circle_slider object
+ *
+ * @see eext_circle_object_slider_step_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_slider_step_set(Evas_Object *obj, double step);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the step value of the circle slider object.
+ *
+ * @param[in] obj The circle slider object
+ * @return The step value of the circle slider object
+ *
+ * @see eext_circle_object_slider_step_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_slider_step_get(const Evas_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SPINNER_MODULE Efl Extension Circle Spinner
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle spinner is based on elm_spinner and is operated by rotary event.
+ *
+ * @details Circle spinner is to display and handle spinner value by rotary event.
+ * If rotary event is activated by eext_rotary_object_event_activated_set(),
+ * circle spinner increases/decreases value of elm_spinner
+ * by the clockwise/counter clockwise rotary event.
+ *
+ * The available circle object items are as follows:
+ * @li @c "default": Default circle item. It draws a marker.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle spinner object.
+ *
+ * @param[in] spinner The spinner object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ * If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the circle spinner angle per each spinner value.
+ *
+ * @details This is not set a circle spinner picker angle offset.
+ * It's set the angle per each spinner value.
+ * default angle per each spinner value is calculated below formula.
+ * (360/ max - min) * step
+ *
+ * @param[in] obj The circle spinner object
+ * @param[in] angle The angle value per each spinner value.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+
+EAPI void eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_PRIVATE_H__
+#define __EFL_EXTENSION_CIRCLE_PRIVATE_H__
+
+#include <cairo.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define EEXT_CIRCLE_OBJECT_TYPE "Eext_Circle_Object"
+
+#define EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) \
+ Eext_Circle_Object *circle_obj = NULL; \
+ circle_obj = evas_object_data_get(obj, EEXT_CIRCLE_OBJECT_TYPE); \
+ if (!circle_obj)
+/**
+ * Put Document
+ */
+typedef struct _Eext_Circle_Object Eext_Circle_Object;
+
+typedef enum
+{
+ EEXT_CIRCLE_SURFACE_TYPE_DEFAULT,
+ EEXT_CIRCLE_SURFACE_TYPE_PRIVATE,
+ EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME,
+ EEXT_CIRCLE_SURFACE_TYPE_LAST
+} Eext_Circle_Surface_Type;
+
+struct _Eext_Circle_Surface {
+ Evas_Object *parent;
+ Evas_Object *image_widget;
+ cairo_surface_t *cairo_surface;
+ cairo_t *cairo;
+ unsigned char *buffer;
+ Evas_Coord w, h;
+ Evas_Coord center_x, center_y;
+ Eext_Circle_Surface_Type type;
+
+ Eina_List *render_objs;
+
+ Ecore_Job *render_job;
+
+ Eext_Circle_Surface *parent_surface;
+ Eina_List *sub_surfaces;
+ Eext_Circle_Object *deactivated_obj;
+};
+
+typedef struct _Eext_Circle_Color Eext_Circle_Color;
+struct _Eext_Circle_Color {
+ int r, g, b, a;
+};
+
+struct _Eext_Circle_Object {
+ Evas_Object *image_widget;
+ Evas_Object *widget_object;
+ void *widget_data;
+ const char *widget_type;
+
+ Eina_List *bg_image_objs;
+ int bg_image_index;
+
+ Eext_Circle_Surface *surface;
+ Eina_List *items;
+ Eina_List *text_items;
+
+ // del_func: Do only for widget_data.
+ // Other things are handled by Eext_Circle_Object.
+ void (*del_func)(Eext_Circle_Object *obj);
+ // disabled_func: When disabled state is changed, it will be called.
+ void (*disabled_func)(Eext_Circle_Object *obj);
+ // color_changed_func: When color of an item is changed, it will be called.
+ void (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name);
+
+ Eina_Bool visible : 1;
+ Eina_Bool disabled : 1;
+ Eina_Bool visible_on_activate: 1;
+ Eina_Bool is_active: 1;
+};
+
+typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item;
+struct _Eext_Circle_Object_Item {
+ Eext_Circle_Object *obj;
+ const char *name;
+ void *data;
+
+ // For text draw
+ const char *text;
+ const char *font;
+ const char *selected_font;
+ int font_size;
+
+ double radius;
+ int line_width;
+
+ int center_x;
+ int center_y;
+
+ double min_angle;
+ double max_angle;
+
+ double value;
+ double min_value;
+ double max_value;
+
+ double angle;
+ double angle_offset;
+
+ Eext_Circle_Color color;
+
+ struct {
+ double angle;
+ double angle_offset;
+ Eext_Circle_Color color;
+ } draw;
+
+ struct {
+ Ecore_Animator *animator_cb;
+ double duration;
+ double start_time;
+ double current_animator_pos;
+ Eext_Circle_Color from_color;
+ double cubic_bezier_v[4];
+ Eina_Bool cubic_bezier_enabled : 1;
+ } color_transit;
+
+ struct {
+ Ecore_Animator *animator_cb;
+ double duration;
+ double start_time;
+ double current_animator_pos;
+ double from_angle, from_angle_offset;
+ double cubic_bezier_v[4];
+ Eina_Bool cubic_bezier_enabled : 1;
+ } angle_transit;
+
+ Eina_Bool round_cap;
+};
+
+/* Datetime widget data */
+typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data;
+struct _Eext_Circle_Object_Datetime_Data {
+ Elm_Datetime_Field_Type current_type;
+ double rotary_angle;
+ double type_current_angle;
+
+ Eina_Bool circle_changed : 1;
+};
+
+/* Progressbar widget data */
+typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data;
+struct _Eext_Circle_Object_Progressbar_Data {
+ Eext_Circle_Color color;
+ Eext_Circle_Color bg_color;
+ Eext_Circle_Color disabled_color;
+ Eext_Circle_Color disabled_bg_color;
+};
+
+/* Slider widget data */
+typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data;
+struct _Eext_Circle_Object_Slider_Data {
+ double value_step;
+
+ Eext_Circle_Color color;
+ Eext_Circle_Color bg_color;
+ Eext_Circle_Color disabled_color;
+ Eext_Circle_Color disabled_bg_color;
+};
+
+/* Genlist widget data */
+typedef struct _Eext_Circle_Object_Genlist_Data Eext_Circle_Object_Genlist_Data;
+struct _Eext_Circle_Object_Genlist_Data {
+ Ecore_Timer *bar_hide_timer;
+ Elm_Scroller_Policy policy_h, policy_v;
+
+ Eext_Circle_Color color;
+ Eext_Circle_Color bg_color;
+ Eext_Circle_Color disabled_color;
+ Eext_Circle_Color disabled_bg_color;
+
+ Eina_Bool realized_callback_added : 1;
+};
+
+/* Scroller widget data */
+typedef struct _Eext_Circle_Object_Scroller_Data Eext_Circle_Object_Scroller_Data;
+struct _Eext_Circle_Object_Scroller_Data {
+ Ecore_Timer *bar_hide_timer;
+ Elm_Scroller_Policy policy_v, policy_h;
+
+ Eext_Circle_Color vertical_color;
+ Eext_Circle_Color vertical_bg_color;
+ Eext_Circle_Color horizontal_color;
+ Eext_Circle_Color horizontal_bg_color;
+ Eext_Circle_Color disabled_color;
+ Eext_Circle_Color disabled_bg_color;
+
+ int step_x, step_y;
+ int line_width;
+ double radius;
+};
+
+/* Spinner widget data */
+typedef struct _Eext_Circle_Object_Spinner_Data Eext_Circle_Object_Spinner_Data;
+struct _Eext_Circle_Object_Spinner_Data {
+ Ecore_Timer *rotary_timer;
+ Ecore_Timer *end_effect_expired_timer;
+ Eina_Bool rotary_event;
+ double angle;
+ double to_angle_offset;
+ double end_effect_angle;
+};
+
+///////////////////////////////
+// Internal APIs //////////////
+///////////////////////////////
+
+// Surface
+Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type);
+
+void _eext_circle_surface_finish(Eext_Circle_Surface *surface);
+
+void _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+void _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+void _eext_circle_surface_changed(Eext_Circle_Surface *surface);
+
+Eext_Circle_Surface *_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type);
+
+void _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+// Item
+double _eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value);
+
+double _eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle);
+
+const char *_eext_circle_text_font_get(const char *text, const char *font_family);
+
+void _eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name);
+
+const char *_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item);
+
+Eext_Circle_Object_Item *_eext_circle_object_item_new(void);
+
+void _eext_circle_object_item_free(Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_remove(Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width);
+
+int _eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle);
+
+double _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset);
+
+double _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item,
+ double min_angle, double max_angle);
+
+void _eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item,
+ double *min_angle, double *max_angle);
+
+void _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item,
+ double min_value, double max_value);
+
+void _eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item,
+ double *min_value, double *max_value);
+
+void _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value);
+
+double _eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
+ int r, int g, int b, int a);
+
+void _eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
+ int *r, int *g, int *b, int *a);
+
+void _eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius);
+
+double _eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
+ const char *text,
+ const char *font);
+
+void _eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
+ const char **text,
+ const char **font);
+
+void _eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
+ int font_size);
+
+int _eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
+ int to_r, int to_g, int to_b, int to_a,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y
+ );
+
+void _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
+ double to_angle, double to_angle_offset,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y);
+
+void _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
+ double to_value,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y);
+
+void _eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool round_cap);
+
+Eina_Bool _eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item);
+
+// Circle Common Private
+void _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_object, Eext_Circle_Surface *surface);
+
+void _eext_circle_object_finish(Evas_Object *obj, Eext_Circle_Object *circle_obj);
+
+void _eext_circle_object_changed(Eext_Circle_Object *obj);
+
+Eext_Circle_Object_Item *_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name);
+
+void _eext_circle_object_hide(Eext_Circle_Object *obj);
+
+void _eext_circle_object_show(Eext_Circle_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EFL_EXTENSION_CIRCLE_PRIVATE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_SURFACE_H__
+#define __EFL_EXTENSION_CIRCLE_SURFACE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE Efl Extension Circle UI
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides circular ui-controls which are for the devices with circular display.
+ */
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE Efl Extension Circle Surface
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Surface aims to show one of its connected circle objects.
+ *
+ * @details The circle surface manages connected circle objects.
+ * When a circle object is chosen to be shown,
+ * the surface shows the circle object and hides the others.
+ * A circle object can be shown and received the rotary event on the surface by
+ * @ref eext_rotary_object_event_activated_set() or @ref evas_object_show().
+ *
+ * The circle surface can be created by @ref eext_circle_surface_conformant_add()
+ * and @ref eext_circle_surface_layout_add().
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Circle_Surface
+ * @brief The structure of circle surface to render a connected circle object.
+ *
+ * @details The circle surface manages and shows a connected circle object.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Circle_Surface Eext_Circle_Surface;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given comformant.
+ *
+ * @details The circle surface needs the conformant to be seen in upper layer.
+ *
+ * @remarks The confom parameter is a conformant object pointer
+ * which is created by @ref elm_conformant_add()
+ * and the conformant's style should not be changed
+ * because in eext_circle_surface_conformant_add()
+ * it will be changed to circle style for circle surface.
+ *
+ * @param[in] conform The conformant
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_conformant_add(Evas_Object *conform);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given layout.
+ *
+ * @details The circle surface needs the layout to be set to the given layout.
+ *
+ * @remarks The layout parameter is a layout object pointer which is created by @ref elm_layout_add()
+ * and the style of it should not change because in @ref eext_circle_surface_layout_add()
+ * it will be changed to circle style for circle surface.
+ *
+ * @param[in] layout The layout
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_layout_add(Evas_Object *layout);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given naviframe.
+ *
+ * @details The circle surface needs the naviframe to be set to the pushed naviframe items.
+ *
+ * @remarks The naviframe parameter is a naviframe object pointer
+ * which is created by @ref elm_naviframe_add()
+ *
+ * @param[in] naviframe The naviframe
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_naviframe_add(Evas_Object *naviframe);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete the given circle surface.
+ *
+ * @param[in] surface The @ref Eext_Circle_Surface
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_surface_del(Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_ROTARY_H__
+#define __EFL_EXTENSION_ROTARY_H__
+
+#include "Evas.h"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_ROTARY_EVENT_MODULE Efl Extension Rotary Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle rotary events.
+ *
+ * @details This rotary object emits the following signals.
+ *
+ * @li "rotary,activated": A circle object is activated.
+ * @li "rotary,deactivated": A circle object is deactivated.
+ *
+ * @{
+ *
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Enumeration of rotary direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Rotary_Event_Direction
+{
+ EEXT_ROTARY_DIRECTION_CLOCKWISE, /**< Rotary is rotated clockwise direction */
+ EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */
+} Eext_Rotary_Event_Direction;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary event information structure
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Rotary_Event_Info
+{
+ Eext_Rotary_Event_Direction direction; /**< Direction of rotary event */
+ unsigned int time_stamp; /**< Timestamp of rotary event */
+} Eext_Rotary_Event_Info;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary object event callback function signature
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef Eina_Bool (*Eext_Rotary_Event_Cb)(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary event handler function signature
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef Eina_Bool (*Eext_Rotary_Handler_Cb)(void *data, Eext_Rotary_Event_Info *info);
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_BEFORE
+ * Slightly more prioritized than default.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_BEFORE -100
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_DEFAULT
+ * Default callback priority level
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_DEFAULT 0
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_AFTER
+ * Slightly less prioritized than default.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_AFTER 100
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Callback_Priority
+ *
+ * Callback priority value. Range is -32k - 32k. The lower the number, the
+ * higher the priority.
+ *
+ * @see EEXT_CALLBACK_PRIORITY_AFTER
+ * @see EEXT_CALLBACK_PRIORITY_BEFORE
+ * @see EEXT_CALLBACK_PRIORITY_DEFAULT
+ *
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef short Eext_Callback_Priority;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a rotary event callback for evas object @a obj.
+ *
+ * @details This function adds a callback function to object with default
+ * priority level, so that when rotary event happens,
+ * the callback can be called for that object.
+ * A callback function must have the ::Eext_Rotary_Event_Cb prototype
+ * definition.
+ * @note Be carefull not to add the same callback multiple times, if
+ * that is not what you want, because Eext won't check if a callback
+ * existed before exactly as the one being registered (and thus, call
+ * it more than once on the event, in this case).
+ *
+ * @param[in] obj The object that will receive rotary event.
+ * @param[in] func Callback function.
+ * @param[in] data User data to pass to callback function @a func.
+ *
+ * @return @c EINA_TRUE if the callback is successfully registered.
+ * @c EINA_FALSE otherwise.
+ *
+ * @see eext_rotary_object_event_callback_priority_add
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a rotary event callback for evas object @a obj
+ * with priority @a priority.
+ *
+ * @details This function adds a callback function to object with
+ * priority level @a priority, so that when rotary event happens,
+ * the callback can be called for that object. Except for the priority field,
+ * it is exactly the same as @ref eext_rotary_object_event_callback_add.
+ *
+ * @param[in] obj The object that will receive rotary event.
+ * @param[in] priority The priority of the callback, lower values called first.
+ * @param[in] func Callback function.
+ * @param[in] data User data to pass to callback function @a func.
+ *
+ * @return @c EINA_TRUE if the callback is successfully registered.
+ * @c EINA_FALSE otherwise.
+ *
+ * @see eext_rotary_object_event_callback_add
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove registered rotary event callback from evas object @a obj.
+ *
+ * @param[in] obj The object from which the callback function is removed.
+ * @param[in] func Callback function.
+ *
+ * @return The data which is passed when registers callback function.
+ *
+ * @see eext_rotary_object_event_callback_add.
+ * @see eext_rotary_object_event_callback_priority_add.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a handler for rotary event.
+ *
+ * @details This function adds a handler function for the rotary event,
+ * so that when rotary event happens, the handler can be called.
+ * A handler function must have the ::Eext_Rotary_Handler_Cb prototype
+ * definition.
+ * @note Be carefull not to add the same handler multiple times, if
+ * that is not what you want, because Eext won't check if a handler
+ * existed before exactly as the one being registered (and thus, call
+ * it more than once on the event, in this case).
+ *
+ * @param[in] func Handler function.
+ * @param[in] data User data to pass to handler function @a func.
+ *
+ * @return @c EINA_TRUE if the handler is successfully registered.
+ * @c EINA_FALSE otherwise.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove registered rotary event handler.
+ *
+ * @param[in] func Handler function.
+ *
+ * @return The data which is passed when registers callback function.
+ *
+ * @see eext_rotary_event_handler_add.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set an object @a obj as activated object.
+ *
+ * @details This function sets object as an activated object.
+ * The activated object and its parent are only objects to receive rotary event.
+ * Only one object is registered as activated object. If the new object is
+ * registered as activated object, the previous activated object will be
+ * de-activated. Set EINA_FALSE to activated parameter will set current activated
+ * object as non-activated object also.
+ * A signal named "rotary,activated" is emitted to the object when it is set as
+ * activated object and similar for "rotary,deactivated" signal.
+ * To receive the rotary event, the object must be visible and a callback function
+ * must be registered to the object with
+ * @ref eext_rotary_object_event_callback_add or
+ * @ref eext_rotary_object_event_callback_priority_add.
+ *
+ * @param[in] obj The object to set as activated object.
+ * @param[in] activated Set EINA_TRUE to activate or EINA_FALSE to de-activate object.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __EFL_EXTENSION_ROTARY_H__
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_COMMON_H__
+#define __EFL_EXTENSION_COMMON_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE Efl Extension Common UI
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides common ui-controls which are compatible for various devices.
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Object_Item
+ * @brief An efl-extension object item handle.
+
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Object_Item Eext_Object_Item;
+
+#define EEXT_OBJECT_ITEM Eext_Object_Item base
+
+struct _Eext_Object_Item {
+ Evas_Object *obj;
+ void *data;
+};
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_COMMON_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_COMMON_PRIVATE_H__
+#define __EFL_EXTENSION_COMMON_PRIVATE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _Eext_Index_Layout_Item Eext_Index_Layout_Item;
+struct _Eext_Index_Layout_Item {
+ EEXT_OBJECT_ITEM;
+ Eext_Circle_Object_Item *item;
+
+ const char *letter;
+ int priority;
+ Eina_Bool selected;
+
+ Evas_Smart_Cb func;
+};
+
+/* Index Layout data */
+typedef struct _Eext_Index_Layout_Data Eext_Index_Layout_Data;
+struct _Eext_Index_Layout_Data {
+ Evas_Object *main_ly;
+ Evas_Object *panel;
+ Evas_Object *index;
+ Evas_Object *cue;
+ Ecore_Timer *hide_timer;
+
+ int max_index;
+ int max_item;
+ int highlighted_index;
+ int index_priority;
+ int *item_index;
+ int default_item_count;
+
+ Eina_List *current_list;
+ Eina_List *item_list;
+ Eina_List *omit_list;
+
+ Eina_Bool panel_hide;
+ Eina_Bool second_list_exist;
+};
+
+/* Rotary Selector data */
+typedef struct _Eext_Rotary_Selector_Selector_Color Eext_Rotary_Selector_Selector_Color;
+struct _Eext_Rotary_Selector_Selector_Color {
+ int r;
+ int g;
+ int b;
+ int a;
+ Eina_Bool set_flag;
+};
+
+typedef struct _Eext_Rotary_Selector_State_Data Eext_Rotary_Selector_State_Data;
+struct _Eext_Rotary_Selector_State_Data {
+ Evas_Object *normal;
+ Evas_Object *pressed;
+};
+
+typedef struct _Eext_Rotary_Selector_Selector_State_Color Eext_Rotary_Selector_Selector_State_Color;
+struct _Eext_Rotary_Selector_Selector_State_Color {
+ Eext_Rotary_Selector_Selector_Color normal_color;
+ Eext_Rotary_Selector_Selector_Color pressed_color;
+ Eext_Rotary_Selector_Selector_Color disabled_color;
+};
+
+//for accessibility
+typedef enum
+{
+ EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL = 0,
+ EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT,
+ EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT,
+} Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State;
+//
+
+typedef struct _Eext_Rotary_Selector_Data Eext_Rotary_Selector_Data;
+struct _Eext_Rotary_Selector_Data {
+ Evas_Object *parent;
+ Evas_Object *rotary_selector;
+ Evas_Object *event_area;
+ Eina_List *item_list;
+ int item_count;
+ int selected_index;
+ int current_page;
+ Eina_Bool animation_direction;
+ Ecore_Animator *previous_page_animator;
+ Ecore_Animator *next_page_animator;
+ double previous_page_animator_start_time;
+ double next_page_animator_start_time;
+ Eina_Bool next_page_animation_started;
+ Eina_Bool previous_page_animation_started;
+ Ecore_Timer *next_page_timer;
+ Eina_Bool end_effect_animation_started;
+ double end_effect_animator_start_time;
+ Ecore_Animator *end_effect_animator;
+ Ecore_Animator *item_update_animator;
+ Eext_Rotary_Selector_Selector_State state;
+ Eext_Rotary_Selector_Selector_State_Color selector_bg_image_color;
+ Eext_Rotary_Selector_State_Data custom_content;
+ Eina_Bool pressed;
+ int pressed_item_index;
+ Eina_Bool touched_item_changed;
+ int radius;
+ Evas_Coord item_width;
+ Evas_Coord item_height;
+ unsigned int rotary_event_time_stamp;
+ Eina_Bool acceleration;
+ //for accessibility
+ Evas_Object *event_area_access_object;
+ Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State event_area_highlighted_state;
+ Evas_Object *backup_first_item_for_atspi;
+ Evas_Object *backup_last_item_for_atspi;
+ int reading_page_number;
+ Eina_Bool from_moreoption;
+ Eina_Bool control_by_rotary
+ //
+};
+
+typedef struct _Eext_Rotary_Selector_Item_Coords Eext_Rotary_Selector_Item_Coords;
+struct _Eext_Rotary_Selector_Item_Coords {
+ double x;
+ double y;
+};
+
+typedef struct _Eext_Rotary_Selector_Item_Color Eext_Rotary_Selector_Item_Color;
+struct _Eext_Rotary_Selector_Item_Color {
+ int r;
+ int g;
+ int b;
+ int a;
+ Eina_Bool set_flag;
+};
+
+typedef struct _Eext_Rotary_Selector_Item_State_Color Eext_Rotary_Selector_Item_State_Color;
+struct _Eext_Rotary_Selector_Item_State_Color {
+ Eext_Rotary_Selector_Item_Color normal_color;
+ Eext_Rotary_Selector_Item_Color pressed_color;
+ Eext_Rotary_Selector_Item_Color disabled_color;
+};
+
+typedef struct _Eext_Rotary_Selector_Item Eext_Rotary_Selector_Item;
+struct _Eext_Rotary_Selector_Item {
+ EEXT_OBJECT_ITEM;
+ int index;
+ Evas_Object *parent;
+ Evas_Object *rotary_selector;
+ Eext_Rotary_Selector_Item_Coords coords;
+ char *domain;
+ char *text1;
+ char *text2;
+ Eext_Rotary_Selector_Item_State state;
+ Eext_Rotary_Selector_Item_Color color;
+ Eext_Rotary_Selector_State_Data item_bg_image;
+ Eext_Rotary_Selector_State_Data item_icon;
+ Eext_Rotary_Selector_State_Data selector_icon;
+ Eext_Rotary_Selector_State_Data selector_content;
+ Eext_Rotary_Selector_Item_State_Color item_bg_image_color;
+ Eext_Rotary_Selector_Item_State_Color item_icon_color;
+ Eext_Rotary_Selector_Item_State_Color selector_icon_color;
+ Eext_Rotary_Selector_Item_State_Color custom_content_color;
+ Evas_Object *content_icon;
+ Evas_Object *custom_content;
+};
+
+
+/* More Option data */
+typedef struct _Eext_More_Option_Data Eext_More_Option_Data;
+struct _Eext_More_Option_Data {
+ Evas_Object* parent;
+ Evas_Object* more_option;
+ Eina_List *item_list;
+ Evas_Object* panel;
+ Evas_Object* rotary_selector;
+ Eext_More_Option_Direction direction;
+ //for accessibility
+ Evas_Object* cue_access_object;
+ //
+};
+
+//for accessibility(internal API)
+void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
+//
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EFL_EXTENSION_COMMON_PRIVATE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_INDEX_H__
+#define __EFL_EXTENSION_INDEX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_INDEX_LAYOUT_MODULE Efl Extension Index Layout
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief Index layout is based on elm_layout with draggable index view, and an item of index
+ * can be selected by rotary event.
+ *
+ * @details This widget emits the following signals.
+ *
+ * @li "changed": The index layout item is changed.
+ * @li "index,show": The index layout item is shown.
+ * @li "index,hide": The index layout item is hidden.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new index layout to the given parent
+ * Elementary object.
+ *
+ * @param[in] parent The parent object
+ * @return A new index layout handle,
+ * otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_index_layout_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item on a given index layout.
+ *
+ * @param[in] obj The index layout
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_append(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Prepend a new item on a given index layout.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_prepend(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the index object before the input index layout item.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] before The index layout item to insert before
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] priority The priority of index layout item
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_insert_before(Evas_Object *obj, Eext_Object_Item *before, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the index object after the input index layout item.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] after The index layout item to insert after
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] priority The priority of index layout item
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_insert_after(Evas_Object *obj, Eext_Object_Item *after, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given index layout object.
+ *
+ * @param[in] obj The index layout
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given index layout item.
+ *
+ * @param[in] item The index layout item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Find a given index widget's item using item data.
+ *
+ * @param[in] obj The index layout
+ * @param[in] data The item data pointed by the desired index layout item
+ * @return The index layout item handle if found, otherwise @c NULL
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_find(Evas_Object *obj, const void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the last selected item, for a given index layout object.
+ *
+ * @param[in] obj The index layout object
+ * @return The index layout item handle if selected, otherwise @c NULL
+ *
+ * @see eext_index_layout_item_selected_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_selected_item_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selected state of an item.
+ *
+ * @remarks Selected item will be highlighted.
+ *
+ * @param[in] item The index layout item
+ * @param[in] selected The selected state
+ *
+ * @see eext_index_layout_selected_item_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_selected_item_set(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text to the given index layout item.
+ *
+ * @param[in] item The index layout item
+ * @param[in] text The text under which the item should be indexed
+ *
+ * @see eext_index_layout_item_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_item_text_set(Eext_Object_Item *item, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the text (string) set on a given index layout item.
+ *
+ * @param[in] item The index layout item
+ * @return The text string set on @a item
+ *
+ * @see eext_index_layout_item_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char* eext_index_layout_item_text_get(Eext_Object_Item *item);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_INDEX_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_MORE_OPTION_H__
+#define __EFL_EXTENSION_MORE_OPTION_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_MORE_OPTION_MODULE Efl Extension More Option
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief More option is composed of the toggle(cue button) and more option view,
+ * and more option can change a visibility through the toggle.
+ *
+ * @details More option is based on elm_panel, but more option is different
+ * from elm_panel in that the former does not set the scrollable option.
+ * To show the more option view, select the toggle or manually use
+ * eext_more_option_opened_set(). To hide the more option view,
+ * trigger the back event or manually use eext_more_option_opened_set().
+ * Additionally, the toggle disappears when more option view appears.
+ * On the other hand, the toggle appears when more option view disappears.
+ * The more option view can be manually set by eext_more_option_opened_set() API.
+ * An item of more option object can be selected by rotary event.
+ *
+ * This widget emits the following signals:
+ * @li "item,selected": When the user selects an item.
+ * @li "item,clicked": When the user selects the already selected item again
+ * or selects a selector.
+ * @li "more,option,opened": When more option view is shown.
+ * @li "more,option,closed": When more option view is hidden.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enumeration of More Option Diection type
+ */
+typedef enum
+{
+ EEXT_MORE_OPTION_DIRECTION_TOP, /**< More option (dis)appears from the top */
+ EEXT_MORE_OPTION_DIRECTION_BOTTOM, /**< More option (dis)appears from the bottom */
+ EEXT_MORE_OPTION_DIRECTION_LEFT, /**< More option (dis)appears from the left */
+ EEXT_MORE_OPTION_DIRECTION_RIGHT /**< More option (dis)appears from the right */
+} Eext_More_Option_Direction;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new more option.
+ *
+ * @details Because the return value is the elm_layout handle,
+ * the elm_layout APIs can be applicable to more option handle.
+ *
+ * @param[in] parent The parent object
+ * @return A new more option handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object * eext_more_option_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the direction of more option.
+ *
+ * @param[in] obj The more option
+ * @param[in] direction The direction of more option
+ *
+ * @see eext_more_option_direction_get()
+ * @ref Eext_More_Option_Direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get @ref Eext_More_Option_Direction.
+ *
+ * @param[in] obj The more option
+ * @return A direction of more option
+ *
+ * @see eext_more_option_direction_set()
+ * @ref Eext_More_Option_Direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_More_Option_Direction eext_more_option_direction_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item to a more option.
+ *
+ * @param[in] obj The more option
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_append(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief prepend a new item to a more option.
+ *
+ * @param[in] obj The more option
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_prepend(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the more option after more option item @a after.
+ *
+ * @param[in] obj The more option
+ * @param[in] after The more option item to insert after
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the more option before more option item @a before.
+ *
+ * @param[in] obj The more option
+ * @param[in] before The more option item to insert before
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given more option item @a item.
+ *
+ * @param[in] item The more option item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given more option object.
+ *
+ * @param[in] obj The more option
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a more option object.
+ *
+ * @details The part name exists with the next.
+ * @li "selector,main_text": This locates in the middle of the selector.
+ * @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] text The new text of the part
+ *
+ * @see eext_more_option_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a more option object.
+ *
+ * @details The part name exists with the next.
+ * @li "selector,main_text": This locates in the middle of the selector.
+ * @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to get (@c NULL for the default part)
+ * @return The text of the part, otherwise @c NULL in case of an error
+ *
+ * @see eext_more_option_item_part_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char * eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the translatable text of a more option object.
+ *
+ * @details The part name exists with the next.
+ * @li "selector,main_text": This locates in the middle of the selector.
+ * @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] domain The name of the domain which contains translatable text
+ * @param[in] text ID of the new translatable text
+ *
+ * @see eext_more_option_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content to the part of a given container widget.
+ *
+ * @details The part name exists with the next.
+ * @li "item,icon": This locates in the middle of the selector.
+ *
+ * @remarks The more option item may hold child objects as content at given parts.
+ * This sets new content to a given part.
+ * If any object is already set as a content object in the same part,
+ * the previous object is automatically deleted. with this call.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The more option item's part name to set
+ * @param[in] content The new content for that part
+ *
+ * @see eext_more_option_item_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content from the part of a given container widget.
+ *
+ * @details The part name exists with the next.
+ * @li "item,icon": This locates in the middle of the selector.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The more option item's part name to get
+ * @return The content of the object at the given part,
+ * otherwise @c NULL in case of an error
+ *
+ * @see eext_more_option_item_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object * eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the visibility of more option view.
+ *
+ * @details If opened is @c EINA_TRUE, more option view in which
+ * the rotary selector is included disappears and toggle appears.
+ * If opened is @c EINA_FALSE, more option view in which
+ * the rotary selector is included appears and toggle disappear.
+ *
+ * @remarks When more option is closed and opened again, the first item
+ * is always selected.
+ *
+ * @param[in] obj The more option object
+ * @param[in] opened If @c EINA_TRUE, the more option runs the animation to appear,
+ * If @c EINA_FALSE, the more option runs the animation to disappear
+ *
+ * @see eext_more_option_opened_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get whether the more option is set to be shown or to be hidden.
+ *
+ * @param[in] obj The more option object
+ * @return If @c EINA_TRUE, more option is shown.
+ * Otherwise @c EINA_FALSE, more option is hidden.
+ *
+ * @see eext_more_option_opened_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_more_option_opened_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the list of all items from a given more option object.
+ *
+ * @param[in] obj The more option object
+ * @return All item lists of the more option..
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const Eina_List* eext_more_option_items_get(const Evas_Object *obj);
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_MORE_OPTION_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_ROTARY_SELECTOR_H__
+#define __EFL_EXTENSION_ROTARY_SELECTOR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_ROTARY_SELECTOR_MODULE Efl Extension Rotary Selector
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief Rotary Selector is based on elm_layout, and an item can be
+ * selected by rotary event or user item click.
+ *
+ * @details This widget emits the following signals.
+ *
+ * @li "item,selected": When the user selected an item.
+ * @li "item,clicked": When selecting again the alredy selected item or selecting a selector.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enumeration of Rotary Selector state
+ */
+typedef enum
+{
+ EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL = 0, /**< Selector is normal state */
+ EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED, /**< Selector is pressed state */
+ EEXT_ROTARY_SELECTOR_SELECTOR_STATE_DISABLED, /**< Selector is disabled state */
+} Eext_Rotary_Selector_Selector_State;
+
+/**
+ * @brief Enumeration of Rotary Selector item state
+ */
+typedef enum
+{
+ EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL = 0, /**< Selector Item is normal state */
+ EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED, /**< Selector Item is pressed state */
+ EEXT_ROTARY_SELECTOR_ITEM_STATE_DISABLED, /**< Selector Item is disabled state */
+} Eext_Rotary_Selector_Item_State;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new Rotary Selector.
+ * @details Because the return value is the elm_layout handle,
+ the elm_layout APIs can be applicable to rotary selector handle.
+ *
+ * @param[in] parent The parent object
+ *
+ * @return A new rotary selector handle, otherwise @c NULL if it cannot be created
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item to a rotary selector.
+ *
+ * @param[in] obj The rotary selector
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_rotary_selector_item_append(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Prepend a new item to a rotary selector.
+ *
+ * @param[in] obj The rotary selector
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_prepend(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into a rotary selector after rotary selector item @a after.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] after The rotary selector item to insert after
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into a rotary selector before rotary selector item @a before.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] before The rotary selector item to insert before
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given rotary selector item.
+ *
+ * @param[in] item The rotary selector item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] text The new text of the part
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "selector,main_text": Selector main text.
+ * @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to get (@c NULL for the default part)
+ * @return The text of the part, otherwise @c NULL for any error
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "selector,main_text": Selector main text.
+ * @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char* eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the translatable text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] domain The name of the domain which contains translatable text
+ * @param[in] text ID of the new translatable text
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "selector,main_text": Selector main text.
+ * @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content at a part of a given container widget.
+ *
+ * @remarks The rotary selector item may hold child objects as its contents in given parts.
+ * This new content to a given part. If any object is already set as a content
+ * object in the given part, the previous object is automatically deleted
+ * with this call.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The rotary selector item's part name to set
+ * @param[in] state The rotary selector item part
+ * @param[in] content The new content for that part
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "item,bg_image": Selector Item background image
+ * @li "item,icon": Selector item icon
+ * @li "selector,icon": Selector icon
+ * @li "selector,content": Selector content
+ *
+ * @see eext_rotary_selector_item_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content at a part of a given container widget.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The rotary selector item's part name to get
+ * @param[in] state The rotary selector item part
+ * @return The content of the object at the given part, otherwise @c NULL in case of an error
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "item,bg_image": Selector Item background image
+ * @li "item,icon": Selector item icon
+ * @li "selector,icon": Selector icon
+ * @li "selector,content": Selector content
+ *
+ * @see eext_rotary_selector_item_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content at a part of a given container widget.
+ *
+ * @remarks The rotary selector may hold child objects as its contents in given parts.
+ * This sets a new content to a given part. If any object is already set as a content
+ * object in the given part, the previous object is automatically deleted
+ * with this call.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The rotary selector part name to set
+ * @param[in] state The selector part
+ * @param[in] content The new content for that part
+ * @details This api supports following part names by default.
+ *
+ * @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_selector_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content from the part of the given container widget.
+ *
+ * @param[in] obj The rotary selector.
+ * @param[in] part_name The rotary selector part name to set
+ * @param[in] state The selector part
+ * @return The content of the object at the given part, otherwise @c NULL in case of an error
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_selector_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state);
+
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the item part color of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The item part name to set
+ * @param[in] state The rotary selector item part
+ * @param[in] r Red (0 - 255)
+ * @param[in] g Green (0 - 255)
+ * @param[in] b Blue (0 - 255)
+ * @param[in] a Alpha (0 - 255)
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "item,bg_image": Selector Item background image
+ * @li "item,icon": Selector item icon
+ * @li "selector,icon": Selector icon
+ * @li "selector,content": Selector content
+ * @li "selector,main_text": Selector main text.
+ * @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the item part color of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The item part name to get
+ * @param[in] state The rotary selector item part
+ * @param[out] r A pointer to Red (0 - 255)
+ * @param[out] g A pointer to Green (0 - 255)
+ * @param[out] b A pointer to Blue (0 - 255)
+ * @param[out] a A pointer to Alpha (0 - 255)
+ * @see eext_rotary_selector_item_part_color_set()
+ *
+ * @details This api supports following part names by default.
+ *
+ * @li "item,bg_image": Selector Item background image
+ * @li "item,icon": Selector item icon
+ * @li "selector,icon": Selector icon
+ * @li "selector,content": Selector content
+ * @li "selector,main_text": Selector main text.
+ * @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_color_get()
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selector part color of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The selector part name to set
+ * @param[in] state The selector part
+ * @param[in] r Red (0 - 255)
+ * @param[in] g Green (0 - 255)
+ * @param[in] b Blue (0 - 255)
+ * @param[in] a Alpha (0 - 255)
+ *
+ * @details This api defualt support part names.
+ *
+ * @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_part_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the selector part color of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The selector part name to get
+ * @param[in] state The selector part
+ * @param[out] r A pointer to Red (0 - 255)
+ * @param[out] g A pointer to Green (0 - 255)
+ * @param[out] b A pointer to Blue (0 - 255)
+ * @param[out] a A pointer to Alpha (0 - 255)
+ * @see eext_rotary_selector_item_part_color_set()
+ *
+ * @details This api defualt support part names.
+ *
+ * @li "selector,bg_image": Selector background image.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selected item of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] item The rotary selector item
+ * @see eext_rotary_selector_selected_item_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the selected item of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @see eext_rotary_selector_selected_item_set()
+ * @return A selected item handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_rotary_selector_selected_item_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the rotary selector item list of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @return A rotary selector item list handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const Eina_List* eext_rotary_selector_items_get(const Evas_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_ROTARY_SELECTOR_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_H__
+#define __EFL_EXTENSION_H__
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@HEADER_INCS@
+@LIB_HEADERS@
+
+/**
+ * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This group provides functionalities to grab hardware key events.
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ *
+ * @{
+ */
+
+/**
+ * @brief Set the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_set.
+ * Key callback is only called when the window located in topmost(top of the window stack).
+ *
+ * @param[in] obj object to set the keygrab
+ * The widget type of this object should be elm_win
+ * @param[in] key keyname string to set keygrab
+ *
+ * @return The result of keygrab set
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ */
+EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
+
+/**
+ * @brief Unset the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_unset.
+ *
+ * @param[in] obj object to unset the keygrab
+ * The widget type of this object should be elm_win
+ * @param[in] key keyname string to unset keygrab
+ *
+ * @return The result of keygrab unset
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ */
+EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_H__ */
+
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_EVENTS_H__
+#define __EFL_EXTENSION_EVENTS_H__
+
+#include <Elementary.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_EVENT_MODULE Efl Extension Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle back/send key events.
+ * @{
+ */
+
+/**
+ * @brief Convenient macro function that sends back key events to the popup
+ * to be removed.
+ *
+ * @details Popup will be removed when it has the back key event with
+ * eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_del(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends back key events to the ctxpopup
+ * to be dismissed.
+ *
+ * @details Ctxpopup will be dismissed when it has the back key event with
+ * eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_ctxpopup_dismiss(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends more key events to the naviframe
+ * top item.
+ *
+ * @details More key action of naviframe will be executed when naviframe has the
+ * more key event with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
+ if (!top) return;
+ Evas_Object *more_btn = elm_object_item_part_content_get(top,
+ "toolbar_more_btn");
+ if (more_btn)
+ evas_object_smart_callback_call(more_btn, "clicked", NULL);
+}
+
+/**
+ * @brief Convenient macro function that pop the naviframe item.
+ *
+ * @details Naviframe will be popped when naviframe has the back key event
+ * with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ elm_naviframe_item_pop(obj);
+}
+
+/**
+ * Identifier of callbacks to be set for Ea events.
+ *
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Callback_Type
+{
+ EEXT_CALLBACK_BACK, /**< H/W Back Key Event */
+ EEXT_CALLBACK_MORE, /**< H/W More Key Event */
+ EEXT_CALLBACK_LAST /**< Reserved value. Acutally This is not matched to
+ any meaningful behavior. */
+} Eext_Callback_Type;
+
+/**
+ * @brief Ea event callback function signature.
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information (if the event passes an additional in
+ formation.)
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
+
+/**
+ * @brief Delete a callback function from an object.
+ *
+ * @details This function removes the most recently added callback from the
+ * object @p obj which was triggered by the type @p type and
+ * was calling the function @p func when triggered. If the removal is
+ * successful it will also return the data pointer that was passed to
+ * eext_object_event_callback_add() when the callback was added to
+ * the object. If not successful @c NULl will be returned.
+ *
+ * @param[in] obj Object to remove a callback from.
+ * @param[in] type The type of event that was triggering the callback.
+ * @param[in] func The function that was to be called when the event was
+ * triggered
+ * @return data The data pointer that was to be passed to the callback.
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
+
+/**
+ * @brief Add (register) a callback function to a given evas object.
+ *
+ * @details This function adds a function callback to an object when the key
+ * event occurs on object @p obj. The key event on the object is only
+ * triggered when the object is the most top in objects stack and
+ * visible. This means, like the naviframe widget, if your application
+ * needs to have the events based on the view but not focus, you can
+ * use this callback. A callback function must have the Eext_Event_Cb
+ * prototype definition. The first parameter (@p data) in this
+ * definition will have the same value passed to
+ * eext_object_event_callback_add() as the @p data parameter, at
+ * runtime. The second parameter @p obj is the evas object on which
+ * event occurred. Finally, the third parameter @p event_info is a
+ * pointer to a data structure that may or may not be passed to the
+ * callback, depending on the event type that triggered the callback.
+ * This is so because some events don't carry extra context with them,
+ * but others do.
+ *
+ * @param[in] obj evas object.
+ * @param[in] type The type of event that will trigger the callback.
+ * @param[in] func The function to be called when the key event is triggered.
+ * @param[in] data The data pointer to be passed to @p func.
+ *
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
+
+/**
+ * @brief Convenient macro function that cancels the selection of the entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (elm_entry_selection_get(obj))
+ elm_entry_select_none(obj);
+
+ eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+ evas_object_data_set(obj, "eext_entry", NULL);
+}
+
+/**
+ * @brief Convenient macro function that registers back key callback for entry.
+ *
+ * @details If the selection handler should be canceled when back key event is
+ * triggered, then use this API.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (!evas_object_data_get(obj, "eext_entry"))
+ {
+ evas_object_data_set(obj, "eext_entry", (void *) 1);
+ eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
+ NULL);
+ }
+}
+
+/**
+ * @brief Convenient macro function that clears back key callback for entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see eext_entry_selection_back_event_allow_set()
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ if (evas_object_data_get(obj, "eext_entry"))
+ {
+ eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+ evas_object_data_set(obj, "eext_entry", NULL);
+ }
+}
+
+/**
+ * @brief Convenient macro function that handle the back event to cancel the
+ * selection handler of the entry.
+ * @details If the selection handler should be canceled (or not) when back key
+ * event is triggered, then use this API.
+ * @param[in] obj Entry object.
+ * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
+ * otherwise.
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
+{
+ if (allow)
+ {
+ evas_object_smart_callback_add(obj, "selection,start",
+ eext_entry_selection_start_cb, NULL);
+ evas_object_smart_callback_add(obj, "selection,cleared",
+ eext_entry_selection_cleared_cb, NULL);
+ }
+ else
+ {
+ evas_object_smart_callback_del(obj, "selection,start",
+ eext_entry_selection_start_cb);
+ evas_object_smart_callback_del(obj, "selection,cleared",
+ eext_entry_selection_cleared_cb);
+ }
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_EVENTS_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef __EFL_EXTENSION_PRIVATE_H__
+#define __EFL_EXTENSION_PRIVATE_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include <fontconfig/fontconfig.h>
+#include <fontconfig/fcfreetype.h>
+
+#define _(str) (gettext(str))
+#define LOCALE_DIR "/usr/share/locale"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+# ifdef DLL_EXPORT
+# define EAPI __declspec(dllexport)
+# else
+# define EAPI
+# endif /* ! DLL_EXPORT */
+# else
+# define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+# if __GNUC__ >= 4
+# define EAPI __attribute__ ((visibility("default")))
+# else
+# define EAPI
+# endif
+# else
+# define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @internal
+ *
+ * @ {
+ */
+
+extern int _eext_log_dom;
+
+#define CRI(...) EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
+
+#define __CONSTRUCTOR__ __attribute__ ((constructor))
+#define __DESTRUCTOR__ __attribute__ ((destructor))
+
+/* eina magic types */
+#define EEXT_MAGIC_NONE 0x87657890
+
+typedef unsigned int eext_magic;
+#define EEXT_MAGIC eext_magic __magic
+
+#define EEXT_MAGIC_SET(d, m) (d)->__magic = (m)
+#define EEXT_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
+#define EEXT_MAGIC_FAIL(d, m, fn) \
+ _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_PRIVATE_H__ */
+++ /dev/null
-ADD_SUBDIRECTORY(src)
-ADD_SUBDIRECTORY(data)
+++ /dev/null
-SET(EDC_FILES
- groups/floatingbutton.edc
- )
-
-FOREACH(edc ${EDC_FILES})
- SET(EDC_INCS "${EDC_INCS}\n #include \"${edc}\"")
-ENDFOREACH(edc)
-
-CONFIGURE_FILE(
- efl-extension.edc.in efl-extension.edc
- @ONLY)
-
-ADD_CUSTOM_TARGET(${PROJECT_NAME}.edj
- COMMAND edje_cc -id ./images/ ${PROJECT_NAME}.edc ${PROJECT_NAME}.edj
-)
-ADD_DEPENDENCIES(${PROJECT_NAME} ${PROJECT_NAME}.edj)
-
-INSTALL(FILES ${PROJECT_NAME}.edj DESTINATION ${EDJDIR})
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#define BASE_SCALE_INC 2.6
-
-//****************************************************************************//
-// Floatingbutton
-//****************************************************************************//
-#define FLOATINGBUTTON_LAYOUT_LR_WIDTH 64
-#define FLOATINGBUTTON_LR_WIDTH 50
-#define FLOATINGBUTTON_LR_MAX_VARIATION 20
-#define FLOATINGBUTTON_MID_WIDTH 20
-#define FLOATINGBUTTON_1BTN_WIDTH 180
-#define FLOATINGBUTTON_2BTN_WIDTH 280
-#define FLOATINGBUTTON_HEIGHT 120
-#define FLOATINGBUTTON_HANDLER_SIZE 32
-#define FLOATINGBUTTON_SIDE_MARGIN 20
-#define FLOATINGBUTTON_LAYOUT_SIDE_MARGIN 34
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "HD-inc.edc"
-
-collections {
- base_scale: BASE_SCALE_INC;
-@EDC_INCS@
-}
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
- group { name: "elm/floatingbutton/base/default";
- script {
- public mouse_down, g_prev_x, g_width, g_btns;
- public left_timer, right_timer;
- public g_visible;
- public g_expand;
-
- public message(Msg_Type:type, id, ...) {
- if ((type == MSG_INT) && (id == 0)) {
- new width;
- width = getarg(2);
- set_int(g_width, width);
- }
- }
- public left_anim_go() {
- run_program(PROGRAM:"left_spacer_animation");
- }
- public right_anim_go() {
- run_program(PROGRAM:"right_spacer_animation");
- }
- }
- parts {
- part { name: "elm.swallow.vg";
- type: SWALLOW;
- scale: 1;
- clip_to: "vg_clipper";
- description { state: "default" 0.0;
- fixed: 1 1;
- rel1.to: "left_expand";
- rel2.to: "right_expand";
- }
- description { state: "hidden" 0.0;
- inherit: "default" 0.0;
- visible: 0;
- }
- }
- part { name: "vg_clipper";
- type: RECT;
- clip_to: "clipper";
- description { state: "default" 0.0;
- fixed: 1 1;
- color: 78 97 173 255;
- rel1.to: "elm.swallow.vg";
- rel2.to: "elm.swallow.vg";
- }
- description { state: "disabled" 0.0;
- inherit: "default";
- color: 131 145 201 255;
- }
- }
- part { name: "elm.track.left_hidden";
- type: SPACER;
- scale: 1;
- description { state: "default" 0.0;
- min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
- fixed: 1 1;
- align: 1.0 0.5;
- rel1.relative: 0.0 0.0;
- rel2.relative: 0.0 1.0;
- }
- description { state: "2buttons" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
- }
- }
- part { name: "elm.track.right_hidden";
- type: SPACER;
- scale: 1;
- description { state: "default" 0.0;
- min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
- fixed: 1 1;
- align: 0.0 0.5;
- rel1.relative: 1.0 0.0;
- rel2.relative: 1.0 1.0;
- }
- description { state: "2buttons" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
- }
- }
- part { name: "elm.track.fb";
- type: SPACER;
- scale: 1;
- description { state: "default" 0.0;
- rel1.to: "elm.track.left_hidden";
- rel2.to: "elm.track.right_hidden";
- }
- }
- part { name: "left_expand";
- type: SPACER;
- description { state: "default" 0.0;
- fixed: 1 1;
- align: 1.0 0.5;
- rel1 { to: "left_spacer"; relative: 0.0 0.0; }
- rel2 { to: "left_spacer"; relative: 0.0 1.0; }
- }
- }
- part { name: "right_expand";
- type: SPACER;
- description { state: "default" 0.0;
- fixed: 1 1;
- align: 0.0 0.5;
- rel1 { to: "right_spacer"; relative: 1.0 0.0; }
- rel2 { to: "right_spacer"; relative: 1.0 1.0; }
- }
- }
- part { name: "left_spacer";
- type: SPACER;
- scale: 1;
- description { state: "default" 0.0;
- min: FLOATINGBUTTON_LR_WIDTH 0;
- fixed: 1 1;
- align: 1.0 0.5;
- rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 0.0; }
- rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 1.0; }
- }
- description { state: "expand" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
- }
- }
- part { name: "right_spacer";
- type: SPACER;
- scale: 1;
- description { state: "default" 0.0;
- min: FLOATINGBUTTON_LR_WIDTH 0;
- fixed: 1 1;
- align: 0.0 0.5;
- rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 0.0; }
- rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 1.0; }
- }
- description { state: "expand" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
- }
- }
- part { name: "elm.swallow.box";
- type: SWALLOW;
- scale: 1;
- clip_to: "clipper";
- description { state: "default" 0.0;
- min: 0 0;
- fixed: 1 1;
- align: 0.5 0.5;
- rel1 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
- rel2 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
- }
- description { state: "hidden" 0.0;
- inherit: "default" 0.0;
- visible: 0;
- }
- }
- part { name: "elm.dragable.fb";
- type: RECT;
- scale: 1;
- clip_to: "clipper";
- repeat_events: 1;
- description { state: "default" 0.0;
- min: FLOATINGBUTTON_1BTN_WIDTH FLOATINGBUTTON_HEIGHT;
- fixed: 1 1;
- align: 0.5 0.5;
- rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
- rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
- color: 0 0 0 0;
- }
- description { state: "expand" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
- }
- description { state: "2buttons" 0.0;
- inherit: "default" 0.0;
- min: FLOATINGBUTTON_2BTN_WIDTH FLOATINGBUTTON_HEIGHT;
- }
- description { state: "2buttons_expand" 0.0;
- inherit: "default" 0.0;
- min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
- }
- description { state: "hidden" 0.0;
- inherit: "default" 0.0;
- visible: 0;
- }
- dragable {
- x: 1 1 0;
- y: 0 0 0;
- confine: "elm.track.fb";
- threshold: "elm.threshold.fb";
- }
- }
- part { name : "elm.threshold.fb";
- type: RECT;
- scale: 1;
- mouse_events: 0;
- description { state: "default" 0.0;
- min: 0 FLOATINGBUTTON_HEIGHT;
- fixed: 1 1;
- align: 0.5 0.5;
- rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
- rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
- color: 0 0 0 0;
- }
- }
- part { name: "clipper";
- type: RECT;
- mouse_events: 0;
- description { state: "default" 0.0;
- color: 255 255 255 255;
- }
- }
- }
- programs {
- program {
- signal: "load";
- script {
- custom_state(PART:"left_expand", "default", 0.0);
- custom_state(PART:"right_expand", "default", 0.0);
- custom_state(PART:"elm.threshold.fb", "default", 0.0);
- set_state(PART:"elm.threshold.fb", "custom", 0.0);
- set_int(g_visible, 1);
- }
- }
- program {
- signal: "elm,state,floatingbutton,*,1btn";
- source: "elm";
- script {
- set_state(PART:"elm.track.left_hidden", "default", 0.0);
- set_state(PART:"elm.track.right_hidden", "default", 0.0);
- set_int(g_btns, 1);
- }
- }
- program {
- signal: "elm,state,floatingbutton,*,2btn";
- source: "elm";
- script {
- set_state(PART:"elm.track.left_hidden", "2buttons", 0.0);
- set_state(PART:"elm.track.right_hidden", "2buttons", 0.0);
- set_int(g_btns, 2);
- }
- }
- program {
- signal: "elm,floatingbutton,threshold,update";
- source: "elm";
- script {
- new width, Float:pos;
- new x, y, w, h;
- new x1, y1, w1, h1;
-
- width = get_int(g_width);
- set_state_val(PART:"elm.threshold.fb", STATE_MIN, width, 0);
-
- get_geometry(PART:"elm.track.fb", x, y, w, h);
- get_geometry(PART:"elm.dragable.fb", x1, y1, w1, h1);
-
- pos = ((x1 - x) + float(w1) / 2) / w;
-
- set_state_val(PART:"elm.threshold.fb", STATE_REL1, pos, 0.0);
- set_state_val(PART:"elm.threshold.fb", STATE_REL2, pos, 1.0);
- }
- }
- program { name: "mouse_down";
- signal: "mouse,down,1";
- source: "elm.dragable.fb";
- script {
- new x, y, w, h;
- get_geometry(PART:"elm.dragable.fb", x, y, w, h);
- set_int(g_prev_x, x);
- set_int(mouse_down, 1);
- }
- }
- program { name: "mouse_up";
- signal: "mouse,up,1";
- source: "elm.dragable.fb";
- script {
- set_int(mouse_down, 0);
- }
- }
- program { name: "mouse_move";
- signal: "mouse,move";
- source: "elm.dragable.fb";
- script {
- new prev_x;
- prev_x = get_int(g_prev_x);
-
- if (get_int(mouse_down) == 1) {
- new x, y, w, h;
- new x1, y1, w1, h1;
-
- get_geometry(PART:"elm.dragable.fb", x, y, w, h);
-
- if (prev_x < x)
- {
- get_geometry(PART:"left_expand", x1, y1, w1, h1);
-
- if ((w1 + x - prev_x) < FLOATINGBUTTON_LR_MAX_VARIATION)
- set_state_val(PART:"left_expand", STATE_MIN, (w1 + x - prev_x), 0);
- else
- set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-
- set_state(PART:"left_expand", "custom", 0.0);
-
- new id;
- id = get_int(left_timer);
- cancel_timer(id);
-
- id = timer(0.01, "left_anim_go", 1);
- set_int(left_timer, id);
- }
- else if (prev_x > x)
- {
- get_geometry(PART:"right_expand", x1, y1, w1, h1);
-
- if ((w1 + prev_x - x) < FLOATINGBUTTON_LR_MAX_VARIATION)
- set_state_val(PART:"right_expand", STATE_MIN, (w1 + prev_x - x), 0);
- else
- set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-
- set_state(PART:"right_expand", "custom", 0.0);
-
- new id;
- id = get_int(right_timer);
- cancel_timer(id);
-
- id = timer(0.01, "right_anim_go", 1);
- set_int(right_timer, id);
- }
- set_int(g_prev_x, x);
- }
- }
- }
- program { name: "left_spacer_animation";
- action: STATE_SET "default" 0.0;
- transition: DECEL 0.4;
- target: "left_expand";
- }
- program { name: "right_spacer_animation";
- action: STATE_SET "default" 0.0;
- transition: DECEL 0.4;
- target: "right_expand";
- }
- program { name: "left_spacer_stretch";
- action: STATE_SET "custom" 0.0;
- transition: ACCEL 0.2;
- target: "left_expand";
- after: "left_spacer_animation";
- }
- program { name: "right_spacer_stretch";
- action: STATE_SET "custom" 0.0;
- transition: ACCEL 0.2;
- target: "right_expand";
- after: "right_spacer_animation";
- }
- program { name: "block";
- signal: "elm,state,floatingbutton,block";
- source: "elm";
- script {
- set_mouse_events(PART:"elm.dragable.fb", 0);
- }
- }
- program { name: "unblock";
- signal: "elm,state,floatingbutton,unblock";
- source: "elm";
- script {
- set_mouse_events(PART:"elm.dragable.fb", 1);
- }
- }
- program {
- signal: "elm,state,floatingbutton,freeze";
- source: "elm";
- script {
- set_mask_flags(PART:"elm.dragable.fb", 1);
- }
- }
- program {
- signal: "elm,state,floatingbutton,thaw";
- source: "elm";
- script {
- set_mask_flags(PART:"elm.dragable.fb", 0);
- }
- }
- program {
- signal: "elm,state,show";
- source: "";
- script {
- set_int(g_visible, 1);
- run_program(PROGRAM:"visible");
- }
- }
- program {
- signal: "elm,state,hide";
- source: "";
- script {
- set_int(g_visible, 0);
- run_program(PROGRAM:"hidden");
- }
- }
- program { name: "visible";
- signal: "elm,state,floatingbutton,visible";
- source: "elm";
- script {
- if (get_int(g_visible) == 1) {
- set_state(PART:"elm.swallow.vg", "default", 0.0);
- set_state(PART:"elm.swallow.box", "default", 0.0);
- if (get_int(g_btns) < 2) {
- if (get_int(g_expand) == 0) {
- set_state(PART:"elm.dragable.fb", "default", 0.0);
- }
- else {
- set_state(PART:"elm.dragable.fb", "expand", 0.0);
- }
- }
- else {
- if (get_int(g_expand) == 0) {
- set_state(PART:"elm.dragable.fb", "2buttons", 0.0);
- }
- else {
- set_state(PART:"elm.dragable.fb", "2buttons_expand", 0.0);
- }
- }
- }
- }
- }
- program { name: "hidden";
- signal: "elm,state,floatingbutton,hidden";
- source: "elm";
- script {
- set_state(PART:"elm.swallow.vg", "hidden", 0.0);
- set_state(PART:"elm.swallow.box", "hidden", 0.0);
- set_state(PART:"elm.dragable.fb", "hidden", 0.0);
- }
- }
- program { name: "left_bring_in";
- signal: "elm,action,floatingbutton,left";
- source: "elm";
- script {
- set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
- run_program(PROGRAM:"right_spacer_stretch");
- }
- }
- program { name: "right_bring_in";
- signal: "elm,action,floatingbutton,right";
- source: "elm";
- script {
- set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
- run_program(PROGRAM:"left_spacer_stretch");
- }
- }
- program { name: "move_to_left";
- signal: "elm,state,floatingbutton,left,*";
- source: "elm";
- action: STATE_SET "expand" 0.0;
- target: "left_spacer";
- transition: DECEL 0.4;
- }
- program {
- signal: "elm,state,floatingbutton,left,*";
- source: "elm";
- script {
- set_int(g_expand, 1);
- }
- }
- program { name: "move_to_left_1btn";
- signal: "elm,state,floatingbutton,left,1btn";
- source: "elm";
- action: STATE_SET "expand" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- program { name: "move_to_left_2btn";
- signal: "elm,state,floatingbutton,left,2btn";
- source: "elm";
- action: STATE_SET "2buttons_expand" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- program { name: "move_to_right";
- signal: "elm,state,floatingbutton,right,*";
- source: "elm";
- action: STATE_SET "expand" 0.0;
- target: "right_spacer";
- transition: DECEL 0.4;
- }
- program {
- signal: "elm,state,floatingbutton,right,*";
- source: "elm";
- script {
- set_int(g_expand, 1);
- }
- }
- program { name: "move_to_right_1btn";
- signal: "elm,state,floatingbutton,right,1btn";
- source: "elm";
- action: STATE_SET "expand" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- program { name: "move_to_right_2btn";
- signal: "elm,state,floatingbutton,right,2btn";
- source: "elm";
- action: STATE_SET "2buttons_expand" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- program { name: "move_to_center";
- signal: "elm,state,floatingbutton,center,*";
- source: "elm";
- action: STATE_SET "default" 0.0;
- target: "left_spacer";
- target: "right_spacer";
- transition: DECEL 0.4;
- }
- program {
- signal: "elm,state,floatingbutton,center,*";
- source: "elm";
- script {
- set_int(g_expand, 0);
- }
- }
- program { name: "move_to_center_1btn";
- signal: "elm,state,floatingbutton,center,1btn";
- source: "elm";
- action: STATE_SET "default" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- program { name: "move_to_center_2btn";
- signal: "elm,state,floatingbutton,center,2btn";
- source: "elm";
- action: STATE_SET "2buttons" 0.0;
- target: "elm.dragable.fb";
- transition: DECEL 0.4;
- }
- }
- }
-
- group { name: "elm/floatingbutton/base/white_bg";
- inherit: "elm/floatingbutton/base/default";
- parts {
- part { name: "vg_clipper";
- type: RECT;
- clip_to: "clipper";
- description { state: "default" 0.0;
- fixed: 1 1;
- color: 250 250 250 255;
- rel1.to: "elm.swallow.vg";
- rel2.to: "elm.swallow.vg";
- }
- description { state: "disabled" 0.0;
- inherit: "default";
- color: 250 250 250 77;
- }
- }
- }
- }
+++ /dev/null
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
+++ /dev/null
-SET(HEADER_FILES
- eext_floatingbutton.h
- )
-
-SET(COMMON_HEADERS
- ${COMMON_HEADERS}
- ${HEADER_FILES}
- )
-
-FOREACH(files ${COMMON_HEADERS})
- SET(HEADER_INCS "${HEADER_INCS}#include \"${files}\"\n")
-ENDFOREACH(files)
-
-CONFIGURE_FILE(
- ${COMMON_DIR}/include/efl_extension.h.in ${COMMON_DIR}/include/efl_extension.h
- @ONLY)
-
-SET(HEADER_FILES
- ${HEADER_FILES}
- eext_floatingbutton_common.h
- eext_floatingbutton_legacy.h
- eext_floatingbutton.eo.legacy.h
- eext_floatingbutton_eo.h
- eext_floatingbutton.eo.h
- )
-
-FOREACH(files ${HEADER_FILES})
- GET_FILENAME_COMPONENT(dir ${files} PATH)
- INSTALL(FILES ${files} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
-INSTALL(FILES ${COMMON_DIR}/include/efl_extension.h DESTINATION include/${LIB_NAME})
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-/**
- * @defgroup Floatingbutton Floatingbutton
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- *
- * @brief Widget to add floating area for buttons
- *
- * The Floatingbutton widget is not a real button, but only provides areas
- * where application adds (maximum 2) buttons to.
- *
- * This widget inherits from the Layout one, so that all the Layout functions
- * can be used on it. However, it includes not only visible floating area,
- * but invisible track for moving floating area, so there is a possibility that
- * it works differently from that you intended.
- *
- * Default content parts of the floatingbutton widget that you can use for are:
- * @li "button1" - left area for button
- * @li "button2" - right area for button
- *
- * Floatingbutton can be hidden by siganl emission.
- * @li show - elm_object_signal_emit(fb, "elm,state,show", "");
- * @li hide - elm_object_signal_emit(fb, "elm,state,hide", "");
- */
-
-/**
- * addtogroup Floatingbutton
- * @{
- */
-#include "eext_floatingbutton_common.h"
-#ifdef EFL_EO_API_SUPPORT
-#include "eext_floatingbutton_eo.h"
-#endif
-#ifndef EFL_NOLEGACY_API_SUPPORT
-#include "eext_floatingbutton_legacy.h"
-#endif
-/**
- * @}
- */
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-/**
- * @addtogroup Floatingbutton
- *
- * @{
- */
-
-/**
- * Positions where floatingbutton can be placed on
- */
-typedef enum {
- EEXT_FLOATINGBUTTON_LEFT_OUT = 0, /**< hides in the left, but small handler will show only */
- EEXT_FLOATINGBUTTON_LEFT, /**< shows all of buttons, but lies on the left */
- EEXT_FLOATINGBUTTON_CENTER, /**< shows all of buttons, but lies on the center */
- EEXT_FLOATINGBUTTON_RIGHT, /**< shows all of buttons, but lies on the right */
- EEXT_FLOATINGBUTTON_RIGHT_OUT, /**< hides in the right, but small handler will show only */
- EEXT_FLOATINGBUTTON_LAST /**< indicates the last, do not use this **/
-} Eext_Floatingbutton_Pos;
-
-typedef enum {
- EEXT_FLOATINGBUTTON_MODE_DEFAULT = 0, /**< allows all positions */
- EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES, /**< allows LEFT and RIGHT positions only */
- EEXT_FLOATINGBUTTON_MODE_LAST /**< indicates the last, do not use this **/
-} Eext_Floatingbutton_Mode;
-
-/**
- * @}
- */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "eext_floatingbutton.eo.h"
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-/**
- * @MOBILE_ONLY
- *
- * @brief Add a new floatingbutton to the parent
- *
- * @if MOBILE @since_tizen 2.4
- * @endif
- *
- * @param[in] parent The parent object
- * @return The new object or NULL if it cannot be created
- *
- * @ingroup Floatingbutton
- */
-EAPI Evas_Object *eext_floatingbutton_add(Evas_Object *parent);
-
-#include "eext_floatingbutton.eo.legacy.h"
+++ /dev/null
-add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
-
-SET(LIB_SRCS
- ${LIB_SRCS}
- eext_floatingbutton.c
- )
-SET (ALL_EO_FILES
- eext_floatingbutton.eo
- )
-
-foreach(eo_file ${ALL_EO_FILES})
- string(REPLACE .eo .eo.c out_c_file ${eo_file})
- string(REPLACE .eo .eo.h out_h_file ${eo_file})
- string(REPLACE .eo .eo.legacy.h out_legacy_file ${eo_file})
- string(REPLACE .eo .c c_file ${eo_file})
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file}
- COMMAND /usr/bin/eolian_gen ${eo_file} --eo --legacy --gc -I /usr/share/eolian/include -o ${out_c_file}
- COMMAND /usr/bin/eolian_gen ${eo_file} --eo --gh -I /usr/share/eolian/include -o "../include/${out_h_file}"
- COMMAND /usr/bin/eolian_gen ${eo_file} --legacy --gh -I /usr/share/eolian/include -o "../include/${out_legacy_file}"
- DEPENDS ${eo_file} ${CMAKE_CURRENT_SOURCE_DIR}/*.eo
- COMMENT "Compiling Eo: ${eo_file}, Output eo : ${out_c_file}"
- VERBATIM)
- add_custom_target(target_${eo_file} ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file})
- SET (ALL_EO_TARGETS ${ALL_EO_TARGETS} target_${eo_file})
-endforeach(eo_file)
-
-ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
-ADD_DEPENDENCIES(${LIB_NAME} ${ALL_EO_TARGETS})
-
-ADD_DEFINITIONS("-DEXPORT_API=__attribute__((visibility(\"default\")))")
-PKG_CHECK_MODULES(LIB_PKGS REQUIRED
- elementary
- dlog
- fontconfig
- glib-2.0
- )
-
-FOREACH(flag ${LIB_PKGS_CFLAGS})
- SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
-TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
-
-INSTALL(TARGETS ${LIB_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR})
-#INSTALL(FILES ${ALL_EO_FILES} DESTINATION share/eolian/include/efl-extension)
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#define ELM_INTERNAL_API_ARGESFSDFEFC 1
-
-#include <Eo.h>
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "../../data/HD-inc.edc"
-
-#include <elm_widget.h>
-
-#define MY_CLASS EEXT_FLOATINGBUTTON_CLASS
-
-#define MY_CLASS_NAME "Eext_Floatingbutton"
-#define MY_CLASS_NAME_LEGACY "eext_floatingbutton"
-
-static const char SIG_PRESSED[] = "pressed";
-static const char SIG_UNPRESSED[] = "unpressed";
-
-static const Evas_Smart_Cb_Description _smart_callbacks[] = {
- {SIG_PRESSED, ""},
- {SIG_UNPRESSED, ""},
- {NULL, NULL}
-};
-
-#define EEXT_SCALE_SIZE(x, obj) ((x) / edje_object_base_scale_get(elm_layout_edje_get(obj)) \
- * elm_config_scale_get() \
- * elm_object_scale_get(obj))
-
-#define EEXT_SCALE_SIZE_INVERSE(x, obj) ((x) * edje_object_base_scale_get(elm_layout_edje_get(obj)) \
- / elm_config_scale_get() \
- / elm_object_scale_get(obj))
-
-#define MSG_THRESHOLD 0
-
-static const char *BTN1_PART = "button1";
-static const char *BTN2_PART = "button2";
-static const char *DRAGABLE_PART = "elm.dragable.fb";
-static const char *TRACK_PART = "elm.track.fb";
-
-typedef struct _Eext_Floatingbutton_Data {
-
- Eo *obj;
- Elm_Theme *th;
- Evas_Object *box;
- Evas_Object *vg;
- Efl_VG_Shape *base_shape;
- Ecore_Animator *anim;
-
- Evas_Object *btn1;
- Evas_Object *btn2;
-
- Evas_Coord x;
- int dir;
-
- Eext_Floatingbutton_Mode mode;
- Eext_Floatingbutton_Pos pos;
- double last_pos;
- double pos_table[EEXT_FLOATINGBUTTON_LAST];
- Eina_Bool pos_disabled[EEXT_FLOATINGBUTTON_LAST];
-
- Eina_Bool on_update : 1;
- Eina_Bool mouse_down : 1;
- Eina_Bool block : 1;
- Eina_Bool center : 1;
-
-} Eext_Floatingbutton_Data;
-
-static void
-_signal_emit(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- int count = 0;
- char buf[200];
- Evas_Object *edje = elm_layout_edje_get(obj);
-
- count = !!(sd->btn1) + !!(sd->btn2);
-
- switch (sd->pos)
- {
- case EEXT_FLOATINGBUTTON_LEFT_OUT:
- case EEXT_FLOATINGBUTTON_LEFT:
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,left,%s", ((count >= 2) ? "2btn" : "1btn"));
- edje_object_signal_emit(edje, buf, "elm");
- sd->center = EINA_FALSE;
- break;
- case EEXT_FLOATINGBUTTON_CENTER:
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
- edje_object_signal_emit(edje, buf, "elm");
- sd->center = EINA_TRUE;
- break;
- case EEXT_FLOATINGBUTTON_RIGHT:
- case EEXT_FLOATINGBUTTON_RIGHT_OUT:
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,right,%s", ((count >= 2) ? "2btn" : "1btn"));
- edje_object_signal_emit(edje, buf, "elm");
- sd->center = EINA_FALSE;
- break;
- case EEXT_FLOATINGBUTTON_LAST:
- /* you must not reach here */
- break;
- }
-
- sd->on_update = EINA_TRUE;
-
- edje_object_message_signal_process(edje);
-}
-
-static void
-_pos_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- int count = 0;
- Evas_Coord w, w1;
- Evas_Object *edje = elm_layout_edje_get(obj);
-
- edje_object_part_geometry_get(edje, TRACK_PART, NULL, NULL, &w, NULL);
-
- count = !!(sd->btn1) + !!(sd->btn2);
-
- if (count >= 2) w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_2BTN_WIDTH, obj);
- else w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_1BTN_WIDTH, obj);
-
- sd->pos_table[EEXT_FLOATINGBUTTON_LEFT] = (w1 - EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
- sd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] = (w - w1 * 2 + EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
-}
-
-static void
-_threshold_update(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- Evas_Coord w1;
- Evas_Object *edje = elm_layout_edje_get(obj);
- Edje_Message_Int *msg = calloc(1, sizeof(*msg) + sizeof(int));
-
- if (!msg) return;
-
- edje_object_part_geometry_get(edje, DRAGABLE_PART, NULL, NULL, &w1, NULL);
- w1 = EEXT_SCALE_SIZE_INVERSE(w1, obj);
-
- msg->val = w1 + 30;
- edje_object_message_send(edje, EDJE_MESSAGE_INT, MSG_THRESHOLD, msg);
- free(msg);
-
- elm_layout_signal_emit(obj, "elm,floatingbutton,threshold,update", "elm");
-}
-
-static void
-_box_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- _signal_emit(obj, sd);
- _pos_recalc(obj, sd);
- _threshold_update(obj, sd);
-}
-
-static void
-_vg_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- Eext_Floatingbutton_Data *fbd = data;
- Evas_Coord x, y, w, h;
-
- evas_object_geometry_get(obj, &x, &y, &w, &h);
-
- evas_vg_shape_reset(fbd->base_shape);
- evas_vg_shape_append_rect(fbd->base_shape, 0, 0, w, h,
- EEXT_SCALE_SIZE(FLOATINGBUTTON_LAYOUT_LR_WIDTH, fbd->obj),
- (EEXT_SCALE_SIZE(FLOATINGBUTTON_HEIGHT, fbd->obj)/2));
-}
-
-static Eina_Bool
-_anim_cb(void *data, double pos)
-{
- Eext_Floatingbutton_Data *fbd = data;
- double cur_pos;
- double pivot;
-
- pivot = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.2, 0.0);
-
- if (fbd->pos_table[fbd->pos] > fbd->last_pos)
- cur_pos = fbd->last_pos + (fbd->pos_table[fbd->pos] - fbd->last_pos) * pivot;
- else
- cur_pos = fbd->last_pos - (fbd->last_pos - fbd->pos_table[fbd->pos]) * pivot;
-
- edje_object_part_drag_value_set(elm_layout_edje_get(fbd->obj), DRAGABLE_PART, cur_pos, 0.5);
-
- if (pos >= 1.0)
- fbd->anim = NULL;
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_message_send(void *data)
-{
- Eext_Floatingbutton_Data *fbd = data;
-
- _threshold_update(fbd->obj, fbd);
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_update_pos(Eo *obj, Eext_Floatingbutton_Data *fbd, Eina_Bool anim)
-{
- edje_object_part_drag_value_get(elm_layout_edje_get(obj), DRAGABLE_PART, &fbd->last_pos, NULL);
-
- if (!anim)
- edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
- else
- {
- if (fbd->anim)
- {
- ecore_animator_del(fbd->anim);
- fbd->anim = NULL;
- }
-
- if ((fbd->last_pos - fbd->pos_table[fbd->pos] >= 0.005) ||
- (fbd->last_pos - fbd->pos_table[fbd->pos] <= -0.005))
- fbd->anim = ecore_animator_timeline_add(0.4, _anim_cb, fbd);
- else
- edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
- }
-
- if (!anim || !fbd->on_update)
- _signal_emit(obj, fbd);
-
- fbd->on_update = EINA_FALSE;
-
- if (!anim || fbd->anim)
- ecore_timer_add(0.4, _message_send, fbd);
-}
-
-static void
-_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- _pos_recalc(obj, data);
- _update_pos(obj, data, EINA_FALSE);
-}
-
-static void
-_size_hints_changed_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- Evas_Display_Mode dispmode;
-
- dispmode = evas_object_size_hint_display_mode_get(obj);
-
- if (dispmode == EVAS_DISPLAY_MODE_COMPRESS)
- elm_layout_signal_emit(obj, "elm,state,floatingbutton,hidden", "elm");
- else
- elm_layout_signal_emit(obj, "elm,state,floatingbutton,visible", "elm");
-}
-
-static void
-_on_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- Eext_Floatingbutton_Data *fbd = data;
- Evas_Object *edje = elm_layout_edje_get(obj);
-
- fbd->mouse_down = EINA_TRUE;
-
- edje_object_part_geometry_get(edje, DRAGABLE_PART, &fbd->x, NULL, NULL, NULL);
-
- fbd->dir = 0;
-
- if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
- evas_object_smart_callback_call(obj, SIG_PRESSED, NULL);
-}
-
-static void
-_on_mouse_move(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- Eext_Floatingbutton_Data *fbd = data;
-
- double dx;
-
- if (fbd->mouse_down)
- {
- Evas_Object *edje = elm_layout_edje_get(obj);
-
- if (!fbd->dir)
- {
- Evas_Coord x, finger_size = elm_config_finger_size_get();
-
- edje_object_part_geometry_get(edje, DRAGABLE_PART, &x, NULL, NULL, NULL);
-
- if (x > (fbd->x + finger_size)) fbd->dir = 1;
- else if(x < (fbd->x - finger_size)) fbd->dir = -1;
-
- if (fbd->dir)
- {
- Eina_List *l;
- Evas_Object *btn;
-
- edje_object_signal_emit(edje, "elm,state,floatingbutton,freeze", "elm");
- edje_object_message_signal_process(edje);
-
- l = elm_box_children_get(fbd->box);
- EINA_LIST_FREE(l, btn)
- elm_layout_signal_emit(btn, "elm,state,default", "elm");
- }
- }
-
- if (!fbd->center)
- {
- int count;
- char buf[200];
-
- count = !!(fbd->btn1) + !!(fbd->btn2);
-
- edje_object_part_drag_value_get(edje, DRAGABLE_PART, &dx, NULL);
-
- if ((dx > fbd->pos_table[EEXT_FLOATINGBUTTON_LEFT] + 0.02) &&
- (dx < fbd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] - 0.02))
- {
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
- edje_object_signal_emit(edje, buf, "elm");
- fbd->center = EINA_TRUE;
- }
- }
- }
-}
-
-static void
-_on_mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- Eext_Floatingbutton_Data *fbd = data;
- Evas_Object *edje = elm_layout_edje_get(obj);
- Evas_Coord track_x, track_w, drag_x, drag_w;
- double cur_pos;
- int i;
-
- fbd->mouse_down = EINA_FALSE;
-
- if (fbd->dir)
- {
- edje_object_part_geometry_get(edje, DRAGABLE_PART, &drag_x, NULL, &drag_w, NULL);
- edje_object_part_geometry_get(edje, TRACK_PART, &track_x, NULL, &track_w, NULL);
-
- cur_pos = (drag_x - track_x) / (double)(track_w - drag_w);
-
- if (fbd->dir > 0)
- {
- for (i = EEXT_FLOATINGBUTTON_LEFT_OUT; i < EEXT_FLOATINGBUTTON_RIGHT_OUT; ++i)
- if (!fbd->pos_disabled[i] &&
- cur_pos < (fbd->pos_table[i] + ((i == 1 || i == 2) ? 0.12 : 0)))
- break;
-
- if (i == EEXT_FLOATINGBUTTON_RIGHT_OUT && fbd->pos_disabled[i])
- while (--i > EEXT_FLOATINGBUTTON_LEFT_OUT)
- if (!fbd->pos_disabled[i]) break;
- }
- else
- {
- for (i = EEXT_FLOATINGBUTTON_RIGHT_OUT; i > EEXT_FLOATINGBUTTON_LEFT_OUT; --i)
- if (!fbd->pos_disabled[i] &&
- cur_pos > (fbd->pos_table[i] - ((i == 3 || i == 2) ? 0.12 : 0)))
- break;
-
- if (i == EEXT_FLOATINGBUTTON_LEFT_OUT && fbd->pos_disabled[i])
- while (++i <= EEXT_FLOATINGBUTTON_RIGHT_OUT)
- if (!fbd->pos_disabled[i]) break;
- }
-
- //just for exceptional case.
- if (i == EEXT_FLOATINGBUTTON_LAST) i = EEXT_FLOATINGBUTTON_RIGHT_OUT;
-
- fbd->pos = i;
-
- edje_object_signal_emit(edje, "elm,state,floatingbutton,thaw", "elm");
- }
-
- _update_pos(obj, fbd, EINA_TRUE);
-
- if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
- evas_object_smart_callback_call(obj, SIG_UNPRESSED, NULL);
-}
-
-EOLIAN static void
-_eext_floatingbutton_evas_object_smart_del(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
-
- elm_theme_extension_del(sd->th, EFL_EXTENSION_EDJ);
- elm_theme_free(sd->th);
-}
-
-EOLIAN static void
-_eext_floatingbutton_movement_block_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eina_Bool block)
-{
- char buf[200];
-
- block = !!block;
- sd->block = block;
-
- if (block)
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,block");
- else
- snprintf(buf, sizeof(buf), "elm,state,floatingbutton,unblock");
-
- elm_layout_signal_emit(obj, buf, "elm");
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_movement_block_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
-{
- return sd->block;
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_pos_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
-{
- if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
- return EINA_FALSE;
-
- if ((sd->block) || (sd->pos_disabled[pos]))
- return EINA_FALSE;
-
- sd->pos = pos;
-
- _update_pos(obj, sd, EINA_FALSE);
-
- return EINA_TRUE;
-}
-
-EOLIAN static Eext_Floatingbutton_Pos
-_eext_floatingbutton_pos_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
-{
- return sd->pos;
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_pos_bring_in(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
-{
- if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
- return EINA_FALSE;
-
- if ((sd->block) || (sd->pos_disabled[pos]))
- return EINA_FALSE;
-
- if (sd->pos > pos)
- elm_layout_signal_emit(obj, "elm,action,floatingbutton,left", "elm");
- else if (sd->pos < pos)
- elm_layout_signal_emit(obj, "elm,action,floatingbutton,right", "elm");
-
- edje_object_message_signal_process(elm_layout_edje_get(obj));
-
- sd->pos = pos;
-
- _update_pos(obj, sd, EINA_TRUE);
-
- return EINA_TRUE;
-}
-
-EAPI Evas_Object *
-eext_floatingbutton_add(Evas_Object *parent)
-{
- if (!parent) return NULL;
- Evas_Object *obj = eo_add(MY_CLASS, parent);
-
- return obj;
-}
-
-EOLIAN static Eo *
-_eext_floatingbutton_eo_base_constructor(Eo *obj, Eext_Floatingbutton_Data *sd EINA_UNUSED)
-{
- obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
- eo_do(obj,
- evas_obj_type_set(MY_CLASS_NAME_LEGACY),
- evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
-
- return obj;
-}
-
-EOLIAN static void
-_eext_floatingbutton_evas_object_smart_add(Eo *obj, Eext_Floatingbutton_Data *priv)
-{
- eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
- elm_widget_sub_object_parent_add(obj);
-
- priv->obj = obj;
- priv->pos = EEXT_FLOATINGBUTTON_RIGHT;
-
- priv->th = elm_theme_new();
- elm_theme_ref_set(priv->th, NULL);
- elm_theme_extension_add(priv->th, EFL_EXTENSION_EDJ);
-
- elm_object_theme_set(obj, priv->th);
- elm_layout_theme_set(obj, "floatingbutton", "base", elm_object_style_get(obj));
- evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, priv);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, priv);
-
- elm_layout_signal_callback_add(obj, "mouse,down,1", DRAGABLE_PART, _on_mouse_down, priv);
- elm_layout_signal_callback_add(obj, "mouse,up,1", DRAGABLE_PART, _on_mouse_up, priv);
- elm_layout_signal_callback_add(obj, "mouse,move", DRAGABLE_PART, _on_mouse_move, priv);
-
- priv->vg = evas_object_vg_add(evas_object_evas_get(obj));
- elm_layout_content_set(obj, "elm.swallow.vg", priv->vg);
- Efl_VG *base_root = evas_object_vg_root_node_get(priv->vg);
- priv->base_shape = evas_vg_shape_add(base_root);
- evas_vg_node_color_set(priv->base_shape, 255, 255, 255, 255);
- evas_object_event_callback_add(priv->vg, EVAS_CALLBACK_RESIZE, _vg_resize_cb, priv);
-
- priv->box = elm_box_add(obj);
- elm_box_horizontal_set(priv->box, EINA_TRUE);
- elm_box_padding_set(priv->box, EEXT_SCALE_SIZE(FLOATINGBUTTON_MID_WIDTH, obj), 0);
- elm_object_part_content_set(obj, "elm.swallow.box", priv->box);
-
- priv->block = EINA_FALSE;
-
- priv->pos_table[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0.0;
- priv->pos_table[EEXT_FLOATINGBUTTON_CENTER] = 0.5;
- priv->pos_table[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1.0;
-
- _pos_recalc(obj, priv);
- _update_pos(obj, priv, EINA_FALSE);
-
- _threshold_update(obj, priv);
-}
-
-EOLIAN static void
-_eext_floatingbutton_class_constructor(Eo_Class *klass)
-{
- evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
-}
-
-static void
-_btn_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- Eext_Floatingbutton_Data *fbd = eo_data_scope_get((Eo *)data, EEXT_FLOATINGBUTTON_CLASS);
-
- if (!fbd) return;
-
- elm_box_unpack(fbd->box, obj);
- _box_recalc(data, fbd);
-
- if (fbd->btn1 == obj) fbd->btn1 = NULL;
- else if (fbd->btn2 == obj) fbd->btn2 = NULL;
-
- _update_pos(obj, fbd, EINA_FALSE);
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_elm_container_content_set(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part, Evas_Object *content)
-{
- Eina_Bool int_ret = EINA_FALSE;
- char buf[256];
-
- if ((!part) || (!content)) return int_ret;
-
- if (!strcmp(part, BTN1_PART))
- {
- snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
- elm_object_style_set(content, buf);
-
- if (sd->btn1) evas_object_del(sd->btn1);
-
- sd->btn1 = content;
-
- evas_object_show(sd->btn1);
- elm_box_pack_start(sd->box, content);
-
- evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
- int_ret = EINA_TRUE;
- }
- else if (!strcmp(part, BTN2_PART))
- {
- snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
- elm_object_style_set(content, buf);
-
- if (sd->btn2) evas_object_del(sd->btn2);
-
- sd->btn2 = content;
-
- evas_object_show(sd->btn2);
- elm_box_pack_end(sd->box, content);
-
- evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
- int_ret = EINA_TRUE;
- }
- else
- eo_do_super(obj, MY_CLASS, int_ret = elm_obj_container_content_set(part, content));
-
- _box_recalc(obj, sd);
- _update_pos(obj, sd, EINA_TRUE);
-
- return int_ret;
-}
-
-EOLIAN static Evas_Object *
-_eext_floatingbutton_elm_container_content_get(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
-{
- Evas_Object *ret = NULL;
-
- if (!part) return ret;
-
- if (!strcmp(part, BTN1_PART))
- ret = sd->btn1;
- else if (!strcmp(part, BTN2_PART))
- ret = sd->btn2;
- else
- eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_get(part));
-
- return ret;
-}
-
-EOLIAN static Evas_Object *
-_eext_floatingbutton_elm_container_content_unset(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
-{
- Evas_Object *ret = NULL;
-
- if (!part) return ret;
-
- if (!strcmp(part, BTN1_PART) && sd->btn1)
- {
- elm_box_unpack(sd->box, sd->btn1);
- evas_object_event_callback_del_full(sd->btn1, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
- ret = sd->btn1;
- sd->btn1 = NULL;
- }
- else if (!strcmp(part, BTN2_PART) && sd->btn2)
- {
- elm_box_unpack(sd->box, sd->btn2);
- evas_object_event_callback_del_full(sd->btn2, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
- ret = sd->btn2;
- sd->btn2 = NULL;
- }
- else
- eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_unset(part));
-
- _box_recalc(obj, sd);
- _update_pos(obj, sd, EINA_TRUE);
-
- return ret;
-}
-
-EOLIAN static Elm_Theme_Apply
-_eext_floatingbutton_elm_widget_theme_apply(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
- Elm_Theme_Apply int_ret = ELM_THEME_APPLY_FAILED;
- char buf[256];
-
- eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
- if (!int_ret) return ELM_THEME_APPLY_FAILED;
-
- snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
-
- if (sd->btn1) elm_object_style_set(sd->btn1, buf);
- if (sd->btn2) elm_object_style_set(sd->btn2, buf);
-
- _box_recalc(obj, sd);
-
- return int_ret;
-}
-
-EOLIAN static void
-_eext_floatingbutton_mode_set(Eo *obj,
- Eext_Floatingbutton_Data *sd,
- Eext_Floatingbutton_Mode mode)
-{
- if (sd->mode == mode) return;
-
- if ((mode < EEXT_FLOATINGBUTTON_MODE_DEFAULT) ||
- (mode >= EEXT_FLOATINGBUTTON_MODE_LAST))
- return;
-
- sd->mode = mode;
-
- switch(mode)
- {
- case EEXT_FLOATINGBUTTON_MODE_DEFAULT:
- sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 0;
- break;
- case EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES:
- sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 1;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 1;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
- sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1;
- break;
- case EEXT_FLOATINGBUTTON_MODE_LAST:
- /* you must not reach here */
- break;
- }
-}
-
-EOLIAN static Eext_Floatingbutton_Mode
-_eext_floatingbutton_mode_get(Eo *obj,
- Eext_Floatingbutton_Data *sd)
-{
- return sd->mode;
-}
-
-#include "eext_floatingbutton.eo.c"
+++ /dev/null
-class Eext.Floatingbutton (Elm.Layout) {
- eo_prefix: eext_obj_floatingbutton;
- methods {
- @property pos {
- set {
- [[
- Set the floatingbutton position
-
- The floatingbutton can be moved among predefined positions
- (LEFT_OUT, LEFT, CENTER, RIGHT, RIGHT_OUT),
- eext_floatingbutton_pos_set() moves floatingbutton to a given position immediately
- (without animation).
-
- return EINA_TRUE on success, EINA_FALSE otherwise.
- ]]
- return: bool;
- }
- get {
- [[
- Get the floatingbutton position
-
- return Floatingbutton position with Eext_Floatingbutton_Pos enumeration
-
- see eext_floatingbutton_pos_set()
- ]]
- }
- values {
- pos: Eext_Floatingbutton_Pos; [[ the floatingbutton position ]]
- }
- }
- @property movement_block {
- set {
- [[
- Set whether floatingbutton can be moved or not.
-
- By default, floatingbutton are movable by user interaction.
- ]]
- }
- get {
- [[
- Get movability for a given floatingbutton widget.
-
- return EINA_TRUE, if obj is set to be unmovable,
- EINA_FALSE, if it's movable.
-
- see eext_floatingbutton_movement_block_set()
- ]]
- }
- values {
- block: Eina_Bool; [[ the floatingbutton movability ]]
- }
- }
- @property mode {
- set {
- [[
- Set floatingbutton mode.
-
- Positions where floatingbutton can stop are restrained by mode.
- ]]
- }
- get {
- [[
- Get floatingbutton mode.
-
- see eext_floatingbutton_mode_set()
- ]]
- }
- values {
- mode: Eext_Floatingbutton_Mode; [[ floatingbutton mode ]]
- }
- }
- pos_bring_in {
- [[
- Set the floatingbutton position with animation
-
- Move floatingbutton similar to eext_floatingbutton_pos_set(),
- but with animation.
-
- return EINA_TRUE on success, EINA_FALSE otherwise.
-
- see eext_floatingbutton_pos_set()
- ]]
- return: Eina_Bool;
- params {
- @in pos: const(Eext_Floatingbutton_Pos); [[ the floatingbutton position ]]
- }
- }
- }
- implements {
- class.constructor;
- Eo.Base.constructor;
- Evas.Object_Smart.add;
- Evas.Object_Smart.del;
- Elm.Container.content_set;
- Elm.Container.content_get;
- Elm.Container.content_unset;
- Elm.Widget.theme_apply;
- }
-}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+
+typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
+
+struct _Eext_Event_Mgr
+{
+ Eina_List *obj_events;
+ Evas *e;
+ Evas_Object *key_grab_rect;
+};
+
+typedef struct _Eext_Object_Event
+{
+ Evas_Object *obj;
+ Evas_Object *parent;
+ Eina_List *callbacks;
+ Eina_Bool delete_me : 1;
+ Eina_Bool on_callback : 1;
+} Eext_Object_Event;
+
+typedef struct _Eext_Event_Callback
+{
+ Eext_Callback_Type type;
+ void (*func)(void *data, Evas_Object *obj, void *event_info);
+ void *data;
+} Eext_Event_Callback;
+
+const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
+const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
+const char *EEXT_KEY_BACK = "XF86Back";
+const char *EEXT_KEY_BACK2 = "XF86Stop";
+const char *EEXT_KEY_BACK3 = "Escape";
+const char *EEXT_KEY_MENU = "XF86Menu";
+const char *EEXT_KEY_MENU2 = "XF86Send";
+const char *EEXT_KEY_MENU3 = "Menu";
+
+
+static Eina_List *event_mgrs = NULL;
+
+static void
+_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
+{
+ if (event_mgr->obj_events) return;
+
+ //Redundant Event Mgr. Remove it.
+ evas_object_del(event_mgr->key_grab_rect);
+ event_mgrs = eina_list_remove(event_mgrs, event_mgr);
+ free(event_mgr);
+}
+
+static void
+_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+ Eext_Object_Event *obj_event = data;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+
+ l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
+ if (!l) return;
+
+ event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
+
+ EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
+ obj_event->callbacks = NULL;
+
+ if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+ else free(obj_event);
+
+ _eext_event_mgr_del(event_mgr);
+}
+
+static int
+_eext_layer_sort_cb(const void *data1, const void *data2)
+{
+ const Eext_Object_Event *obj_event = data1;
+ const Eext_Object_Event *obj_event2 = data2;
+
+ //1. Layer Compare
+ int layer1 = evas_object_layer_get(obj_event->obj);
+ int layer2 = evas_object_layer_get(obj_event2->obj);
+
+ return (layer1 < layer2) ? -1 : 1;
+}
+
+static Evas_Object *
+_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
+{
+ Evas_Object *temp;
+ Evas_Object *parent;
+ Eina_List *l, *l_next;
+ Eext_Object_Event *obj_event;
+ Eina_List *_candidates = *candidates;
+ Eina_Bool found = EINA_FALSE;
+
+ //Get the top parent lists
+ EINA_LIST_FOREACH(_candidates, l, obj_event)
+ {
+ temp = obj_event->obj;
+ parent = obj_event->obj;
+ while (temp)
+ {
+ parent = temp;
+ temp = evas_object_smart_parent_get(temp);
+ }
+ obj_event->parent = parent;
+ }
+
+ //Leave only parent candidates.
+ parent = evas_object_top_get(e);
+
+ while (parent)
+ {
+ EINA_LIST_FOREACH(_candidates, l, obj_event)
+ {
+ if (parent == obj_event->parent)
+ {
+ found = EINA_TRUE;
+ obj_event->parent = NULL;
+ }
+ }
+ if (found) break;
+ parent = evas_object_below_get(parent);
+ }
+
+ //Redundant parents (no candidates)
+ EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
+ {
+ if (!obj_event->parent) continue;
+ _candidates = eina_list_remove_list(_candidates, l);
+ }
+
+ *candidates = _candidates;
+ return parent;
+}
+
+static Eext_Object_Event *
+_eext_find_event_target(Eina_List *candidates, Evas_Object *parent, Eext_Callback_Type type)
+{
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l, *ll;
+ Evas_Object *obj;
+ Eina_List *members = NULL;
+ Eext_Event_Callback *callback;
+
+ if (eo_isa(parent, EVAS_OBJECT_SMART_CLASS))
+ members = evas_object_smart_members_get(parent);
+
+ if (members)
+ {
+ EINA_LIST_REVERSE_FOREACH(members, l, obj)
+ {
+ obj_event = _eext_find_event_target(candidates, obj, type);
+ //got you!
+ if (obj_event)
+ {
+ EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
+ {
+ if (callback->type == type)
+ {
+ eina_list_free(members);
+ return obj_event;
+ }
+ }
+ }
+ }
+ eina_list_free(members);
+ }
+
+ EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
+ {
+ //got you!
+ if (parent == obj_event->obj)
+ {
+ EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
+ {
+ if (callback->type == type)
+ return obj_event;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static Eext_Object_Event *
+_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr, Eext_Callback_Type type)
+{
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l, *l_next;
+ Eina_List *candidates = NULL;
+ Evas_Object *parent;
+ int top_layer;
+ Eina_Bool invisible;
+
+ //1. filter the invisible objs
+ EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
+ {
+ parent = obj_event->obj;
+ invisible = EINA_FALSE;
+
+ while (parent)
+ {
+ if (!evas_object_visible_get(parent))
+ {
+ invisible = EINA_TRUE;
+ break;
+ }
+ parent = evas_object_smart_parent_get(parent);
+ }
+ if (invisible) continue;
+ candidates = eina_list_append(candidates, obj_event);
+ }
+ if (!candidates) return NULL; //no visible objects.
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //2.1. sort by layer order
+ candidates = eina_list_sort(candidates, eina_list_count(candidates),
+ _eext_layer_sort_cb);
+
+ //2.2. leave the only top layer
+ obj_event = eina_list_data_get(eina_list_last(candidates));
+ top_layer = evas_object_layer_get(obj_event->obj);
+
+ EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
+ {
+ if (evas_object_layer_get(obj_event->obj) < top_layer)
+ candidates = eina_list_remove_list(candidates, l);
+ }
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //3. find the top parent candidate.
+ parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //4. find the target in this parent tree.
+ obj_event = _eext_find_event_target(candidates, parent, type);
+ eina_list_free(candidates);
+ return obj_event;
+
+found:
+ obj_event = eina_list_data_get(candidates);
+ eina_list_free(candidates);
+ return obj_event;
+}
+
+static void
+_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ Eext_Event_Mgr *event_mgr = data;
+ Eext_Object_Event *obj_event;
+ Eext_Event_Callback *callback;
+ Eext_Callback_Type type;
+ Eina_List *l;
+
+ if (!strcmp(ev->keyname, EEXT_KEY_BACK) ||
+ !strcmp(ev->keyname, EEXT_KEY_BACK2) ||
+ !strcmp(ev->keyname, EEXT_KEY_BACK3))
+ type = EEXT_CALLBACK_BACK;
+ else if (!strcmp(ev->keyname, EEXT_KEY_MENU) ||
+ !strcmp(ev->keyname, EEXT_KEY_MENU2) ||
+ !strcmp(ev->keyname, EEXT_KEY_MENU3))
+ type = EEXT_CALLBACK_MORE;
+ else return;
+
+ obj_event = _eext_top_obj_event_find(event_mgr, type);
+ if (!obj_event) return;
+
+ obj_event->on_callback = EINA_TRUE;
+ EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
+ {
+ if (callback->type != type) continue;
+ callback->func(callback->data, obj_event->obj, (void*) type);
+ if (obj_event->delete_me) break;
+ }
+ if (obj_event->delete_me) free(obj_event);
+ else obj_event->on_callback = EINA_FALSE;
+}
+
+static void
+_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
+{
+ Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
+
+ evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
+ _eext_key_grab_rect_key_up_cb, event_mgr);
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab BACK KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab BACK KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab BACK KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab MENU KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab MENU KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE))
+ LOGE("Failed to grab MENU KEY\n");
+
+ event_mgr->key_grab_rect = key_grab_rect;
+}
+
+static Eext_Event_Mgr *
+_eext_event_mgr_new(Evas *e)
+{
+ Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
+ if (!event_mgr)
+ {
+ LOGE("Failed to allocate event manager");
+ return NULL;
+ }
+ event_mgr->e = e;
+ _eext_key_grab_obj_create(event_mgr);
+
+ return event_mgr;
+}
+
+EAPI void *
+eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
+{
+ Eext_Object_Event *obj_event;
+ Eext_Event_Mgr *event_mgr;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+ void *data;
+
+ //Check the validation
+ event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+ obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+ if (!event_mgr || !obj_event)
+ {
+ LOGW("This object(%p) hasn't been registered before", obj);
+ return NULL;
+ }
+
+ //Remove the callback data
+ EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
+ {
+ if ((callback->func == func) && (callback->type == type)) break;
+ }
+
+ if (!callback)
+ {
+ LOGW("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
+ return NULL;
+ }
+
+ data = callback->data;
+ obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
+ free(callback);
+
+ //This object is not managed anymore.
+ if (!obj_event->callbacks)
+ {
+ evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
+ evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
+ Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
+ obj_event);
+ if (l)
+ event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
+ l);
+ if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+ else free(obj_event);
+
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
+ }
+
+ _eext_event_mgr_del(event_mgr);
+
+ return data;
+}
+
+EAPI void
+eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
+{
+ Eext_Event_Mgr *event_mgr;
+ Evas *e;
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+ Eina_Bool new_event_mgr = EINA_TRUE;
+
+ //Check the registered event manager for this Evas.
+ e = evas_object_evas_get(obj);
+
+ EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
+ {
+ if (event_mgr->e == e)
+ {
+ new_event_mgr = EINA_FALSE;
+ break;
+ }
+ }
+
+ //New Evas comes. Create new event manager for this Evas.
+ if (new_event_mgr)
+ {
+ if (!(event_mgr = _eext_event_mgr_new(e))) return;
+ event_mgrs = eina_list_append(event_mgrs, event_mgr);
+ }
+
+ obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+ //New Object Event. Probably user adds eext_object_event_callback first time.
+ if (!obj_event)
+ {
+ obj_event = calloc(1, sizeof(Eext_Object_Event));
+ if (!obj_event)
+ {
+ LOGE("Failed to allocate object event");
+ return;
+ }
+ evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
+ evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+ _eext_object_del_cb,
+ obj_event);
+ event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
+ obj_event);
+ obj_event->obj = obj;
+ }
+
+ //Append this callback.
+ callback = calloc(1, sizeof(Eext_Event_Callback));
+ if (!callback)
+ {
+ LOGE("Failed to allocate event callback");
+ return;
+ }
+ callback->type = type;
+ callback->func = func;
+ callback->data = data;
+
+ obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+
+/*===========================================================================*
+ * Local *
+ *===========================================================================*/
+
+static const char *
+_magic_string_get(eext_magic m)
+{
+ switch (m) {
+ case EEXT_MAGIC_NONE:
+ return "None (Freed Object)";
+
+ default:
+ return "<UNKNOWN>";
+ }
+}
+
+__CONSTRUCTOR__ static void
+eext_mod_init(void)
+{
+}
+
+__DESTRUCTOR__ static void
+eext_mod_shutdown(void)
+{
+}
+
+
+/*===========================================================================*
+ * Global *
+ *===========================================================================*/
+
+void
+_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
+{
+ LOGE("\n*** MAGIC FAIL (%s) ***\n", fname);
+
+ if (!d)
+ LOGE(" Input handle pointer is NULL!");
+ else if (m == EEXT_MAGIC_NONE)
+ LOGE(" Input handle has already been freed!");
+ else if (m != req_m)
+ LOGE(" Input handle is wrong type\n"
+ " Expected: %08x - %s\n"
+ " Supplied: %08x - %s",
+ (unsigned int)req_m, _magic_string_get(req_m),
+ (unsigned int)m, _magic_string_get(m));
+
+ gchar **envp = g_get_environ();
+ if (g_environ_getenv(envp, "EEXT_ERROR_ABORT")) abort();
+}
+
+/*===========================================================================*
+ * API *
+ *===========================================================================*/
+#if 0 //This API will be not used. For history, keep this codes
+
+EAPI tzsh_native_window
+eext_win_tzsh_native_window_get(const Elm_Win *obj)
+{
+ Evas *e = evas_object_evas_get(obj);
+ Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
+ const char *engine_name = ecore_evas_engine_name_get(ee);
+
+ if (strcmp(elm_object_widget_type_get(obj), "Elm_Win"))
+ {
+ LOGE(" Input object is not elm_win widget");
+ return 0;
+ }
+ if (engine_name &&
+ ((!strcmp(engine_name, "opengl_x11")) ||
+ (!strcmp(engine_name, "software_x11"))))
+ return (tzsh_native_window) elm_win_xwindow_get(obj);
+#ifdef HAVE_ELEMENTARY_WAYLAND
+ else if (engine_name &&
+ ((!strcmp(engine_name, "wayland_shm")) ||
+ (!strcmp(engine_name, "wayland_egl"))))
+ {
+ Ecore_Wl_Window wl_win;
+ wl_win = elm_win_wl_window_get(obj);
+ return (tzsh_native_window)ecore_wl_window_surface_get(wl_win);
+ }
+#endif
+ LOGE(" Do not support %s window system", engine_name);
+ return 0;
+}
+#endif
+
+EAPI Eina_Bool
+eext_win_keygrab_set(Elm_Win *obj, const char *key)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+ if (!ret)
+ LOGE(" Can't set keygrab of [%s].", key);
+ return ret;
+}
+
+EAPI Eina_Bool
+eext_win_keygrab_unset(Elm_Win *obj, const char *key)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = elm_win_keygrab_unset(obj, key, 0, 0);
+ if (!ret)
+ LOGE(" Can't unset keygrab of [%s].", key);
+ return ret;
+}
--- /dev/null
+add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
+
+SET(LIB_SRCS
+ ${LIB_SRCS}
+ eext_floatingbutton.c
+ )
+SET (ALL_EO_FILES
+ eext_floatingbutton.eo
+ )
+
+foreach(eo_file ${ALL_EO_FILES})
+ string(REPLACE .eo .eo.c out_c_file ${eo_file})
+ string(REPLACE .eo .eo.h out_h_file ${eo_file})
+ string(REPLACE .eo .eo.legacy.h out_legacy_file ${eo_file})
+ string(REPLACE .eo .c c_file ${eo_file})
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file}
+ COMMAND /usr/bin/eolian_gen ${eo_file} --eo --legacy --gc -I /usr/share/eolian/include -o ${out_c_file}
+ COMMAND /usr/bin/eolian_gen ${eo_file} --eo --gh -I /usr/share/eolian/include -o "../include/${out_h_file}"
+ COMMAND /usr/bin/eolian_gen ${eo_file} --legacy --gh -I /usr/share/eolian/include -o "../include/${out_legacy_file}"
+ DEPENDS ${eo_file} ${CMAKE_CURRENT_SOURCE_DIR}/*.eo
+ COMMENT "Compiling Eo: ${eo_file}, Output eo : ${out_c_file}"
+ VERBATIM)
+ add_custom_target(target_${eo_file} ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file})
+ SET (ALL_EO_TARGETS ${ALL_EO_TARGETS} target_${eo_file})
+endforeach(eo_file)
+
+ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
+ADD_DEPENDENCIES(${LIB_NAME} ${ALL_EO_TARGETS})
+
+ADD_DEFINITIONS("-DEXPORT_API=__attribute__((visibility(\"default\")))")
+PKG_CHECK_MODULES(LIB_PKGS REQUIRED
+ elementary
+ dlog
+ fontconfig
+ glib-2.0
+ )
+
+FOREACH(flag ${LIB_PKGS_CFLAGS})
+ SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
+TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
+
+INSTALL(TARGETS ${LIB_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR})
+#INSTALL(FILES ${ALL_EO_FILES} DESTINATION share/eolian/include/efl-extension)
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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.
+ */
+
+#define ELM_INTERNAL_API_ARGESFSDFEFC 1
+
+#include <Eo.h>
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "../../data/HD-inc.edc"
+
+#include <elm_widget.h>
+
+#define MY_CLASS EEXT_FLOATINGBUTTON_CLASS
+
+#define MY_CLASS_NAME "Eext_Floatingbutton"
+#define MY_CLASS_NAME_LEGACY "eext_floatingbutton"
+
+static const char SIG_PRESSED[] = "pressed";
+static const char SIG_UNPRESSED[] = "unpressed";
+
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
+ {SIG_PRESSED, ""},
+ {SIG_UNPRESSED, ""},
+ {NULL, NULL}
+};
+
+#define EEXT_SCALE_SIZE(x, obj) ((x) / edje_object_base_scale_get(elm_layout_edje_get(obj)) \
+ * elm_config_scale_get() \
+ * elm_object_scale_get(obj))
+
+#define EEXT_SCALE_SIZE_INVERSE(x, obj) ((x) * edje_object_base_scale_get(elm_layout_edje_get(obj)) \
+ / elm_config_scale_get() \
+ / elm_object_scale_get(obj))
+
+#define MSG_THRESHOLD 0
+
+static const char *BTN1_PART = "button1";
+static const char *BTN2_PART = "button2";
+static const char *DRAGABLE_PART = "elm.dragable.fb";
+static const char *TRACK_PART = "elm.track.fb";
+
+typedef struct _Eext_Floatingbutton_Data {
+
+ Eo *obj;
+ Elm_Theme *th;
+ Evas_Object *box;
+ Evas_Object *vg;
+ Efl_VG_Shape *base_shape;
+ Ecore_Animator *anim;
+
+ Evas_Object *btn1;
+ Evas_Object *btn2;
+
+ Evas_Coord x;
+ int dir;
+
+ Eext_Floatingbutton_Mode mode;
+ Eext_Floatingbutton_Pos pos;
+ double last_pos;
+ double pos_table[EEXT_FLOATINGBUTTON_LAST];
+ Eina_Bool pos_disabled[EEXT_FLOATINGBUTTON_LAST];
+
+ Eina_Bool on_update : 1;
+ Eina_Bool mouse_down : 1;
+ Eina_Bool block : 1;
+ Eina_Bool center : 1;
+
+} Eext_Floatingbutton_Data;
+
+static void
+_signal_emit(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ int count = 0;
+ char buf[200];
+ Evas_Object *edje = elm_layout_edje_get(obj);
+
+ count = !!(sd->btn1) + !!(sd->btn2);
+
+ switch (sd->pos)
+ {
+ case EEXT_FLOATINGBUTTON_LEFT_OUT:
+ case EEXT_FLOATINGBUTTON_LEFT:
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,left,%s", ((count >= 2) ? "2btn" : "1btn"));
+ edje_object_signal_emit(edje, buf, "elm");
+ sd->center = EINA_FALSE;
+ break;
+ case EEXT_FLOATINGBUTTON_CENTER:
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
+ edje_object_signal_emit(edje, buf, "elm");
+ sd->center = EINA_TRUE;
+ break;
+ case EEXT_FLOATINGBUTTON_RIGHT:
+ case EEXT_FLOATINGBUTTON_RIGHT_OUT:
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,right,%s", ((count >= 2) ? "2btn" : "1btn"));
+ edje_object_signal_emit(edje, buf, "elm");
+ sd->center = EINA_FALSE;
+ break;
+ case EEXT_FLOATINGBUTTON_LAST:
+ /* you must not reach here */
+ break;
+ }
+
+ sd->on_update = EINA_TRUE;
+
+ edje_object_message_signal_process(edje);
+}
+
+static void
+_pos_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ int count = 0;
+ Evas_Coord w, w1;
+ Evas_Object *edje = elm_layout_edje_get(obj);
+
+ edje_object_part_geometry_get(edje, TRACK_PART, NULL, NULL, &w, NULL);
+
+ count = !!(sd->btn1) + !!(sd->btn2);
+
+ if (count >= 2) w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_2BTN_WIDTH, obj);
+ else w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_1BTN_WIDTH, obj);
+
+ sd->pos_table[EEXT_FLOATINGBUTTON_LEFT] = (w1 - EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
+ sd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] = (w - w1 * 2 + EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
+}
+
+static void
+_threshold_update(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ Evas_Coord w1;
+ Evas_Object *edje = elm_layout_edje_get(obj);
+ Edje_Message_Int *msg = calloc(1, sizeof(*msg) + sizeof(int));
+
+ if (!msg) return;
+
+ edje_object_part_geometry_get(edje, DRAGABLE_PART, NULL, NULL, &w1, NULL);
+ w1 = EEXT_SCALE_SIZE_INVERSE(w1, obj);
+
+ msg->val = w1 + 30;
+ edje_object_message_send(edje, EDJE_MESSAGE_INT, MSG_THRESHOLD, msg);
+ free(msg);
+
+ elm_layout_signal_emit(obj, "elm,floatingbutton,threshold,update", "elm");
+}
+
+static void
+_box_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ _signal_emit(obj, sd);
+ _pos_recalc(obj, sd);
+ _threshold_update(obj, sd);
+}
+
+static void
+_vg_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ evas_vg_shape_reset(fbd->base_shape);
+ evas_vg_shape_append_rect(fbd->base_shape, 0, 0, w, h,
+ EEXT_SCALE_SIZE(FLOATINGBUTTON_LAYOUT_LR_WIDTH, fbd->obj),
+ (EEXT_SCALE_SIZE(FLOATINGBUTTON_HEIGHT, fbd->obj)/2));
+}
+
+static Eina_Bool
+_anim_cb(void *data, double pos)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+ double cur_pos;
+ double pivot;
+
+ pivot = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.2, 0.0);
+
+ if (fbd->pos_table[fbd->pos] > fbd->last_pos)
+ cur_pos = fbd->last_pos + (fbd->pos_table[fbd->pos] - fbd->last_pos) * pivot;
+ else
+ cur_pos = fbd->last_pos - (fbd->last_pos - fbd->pos_table[fbd->pos]) * pivot;
+
+ edje_object_part_drag_value_set(elm_layout_edje_get(fbd->obj), DRAGABLE_PART, cur_pos, 0.5);
+
+ if (pos >= 1.0)
+ fbd->anim = NULL;
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_message_send(void *data)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+
+ _threshold_update(fbd->obj, fbd);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_update_pos(Eo *obj, Eext_Floatingbutton_Data *fbd, Eina_Bool anim)
+{
+ edje_object_part_drag_value_get(elm_layout_edje_get(obj), DRAGABLE_PART, &fbd->last_pos, NULL);
+
+ if (!anim)
+ edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
+ else
+ {
+ if (fbd->anim)
+ {
+ ecore_animator_del(fbd->anim);
+ fbd->anim = NULL;
+ }
+
+ if ((fbd->last_pos - fbd->pos_table[fbd->pos] >= 0.005) ||
+ (fbd->last_pos - fbd->pos_table[fbd->pos] <= -0.005))
+ fbd->anim = ecore_animator_timeline_add(0.4, _anim_cb, fbd);
+ else
+ edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
+ }
+
+ if (!anim || !fbd->on_update)
+ _signal_emit(obj, fbd);
+
+ fbd->on_update = EINA_FALSE;
+
+ if (!anim || fbd->anim)
+ ecore_timer_add(0.4, _message_send, fbd);
+}
+
+static void
+_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ _pos_recalc(obj, data);
+ _update_pos(obj, data, EINA_FALSE);
+}
+
+static void
+_size_hints_changed_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Display_Mode dispmode;
+
+ dispmode = evas_object_size_hint_display_mode_get(obj);
+
+ if (dispmode == EVAS_DISPLAY_MODE_COMPRESS)
+ elm_layout_signal_emit(obj, "elm,state,floatingbutton,hidden", "elm");
+ else
+ elm_layout_signal_emit(obj, "elm,state,floatingbutton,visible", "elm");
+}
+
+static void
+_on_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+ Evas_Object *edje = elm_layout_edje_get(obj);
+
+ fbd->mouse_down = EINA_TRUE;
+
+ edje_object_part_geometry_get(edje, DRAGABLE_PART, &fbd->x, NULL, NULL, NULL);
+
+ fbd->dir = 0;
+
+ if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
+ evas_object_smart_callback_call(obj, SIG_PRESSED, NULL);
+}
+
+static void
+_on_mouse_move(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+
+ double dx;
+
+ if (fbd->mouse_down)
+ {
+ Evas_Object *edje = elm_layout_edje_get(obj);
+
+ if (!fbd->dir)
+ {
+ Evas_Coord x, finger_size = elm_config_finger_size_get();
+
+ edje_object_part_geometry_get(edje, DRAGABLE_PART, &x, NULL, NULL, NULL);
+
+ if (x > (fbd->x + finger_size)) fbd->dir = 1;
+ else if(x < (fbd->x - finger_size)) fbd->dir = -1;
+
+ if (fbd->dir)
+ {
+ Eina_List *l;
+ Evas_Object *btn;
+
+ edje_object_signal_emit(edje, "elm,state,floatingbutton,freeze", "elm");
+ edje_object_message_signal_process(edje);
+
+ l = elm_box_children_get(fbd->box);
+ EINA_LIST_FREE(l, btn)
+ elm_layout_signal_emit(btn, "elm,state,default", "elm");
+ }
+ }
+
+ if (!fbd->center)
+ {
+ int count;
+ char buf[200];
+
+ count = !!(fbd->btn1) + !!(fbd->btn2);
+
+ edje_object_part_drag_value_get(edje, DRAGABLE_PART, &dx, NULL);
+
+ if ((dx > fbd->pos_table[EEXT_FLOATINGBUTTON_LEFT] + 0.02) &&
+ (dx < fbd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] - 0.02))
+ {
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
+ edje_object_signal_emit(edje, buf, "elm");
+ fbd->center = EINA_TRUE;
+ }
+ }
+ }
+}
+
+static void
+_on_mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Eext_Floatingbutton_Data *fbd = data;
+ Evas_Object *edje = elm_layout_edje_get(obj);
+ Evas_Coord track_x, track_w, drag_x, drag_w;
+ double cur_pos;
+ int i;
+
+ fbd->mouse_down = EINA_FALSE;
+
+ if (fbd->dir)
+ {
+ edje_object_part_geometry_get(edje, DRAGABLE_PART, &drag_x, NULL, &drag_w, NULL);
+ edje_object_part_geometry_get(edje, TRACK_PART, &track_x, NULL, &track_w, NULL);
+
+ cur_pos = (drag_x - track_x) / (double)(track_w - drag_w);
+
+ if (fbd->dir > 0)
+ {
+ for (i = EEXT_FLOATINGBUTTON_LEFT_OUT; i < EEXT_FLOATINGBUTTON_RIGHT_OUT; ++i)
+ if (!fbd->pos_disabled[i] &&
+ cur_pos < (fbd->pos_table[i] + ((i == 1 || i == 2) ? 0.12 : 0)))
+ break;
+
+ if (i == EEXT_FLOATINGBUTTON_RIGHT_OUT && fbd->pos_disabled[i])
+ while (--i > EEXT_FLOATINGBUTTON_LEFT_OUT)
+ if (!fbd->pos_disabled[i]) break;
+ }
+ else
+ {
+ for (i = EEXT_FLOATINGBUTTON_RIGHT_OUT; i > EEXT_FLOATINGBUTTON_LEFT_OUT; --i)
+ if (!fbd->pos_disabled[i] &&
+ cur_pos > (fbd->pos_table[i] - ((i == 3 || i == 2) ? 0.12 : 0)))
+ break;
+
+ if (i == EEXT_FLOATINGBUTTON_LEFT_OUT && fbd->pos_disabled[i])
+ while (++i <= EEXT_FLOATINGBUTTON_RIGHT_OUT)
+ if (!fbd->pos_disabled[i]) break;
+ }
+
+ //just for exceptional case.
+ if (i == EEXT_FLOATINGBUTTON_LAST) i = EEXT_FLOATINGBUTTON_RIGHT_OUT;
+
+ fbd->pos = i;
+
+ edje_object_signal_emit(edje, "elm,state,floatingbutton,thaw", "elm");
+ }
+
+ _update_pos(obj, fbd, EINA_TRUE);
+
+ if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
+ evas_object_smart_callback_call(obj, SIG_UNPRESSED, NULL);
+}
+
+EOLIAN static void
+_eext_floatingbutton_evas_object_smart_del(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
+
+ elm_theme_extension_del(sd->th, EFL_EXTENSION_EDJ);
+ elm_theme_free(sd->th);
+}
+
+EOLIAN static void
+_eext_floatingbutton_movement_block_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eina_Bool block)
+{
+ char buf[200];
+
+ block = !!block;
+ sd->block = block;
+
+ if (block)
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,block");
+ else
+ snprintf(buf, sizeof(buf), "elm,state,floatingbutton,unblock");
+
+ elm_layout_signal_emit(obj, buf, "elm");
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_movement_block_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
+{
+ return sd->block;
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_pos_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
+{
+ if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
+ return EINA_FALSE;
+
+ if ((sd->block) || (sd->pos_disabled[pos]))
+ return EINA_FALSE;
+
+ sd->pos = pos;
+
+ _update_pos(obj, sd, EINA_FALSE);
+
+ return EINA_TRUE;
+}
+
+EOLIAN static Eext_Floatingbutton_Pos
+_eext_floatingbutton_pos_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
+{
+ return sd->pos;
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_pos_bring_in(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
+{
+ if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
+ return EINA_FALSE;
+
+ if ((sd->block) || (sd->pos_disabled[pos]))
+ return EINA_FALSE;
+
+ if (sd->pos > pos)
+ elm_layout_signal_emit(obj, "elm,action,floatingbutton,left", "elm");
+ else if (sd->pos < pos)
+ elm_layout_signal_emit(obj, "elm,action,floatingbutton,right", "elm");
+
+ edje_object_message_signal_process(elm_layout_edje_get(obj));
+
+ sd->pos = pos;
+
+ _update_pos(obj, sd, EINA_TRUE);
+
+ return EINA_TRUE;
+}
+
+EAPI Evas_Object *
+eext_floatingbutton_add(Evas_Object *parent)
+{
+ if (!parent) return NULL;
+ Evas_Object *obj = eo_add(MY_CLASS, parent);
+
+ return obj;
+}
+
+EOLIAN static Eo *
+_eext_floatingbutton_eo_base_constructor(Eo *obj, Eext_Floatingbutton_Data *sd EINA_UNUSED)
+{
+ obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
+ eo_do(obj,
+ evas_obj_type_set(MY_CLASS_NAME_LEGACY),
+ evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
+
+ return obj;
+}
+
+EOLIAN static void
+_eext_floatingbutton_evas_object_smart_add(Eo *obj, Eext_Floatingbutton_Data *priv)
+{
+ eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
+ elm_widget_sub_object_parent_add(obj);
+
+ priv->obj = obj;
+ priv->pos = EEXT_FLOATINGBUTTON_RIGHT;
+
+ priv->th = elm_theme_new();
+ elm_theme_ref_set(priv->th, NULL);
+ elm_theme_extension_add(priv->th, EFL_EXTENSION_EDJ);
+
+ elm_object_theme_set(obj, priv->th);
+ elm_layout_theme_set(obj, "floatingbutton", "base", elm_object_style_get(obj));
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, priv);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, priv);
+
+ elm_layout_signal_callback_add(obj, "mouse,down,1", DRAGABLE_PART, _on_mouse_down, priv);
+ elm_layout_signal_callback_add(obj, "mouse,up,1", DRAGABLE_PART, _on_mouse_up, priv);
+ elm_layout_signal_callback_add(obj, "mouse,move", DRAGABLE_PART, _on_mouse_move, priv);
+
+ priv->vg = evas_object_vg_add(evas_object_evas_get(obj));
+ elm_layout_content_set(obj, "elm.swallow.vg", priv->vg);
+ Efl_VG *base_root = evas_object_vg_root_node_get(priv->vg);
+ priv->base_shape = evas_vg_shape_add(base_root);
+ evas_vg_node_color_set(priv->base_shape, 255, 255, 255, 255);
+ evas_object_event_callback_add(priv->vg, EVAS_CALLBACK_RESIZE, _vg_resize_cb, priv);
+
+ priv->box = elm_box_add(obj);
+ elm_box_horizontal_set(priv->box, EINA_TRUE);
+ elm_box_padding_set(priv->box, EEXT_SCALE_SIZE(FLOATINGBUTTON_MID_WIDTH, obj), 0);
+ elm_object_part_content_set(obj, "elm.swallow.box", priv->box);
+
+ priv->block = EINA_FALSE;
+
+ priv->pos_table[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0.0;
+ priv->pos_table[EEXT_FLOATINGBUTTON_CENTER] = 0.5;
+ priv->pos_table[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1.0;
+
+ _pos_recalc(obj, priv);
+ _update_pos(obj, priv, EINA_FALSE);
+
+ _threshold_update(obj, priv);
+}
+
+EOLIAN static void
+_eext_floatingbutton_class_constructor(Eo_Class *klass)
+{
+ evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
+}
+
+static void
+_btn_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Eext_Floatingbutton_Data *fbd = eo_data_scope_get((Eo *)data, EEXT_FLOATINGBUTTON_CLASS);
+
+ if (!fbd) return;
+
+ elm_box_unpack(fbd->box, obj);
+ _box_recalc(data, fbd);
+
+ if (fbd->btn1 == obj) fbd->btn1 = NULL;
+ else if (fbd->btn2 == obj) fbd->btn2 = NULL;
+
+ _update_pos(obj, fbd, EINA_FALSE);
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_elm_container_content_set(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part, Evas_Object *content)
+{
+ Eina_Bool int_ret = EINA_FALSE;
+ char buf[256];
+
+ if ((!part) || (!content)) return int_ret;
+
+ if (!strcmp(part, BTN1_PART))
+ {
+ snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+ elm_object_style_set(content, buf);
+
+ if (sd->btn1) evas_object_del(sd->btn1);
+
+ sd->btn1 = content;
+
+ evas_object_show(sd->btn1);
+ elm_box_pack_start(sd->box, content);
+
+ evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+ int_ret = EINA_TRUE;
+ }
+ else if (!strcmp(part, BTN2_PART))
+ {
+ snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+ elm_object_style_set(content, buf);
+
+ if (sd->btn2) evas_object_del(sd->btn2);
+
+ sd->btn2 = content;
+
+ evas_object_show(sd->btn2);
+ elm_box_pack_end(sd->box, content);
+
+ evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+ int_ret = EINA_TRUE;
+ }
+ else
+ eo_do_super(obj, MY_CLASS, int_ret = elm_obj_container_content_set(part, content));
+
+ _box_recalc(obj, sd);
+ _update_pos(obj, sd, EINA_TRUE);
+
+ return int_ret;
+}
+
+EOLIAN static Evas_Object *
+_eext_floatingbutton_elm_container_content_get(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
+{
+ Evas_Object *ret = NULL;
+
+ if (!part) return ret;
+
+ if (!strcmp(part, BTN1_PART))
+ ret = sd->btn1;
+ else if (!strcmp(part, BTN2_PART))
+ ret = sd->btn2;
+ else
+ eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_get(part));
+
+ return ret;
+}
+
+EOLIAN static Evas_Object *
+_eext_floatingbutton_elm_container_content_unset(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
+{
+ Evas_Object *ret = NULL;
+
+ if (!part) return ret;
+
+ if (!strcmp(part, BTN1_PART) && sd->btn1)
+ {
+ elm_box_unpack(sd->box, sd->btn1);
+ evas_object_event_callback_del_full(sd->btn1, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+ ret = sd->btn1;
+ sd->btn1 = NULL;
+ }
+ else if (!strcmp(part, BTN2_PART) && sd->btn2)
+ {
+ elm_box_unpack(sd->box, sd->btn2);
+ evas_object_event_callback_del_full(sd->btn2, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+ ret = sd->btn2;
+ sd->btn2 = NULL;
+ }
+ else
+ eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_unset(part));
+
+ _box_recalc(obj, sd);
+ _update_pos(obj, sd, EINA_TRUE);
+
+ return ret;
+}
+
+EOLIAN static Elm_Theme_Apply
+_eext_floatingbutton_elm_widget_theme_apply(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+ Elm_Theme_Apply int_ret = ELM_THEME_APPLY_FAILED;
+ char buf[256];
+
+ eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
+ if (!int_ret) return ELM_THEME_APPLY_FAILED;
+
+ snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+
+ if (sd->btn1) elm_object_style_set(sd->btn1, buf);
+ if (sd->btn2) elm_object_style_set(sd->btn2, buf);
+
+ _box_recalc(obj, sd);
+
+ return int_ret;
+}
+
+EOLIAN static void
+_eext_floatingbutton_mode_set(Eo *obj,
+ Eext_Floatingbutton_Data *sd,
+ Eext_Floatingbutton_Mode mode)
+{
+ if (sd->mode == mode) return;
+
+ if ((mode < EEXT_FLOATINGBUTTON_MODE_DEFAULT) ||
+ (mode >= EEXT_FLOATINGBUTTON_MODE_LAST))
+ return;
+
+ sd->mode = mode;
+
+ switch(mode)
+ {
+ case EEXT_FLOATINGBUTTON_MODE_DEFAULT:
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 0;
+ break;
+ case EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES:
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 1;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 1;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
+ sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1;
+ break;
+ case EEXT_FLOATINGBUTTON_MODE_LAST:
+ /* you must not reach here */
+ break;
+ }
+}
+
+EOLIAN static Eext_Floatingbutton_Mode
+_eext_floatingbutton_mode_get(Eo *obj,
+ Eext_Floatingbutton_Data *sd)
+{
+ return sd->mode;
+}
+
+#include "eext_floatingbutton.eo.c"
--- /dev/null
+class Eext.Floatingbutton (Elm.Layout) {
+ eo_prefix: eext_obj_floatingbutton;
+ methods {
+ @property pos {
+ set {
+ [[
+ Set the floatingbutton position
+
+ The floatingbutton can be moved among predefined positions
+ (LEFT_OUT, LEFT, CENTER, RIGHT, RIGHT_OUT),
+ eext_floatingbutton_pos_set() moves floatingbutton to a given position immediately
+ (without animation).
+
+ return EINA_TRUE on success, EINA_FALSE otherwise.
+ ]]
+ return: bool;
+ }
+ get {
+ [[
+ Get the floatingbutton position
+
+ return Floatingbutton position with Eext_Floatingbutton_Pos enumeration
+
+ see eext_floatingbutton_pos_set()
+ ]]
+ }
+ values {
+ pos: Eext_Floatingbutton_Pos; [[ the floatingbutton position ]]
+ }
+ }
+ @property movement_block {
+ set {
+ [[
+ Set whether floatingbutton can be moved or not.
+
+ By default, floatingbutton are movable by user interaction.
+ ]]
+ }
+ get {
+ [[
+ Get movability for a given floatingbutton widget.
+
+ return EINA_TRUE, if obj is set to be unmovable,
+ EINA_FALSE, if it's movable.
+
+ see eext_floatingbutton_movement_block_set()
+ ]]
+ }
+ values {
+ block: Eina_Bool; [[ the floatingbutton movability ]]
+ }
+ }
+ @property mode {
+ set {
+ [[
+ Set floatingbutton mode.
+
+ Positions where floatingbutton can stop are restrained by mode.
+ ]]
+ }
+ get {
+ [[
+ Get floatingbutton mode.
+
+ see eext_floatingbutton_mode_set()
+ ]]
+ }
+ values {
+ mode: Eext_Floatingbutton_Mode; [[ floatingbutton mode ]]
+ }
+ }
+ pos_bring_in {
+ [[
+ Set the floatingbutton position with animation
+
+ Move floatingbutton similar to eext_floatingbutton_pos_set(),
+ but with animation.
+
+ return EINA_TRUE on success, EINA_FALSE otherwise.
+
+ see eext_floatingbutton_pos_set()
+ ]]
+ return: Eina_Bool;
+ params {
+ @in pos: const(Eext_Floatingbutton_Pos); [[ the floatingbutton position ]]
+ }
+ }
+ }
+ implements {
+ class.constructor;
+ Eo.Base.constructor;
+ Evas.Object_Smart.add;
+ Evas.Object_Smart.del;
+ Elm.Container.content_set;
+ Elm.Container.content_get;
+ Elm.Container.content_unset;
+ Elm.Widget.theme_apply;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void
+_eext_circle_object_del_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Item *item;
+ Eina_List *l, *l_next;
+
+ if (!circle_obj)
+ {
+ ERR("Eext_Circle_Object is NULL");
+ return;
+ }
+
+ if (circle_obj->del_func)
+ circle_obj->del_func(circle_obj);
+
+ EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
+ {
+ _eext_circle_object_item_free(item);
+ }
+
+ if (circle_obj->surface)
+ {
+ _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
+ circle_obj->surface = NULL;
+ }
+
+ circle_obj->visible = EINA_FALSE;
+
+ if (obj)
+ evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
+
+ free(circle_obj);
+}
+
+static void
+_eext_circle_object_show_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ if (!circle_obj) return;
+ if (circle_obj->visible) return;
+
+ if (circle_obj->widget_object)
+ {
+ if (evas_object_visible_get(circle_obj->widget_object))
+ {
+ circle_obj->visible = EINA_TRUE;
+ _eext_circle_object_changed(circle_obj);
+ }
+ }
+ else
+ {
+ circle_obj->visible = EINA_TRUE;
+ _eext_circle_object_changed(circle_obj);
+ }
+}
+
+static void
+_eext_circle_object_hide_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ if (!circle_obj) return;
+ if (!circle_obj->visible) return;
+
+ circle_obj->visible = EINA_FALSE;
+ _eext_circle_object_changed(circle_obj);
+}
+
+static void
+_eext_circle_object_widget_object_show_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ if (!circle_obj) return;
+ if (circle_obj->visible) return;
+
+ if (evas_object_visible_get(circle_obj->image_widget))
+ {
+ circle_obj->visible = EINA_TRUE;
+ _eext_circle_object_changed(circle_obj);
+ }
+ else
+ {
+ evas_object_show(circle_obj->image_widget);
+ }
+}
+
+static void
+_eext_circle_object_widget_object_hide_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ evas_object_hide(circle_obj->image_widget);
+}
+
+static void
+_eext_circle_object_widget_object_disabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *main_obj = circle_obj->image_widget;
+
+ if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
+ eext_circle_object_disabled_set(main_obj, EINA_TRUE);
+}
+
+static void
+_eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *main_obj = circle_obj->image_widget;
+
+ if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
+ eext_circle_object_disabled_set(main_obj, EINA_FALSE);
+}
+
+//////////////////////////////
+// Internal API //////////////
+//////////////////////////////
+void
+_eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
+{
+ Eext_Circle_Object *circle_obj;
+
+ circle_obj = (Eext_Circle_Object *)calloc(1, sizeof(Eext_Circle_Object));
+ // Obj is expected to be elm_image object.
+ circle_obj->image_widget = obj;
+ circle_obj->widget_object = widget_obj;
+ circle_obj->widget_data = NULL;
+ circle_obj->widget_type = EEXT_CIRCLE_OBJECT_TYPE;
+ circle_obj->del_func = NULL;
+ circle_obj->disabled_func = NULL;
+
+ evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
+
+ //FIXME: It's for adjusting evas_image geometry.
+ // Image object has weird geometry during the window calc own size.
+ // We need to recalc image object after buffer memory copy in render time.
+ // But now we don't have any way to call image's internal sizing eval function.
+ elm_image_aspect_fixed_set(obj, EINA_FALSE);
+ evas_object_repeat_events_set(obj, EINA_TRUE);
+
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj);
+
+ if (widget_obj)
+ {
+ evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_SHOW,
+ _eext_circle_object_widget_object_show_cb, circle_obj);
+ evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_HIDE,
+ _eext_circle_object_widget_object_hide_cb, circle_obj);
+ evas_object_smart_callback_add(widget_obj, "disabled", _eext_circle_object_widget_object_disabled_cb, circle_obj);
+ evas_object_smart_callback_add(widget_obj, "enabled", _eext_circle_object_widget_object_enabled_cb, circle_obj);
+ }
+
+ if (surface)
+ _eext_circle_surface_object_append(surface, circle_obj);
+ else
+ {
+ Eext_Circle_Surface *private_surface =
+ _eext_circle_surface_init(circle_obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+ _eext_circle_surface_object_append(private_surface, circle_obj);
+ }
+}
+
+void
+_eext_circle_object_changed(Eext_Circle_Object *obj)
+{
+ if (!obj) return;
+
+ if (obj->surface)
+ _eext_circle_surface_changed(obj->surface);
+}
+
+Eext_Circle_Object_Item *
+_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
+{
+ Eina_List *l;
+ Eext_Circle_Object_Item *item;
+
+ if (!obj)
+ {
+ ERR("Eext_Circle_Object is NULL! It returns NULL!");
+ return NULL;
+ }
+
+ if (!name)
+ {
+ ERR("The given item name is NULL! It returns NULL!");
+ return NULL;
+ }
+
+ EINA_LIST_FOREACH(obj->items, l, item)
+ {
+ const char *item_name = _eext_circle_object_item_name_get(item);
+ if (item_name &&
+ (name && !strcmp(_eext_circle_object_item_name_get(item), name)))
+ return item;
+ }
+
+ ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->image_widget, obj->widget_type);
+ return NULL;
+}
+
+void
+_eext_circle_object_hide(Eext_Circle_Object *obj)
+{
+ if (!obj) return;
+ if (!obj->visible) return;
+
+ obj->visible = EINA_FALSE;
+
+ _eext_circle_object_changed(obj);
+}
+
+void
+_eext_circle_object_show(Eext_Circle_Object *obj)
+{
+ if (!obj) return;
+ if (obj->visible) return;
+
+ obj->visible = EINA_TRUE;
+
+ if (obj->surface)
+ _eext_circle_surface_object_exclusive_show(obj->surface, obj);
+
+ _eext_circle_object_changed(obj);
+}
+
+/////////////////////////////////////////////////
+// EAPI /////////////////////////////////////////
+/////////////////////////////////////////////////
+EAPI void
+eext_circle_object_line_width_set(Evas_Object *obj, int line_width)
+{
+ eext_circle_object_item_line_width_set(obj, "default", line_width);
+}
+
+EAPI int
+eext_circle_object_line_width_get(const Evas_Object *obj)
+{
+ return eext_circle_object_item_line_width_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_set(Evas_Object *obj, double angle)
+{
+ eext_circle_object_item_angle_set(obj, "default", angle);
+}
+
+EAPI double
+eext_circle_object_angle_get(const Evas_Object *obj)
+{
+ return eext_circle_object_item_angle_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset)
+{
+ eext_circle_object_item_angle_offset_set(obj, "default", angle_offset);
+}
+
+EAPI double
+eext_circle_object_angle_offset_get(const Evas_Object *obj)
+{
+ return eext_circle_object_item_angle_offset_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle)
+{
+ eext_circle_object_item_angle_min_max_set(obj, "default", min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle)
+{
+ eext_circle_object_item_angle_min_max_get(obj, "default", min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value)
+{
+ eext_circle_object_item_value_min_max_set(obj, "default", min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value)
+{
+ eext_circle_object_item_value_min_max_get(obj, "default", min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_value_set(Evas_Object *obj, double value)
+{
+ eext_circle_object_item_value_set(obj, "default", value);
+}
+
+EAPI double
+eext_circle_object_value_get(const Evas_Object *obj)
+{
+ return eext_circle_object_item_value_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+ eext_circle_object_item_color_set(obj, "default", r, g, b, a);
+}
+
+EAPI void
+eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+ eext_circle_object_item_color_get(obj, "default", r, g, b, a);
+}
+
+EAPI void
+eext_circle_object_radius_set(Evas_Object *obj, double radius)
+{
+ eext_circle_object_item_radius_set(obj, "default", radius);
+}
+
+EAPI double
+eext_circle_object_radius_get(const Evas_Object *obj)
+{
+ return eext_circle_object_item_radius_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ if (circle_obj->disabled == disabled) return;
+
+ circle_obj->disabled = disabled;
+
+ if (circle_obj->disabled_func)
+ circle_obj->disabled_func(circle_obj);
+
+ if (circle_obj->widget_object &&
+ (elm_object_disabled_get(circle_obj->widget_object) != disabled))
+ elm_object_disabled_set(circle_obj->widget_object, disabled);
+}
+
+EAPI Eina_Bool
+eext_circle_object_disabled_get(Evas_Object *obj)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE;
+
+ return circle_obj->disabled;
+}
+
+EAPI Evas_Object *
+eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+ Eext_Circle_Object_Item *item;
+
+ obj = elm_image_add(parent);
+ _eext_circle_object_init(obj, NULL, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_append(circle_obj, item);
+
+ return obj;
+}
+
+EAPI void
+eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_line_width_set(item, line_width);
+}
+
+EAPI int
+eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ return _eext_circle_object_item_line_width_get(item);
+
+ return -1;
+}
+
+EAPI void
+eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_angle_set(item, angle);
+}
+
+EAPI double
+eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ return _eext_circle_object_item_angle_get(item);
+
+ return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_angle_offset_set(item, angle_offset);
+}
+
+EAPI double
+eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ return _eext_circle_object_item_angle_offset_get(item);
+
+ return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_angle_min_max_set(item, min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+ {
+ if (min_angle) *min_angle = 0;
+ if (max_angle) *max_angle = 0;
+
+ return;
+ }
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ {
+ _eext_circle_object_item_angle_min_max_get(item, min_angle, max_angle);
+ }
+ else
+ {
+ if (min_angle) *min_angle = 0;
+ if (max_angle) *max_angle = 0;
+ }
+}
+
+EAPI void
+eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_value_min_max_set(item, min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+ {
+ if (min_value) *min_value = 0;
+ if (max_value) *max_value = 0;
+
+ return;
+ }
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ {
+ _eext_circle_object_item_value_min_max_get(item, min_value, max_value);
+ }
+ else
+ {
+ if (min_value) *min_value = 0;
+ if (max_value) *max_value = 0;
+ }
+}
+
+EAPI void
+eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_value_set(item, value);
+}
+
+EAPI double
+eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ return _eext_circle_object_item_value_get(item);
+
+ return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ {
+ _eext_circle_object_item_color_set(item, r, g, b, a);
+
+ if (circle_obj->color_changed_func)
+ {
+ if (item_name)
+ circle_obj->color_changed_func(circle_obj, item_name);
+ else
+ circle_obj->color_changed_func(circle_obj, "default");
+ }
+ }
+}
+
+EAPI void
+eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+ {
+ if (r) *r = 0;
+ if (g) *g = 0;
+ if (b) *b = 0;
+ if (a) *a = 0;
+
+ return;
+ }
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ {
+ _eext_circle_object_item_color_get(item, r, g, b, a);
+ }
+ else
+ {
+ if (r) *r = 0;
+ if (g) *g = 0;
+ if (b) *b = 0;
+ if (a) *a = 0;
+ }
+}
+
+EAPI void
+eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ _eext_circle_object_item_radius_set(item, radius);
+}
+
+EAPI double
+eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item = NULL;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+ item = _eext_circle_object_item_get(circle_obj, item_name);
+
+ if (item)
+ return _eext_circle_object_item_radius_get(item);
+
+ return -1.0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_DATETIME_TYPE "Eext_Circle_Object_Datetime"
+#define MIN_DAYS_IN_MONTH 28
+#define MAX_DAYS_IN_MONTH 31
+#define DATETIME_FIELD_NAME_BUF_MAX 8
+
+#define PICKER_MARK_PARTITION_COUNT_YEAR 50
+#define PICKER_MARK_ANGLE_MONTH 30
+#define PICKER_MARK_ANGLE_HOUR 30
+#define PICKER_MARK_ANGLE_MIN 6
+
+#define EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Datetime_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_DATETIME_TYPE)) \
+ data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data; \
+ if (!data)
+
+#define BG_FILE_COUNT 7
+
+#define DATETIME_ITEM_NAME "default"
+
+static const double BG_WIDTH = 360.0;
+static const double BG_HEIGHT = 360.0;
+static const double mark_width = 6;
+static const double mark_height =23;
+static const double radius = 168.5; //BG_HEIGHT / 2 - mark_height / 2;
+static const double mark_radius = 2.000317; //1 / sqrt(1 - pow(mark_width / 2 / radius , 2)) * 2;
+static const double ANIMATION_DURATION = 0.3;
+
+static char *bg_file_name[] = {
+ "date_picker_day_28_bg",
+ "date_picker_day_29_bg",
+ "date_picker_day_30_bg",
+ "date_picker_day_31_bg",
+ "date_picker_month_bg",
+ "date_picker_year_bg",
+ "time_picker_bg",
+ NULL
+};
+
+static const int picker_mark_angle_year[] =
+{0,7,14,21,28,36,43,50,57,64,72,79,86,93,100,108,115,122,129,136,144,151,158,165,172,180,187,194,201,208,216,223,230,237,244,252,259,266,273,280,288,295,302,309,316,324,331,338,345,352};
+
+static const int picker_mark_angle_day[4][31] =
+//28 day
+{{0,13,26,39,52,65,78,90,103,116,129,142,155,168,180,193,206,219,232,245,258,270,283,296,309,322,335,348},
+//29 day
+{0,13,25,38,50,63,75,87,100,112,125,137,149,162,174,187,199,211,224,236,249,261,273,286,298,311,323,335,348},
+//30 day
+{0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240,252,264,276,288,300,312,324,336,348},
+//31 day
+{0,12,24,36,47,59,70,82,93,105,116,128,139,151,163,175,186,198,209,221,232,244,255,267,278,290,302,314,325,337,349}};
+
+static void
+_eext_circle_object_datetime_picker_mark_angle_set(Eext_Circle_Object *obj, double angle, Eina_Bool anim)
+{
+ double angle_offset, real_part;
+ Eext_Circle_Object_Item *item;
+
+ item = _eext_circle_object_item_get(obj, DATETIME_ITEM_NAME);
+ if (anim)
+ {
+ angle_offset = _eext_circle_object_item_angle_offset_get(item);
+ real_part = angle_offset - (int)angle_offset;
+
+ angle_offset = (int)angle_offset % 360 + real_part;
+ if (angle_offset < 0.0) angle_offset += 360.0;
+
+ if (angle - angle_offset > 180.0)
+ angle_offset += 360.0;
+ else if (angle_offset - angle > 180.0)
+ angle_offset -= 360.0;
+
+ _eext_circle_object_item_angle_offset_set(item, angle_offset - (mark_radius / 2));
+
+ _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
+ mark_radius, angle - (mark_radius / 2),
+ EINA_TRUE,
+ 0.25, 0.46,
+ 0.45, 1.0);
+ }
+ else
+ {
+ _eext_circle_object_item_angle_offset_set(item, angle -(mark_radius / 2));
+ _eext_circle_object_item_angle_set(item, mark_radius);
+ }
+
+ _eext_circle_object_changed(obj);
+}
+
+static int
+_max_days_get(int year, int month)
+{
+ struct tm time1;
+ time_t t;
+ int day;
+
+ t = time(NULL);
+ localtime_r(&t, &time1);
+ time1.tm_year = year;
+ time1.tm_mon = month;
+ for (day = MIN_DAYS_IN_MONTH; day <= MAX_DAYS_IN_MONTH; day++)
+ {
+ time1.tm_mday = day;
+ /* FIXME: To restrict month wrapping because of summer time in some locales,
+ * ignore day light saving mode in mktime(). */
+ time1.tm_isdst = -1;
+ mktime(&time1);
+ if (time1.tm_mday == 1) break;
+ }
+
+ day--;
+ return day;
+}
+
+static Evas_Object *
+_eext_circle_object_datetime_selected_field_object_get(Evas_Object *datetime)
+{
+ Evas_Object *radio;
+ Elm_Datetime_Field_Type type;
+ char buf[DATETIME_FIELD_NAME_BUF_MAX];
+
+ for (type = ELM_DATETIME_YEAR; type < ELM_DATETIME_AMPM; type++)
+ {
+ snprintf(buf, sizeof(buf), "field%d", type);
+ radio = elm_object_part_content_get(datetime, buf);
+ if (radio)
+ return elm_radio_selected_object_get(radio);
+ }
+
+ return NULL;
+}
+
+static void
+_eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim)
+{
+ Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
+ Evas_Object *datetime = obj->widget_object;
+ Evas_Object *radio;
+ struct tm t;
+ int max_day;
+ double picker_angle = 0.0;
+
+ elm_datetime_value_get(datetime, &t);
+
+ radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
+ data->current_type = elm_radio_state_value_get(radio);
+ data->rotary_angle = eext_circle_object_angle_get(datetime);
+
+ switch (data->current_type)
+ {
+ case ELM_DATETIME_YEAR:
+ obj->bg_image_index = 5;
+ picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+ break;
+ case ELM_DATETIME_MONTH:
+ obj->bg_image_index = 4;
+ picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+ break;
+ case ELM_DATETIME_DATE:
+ max_day = _max_days_get(t.tm_year, t.tm_mon);
+ obj->bg_image_index = max_day % 28;
+ picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+ break;
+ case ELM_DATETIME_HOUR:
+ picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+ obj->bg_image_index = 6;
+ break;
+ case ELM_DATETIME_MINUTE:
+ picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
+ obj->bg_image_index = 6;
+ break;
+ case ELM_DATETIME_AMPM:
+ default:
+ break;
+ }
+
+ _eext_circle_object_changed(obj);
+
+}
+
+static void
+_eext_circle_object_datetime_circle_update(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
+ Evas_Object *datetime = obj->widget_object;
+ struct tm t;
+ int min, max;
+
+ elm_datetime_value_get(datetime, &t);
+ elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
+
+ switch (data->current_type)
+ {
+ case ELM_DATETIME_YEAR:
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_year);
+ break;
+ case ELM_DATETIME_MONTH:
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_mon);
+ break;
+ case ELM_DATETIME_DATE:
+ min = 1;
+ max = _max_days_get(t.tm_year, t.tm_mon);
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_mday);
+ break;
+ case ELM_DATETIME_HOUR:
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_hour);
+ break;
+ case ELM_DATETIME_MINUTE:
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_min);
+ break;
+ case ELM_DATETIME_AMPM:
+ eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
+ eext_circle_object_value_set(datetime, (double)t.tm_hour);
+ default:
+ break;
+ }
+
+ data->rotary_angle = eext_circle_object_angle_get(datetime);
+}
+
+static void
+_eext_circle_object_datetime_radio_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ if (circle_obj->widget_object == event_info)
+ _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
+ else
+ _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
+
+ _eext_circle_object_datetime_circle_update(circle_obj);
+}
+
+static void
+_eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
+
+ if (!widget_data->circle_changed)
+ _eext_circle_object_datetime_circle_update(circle_obj);
+}
+
+static void
+_date_update(Eext_Circle_Object *obj, Eina_Bool value_up)
+{
+ Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
+ Evas_Object *datetime = obj->widget_object;
+ struct tm t;
+ int min, max;
+ int max_day;
+ double picker_angle = 0.0;
+
+ elm_datetime_value_get(datetime, &t);
+ elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
+
+ switch (data->current_type)
+ {
+ case ELM_DATETIME_YEAR:
+ if (value_up) t.tm_year += 1;
+ else t.tm_year -= 1;
+
+ if (t.tm_year < min) t.tm_year = max;
+ else if (t.tm_year > max) t.tm_year = min;
+
+ picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
+ break;
+ case ELM_DATETIME_MONTH:
+ if (value_up) t.tm_mon += 1;
+ else t.tm_mon -= 1;
+
+ if (t.tm_mon < min) t.tm_mon = max;
+ else if (t.tm_mon > max) t.tm_mon = min;
+
+ picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
+ break;
+ case ELM_DATETIME_DATE:
+ if (value_up) t.tm_mday += 1;
+ else t.tm_mday -= 1;
+
+ int old_mday = t.tm_mday;
+
+ if (t.tm_mday < min) t.tm_mday = max;
+ else if (t.tm_mday > max) t.tm_mday = min;
+ else
+ {
+ elm_datetime_value_set(datetime, &t);
+ elm_datetime_value_get(datetime, &t);
+ if (t.tm_mday < old_mday)
+ {
+ if (value_up) t.tm_mday = min;
+ else
+ {
+ t.tm_mday = max;
+ elm_datetime_value_set(datetime, &t);
+ elm_datetime_value_get(datetime, &t);
+ }
+ }
+ }
+
+ max_day = _max_days_get(t.tm_year, t.tm_mon);
+
+ picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
+ break;
+ case ELM_DATETIME_HOUR:
+ if (value_up) t.tm_hour += 1;
+ else t.tm_hour -= 1;
+
+ if (t.tm_hour < min) t.tm_hour = max;
+ else if (t.tm_hour > max) t.tm_hour = min;
+
+ elm_datetime_value_set(datetime, &t);
+ elm_datetime_value_get(datetime, &t);
+
+ picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
+ break;
+ case ELM_DATETIME_MINUTE:
+ if (value_up) t.tm_min += 1;
+ else t.tm_min -= 1;
+
+ if (t.tm_min < min) t.tm_min = max;
+ else if (t.tm_min > max) t.tm_min = min;
+
+ elm_datetime_value_set(datetime, &t);
+ elm_datetime_value_get(datetime, &t);
+ picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
+ _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
+ break;
+ case ELM_DATETIME_AMPM:
+ if (value_up && t.tm_hour < 12) t.tm_hour += 12;
+ else if (t.tm_hour >= 12) t.tm_hour -= 12;
+ default:
+ break;
+ }
+
+ elm_datetime_value_set(datetime, &t);
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
+{
+ char buf[DATETIME_FIELD_NAME_BUF_MAX];
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *selected_radio;
+
+ //Send rotary active signal to selected radio to off animation(Tizen_2.3.2 UX)
+ selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
+ elm_object_signal_emit(selected_radio, "elm,state,rotary,active", "eext");
+
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ _date_update(circle_obj, EINA_TRUE);
+ else
+ _date_update(circle_obj, EINA_FALSE);
+
+ //for accessibility
+ Eext_Circle_Object_Datetime_Data *datetime_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
+ Evas_Object *datetime = circle_obj->widget_object;
+ struct tm t;
+ char buf_read_text[255];
+ char buf_month[255];
+ char buf_ampm[3];
+ int idx = 0;
+
+ elm_datetime_value_get(datetime, &t);
+
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+ elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
+
+ switch(datetime_data->current_type)
+ {
+ case ELM_DATETIME_DATE:
+ snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
+ break;
+ case ELM_DATETIME_MONTH:
+ if(t.tm_mon == 0)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JANUARY"));
+ else if(t.tm_mon == 1)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_FEBRUARY"));
+ else if(t.tm_mon == 2)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MARCH"));
+ else if(t.tm_mon == 3)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_APRIL"));
+ else if(t.tm_mon == 4)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MAY"));
+ else if(t.tm_mon == 5)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JUNE"));
+ else if(t.tm_mon == 6)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JULY"));
+ else if(t.tm_mon == 7)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_AUGUST"));
+ else if(t.tm_mon == 8)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_SEPTEMBER"));
+ else if(t.tm_mon == 9)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_OCTOBER"));
+ else if(t.tm_mon == 10)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_NOVEMBER"));
+ else if(t.tm_mon == 11)
+ snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_DECEMBER"));
+ snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
+ break;
+ case ELM_DATETIME_YEAR:
+ snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
+ break;
+ case ELM_DATETIME_HOUR:
+ if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
+ (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
+ snprintf(buf_ampm, sizeof(buf_ampm), _("WDS_TTS_TBBODY_PM"));
+ else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
+ (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
+ snprintf(buf_ampm, sizeof(buf_ampm), _("WDS_TTS_TBBODY_AM"));
+ else
+ snprintf(buf_ampm, sizeof(buf_ampm), "");
+
+ if (t.tm_hour > 12)
+ snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
+ else if (t.tm_hour == 0)
+ snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
+ else
+ snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
+
+ break;
+ case ELM_DATETIME_MINUTE:
+ snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
+ break;
+ }
+ elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
+ //
+
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
+{
+ if (!obj) return;
+
+ if (obj->widget_data)
+ {
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+ }
+
+ if (obj->bg_image_objs)
+ {
+ eina_list_free(obj->bg_image_objs);
+ obj->bg_image_objs = NULL;
+ }
+}
+
+static void
+_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
+{
+ if (obj->disabled)
+ {
+ eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+ eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+ }
+ else
+ {
+ eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+ }
+}
+
+static void
+_eext_circle_object_datetime_bg_image_append(Eext_Circle_Object *obj)
+{
+ Evas_Object *bg_image;
+ char buf[PATH_MAX];
+ int i;
+
+ for (i = 0; i <= BG_FILE_COUNT; i++)
+ {
+ bg_image = elm_image_add(obj->widget_object);
+ snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[i]);
+ elm_image_file_set(bg_image, buf, NULL);
+ obj->bg_image_objs = eina_list_append(obj->bg_image_objs, bg_image);
+ }
+
+ obj->bg_image_index = BG_FILE_COUNT;
+}
+static char *
+_accessibility_item_make_trait(char *trait, char *unit)
+{
+ sprintf(trait, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), unit);
+ return strdup(trait);
+}
+
+//for accessibility
+static char *
+_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
+{
+ char buf[255] = "";
+ char buf_month[255];
+ char buf_unit[255];
+ char buf_ampm[255];
+ char buf_trait[255];
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *datetime = circle_obj->widget_object;
+ int idx = 0;
+ int selected = -1;
+ struct tm t;
+ Evas_Object *radio;
+
+ if(obj == elm_object_part_content_get(datetime, "field0"))
+ {
+ selected = ELM_DATETIME_DATE;
+ }
+ else if(obj == elm_object_part_content_get(datetime, "field1"))
+ {
+ selected = ELM_DATETIME_MONTH;
+ }
+ else if(obj == elm_object_part_content_get(datetime, "field2"))
+ {
+ selected = ELM_DATETIME_YEAR;
+ }
+ for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
+ {
+ snprintf(buf, sizeof(buf), "field%d", idx);
+ Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
+ if (field_obj)
+ {
+ if(obj == field_obj)
+ {
+ selected = idx;
+ }
+ }
+ }
+
+ elm_datetime_value_get(datetime, &t);
+
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+
+ switch(selected)
+ {
+ case ELM_DATETIME_DATE:
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_DAY"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
+ break;
+ case ELM_DATETIME_MONTH:
+ if(t.tm_mon == 0)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_JANUARY"));
+ else if(t.tm_mon == 1)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_FEBRUARY"));
+ else if(t.tm_mon == 2)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_MARCH"));
+ else if(t.tm_mon == 3)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_APRIL"));
+ else if(t.tm_mon == 4)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_MAY"));
+ else if(t.tm_mon == 5)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_JUNE"));
+ else if(t.tm_mon == 6)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_JULY"));
+ else if(t.tm_mon == 7)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_AUGUST"));
+ else if(t.tm_mon == 8)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_SEPTEMBER"));
+ else if(t.tm_mon == 9)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_OCTOBER"));
+ else if(t.tm_mon == 10)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_NOVEMBER"));
+ else if(t.tm_mon == 11)
+ sprintf(buf_month, _("WDS_TTS_TBBODY_DECEMBER"));
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_MONTH"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%s %s %s",buf_month, buf_unit, buf_trait);
+ break;
+ case ELM_DATETIME_YEAR:
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_YEAR"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
+ break;
+ case ELM_DATETIME_AMPM:
+ sprintf(buf_trait, _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
+ if((double)t.tm_hour <= 12.0f)
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_AM"));
+ else
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_PM"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%s %s",buf_unit, buf_trait);
+ break;
+ case ELM_DATETIME_HOUR:
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_HOUR"));
+ if((double)t.tm_hour <= 12.0f)
+ {
+ sprintf(buf_ampm, _("WDS_TTS_TBBODY_AM"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour, buf_ampm, buf_unit, buf_trait);
+ }
+ else
+ {
+ sprintf(buf_ampm, _("WDS_TTS_TBBODY_PM"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour - (double)12.0f, buf_ampm, buf_unit, buf_trait);
+ }
+ break;
+ case ELM_DATETIME_MINUTE:
+ sprintf(buf_unit, _("WDS_TTS_TBBODY_MINUTE"));
+ strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+ sprintf(buf, "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
+ break;
+ }
+
+ return strdup(buf);
+
+}
+static void
+_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ char buf[255] = "";
+ char buf_month[255];
+ char buf_unit[255];
+ char buf_ampm[255];
+ char buf_trait[255];
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *datetime = circle_obj->widget_object;
+ int idx = 0;
+ int selected = -1;
+ struct tm t;
+ Evas_Object *radio;
+
+ if(obj == elm_object_part_content_get(datetime, "field0"))
+ selected = ELM_DATETIME_DATE;
+ else if(obj == elm_object_part_content_get(datetime, "field1"))
+ selected = ELM_DATETIME_MONTH;
+ else if(obj == elm_object_part_content_get(datetime, "field2"))
+ selected = ELM_DATETIME_YEAR;
+
+ for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
+ {
+ snprintf(buf, sizeof(buf), "field%d", idx);
+ Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
+ if (field_obj)
+ {
+ if(obj == field_obj)
+ {
+ selected = idx;
+ }
+ }
+ }
+
+ radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
+ if(selected == ELM_DATETIME_AMPM)
+ elm_radio_value_set(radio, ELM_DATETIME_HOUR);
+ else
+ elm_radio_value_set(radio, selected);
+
+ _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
+
+ elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_set_cb, (Eext_Circle_Object*)circle_obj);
+ elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+
+ return EINA_TRUE;
+}
+//
+
+static void
+_eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
+{
+ Eext_Circle_Object_Datetime_Data *data;
+ Eext_Circle_Object_Item *item;
+
+ char buf[DATETIME_FIELD_NAME_BUF_MAX];
+ int idx;
+
+ obj->widget_object = datetime;
+ obj->widget_type = EEXT_CIRCLE_OBJECT_DATETIME_TYPE;
+ obj->del_func = _eext_circle_object_datetime_del_cb;
+ obj->disabled_func = _eext_circle_object_datetime_disabled_cb;
+
+ data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
+ obj->widget_data = (void *)data;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
+ _eext_circle_object_item_radius_set(item, radius);
+ _eext_circle_object_item_line_width_set(item, mark_height);
+ _eext_circle_object_item_angle_offset_set(item, item->angle_offset -(mark_radius / 2));
+ _eext_circle_object_item_angle_set(item, mark_radius);
+ _eext_circle_object_item_append(obj, item);
+
+ elm_object_style_set(datetime, "datepicker/circle");
+
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "changed",
+ _eext_circle_object_datetime_radio_changed_cb, obj);
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "changed",
+ _eext_circle_object_datetime_radio_changed_cb, obj);
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
+ _eext_circle_object_datetime_radio_changed_cb, obj);
+ //for accessibility
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+ evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+ //
+
+ for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
+ {
+ snprintf(buf, sizeof(buf), "field%d", idx);
+
+ Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
+ if (field_obj)
+ {
+ Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
+ if (field_type != ELM_DATETIME_AMPM)
+ evas_object_smart_callback_add(field_obj, "changed",
+ _eext_circle_object_datetime_radio_changed_cb, obj);
+ //for accessibility
+ evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+ //
+ }
+ }
+
+ evas_object_smart_callback_add(datetime, "changed",
+ _eext_circle_object_datetime_changed_cb, obj);
+
+ _eext_circle_object_datetime_current_type_update(obj, EINA_FALSE);
+ _eext_circle_object_datetime_circle_update(obj);
+
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+
+ _eext_circle_object_datetime_bg_image_append(obj);
+
+}
+
+EAPI Evas_Object *
+eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!datetime) return NULL;
+
+ obj = elm_image_add(datetime);
+ _eext_circle_object_init(obj, datetime, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_datetime_init(circle_obj, datetime);
+
+ return obj;
+}
+
+/**
+ * FIXME(150420) : After deciding how to support current types to application developer, we will define these APIs' name and parameters.
+ *
+EAPI Elm_Datetime_Field_Type
+eext_circle_object_datetime_selected_field_type_get(const Evas_Object *obj)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return 0;
+ EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return 0;
+
+ return data->current_type;
+}
+
+EAPI void
+eext_circle_object_datetime_selected_field_type_set(Evas_Object *obj, Elm_Datetime_Field_Type type)
+{
+ Evas_Object *radio;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return;
+
+ if (data->current_type == type) return;
+
+ radio = _eext_circle_object_datetime_selected_field_object_get(obj);
+ elm_radio_value_set(radio, type);
+ data->current_type = type;
+ _eext_circle_object_datetime_circle_update(circle_obj);
+}
+*/
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist"
+
+#define VERTICAL_BAR_ANGLE_START 60.0
+#define VERTICAL_BAR_ANGLE_RANGE 60.0
+#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
+#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+#define VERTICAL_BAR_TRANSIT_TIME 0.2
+#define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2
+#define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
+#define VERTICAL_BAR_WIDTH_SIZE 10
+#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
+
+#define SCROLL_BAR_COLOR_R 14
+#define SCROLL_BAR_COLOR_G 137
+#define SCROLL_BAR_COLOR_B 181
+#define SCROLL_BAR_COLOR_A 255
+
+#define SCROLL_BAR_BG_COLOR_R 250
+#define SCROLL_BAR_BG_COLOR_G 250
+#define SCROLL_BAR_BG_COLOR_B 250
+#define SCROLL_BAR_BG_COLOR_A 38
+
+#define SCROLL_BAR_COLOR_DISABLED_R 45
+#define SCROLL_BAR_COLOR_DISABLED_G 45
+#define SCROLL_BAR_COLOR_DISABLED_B 45
+#define SCROLL_BAR_COLOR_DISABLED_A 255
+
+#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
+
+#define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Genlist_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_GENLIST_TYPE)) \
+ data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \
+ if (!data)
+
+#define GENLIST_ITEM_NAME "default"
+#define GENLIST_BG_ITEM_NAME "vertical,scroll,bg"
+
+static void
+_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise)
+{
+ Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+ Evas_Coord x, y, vw, vh;
+ Elm_Object_Item *next_item;
+
+ if (!obj) return;
+
+ elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh);
+ evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL);
+
+ next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0);
+
+ if (!next_item) return;
+
+ if (clockwise)
+ next_item = elm_genlist_item_next_get(next_item);
+ else
+ next_item = elm_genlist_item_prev_get(next_item);
+
+ if (!next_item) return;
+
+ elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ _eext_circle_object_genlist_region_show(data, EINA_TRUE);
+ else
+ _eext_circle_object_genlist_region_show(data, EINA_FALSE);
+
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item;
+ Evas_Coord ch; /* content h */
+ Evas_Coord py, vh; /* postion y, viewport h*/
+ double ratio;
+ double bar_pos_y = VERTICAL_BAR_ANGLE_START;
+ double bar_size_y = VERTICAL_BAR_ANGLE_RANGE;
+ double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
+
+ if (!obj) return;
+
+ item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+
+ elm_scroller_child_size_get(obj->widget_object, NULL, &ch);
+ elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh);
+
+ if (ch > 0)
+ {
+ ratio = (double)ch / (double)vh;
+
+ if (ratio == 0) return;
+
+ if (ch > vh)
+ {
+ bar_size_y = vertical_bar_angle_range / ratio;
+
+ if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
+ bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
+ if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
+ bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
+ }
+ bar_pos_y += (double)py / ch * vertical_bar_angle_range;
+
+ _eext_circle_object_item_angle_set(item, bar_size_y);
+ _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
+ }
+}
+
+static void
+_eext_circle_object_genlist_realized_cb(void *data,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+ if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+ _eext_circle_object_genlist_scrollbar_update(circle_obj);
+}
+
+static void
+_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item;
+ int r, g, b, a;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+ item = _eext_circle_object_item_get(obj, item_name);
+ if (!item) return;
+
+ _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+ if (!strcmp(item_name, GENLIST_ITEM_NAME))
+ {
+ widget_data->color.r = r;
+ widget_data->color.g = g;
+ widget_data->color.b = b;
+ widget_data->color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
+ {
+ widget_data->bg_color.r = r;
+ widget_data->bg_color.g = g;
+ widget_data->bg_color.b = b;
+ widget_data->bg_color.a = a;
+
+ return;
+ }
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
+{
+ Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Item *item;
+ Eina_List *l;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
+
+ if (widget_data->realized_callback_added)
+ {
+ evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+ widget_data->realized_callback_added = EINA_FALSE;
+ }
+
+ EINA_LIST_FOREACH(obj->items, l, item)
+ {
+ _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME,
+ 0, 0, 0, 0,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+
+ if (widget_data->bar_hide_timer)
+ {
+ ecore_timer_del(widget_data->bar_hide_timer);
+ widget_data->bar_hide_timer = NULL;
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
+ double hide_waiting_time)
+{
+ Eext_Circle_Object_Item *item;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+ if (widget_data->realized_callback_added)
+ {
+ evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+ widget_data->realized_callback_added = EINA_FALSE;
+ }
+
+ if (widget_data->bar_hide_timer)
+ {
+ ecore_timer_del(widget_data->bar_hide_timer);
+ widget_data->bar_hide_timer = NULL;
+ }
+
+ item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+ if (obj->disabled)
+ _eext_circle_object_item_color_set(item,
+ widget_data->disabled_bg_color.r,
+ widget_data->disabled_bg_color.g,
+ widget_data->disabled_bg_color.b,
+ widget_data->disabled_bg_color.a);
+ else
+ _eext_circle_object_item_color_set(item,
+ widget_data->bg_color.r,
+ widget_data->bg_color.g,
+ widget_data->bg_color.b,
+ widget_data->bg_color.a);
+
+ item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+ if (obj->disabled)
+ _eext_circle_object_item_color_set(item,
+ widget_data->disabled_color.r,
+ widget_data->disabled_color.g,
+ widget_data->disabled_color.b,
+ widget_data->disabled_color.a);
+ else
+ _eext_circle_object_item_color_set(item,
+ widget_data->color.r,
+ widget_data->color.g,
+ widget_data->color.b,
+ widget_data->color.a);
+
+ if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+ {
+ widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
+ _eext_circle_object_genlist_scrollbar_policy_hide_cb,
+ obj);
+ }
+}
+
+static void
+_eext_circle_object_genlist_show_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+ if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+ _eext_circle_object_genlist_scrollbar_update(circle_obj);
+ _eext_circle_object_genlist_scrollbar_show(circle_obj,
+ VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+ if (!widget_data->realized_callback_added)
+ {
+ evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj);
+ widget_data->realized_callback_added = EINA_TRUE;
+ }
+}
+
+static void
+_eext_circle_object_genlist_scroll_cb(void *data,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+ if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+ _eext_circle_object_genlist_scrollbar_update(circle_obj);
+ _eext_circle_object_genlist_scrollbar_show(circle_obj,
+ VERTICAL_BAR_HIDE_WAITTING_TIME);
+}
+
+static void
+_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj)
+{
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+ evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
+ evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
+
+ if (widget_data->realized_callback_added)
+ {
+ evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+ widget_data->realized_callback_added = EINA_FALSE;
+ }
+
+ if (widget_data->bar_hide_timer)
+ {
+ ecore_timer_del(widget_data->bar_hide_timer);
+ widget_data->bar_hide_timer = NULL;
+ }
+
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+
+ eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+}
+
+static void
+_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item;
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return;
+
+ if (obj->disabled)
+ {
+ item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a);
+
+ item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a);
+
+ eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+ eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+ }
+ else
+ {
+ item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->color.r,
+ data->color.g,
+ data->color.b,
+ data->color.a);
+
+ item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->bg_color.r,
+ data->bg_color.g,
+ data->bg_color.b,
+ data->bg_color.a);
+
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+ eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+ }
+}
+
+static void
+_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
+{
+ Eext_Circle_Object_Genlist_Data *data;
+ Eext_Circle_Object_Item *item;
+
+ obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
+ obj->del_func = _eext_circle_object_genlist_del_cb;
+ obj->disabled_func = _eext_circle_object_genlist_disabled_cb;
+ obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
+
+ data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
+ data->policy_v = ELM_SCROLLER_POLICY_AUTO;
+ data->color.r = SCROLL_BAR_COLOR_R;
+ data->color.g = SCROLL_BAR_COLOR_G;
+ data->color.b = SCROLL_BAR_COLOR_B;
+ data->color.a = SCROLL_BAR_COLOR_A;
+ data->bg_color.r = SCROLL_BAR_BG_COLOR_R;
+ data->bg_color.g = SCROLL_BAR_BG_COLOR_G;
+ data->bg_color.b = SCROLL_BAR_BG_COLOR_B;
+ data->bg_color.a = SCROLL_BAR_BG_COLOR_A;
+ data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
+ data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
+ data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
+ data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
+ data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
+ data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
+ data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
+ data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+ obj->widget_data = (void *)data;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->bg_color.r,
+ data->bg_color.g,
+ data->bg_color.b,
+ data->bg_color.a);
+ _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
+ _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
+ _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
+ _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->color.r,
+ data->color.g,
+ data->color.b,
+ data->color.a);
+ _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
+ _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
+ _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
+ evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+ eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!genlist) return NULL;
+
+ obj = elm_image_add(genlist);
+ _eext_circle_object_init(obj, genlist, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_genlist_init(circle_obj, genlist);
+
+ return obj;
+}
+
+
+EAPI void
+eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
+ Elm_Scroller_Policy policy_h,
+ Elm_Scroller_Policy policy_v)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+ {
+ ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+ EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
+ return;
+ }
+
+ if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
+ (policy_v >= ELM_SCROLLER_POLICY_LAST))
+ return;
+
+ data->policy_h = policy_h;
+ data->policy_v = policy_v;
+
+ if (data->policy_v == ELM_SCROLLER_POLICY_ON)
+ {
+ _eext_circle_object_genlist_scrollbar_update(circle_obj);
+ _eext_circle_object_genlist_scrollbar_show(circle_obj,
+ VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+ }
+}
+
+EAPI void
+eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj,
+ Elm_Scroller_Policy *policy_h,
+ Elm_Scroller_Policy *policy_v)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+ {
+ if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
+ if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
+ return;
+ }
+
+ EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+ {
+ ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+ EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
+ if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
+ if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
+ return;
+ }
+
+ if (policy_h) *policy_h = data->policy_h;
+ if (policy_v) *policy_v = data->policy_v;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item);
+static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item);
+
+static Eina_Bool
+_eext_circle_object_item_color_transit_animator_cb(void *data, double pos)
+{
+ Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
+ int diff_r, diff_g, diff_b, diff_a;
+ double mapped_pos;
+
+ diff_r = item->color_transit.from_color.r - item->color.r;
+ diff_g = item->color_transit.from_color.g - item->color.g;
+ diff_b = item->color_transit.from_color.b - item->color.b;
+ diff_a = item->color_transit.from_color.a - item->color.a;
+
+ item->color_transit.current_animator_pos = pos;
+
+ if (item->color_transit.cubic_bezier_enabled)
+ mapped_pos = ecore_animator_pos_map_n(pos,
+ ECORE_POS_MAP_CUBIC_BEZIER,
+ 4,
+ item->color_transit.cubic_bezier_v);
+ else
+ mapped_pos = pos;
+
+ item->draw.color.r = item->color_transit.from_color.r - diff_r * mapped_pos;
+ item->draw.color.g = item->color_transit.from_color.g - diff_g * mapped_pos;
+ item->draw.color.b = item->color_transit.from_color.b - diff_b * mapped_pos;
+ item->draw.color.a = item->color_transit.from_color.a - diff_a * mapped_pos;
+
+ _eext_circle_object_changed(item->obj);
+
+ if (pos >= 1.0)
+ {
+ _eext_circle_object_item_color_transit_animator_del(item);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_transit_animator_cb(void *data, double pos)
+{
+ Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
+ double diff_angle, diff_angle_offset;
+ double mapped_pos;
+
+ diff_angle = item->angle_transit.from_angle - item->angle;
+ diff_angle_offset =
+ item->angle_transit.from_angle_offset - item->angle_offset;
+
+ item->angle_transit.current_animator_pos = pos;
+
+ if (item->angle_transit.cubic_bezier_enabled)
+ mapped_pos = ecore_animator_pos_map_n(pos,
+ ECORE_POS_MAP_CUBIC_BEZIER,
+ 4,
+ item->angle_transit.cubic_bezier_v);
+ else
+ mapped_pos = pos;
+
+ item->draw.angle = item->angle_transit.from_angle - diff_angle * mapped_pos;
+ item->draw.angle_offset = item->angle_transit.from_angle_offset - diff_angle_offset * mapped_pos;
+
+ _eext_circle_object_changed(item->obj);
+
+ if (pos >= 1.0)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle)
+{
+ double temp_angle;
+
+ if (item->angle == angle) return EINA_FALSE;
+
+ temp_angle = angle;
+
+ if (angle < item->min_angle) temp_angle = item->min_angle;
+ if (angle > item->max_angle) temp_angle = item->max_angle;
+
+ if (item->angle == temp_angle) return EINA_FALSE;
+
+ item->angle = temp_angle;
+ item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item, double angle_offset)
+{
+ if (item->angle_offset == angle_offset) return EINA_FALSE;
+
+ item->angle_offset = angle_offset;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value)
+{
+ double angle;
+
+ if (item->value == value) return EINA_FALSE;
+
+ item->value = value;
+
+ if (item->value < item->min_value) item->value = item->min_value;
+ if (item->value > item->max_value) item->value = item->max_value;
+
+ angle = _eext_circle_object_item_value_angle_get(item, item->value);
+
+ if (item->angle == angle) return EINA_FALSE;
+
+ item->angle = angle;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_color_set_internal(Eext_Circle_Object_Item *item,
+ int r, int g, int b, int a)
+{
+ if (r > 255) r = 255; if (r < 0) r = 0;
+ if (g > 255) g = 255; if (g < 0) g = 0;
+ if (b > 255) b = 255; if (b < 0) b = 0;
+ if (a > 255) a = 255; if (a < 0) a = 0;
+
+ if ((item->color.r == r) && (item->color.g == g) && (item->color.b == b) && (item->color.a == a))
+ return EINA_FALSE;
+
+ item->color.r = r;
+ item->color.g = g;
+ item->color.b = b;
+ item->color.a = a;
+
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item)
+{
+ if (!item) return;
+
+ if (item->color_transit.animator_cb)
+ ecore_animator_del(item->color_transit.animator_cb);
+
+ item->color_transit.animator_cb = NULL;
+}
+
+static void
+_eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item)
+{
+ if (!item) return;
+
+ if (item->angle_transit.animator_cb)
+ ecore_animator_del(item->angle_transit.animator_cb);
+
+ item->angle_transit.animator_cb = NULL;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_transit_set_internal(Eext_Circle_Object_Item *item, double duration,
+ double to_angle, double to_angle_offset,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+ if (duration == 0.0) return EINA_FALSE;
+ if ((item->angle_transit.duration == duration) &&
+ (item->angle == to_angle) &&
+ (item->angle_offset == to_angle_offset))
+ return EINA_FALSE;
+
+ if (item->angle_transit.animator_cb)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+
+ // If previous animator is never excuted, run animator callback manually once.
+ if (item->angle_transit.current_animator_pos == 0.0)
+ {
+ double current_time = ecore_time_unix_get();
+
+ if (item->angle_transit.start_time != current_time)
+ {
+ double pos = (current_time - item->angle_transit.start_time) /
+ item->angle_transit.duration;
+
+ _eext_circle_object_item_angle_transit_animator_cb(item, pos);
+ }
+ }
+ }
+
+ _eext_circle_object_item_angle_set_internal(item, to_angle);
+ _eext_circle_object_item_angle_offset_set_internal(item, to_angle_offset);
+
+ item->angle_transit.start_time = ecore_time_unix_get();
+ item->angle_transit.current_animator_pos = 0.0;
+ item->angle_transit.duration = duration;
+ item->angle_transit.from_angle = item->draw.angle;
+ item->angle_transit.from_angle_offset = item->draw.angle_offset;
+ item->angle_transit.cubic_bezier_enabled = cubic_bezier_enabled;
+
+ if (cubic_bezier_enabled)
+ {
+ item->angle_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
+ item->angle_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
+ item->angle_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
+ item->angle_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
+ }
+
+ item->angle_transit.animator_cb = ecore_animator_timeline_add(duration,
+ _eext_circle_object_item_angle_transit_animator_cb,
+ item);
+
+ return EINA_TRUE;
+}
+
+//////////////////////////////
+// Internal API //////////////
+//////////////////////////////
+double
+_eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value)
+{
+ double angle;
+
+ angle = item->min_angle;
+ if (item->max_value != item->min_value)
+ angle += (value - item->min_value) * (item->max_angle - item->min_angle) / (item->max_value - item->min_value);
+
+ if (angle < item->min_angle) angle = item->min_angle;
+ if (angle > item->max_angle) angle = item->max_angle;
+
+ return angle;
+}
+
+double
+_eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle)
+{
+ double value;
+
+ value = item->min_value;
+ if (item->max_angle != item->min_angle)
+ value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle);
+
+ if (value < item->min_value) value = item->min_value;
+ if (value > item->max_value) value = item->max_value;
+
+ return value;
+}
+
+const char *
+_eext_circle_text_font_get(const char *text, const char *font_family)
+{
+ FcFontSet *set = NULL;
+ FcPattern *p_nm = NULL;
+ FcCharSet *c_set = NULL;
+ FcValue family;
+ FcResult result;
+ Eina_Unicode u_str;
+ int u_str_index = 0;
+
+ if (!text || !font_family)
+ return NULL;
+
+ // Going to use first character.
+ u_str = eina_unicode_utf8_next_get(text, &u_str_index);
+
+ // Query font using FontConfig.
+ c_set = FcCharSetCreate();
+ p_nm = FcPatternBuild (NULL,
+ FC_WEIGHT, FcTypeInteger, FC_WEIGHT_NORMAL,
+ FC_SLANT, FcTypeInteger, FC_SLANT_ROMAN,
+ FC_WIDTH, FcTypeInteger, FC_WIDTH_NORMAL,
+ NULL);
+
+ FcCharSetAddChar(c_set, (FcChar32)u_str);
+ FcPatternAddCharSet(p_nm, FC_CHARSET, c_set);
+ FcPatternAddString(p_nm, FC_FAMILY, (FcChar8 *)font_family);
+ FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
+ FcDefaultSubstitute(p_nm);
+ set = FcFontSort(NULL, p_nm, FcTrue, NULL, &result);
+
+ FcCharSetDestroy(c_set);
+ FcPatternDestroy(p_nm);
+
+ result = FcPatternGet(set->fonts[0], FC_FAMILY, 0, &family);
+ FcFontSetSortDestroy(set);
+
+ if (result == FcResultNoMatch)
+ {
+ ERR("Fail to Load Family Name to draw %s [%X]", text, u_str);
+ return NULL;
+ }
+
+ return (const char *)family.u.s;
+}
+
+Eext_Circle_Object_Item *
+_eext_circle_object_item_new(void)
+{
+ Eext_Circle_Object_Item *item;
+
+ item = (Eext_Circle_Object_Item *)calloc(1, sizeof(Eext_Circle_Object_Item));
+
+ // Initialize...
+ item->name = eina_stringshare_add("default");
+ item->angle = item->draw.angle = 0.0;
+ item->angle_offset = item->draw.angle_offset = 0.0;
+ item->min_angle = 0;
+ item->max_angle = 360;
+ item->min_value = 0;
+ item->max_value = 360;
+ item->radius = 176;
+ item->line_width = 8;
+ item->color.r = item->draw.color.r = 102;
+ item->color.g = item->draw.color.g = 179;
+ item->color.b = item->draw.color.b = 230;
+ item->color.a = item->draw.color.a = 255;
+
+ return item;
+}
+
+void
+_eext_circle_object_item_free(Eext_Circle_Object_Item *item)
+{
+ if (!item) return;
+
+ eina_stringshare_del(item->name);
+
+ if (item->color_transit.animator_cb)
+ _eext_circle_object_item_color_transit_animator_del(item);
+
+ if (item->angle_transit.animator_cb)
+ _eext_circle_object_item_angle_transit_animator_del(item);
+
+ if (item->obj)
+ _eext_circle_object_item_remove(item);
+
+ free(item);
+}
+
+void
+_eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
+{
+ if (!obj || !item) return;
+
+ if (obj == item->obj)
+ {
+ ERR("You are trying to append the item that is already appended");
+ return;
+ }
+
+ if (item->obj)
+ {
+ ERR("You are trying to append the item that is already appended to the other object!");
+ return;
+ }
+
+ obj->items = eina_list_append(obj->items, item);
+ item->obj = obj;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
+{
+ if (!obj || !item) return;
+
+ if (obj == item->obj)
+ {
+ ERR("You are trying to append the item that is already appended");
+ return;
+ }
+
+ if (item->obj)
+ {
+ ERR("You are trying to append the item that is already appended to the other object!");
+ return;
+ }
+
+ obj->items = eina_list_prepend(obj->items, item);
+ item->obj = obj;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item)
+{
+ if (!obj || !item) return;
+
+ if (obj == item->obj)
+ {
+ ERR("You are trying to append the item that is already appended");
+ return;
+ }
+
+ if (item->obj)
+ {
+ ERR("You are trying to append the item that is already appended to the other object!");
+ return;
+ }
+
+ if (!before) _eext_circle_object_item_prepend(obj, item);
+
+ obj->items = eina_list_prepend_relative(obj->items, item, before);
+ item->obj = obj;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item)
+{
+ if (!obj || !item) return;
+
+ if (obj == item->obj)
+ {
+ ERR("You are trying to append the item that is already appended");
+ return;
+ }
+
+ if (item->obj)
+ {
+ ERR("You are trying to append the item that is already appended to the other object!");
+ return;
+ }
+
+ if (!after) _eext_circle_object_item_append(obj, item);
+
+ obj->items = eina_list_append_relative(obj->items, item, after);
+ item->obj = obj;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_remove(Eext_Circle_Object_Item *item)
+{
+ if (!item || !item->obj) return;
+
+ // You must have to free this item.
+ item->obj->items = eina_list_remove(item->obj->items, item);
+
+ _eext_circle_object_changed(item->obj);
+ item->obj = NULL;
+}
+
+void
+_eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name)
+{
+ if (!item) return;
+
+ if (name)
+ eina_stringshare_replace(&item->name, name);
+ else
+ eina_stringshare_replace(&item->name, "default");
+}
+
+const char *
+_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return NULL;
+
+ return item->name;
+}
+
+void
+_eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width)
+{
+ if (!item) return;
+
+ if ((line_width <= 0) || (item->line_width == line_width)) return;
+
+ item->line_width = line_width;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+int
+_eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1;
+
+ return item->line_width;
+}
+
+void
+_eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle)
+{
+ if (!item) return;
+
+ if (item->angle_transit.animator_cb)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+
+ if (_eext_circle_object_item_angle_set_internal(item, angle))
+ {
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+}
+
+double
+_eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1.0;
+
+ return item->angle;
+}
+
+void
+_eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset)
+{
+ if (!item) return;
+
+ if (_eext_circle_object_item_angle_offset_set_internal(item, angle_offset))
+ {
+ item->draw.angle_offset = item->angle_offset;
+ _eext_circle_object_changed(item->obj);
+ }
+}
+
+double
+_eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1.0;
+
+ return item->angle_offset;
+}
+
+void
+_eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle)
+{
+ double angle = 0.0;
+
+ if (!item) return;
+
+ if (item->angle_transit.animator_cb)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+
+ if ((item->min_angle == min_angle) && (item->max_angle == max_angle)) return;
+
+ item->min_angle = min_angle;
+ item->max_angle = max_angle;
+
+ if (item->angle < item->min_angle) angle = item->min_angle;
+ if (item->angle > item->max_angle) angle = item->max_angle;
+
+ if (item->angle == angle) return;
+
+ item->angle = angle;
+ item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+ item->draw.angle = item->angle;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item, double *min_angle, double *max_angle)
+{
+ if (!item)
+ {
+ if (min_angle) *min_angle = 0.0;
+ if (max_angle) *max_angle = 0.0;
+
+ return;
+ }
+
+ if (min_angle) *min_angle = item->min_angle;
+ if (max_angle) *max_angle = item->max_angle;
+}
+
+void
+_eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double min_value, double max_value)
+{
+ double angle;
+
+ if (!item) return;
+
+ if (item->angle_transit.animator_cb)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+
+ if ((item->min_value == min_value) && (item->max_value == max_value)) return;
+
+ item->min_value = min_value;
+ item->max_value = max_value;
+
+ if (item->value < item->min_value) item->value = item->min_value;
+ if (item->value > item->max_value) item->value = item->max_value;
+
+ angle = _eext_circle_object_item_value_angle_get(item, item->value);
+
+ if (item->angle == angle) return;
+
+ item->angle = angle;
+ item->draw.angle = item->angle;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item, double *min_value, double *max_value)
+{
+ if (!item)
+ {
+ if (min_value) *min_value = 0.0;
+ if (max_value) *max_value = 0.0;
+
+ return;
+ }
+
+ if (min_value) *min_value = item->min_value;
+ if (max_value) *max_value = item->max_value;
+}
+
+void
+_eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value)
+{
+ if (!item) return;
+
+ if (item->angle_transit.animator_cb)
+ {
+ _eext_circle_object_item_angle_transit_animator_del(item);
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+
+ if (_eext_circle_object_item_value_set_internal(item, value))
+ {
+ item->draw.angle = item->angle;
+ _eext_circle_object_changed(item->obj);
+ }
+}
+
+double
+_eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1.0;
+
+ return item->value;
+}
+
+void
+_eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
+ int r, int g, int b, int a)
+{
+ if (!item) return;
+
+ if (item->color_transit.animator_cb)
+ {
+ _eext_circle_object_item_color_transit_animator_del(item);
+ item->draw.color.r = item->color.r;
+ item->draw.color.g = item->color.g;
+ item->draw.color.b = item->color.b;
+ item->draw.color.a = item->color.a;
+
+ _eext_circle_object_changed(item->obj);
+ }
+
+ if (_eext_circle_object_item_color_set_internal(item, r, g, b, a))
+ {
+ item->draw.color.r = item->color.r;
+ item->draw.color.g = item->color.g;
+ item->draw.color.b = item->color.b;
+ item->draw.color.a = item->color.a;
+
+ _eext_circle_object_changed(item->obj);
+ }
+}
+
+void
+_eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
+ int *r, int *g, int *b, int *a)
+{
+ if (!item)
+ {
+ if (r) *r = 0;
+ if (g) *g = 0;
+ if (b) *b = 0;
+ if (a) *a = 0;
+
+ return;
+ }
+
+ if (r) *r = item->color.r;
+ if (g) *g = item->color.g;
+ if (b) *b = item->color.b;
+ if (a) *a = item->color.a;
+}
+
+void
+_eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius)
+{
+ if (!item) return;
+
+ if (radius < 0.0) radius = 0.0; if (radius > 180.0) radius = 180.0;
+
+ if (item->radius == radius) return;
+
+ item->radius = radius;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+double
+_eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1.0;
+
+ return item->radius;
+}
+
+void
+_eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
+ const char *text,
+ const char *font)
+{
+ const char *selected_font;
+
+ if (!item) return;
+
+ if (font)
+ eina_stringshare_replace(&item->font, font);
+ else
+ eina_stringshare_replace(&item->font, "Tizen");
+
+ eina_stringshare_replace(&item->text, text);
+
+ selected_font = _eext_circle_text_font_get(item->text, item->font);
+
+ if (!selected_font)
+ {
+ ERR("There is no font for the text: %s", text);
+ }
+
+ eina_stringshare_replace(&item->selected_font, selected_font);
+
+ _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
+ const char **text,
+ const char **font)
+{
+ if (!item)
+ {
+ if (text) *text = NULL;
+ if (font) *font = NULL;
+
+ return;
+ }
+
+ if (text) *text = item->text;
+ if (font) *font = item->font;
+}
+
+void
+_eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
+ int font_size)
+{
+ if (!item) return;
+
+ if (item->font_size == font_size) return;
+
+ item->font_size = font_size;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+int
+_eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1;
+
+ return item->font_size;
+}
+
+void
+_eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
+ int to_r, int to_g, int to_b, int to_a,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+ if (!item) return;
+
+ if (duration == 0.0) return;
+ if ((item->color_transit.duration == duration) &&
+ (item->color.r == to_r) && (item->color.g == to_g) && (item->color.b == to_b) && (item->color.a == to_a))
+ return;
+
+ if (item->color_transit.animator_cb)
+ {
+ _eext_circle_object_item_color_transit_animator_del(item);
+
+ if (item->color_transit.current_animator_pos == 0.0)
+ {
+ double current_time = ecore_time_unix_get();
+
+ if (item->color_transit.start_time != current_time)
+ {
+ double pos = (current_time - item->color_transit.start_time) /
+ item->color_transit.duration;
+
+ _eext_circle_object_item_color_transit_animator_cb(item, pos);
+ }
+ }
+ }
+
+ _eext_circle_object_item_color_set_internal(item, to_r, to_g, to_b, to_a);
+
+ item->color_transit.start_time = ecore_time_unix_get();
+ item->color_transit.current_animator_pos = 0.0;
+ item->color_transit.duration = duration;
+ item->color_transit.from_color.r = item->draw.color.r;
+ item->color_transit.from_color.g = item->draw.color.g;
+ item->color_transit.from_color.b = item->draw.color.b;
+ item->color_transit.from_color.a = item->draw.color.a;
+ item->color_transit.cubic_bezier_enabled = cubic_bezier_enabled;
+
+ if (cubic_bezier_enabled)
+ {
+ item->color_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
+ item->color_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
+ item->color_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
+ item->color_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
+ }
+
+ item->color_transit.animator_cb = ecore_animator_timeline_add(duration,
+ _eext_circle_object_item_color_transit_animator_cb,
+ item);
+}
+
+
+void
+_eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
+ double to_angle, double to_angle_offset,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+ Eina_Bool ret;
+
+ if (!item) return;
+
+ ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
+ to_angle, to_angle_offset,
+ cubic_bezier_enabled,
+ cubic_bezier_p1_x, cubic_bezier_p1_y,
+ cubic_bezier_p2_x, cubic_bezier_p2_y);
+
+ if (ret)
+ item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+}
+
+void
+_eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
+ double to_value,
+ Eina_Bool cubic_bezier_enabled,
+ double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+ double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+ Eina_Bool ret;
+ double to_angle, to_angle_offset;
+
+ if (!item) return;
+
+ to_angle = _eext_circle_object_item_value_angle_get(item, to_value);
+ to_angle_offset = item->angle_offset;
+
+ ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
+ to_angle, to_angle_offset,
+ cubic_bezier_enabled,
+ cubic_bezier_p1_x, cubic_bezier_p1_y,
+ cubic_bezier_p2_x, cubic_bezier_p2_y);
+
+ if (ret)
+ item->value = to_value;
+}
+
+void
+_eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool enable)
+{
+ if (!item) return;
+
+ if (item->round_cap == enable) return;
+
+ item->round_cap = enable;
+
+ _eext_circle_object_changed(item->obj);
+}
+
+Eina_Bool
+_eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item)
+{
+ if (!item) return -1;
+
+ return item->round_cap;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE "Eext_Circle_Progressbar"
+
+#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Progressbar_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE)) \
+ data = (Eext_Circle_Object_Progressbar_Data *)circle_obj->widget_data; \
+ if (!data)
+
+#define PROGRESSBAR_ITEM_NAME "default"
+#define PROGRESSBAR_BG_ITEM_NAME "bg"
+
+#define PROGRESSBAR_COLOR_R 77
+#define PROGRESSBAR_COLOR_G 207
+#define PROGRESSBAR_COLOR_B 255
+#define PROGRESSBAR_COLOR_A 255
+
+#define PROGRESSBAR_BG_COLOR_R 0
+#define PROGRESSBAR_BG_COLOR_G 67
+#define PROGRESSBAR_BG_COLOR_B 115
+#define PROGRESSBAR_BG_COLOR_A 255
+
+#define PROGRESSBAR_COLOR_DISABLED_R 77
+#define PROGRESSBAR_COLOR_DISABLED_G 207
+#define PROGRESSBAR_COLOR_DISABLED_B 255
+#define PROGRESSBAR_COLOR_DISABLED_A 153
+
+#define PROGRESSBAR_BG_COLOR_DISABLED_R 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_G 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_B 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_A 255
+
+#define PROGRESSBAR_WIDTH_SIZE 8
+#define PROGRESSBAR_RADIUS_SIZE 176
+
+static void
+_eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj)
+{
+ if (obj->widget_data)
+ {
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+ }
+}
+
+static void
+_eext_circle_object_progressbar_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item;
+ int r, g, b, a;
+
+ EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, widget_data) return;
+
+ item = _eext_circle_object_item_get(obj, item_name);
+ if (!item) return;
+
+ _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+ if (!strcmp(item_name, PROGRESSBAR_ITEM_NAME))
+ {
+ widget_data->color.r = r;
+ widget_data->color.g = g;
+ widget_data->color.b = b;
+ widget_data->color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, PROGRESSBAR_BG_ITEM_NAME))
+ {
+ widget_data->bg_color.r = r;
+ widget_data->bg_color.g = g;
+ widget_data->bg_color.b = b;
+ widget_data->bg_color.a = a;
+
+ return;
+ }
+}
+
+static void
+_eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item, *bg_item;
+
+ EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
+
+ item = _eext_circle_object_item_get(obj, PROGRESSBAR_ITEM_NAME);
+ bg_item = _eext_circle_object_item_get(obj, PROGRESSBAR_BG_ITEM_NAME);
+
+ if (obj->disabled)
+ {
+ if (item)
+ _eext_circle_object_item_color_set(item,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a);
+ if (bg_item)
+ _eext_circle_object_item_color_set(bg_item,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a);
+ }
+ else
+ {
+ if (item)
+ _eext_circle_object_item_color_set(item,
+ data->color.r,
+ data->color.g,
+ data->color.b,
+ data->color.a);
+ if (bg_item)
+ _eext_circle_object_item_color_set(bg_item,
+ data->bg_color.r,
+ data->bg_color.g,
+ data->bg_color.b,
+ data->bg_color.a);
+ }
+}
+
+static void
+_eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item;
+ Eext_Circle_Object_Progressbar_Data *data;
+
+ obj->widget_object = NULL;
+ obj->widget_type = EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE;
+ obj->del_func = _eext_circle_object_progressbar_del_cb;
+ obj->disabled_func = _eext_circle_object_progressbar_disabled_cb;
+ obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb;
+
+ data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data));
+ data->color.r = PROGRESSBAR_COLOR_R;
+ data->color.g = PROGRESSBAR_COLOR_G;
+ data->color.b = PROGRESSBAR_COLOR_B;
+ data->color.a = PROGRESSBAR_COLOR_A;
+ data->bg_color.r = PROGRESSBAR_BG_COLOR_R;
+ data->bg_color.g = PROGRESSBAR_BG_COLOR_G;
+ data->bg_color.b = PROGRESSBAR_BG_COLOR_B;
+ data->bg_color.a = PROGRESSBAR_BG_COLOR_A;
+ data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R;
+ data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G;
+ data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B;
+ data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A;
+ data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
+ data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
+ data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
+ data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
+ obj->widget_data = (void *)data;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME);
+ _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
+ _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
+ _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
+ _eext_circle_object_item_angle_set(item, 360);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, PROGRESSBAR_ITEM_NAME);
+ _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
+ _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
+ _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
+ _eext_circle_object_item_append(obj, item);
+}
+
+static char *
+_accessible_name_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *progressbar;
+ double value;
+ char ret[255];
+
+ progressbar = data;
+ value = eext_circle_object_value_get(progressbar);
+
+ snprintf(ret, sizeof(ret), "%d Percent", (int)value);
+ return strdup(ret);
+}
+
+EAPI Evas_Object *
+eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!parent) return NULL;
+
+ obj = elm_image_add(parent);
+ _eext_circle_object_init(obj, NULL, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_progressbar_init(circle_obj);
+
+ /* Accessibility */
+ if (!surface)
+ {
+ elm_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_PROGRESS_BAR);
+ elm_atspi_accessible_name_cb_set(obj, _accessible_name_cb, obj);
+ }
+ else
+ {
+ elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PROGRESS_BAR);
+ elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj);
+ }
+
+ return obj;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_SCROLLER_TYPE "Eext_Circle_Object_Scroller"
+
+#define VERTICAL_BAR_NAME "default"
+#define VERTICAL_BAR_BG_NAME "vertical,scroll,bg"
+#define VERTICAL_BAR_ANGLE_START 60.0
+#define VERTICAL_BAR_ANGLE_RANGE 60.0
+#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
+#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+
+#define HORIZONTAL_BAR_NAME "horizontal,scroll,bar"
+#define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg"
+#define HORIZONTAL_BAR_ANGLE_START -30.0
+#define HORIZONTAL_BAR_ANGLE_RANGE 60.0
+#define HORIZONTAL_BAR_ANGLE_MAX_SIZE 60.0
+#define HORIZONTAL_BAR_ANGLE_MIN_SIZE 6.0
+
+#define SCROLL_BAR_TRANSIT_TIME 0.2
+#define SCROLL_BAR_HIDE_WAITTING_TIME 10.2
+#define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
+#define SCROLL_BAR_WIDTH_SIZE 10
+#define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
+
+#define SCROLL_BAR_COLOR_R 14
+#define SCROLL_BAR_COLOR_G 137
+#define SCROLL_BAR_COLOR_B 181
+#define SCROLL_BAR_COLOR_A 255
+
+#define SCROLL_BAR_BG_COLOR_R 250
+#define SCROLL_BAR_BG_COLOR_G 250
+#define SCROLL_BAR_BG_COLOR_B 250
+#define SCROLL_BAR_BG_COLOR_A 38
+
+#define SCROLL_BAR_COLOR_DISABLED_R 45
+#define SCROLL_BAR_COLOR_DISABLED_G 45
+#define SCROLL_BAR_COLOR_DISABLED_B 45
+#define SCROLL_BAR_COLOR_DISABLED_A 255
+
+#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
+
+#define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Scroller_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \
+ data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \
+ if (!data)
+
+static void
+_eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item;
+ int r, g, b, a;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return;
+
+ item = _eext_circle_object_item_get(obj, item_name);
+ if (!item) return;
+
+ _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+ if (!strcmp(item_name, VERTICAL_BAR_NAME))
+ {
+ widget_data->vertical_color.r = r;
+ widget_data->vertical_color.g = g;
+ widget_data->vertical_color.b = b;
+ widget_data->vertical_color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, VERTICAL_BAR_BG_NAME))
+ {
+ widget_data->vertical_bg_color.r = r;
+ widget_data->vertical_bg_color.g = g;
+ widget_data->vertical_bg_color.b = b;
+ widget_data->vertical_bg_color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, HORIZONTAL_BAR_NAME))
+ {
+ widget_data->horizontal_color.r = r;
+ widget_data->horizontal_color.g = g;
+ widget_data->horizontal_color.b = b;
+ widget_data->horizontal_color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, HORIZONTAL_BAR_BG_NAME))
+ {
+ widget_data->horizontal_bg_color.r = r;
+ widget_data->horizontal_bg_color.g = g;
+ widget_data->horizontal_bg_color.b = b;
+ widget_data->horizontal_bg_color.a = a;
+
+ return;
+ }
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
+{
+ Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Item *item, *bg_item;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
+
+ if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+ {
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+ bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ 0, 0, 0, 0,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ 0, 0, 0, 0,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+
+ if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO)
+ {
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+ bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ 0, 0, 0, 0,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ 0, 0, 0, 0,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+
+ if (widget_data->bar_hide_timer)
+ {
+ ecore_timer_del(widget_data->bar_hide_timer);
+ widget_data->bar_hide_timer = NULL;
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
+ double hide_waiting_time)
+{
+ Eext_Circle_Object_Item *item, *bg_item;
+ Evas_Object *scroller = obj->widget_object;
+ Evas_Coord cont_v = 0, cont_h = 0; /* content v/h */
+ Evas_Coord pos_x = 0, pos_y = 0; /* postion x/y */
+ Evas_Coord vp_v = 0, vp_h = 0; /* viewport v/h */
+ double bar_pos_v = 0.0, bar_pos_h = 0.0; /* bar position v/h */
+ double bar_size_v = 0.0, bar_size_h = 0.0; /* bar size v/h */
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+ elm_scroller_child_size_get(scroller, &cont_h, &cont_v);
+ elm_scroller_region_get(scroller, &pos_y, &pos_x, &vp_h, &vp_v);
+
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+ bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+
+ if ((cont_v > 0.0) && (vp_v > 0.0) &&
+ (data->policy_v != ELM_SCROLLER_POLICY_OFF))
+ {
+ if (cont_v > vp_v)
+ {
+ bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)cont_v / (double)vp_v);
+
+ if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
+ bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+ if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
+ bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
+ }
+ else
+ bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+
+ bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)cont_v) * (double)pos_x;
+ bar_pos_v += VERTICAL_BAR_ANGLE_START;
+
+ _eext_circle_object_item_angle_offset_set(item, bar_pos_v);
+ _eext_circle_object_item_angle_set(item, bar_size_v);
+
+ if (obj->disabled)
+ {
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+ else
+ {
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ data->vertical_color.r,
+ data->vertical_color.g,
+ data->vertical_color.b,
+ data->vertical_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ data->vertical_bg_color.r,
+ data->vertical_bg_color.g,
+ data->vertical_bg_color.b,
+ data->vertical_bg_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+ }
+ else
+ {
+ _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
+ _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
+ }
+
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+ bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+
+ if ((cont_h > 0.0) && (vp_h > 0.0) &&
+ (data->policy_h != ELM_SCROLLER_POLICY_OFF))
+ {
+ if (cont_h > vp_h)
+ {
+ bar_size_h = HORIZONTAL_BAR_ANGLE_RANGE / ((double)cont_h / (double)vp_h);
+
+ if (bar_size_h > HORIZONTAL_BAR_ANGLE_MAX_SIZE)
+ bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
+ if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE)
+ bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE;
+ }
+ else
+ bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
+
+ bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)cont_h) * (double)pos_y;
+ bar_pos_h += HORIZONTAL_BAR_ANGLE_START;
+
+ _eext_circle_object_item_angle_offset_set(item, bar_pos_h);
+ _eext_circle_object_item_angle_set(item, bar_size_h);
+
+ if (obj->disabled)
+ {
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+ else
+ {
+ _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+ data->horizontal_color.r,
+ data->horizontal_color.g,
+ data->horizontal_color.b,
+ data->horizontal_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+ data->horizontal_bg_color.r,
+ data->horizontal_bg_color.g,
+ data->horizontal_bg_color.b,
+ data->horizontal_bg_color.a,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+ }
+ }
+ else
+ {
+ _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
+ _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
+ }
+
+ if ((hide_waiting_time > 0.0) &&
+ ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
+ (data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
+ {
+ if (data->bar_hide_timer)
+ ecore_timer_del(data->bar_hide_timer);
+
+ data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
+ _eext_circle_object_scroller_scrollbar_policy_hide_cb,
+ obj);
+ }
+}
+
+static void
+_eext_circle_object_scroller_scroll_cb(void *data,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+ if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+ (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+ return;
+
+ _eext_circle_object_scroller_scrollbar_update(circle_obj,
+ SCROLL_BAR_HIDE_WAITTING_TIME);
+}
+
+static void
+_eext_circle_object_scroller_show_cb(void *data,
+ Evas *e,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+ if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+ (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+ return;
+
+ _eext_circle_object_scroller_scrollbar_update(circle_obj,
+ SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+static void
+_eext_circle_object_scroller_content_resize_cb(void *data,
+ Evas_Object *obj,
+ void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+ if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+ (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+ return;
+
+ _eext_circle_object_scroller_scrollbar_update(circle_obj,
+ SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_rotary_changed_cb(void *data,
+ Evas_Object *obj,
+ Eext_Rotary_Event_Info *info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Evas_Object *scroller = circle_obj->widget_object;
+ int h_pagesize, v_pagesize;
+ int cw, ch;
+ int x, y, w, h;
+ int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1;
+ Elm_Scroller_Movement_Block scroller_block;
+ Eina_Bool scroll_locked_x, scroll_locked_y;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
+
+ if (elm_object_scroll_freeze_get(scroller))
+ return EINA_TRUE;
+
+ elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
+ elm_scroller_child_size_get(scroller, &cw, &ch);
+ elm_scroller_region_get(scroller, &x, &y, &w, &h);
+
+ scroller_block = elm_scroller_movement_block_get(scroller);
+ scroll_locked_x = elm_object_scroll_lock_x_get(scroller);
+ scroll_locked_y = elm_object_scroll_lock_y_get(scroller);
+
+ if ((h_pagesize > 0) || (v_pagesize > 0))
+ {
+ int h_current_page, v_current_page;
+
+ // Handle scroll per page
+ elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page);
+
+ if (!scroll_locked_y &&
+ !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+ (ch > h) && (v_pagesize > 0))
+ {
+ v_current_page += d;
+ }
+ else if (!scroll_locked_x &&
+ !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+ (cw > w) && (h_pagesize > 0))
+ {
+ h_current_page += d;
+ }
+
+ if (v_current_page < 0) v_current_page = 0;
+ if (h_current_page < 0) h_current_page = 0;
+
+ elm_scroller_page_bring_in(scroller, h_current_page,v_current_page);
+ }
+ else
+ {
+ // Handle scroll
+ if (!scroll_locked_y &&
+ !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+ (ch > h))
+ {
+ y += d * widget_data->step_y;
+ }
+ else if (!scroll_locked_x &&
+ !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+ (cw > w))
+ {
+ x += d * widget_data->step_x;
+ }
+
+ if (y < 0) y = 0;
+ if (x < 0) x = 0;
+
+ elm_scroller_region_bring_in(scroller, x, y, w, h);
+ }
+
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
+{
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+ evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
+ evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
+ evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+ eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
+ eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+
+ if (data->bar_hide_timer)
+ {
+ ecore_timer_del(data->bar_hide_timer);
+ data->bar_hide_timer = NULL;
+ }
+
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+}
+
+static void
+_eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item;
+
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+ if (obj->disabled)
+ {
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a);
+
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a);
+
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a);
+
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a);
+
+ eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
+ eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+ }
+ else
+ {
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->vertical_color.r,
+ data->vertical_color.g,
+ data->vertical_color.b,
+ data->vertical_color.a);
+
+ item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->vertical_bg_color.r,
+ data->vertical_bg_color.g,
+ data->vertical_bg_color.b,
+ data->vertical_bg_color.a);
+
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->horizontal_color.r,
+ data->horizontal_color.g,
+ data->horizontal_color.b,
+ data->horizontal_color.a);
+
+ item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->horizontal_bg_color.r,
+ data->horizontal_bg_color.g,
+ data->horizontal_bg_color.b,
+ data->horizontal_bg_color.a);
+
+ eext_rotary_object_event_callback_add(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb, obj);
+ eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+ }
+}
+
+static void
+_eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller)
+{
+ Eext_Circle_Object_Scroller_Data *data;
+ Eext_Circle_Object_Item *item;
+
+ obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE;
+ obj->del_func = _eext_circle_object_scroller_del_cb;
+ obj->disabled_func = _eext_circle_object_scroller_disabled_cb;
+ obj->color_changed_func = _eext_circle_object_scroller_color_changed_cb;
+
+ data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data));
+ data->policy_v = ELM_SCROLLER_POLICY_AUTO;
+ data->policy_h = ELM_SCROLLER_POLICY_AUTO;
+ data->line_width = SCROLL_BAR_WIDTH_SIZE;
+ data->radius = SCROLL_BAR_RADIUS_SIZE;
+ data->step_x = data->step_y = 32;
+ data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R;
+ data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G;
+ data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B;
+ data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A;
+ data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R;
+ data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G;
+ data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B;
+ data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A;
+ data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
+ data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
+ data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
+ data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
+ data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
+ data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
+ data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
+ data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+ obj->widget_data = (void *)data;
+
+ // We don't want to allow to change properties of these items.
+ // There is no item with "default" as its name.
+ // So, eext_circle_object_* APIs is meaningless in here.
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, VERTICAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->vertical_bg_color.r,
+ data->vertical_bg_color.g,
+ data->vertical_bg_color.b,
+ 0);
+ _eext_circle_object_item_line_width_set(item, data->line_width);
+ _eext_circle_object_item_radius_set(item, data->radius);
+ _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+ _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_BG_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->horizontal_bg_color.r,
+ data->horizontal_bg_color.g,
+ data->horizontal_bg_color.b,
+ 0);
+ _eext_circle_object_item_line_width_set(item, data->line_width);
+ _eext_circle_object_item_radius_set(item, data->radius);
+ _eext_circle_object_item_angle_offset_set(item, HORIZONTAL_BAR_ANGLE_START);
+ _eext_circle_object_item_angle_set(item, HORIZONTAL_BAR_ANGLE_RANGE);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, VERTICAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->vertical_color.r,
+ data->vertical_color.g,
+ data->vertical_color.b,
+ data->vertical_color.a);
+ _eext_circle_object_item_line_width_set(item, data->line_width);
+ _eext_circle_object_item_radius_set(item, data->radius);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_NAME);
+ _eext_circle_object_item_color_set(item,
+ data->horizontal_color.r,
+ data->horizontal_color.g,
+ data->horizontal_color.b,
+ data->horizontal_color.a);
+ _eext_circle_object_item_line_width_set(item, data->line_width);
+ _eext_circle_object_item_radius_set(item, data->radius);
+ _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+ _eext_circle_object_item_append(obj, item);
+
+ elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
+ evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
+ evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+
+ eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
+ eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!scroller) return NULL;
+
+ obj = elm_image_add(scroller);
+ _eext_circle_object_init(obj, scroller, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_scroller_init(circle_obj, scroller);
+
+ return obj;
+}
+
+EAPI void
+eext_circle_object_scroller_policy_set(Evas_Object *obj,
+ Elm_Scroller_Policy policy_h,
+ Elm_Scroller_Policy policy_v)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
+
+ if ((data->policy_v == policy_v) && (data->policy_h == policy_h))
+ return;
+
+ if (policy_v < ELM_SCROLLER_POLICY_LAST)
+ data->policy_v = policy_v;
+
+ if (policy_h < ELM_SCROLLER_POLICY_LAST)
+ data->policy_h = policy_h;
+
+ _eext_circle_object_scroller_scrollbar_update(circle_obj,
+ SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+EAPI void
+eext_circle_object_scroller_policy_get(const Evas_Object *obj,
+ Elm_Scroller_Policy *policy_h,
+ Elm_Scroller_Policy *policy_v)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
+
+ if (policy_v) *policy_v = data->policy_v;
+ if (policy_h) *policy_h = data->policy_h;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_SLIDER_TYPE "Eext_Circle_Object_Slider"
+
+#define SLIDER_TRANSIT_TIME 0.3
+
+#define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Slider_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SLIDER_TYPE)) \
+ data = (Eext_Circle_Object_Slider_Data *)circle_obj->widget_data; \
+ if (!data)
+
+#define SLIDER_ITEM_NAME "default"
+#define SLIDER_BG_ITEM_NAME "bg"
+
+#define SLIDER_COLOR_R 77
+#define SLIDER_COLOR_G 207
+#define SLIDER_COLOR_B 255
+#define SLIDER_COLOR_A 255
+
+#define SLIDER_BG_COLOR_R 0
+#define SLIDER_BG_COLOR_G 67
+#define SLIDER_BG_COLOR_B 115
+#define SLIDER_BG_COLOR_A 255
+
+#define SLIDER_COLOR_DISABLED_R 77
+#define SLIDER_COLOR_DISABLED_G 207
+#define SLIDER_COLOR_DISABLED_B 255
+#define SLIDER_COLOR_DISABLED_A 153
+
+#define SLIDER_BG_COLOR_DISABLED_R 64
+#define SLIDER_BG_COLOR_DISABLED_G 64
+#define SLIDER_BG_COLOR_DISABLED_B 64
+#define SLIDER_BG_COLOR_DISABLED_A 255
+
+#define SLIDER_WIDTH_SIZE 8
+#define SLIDER_RADIUS_SIZE 176
+
+static const char SIG_VALUE_CHANGED[] = "value,changed";
+
+static void
+_eext_circle_object_slider_del_cb(Eext_Circle_Object *obj)
+{
+ if (obj->widget_data)
+ {
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+ }
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+ Evas_Object *slider = obj;
+ double current_value;
+ double next_value;
+ double min, max;
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj);
+ EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data);
+
+ Eext_Circle_Object_Item *item = NULL;
+ item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+
+ current_value = _eext_circle_object_item_value_get(item);
+
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ next_value = current_value + widget_data->value_step;
+ else
+ next_value = current_value - widget_data->value_step;
+
+ _eext_circle_object_item_value_min_max_get(item, &min, &max);
+
+ if (next_value < min) next_value = min;
+ else if (next_value > max) next_value = max;
+
+ _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME,
+ next_value,
+ EINA_TRUE,
+ 0.25, 0.46, 0.45, 1.0);
+
+ evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
+
+ /* Accessibility */
+ if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ const char *slider_desc = NULL;
+ slider_desc = elm_atspi_accessible_description_get(slider);
+ if (slider_desc && strlen(slider_desc) > 0)
+ elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL);
+ }
+
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_slider_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+ Eext_Circle_Object_Item *item;
+ int r, g, b, a;
+
+ EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, widget_data) return;
+
+ item = _eext_circle_object_item_get(obj, item_name);
+ if (!item) return;
+
+ _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+ if (!strcmp(item_name, SLIDER_ITEM_NAME))
+ {
+ widget_data->color.r = r;
+ widget_data->color.g = g;
+ widget_data->color.b = b;
+ widget_data->color.a = a;
+
+ return;
+ }
+
+ if (!strcmp(item_name, SLIDER_BG_ITEM_NAME))
+ {
+ widget_data->bg_color.r = r;
+ widget_data->bg_color.g = g;
+ widget_data->bg_color.b = b;
+ widget_data->bg_color.a = a;
+
+ return;
+ }
+}
+
+static void
+_eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Item *item, *bg_item;
+
+ EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
+
+ item = _eext_circle_object_item_get(obj, SLIDER_ITEM_NAME);
+ bg_item = _eext_circle_object_item_get(obj, SLIDER_BG_ITEM_NAME);
+
+ if (obj->disabled)
+ {
+ if (item)
+ _eext_circle_object_item_color_set(item,
+ data->disabled_color.r,
+ data->disabled_color.g,
+ data->disabled_color.b,
+ data->disabled_color.a);
+ if (bg_item)
+ _eext_circle_object_item_color_set(bg_item,
+ data->disabled_bg_color.r,
+ data->disabled_bg_color.g,
+ data->disabled_bg_color.b,
+ data->disabled_bg_color.a);
+
+ eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+ }
+ else
+ {
+ if (item)
+ _eext_circle_object_item_color_set(item,
+ data->color.r,
+ data->color.g,
+ data->color.b,
+ data->color.a);
+ if (bg_item)
+ _eext_circle_object_item_color_set(bg_item,
+ data->bg_color.r,
+ data->bg_color.g,
+ data->bg_color.b,
+ data->bg_color.a);
+
+ eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+ }
+}
+
+static void
+_eext_circle_object_slider_init(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Slider_Data *data;
+ Eext_Circle_Object_Item *item;
+
+ obj->widget_object = NULL;
+ obj->widget_type = EEXT_CIRCLE_OBJECT_SLIDER_TYPE;
+ obj->del_func = _eext_circle_object_slider_del_cb;
+ obj->disabled_func = _eext_circle_object_slider_disabled_cb;
+ obj->color_changed_func = _eext_circle_object_slider_color_changed_cb;
+
+ data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data));
+ data->value_step = 1.0;
+ data->color.r = SLIDER_COLOR_R;
+ data->color.g = SLIDER_COLOR_G;
+ data->color.b = SLIDER_COLOR_B;
+ data->color.a = SLIDER_COLOR_A;
+ data->bg_color.r = SLIDER_BG_COLOR_R;
+ data->bg_color.g = SLIDER_BG_COLOR_G;
+ data->bg_color.b = SLIDER_BG_COLOR_B;
+ data->bg_color.a = SLIDER_BG_COLOR_A;
+ data->disabled_color.r = SLIDER_COLOR_DISABLED_R;
+ data->disabled_color.g = SLIDER_COLOR_DISABLED_G;
+ data->disabled_color.b = SLIDER_COLOR_DISABLED_B;
+ data->disabled_color.a = SLIDER_COLOR_DISABLED_A;
+ data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R;
+ data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G;
+ data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B;
+ data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A;
+ obj->widget_data = data;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, SLIDER_BG_ITEM_NAME);
+ _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
+ _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
+ _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
+ _eext_circle_object_item_angle_set(item, 360);
+ _eext_circle_object_item_append(obj, item);
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, SLIDER_ITEM_NAME);
+ _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
+ _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
+ _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
+ _eext_circle_object_item_value_min_max_set(item, 0, 10);
+ _eext_circle_object_item_value_set(item, 0);
+ _eext_circle_object_item_append(obj, item);
+
+ eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+}
+
+static char *
+_accessible_description_cb(void *data, Evas_Object *obj)
+{
+ char *ret;
+ char *buf[255];
+ Eina_Strbuf *sbuf;
+ const char *slider_name;
+ Evas_Object *slider;
+
+ sbuf = eina_strbuf_new();
+ slider = data;
+ slider_name = elm_atspi_accessible_name_get(slider);
+
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+ if (!slider_name) slider = "Slider";
+
+ eina_strbuf_append(sbuf, slider_name);
+ eina_strbuf_append(sbuf, ", ");
+
+ snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), slider_name);
+ eina_strbuf_append(sbuf, buf);
+
+ ret = eina_strbuf_string_steal(sbuf);
+ eina_strbuf_free(sbuf);
+ return ret;
+}
+
+EAPI Evas_Object *
+eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!parent) return NULL;
+
+ obj = elm_image_add(parent);
+ _eext_circle_object_init(obj, NULL, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_slider_init(circle_obj);
+
+ /* TODO: Reading information should be changed with UX team */
+ /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */
+ elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON);
+ elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj);
+ elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+ return obj;
+}
+
+EAPI void
+eext_circle_object_slider_step_set(Evas_Object *obj, double step)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+
+ double min, max;
+ Eext_Circle_Object_Item *item = NULL;
+ item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+
+ if (widget_data->value_step == step) return;
+
+ _eext_circle_object_item_value_min_max_get(item, &min, &max);
+
+ if (step < min) step = min;
+ else if (step > max) step = max;
+
+ widget_data->value_step = step;
+}
+
+EAPI double
+eext_circle_object_slider_step_get(const Evas_Object *obj)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+ EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return -1.0;
+
+ return widget_data->value_step;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_SPINNER_TYPE "Eext_Circle_Object_Spinner"
+#define SPINNER_ITEM_NAME "default"
+
+#define EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, data) \
+ Eext_Circle_Object_Spinner_Data *data = NULL; \
+ if (circle_obj && circle_obj->widget_data && \
+ circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SPINNER_TYPE)) \
+ data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
+ if (!data)
+
+static const double MARK_WIDTH = 6.0;
+static const double MARK_HEIGHT = 23.0;
+static const double RADIUS = 168.5; //BG_HEIGHT / 2 - MARK_HEIGHT / 2;
+static const double MARK_RADIUS = 2.000317;
+// chord = 2 * radius * sin(x/2), x = arcsin(sin(x)), arcsin(x) = 1 / sqrt(1 - pow(x, 2))
+
+static const double END_EFFECT_ANGLE = 15.0;
+
+static const double ANIMATION_DURATION = 0.3;
+
+// ----------------------------------------- animation API --------------------------------------//
+static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_eext_circle_object_spinner_mark_angle_offset_set(Eext_Circle_Object *obj, double angle)
+{
+ Eext_Circle_Object_Item *item;
+
+ item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
+
+ _eext_circle_object_item_angle_offset_set(item, angle - (MARK_RADIUS / 2));
+ _eext_circle_object_item_angle_set(item, MARK_RADIUS);
+}
+
+static Eina_Bool
+_end_effect_expired_timer_cb(void *data)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+ Eext_Circle_Object_Item *item;
+
+ item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
+
+ _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
+ MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
+ EINA_TRUE,
+ 0.25, 0.46,
+ 0.45, 1.0);
+
+ widget_data->end_effect_expired_timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_spinner_mark_update(Eext_Circle_Object *obj, Eina_Bool animate)
+{
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
+
+ if (evas_object_visible_get(obj->widget_object) && animate)
+ {
+ Eext_Circle_Object_Item *item;
+
+ item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
+
+ if (widget_data->end_effect_angle)
+ {
+ if (widget_data->end_effect_expired_timer) return;
+
+ _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
+ MARK_RADIUS, widget_data->to_angle_offset + widget_data->end_effect_angle - (MARK_RADIUS / 2),
+ EINA_TRUE,
+ 0.25, 0.46,
+ 0.45, 1.0);
+
+ widget_data->end_effect_expired_timer = ecore_timer_add(ANIMATION_DURATION, _end_effect_expired_timer_cb, obj);
+ }
+ else
+ {
+ if (widget_data->end_effect_expired_timer)
+ {
+ ecore_timer_del(widget_data->end_effect_expired_timer);
+ widget_data->end_effect_expired_timer = NULL;
+ }
+
+ _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
+ MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
+ EINA_TRUE,
+ 0.25, 0.46,
+ 0.45, 1.0);
+ }
+ }
+ else
+ _eext_circle_object_spinner_mark_angle_offset_set(obj, widget_data->to_angle_offset);
+}
+
+static double
+_eext_circle_object_spinner_angle_get(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
+ double min, max, angle;
+
+ if (widget_data->angle) return widget_data->angle;
+
+ elm_spinner_min_max_get(obj->widget_object, &min, &max);
+
+ if (elm_spinner_wrap_get(obj->widget_object))
+ angle = 360 / (max - min + 1);
+ else
+ {
+ if (min == max)
+ angle = 0.0;
+ else
+ angle = 360 / (max - min);
+ }
+
+ return angle;
+}
+
+static double
+_eext_circle_object_spinner_angle_offset_get(Eext_Circle_Object *obj, double val)
+{
+ double min, angle_offset, real_part;
+
+ elm_spinner_min_max_get(obj->widget_object, &min, NULL);
+
+ angle_offset = (val - min) * _eext_circle_object_spinner_angle_get(obj);
+ real_part = angle_offset - (int)angle_offset;
+ angle_offset = (int)angle_offset % 360 + real_part;
+
+ return angle_offset;
+}
+
+static void
+_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
+ double val;
+
+ val = elm_spinner_value_get(obj->widget_object);
+
+ widget_data->to_angle_offset = _eext_circle_object_spinner_angle_offset_get(obj, val);
+
+ _eext_circle_object_spinner_mark_update(obj, EINA_FALSE);
+}
+
+static void
+_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+
+ if (widget_data->rotary_event)
+ _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
+ else
+ _eext_circle_object_spinner_update(circle_obj);
+}
+
+static double
+_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
+{
+ double angle_distance = 0;
+
+ if (value_up)
+ {
+ if (from_angle_offset > to_angle_offset)
+ angle_distance = 360 - from_angle_offset + to_angle_offset;
+ else if (from_angle_offset < to_angle_offset)
+ angle_distance = to_angle_offset - from_angle_offset;
+ }
+ else
+ {
+ if (from_angle_offset > to_angle_offset)
+ angle_distance = from_angle_offset - to_angle_offset;
+ else if (from_angle_offset < to_angle_offset)
+ angle_distance = from_angle_offset + 360 - to_angle_offset;
+ }
+
+ return angle_distance;
+}
+
+static void
+_eext_circle_object_spinner_value_update(Eext_Circle_Object *obj, Eina_Bool value_up)
+{
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
+ double val, step, min, max;
+
+ val = elm_spinner_value_get(obj->widget_object);
+
+ step = elm_spinner_step_get(obj->widget_object);
+ elm_spinner_min_max_get(obj->widget_object, &min, &max);
+
+ widget_data->end_effect_angle = 0.0;
+
+ if (elm_spinner_wrap_get(obj->widget_object))
+ {
+ if (value_up)
+ {
+ if (val + step > max)
+ {
+ widget_data->to_angle_offset += _looping_angle_distance_get(
+ _eext_circle_object_spinner_angle_offset_get(obj, max),
+ _eext_circle_object_spinner_angle_offset_get(obj, min),
+ value_up);
+ val = min;
+ }
+ else
+ {
+ widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
+ val += step;
+ }
+ }
+ else
+ {
+ if (val - step < min)
+ {
+ widget_data->to_angle_offset -= _looping_angle_distance_get(
+ _eext_circle_object_spinner_angle_offset_get(obj, min),
+ _eext_circle_object_spinner_angle_offset_get(obj, max),
+ value_up);
+ val = max;
+ }
+ else
+ {
+ widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
+ val -= step;
+ }
+ }
+ }
+ else
+ {
+ if (value_up)
+ {
+ if (val + step > max)
+ {
+ if (val == max)
+ widget_data->end_effect_angle = END_EFFECT_ANGLE;
+ else
+ widget_data->to_angle_offset += widget_data->angle * (max - val);
+ }
+ else
+ widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
+
+ val += step;
+ }
+ else
+ {
+ if (val - step < min)
+ {
+ if (val == min)
+ widget_data->end_effect_angle = -END_EFFECT_ANGLE;
+ else
+ widget_data->to_angle_offset -= widget_data->angle * (val - min);
+ }
+ else
+ widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
+
+ val -= step;
+ }
+ }
+
+ widget_data->rotary_event = EINA_TRUE;
+ elm_spinner_value_set(obj->widget_object, val);
+ widget_data->rotary_event = EINA_FALSE;
+}
+
+static Eina_Bool
+_rotary_timer_cb(void *data)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+ Eext_Circle_Object_Item *item;
+ double angle_offset_diff;
+
+ item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
+ if (!item) return ECORE_CALLBACK_CANCEL;
+
+ angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
+ - item->draw.angle_offset);
+
+ if (angle_offset_diff <= 1.0e-8)
+ elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
+ "elm,state,rotary,inactive", "eext");
+
+ widget_data->rotary_timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+
+ elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
+ "elm,state,rotary,active", "eext");
+
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ _eext_circle_object_spinner_value_update(circle_obj, EINA_TRUE);
+ else
+ _eext_circle_object_spinner_value_update(circle_obj, EINA_FALSE);
+
+ if (widget_data->rotary_timer)
+ {
+ ecore_timer_del(widget_data->rotary_timer);
+ widget_data->rotary_timer = NULL;
+ }
+
+ widget_data->rotary_timer = ecore_timer_add(1.0, _rotary_timer_cb, circle_obj);
+
+ /* Accessibility */
+ if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ double val;
+ char buf[255];
+ char *buf_val = NULL;
+ Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
+ val = elm_spinner_value_get(circle_obj->widget_object);
+ buf_val = elm_layout_text_get(btn, "elm.text");
+ if(buf_val)
+ snprintf(buf, sizeof(buf), "%s",buf_val);
+ else
+ snprintf(buf, sizeof(buf), "%.0f",val);
+ elm_atspi_bridge_utils_say((const char*)buf, EINA_TRUE, NULL, NULL);
+ }
+ return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
+{
+ if (!obj) return;
+
+ if (obj->widget_data)
+ {
+ Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
+ if (widget_data->end_effect_expired_timer)
+ {
+ ecore_timer_del(widget_data->end_effect_expired_timer);
+ widget_data->end_effect_expired_timer = NULL;
+ }
+
+ if (widget_data->rotary_timer)
+ {
+ ecore_timer_del(widget_data->rotary_timer);
+ widget_data->rotary_timer = NULL;
+ }
+
+ free(obj->widget_data);
+ obj->widget_data = NULL;
+ }
+}
+
+static void
+_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
+{
+ if (obj->disabled)
+ eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+ else
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+}
+
+static void
+_eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
+{
+ Eext_Circle_Object_Spinner_Data *data;
+ Eext_Circle_Object_Item *item;
+
+ obj->widget_object = spinner;
+ obj->widget_type = EEXT_CIRCLE_OBJECT_SPINNER_TYPE;
+ obj->del_func = _eext_circle_object_spinner_del_cb;
+ obj->disabled_func = _eext_circle_object_spinner_disabled_cb;
+ obj->visible_on_activate = EINA_TRUE;
+
+ data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data));
+ obj->widget_data = (void *)data;
+
+ item = _eext_circle_object_item_new();
+ _eext_circle_object_item_name_set(item, SPINNER_ITEM_NAME);
+ _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
+ _eext_circle_object_item_radius_set(item, RADIUS);
+ _eext_circle_object_item_line_width_set(item, MARK_HEIGHT);
+ _eext_circle_object_item_angle_offset_set(item, item->angle_offset - (MARK_RADIUS / 2));
+ _eext_circle_object_item_angle_set(item, MARK_RADIUS);
+ _eext_circle_object_item_append(obj, item);
+
+ elm_spinner_editable_set(spinner, EINA_FALSE);
+
+ evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
+
+ //for accessibility
+ evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,highlighted", _accessibility_spinner_highlighted_cb, obj);
+ //
+
+ eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface)
+{
+ Evas_Object *obj;
+
+ if (!spinner) return NULL;
+
+ obj = elm_image_add(spinner);
+ _eext_circle_object_init(obj, spinner, surface);
+
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+ _eext_circle_object_spinner_init(circle_obj, spinner);
+
+ return obj;
+}
+
+EAPI void
+eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle)
+{
+ EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+ EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
+
+ if ((angle <= 0) || (widget_data->angle == angle)) return;
+
+ widget_data->angle = angle;
+}
+static char *
+_accessible_description_cb(void *data, Evas_Object *obj)
+{
+ Eext_Circle_Object *circle_obj = data;
+ double val;
+ char buf_desc[255];
+ char buf[255];
+ char *buf_val = NULL;
+ char *buf_unit = NULL;
+
+ Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
+
+ val = elm_spinner_value_get(circle_obj->widget_object);
+ buf_unit = elm_object_part_text_get(circle_obj->widget_object, "elm.text");
+ buf_val = elm_layout_text_get(btn, "elm.text");
+
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+ if(buf_unit)
+ {
+ snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),buf_unit);
+ if(buf_val)
+ snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
+ else
+ snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
+ }
+ else
+ {
+ snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),"");
+ if(buf_val)
+ snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
+ else
+ snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
+ }
+ return strdup(buf);
+}
+static void
+_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+ return ;
+
+ Eext_Circle_Object *circle_obj = data;
+ Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
+
+ /* TODO: Reading information should be changed with UX team */
+ elm_atspi_accessible_description_cb_set(btn, _accessible_description_cb, circle_obj);
+ elm_atspi_accessible_reading_info_type_set(btn, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+ evas_object_smart_callback_call(circle_obj->widget_object, "focused",NULL);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface);
+static void _eext_circle_surface_render(void *data);
+
+static Evas_Object *
+_eext_circle_surface_image_widget_add(Evas_Object *parent)
+{
+ Evas_Object *image_widget;
+
+ image_widget = elm_image_add(parent);
+
+ if (!image_widget)
+ {
+ ERR("Failed to create elm_image_object");
+ return NULL;
+ }
+
+ //for accessibility
+ elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+
+ //FIXME: It's for adjusting evas_image geometry.
+ // Image object has weird geometry during the window calc own size.
+ // We need to recalc image object after buffer memory copy in render time.
+ // But now we don't have any way to call image's internal sizing eval function.
+ elm_image_aspect_fixed_set(image_widget, EINA_FALSE);
+ evas_object_repeat_events_set(image_widget, EINA_TRUE);
+
+ return image_widget;
+}
+
+static void
+_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
+ int line_width,
+ double center_x, double center_y, double radius,
+ double r, double g, double b, double a,
+ double angle1, double angle2, Eina_Bool round_cap)
+{
+ cairo_set_line_width(cairo, line_width);
+
+ if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
+
+ cairo_set_source_rgba(cairo, r, g, b, a);
+
+ cairo_arc(cairo, center_x, center_y, radius,
+ angle1 * M_PI / 180, angle2 * M_PI / 180);
+ cairo_stroke(cairo);
+}
+
+static void
+_eext_circle_surface_cairo_draw_text(cairo_t *cairo,
+ const char *text, const char *font, int font_size,
+ cairo_font_slant_t slant, cairo_font_weight_t weight,
+ double center_x, double center_y, double radius,
+ double r, double g, double b, double a,
+ double angle, double rotate_angle)
+{
+ int x, y;
+
+ x = radius * cos(angle * M_PI / 180);
+ y = radius * sin(angle * M_PI / 180);
+ x += center_x;
+ y += center_y;
+
+ cairo_set_source_rgba(cairo, r, g, b, a);
+ cairo_set_font_size(cairo, font_size);
+ cairo_select_font_face(cairo, font, slant, weight);
+ cairo_move_to(cairo, x, y);
+ cairo_rotate(cairo, rotate_angle * M_PI / 180);
+ cairo_show_text(cairo, text);
+ cairo_stroke(cairo);
+}
+
+static void
+_eext_circle_surface_clear(Eext_Circle_Surface *surface)
+{
+ Evas_Object *image_object;
+ unsigned char *buffer;
+
+ if (!surface || !surface->image_widget) return;
+
+ image_object = elm_image_object_get(surface->image_widget);
+
+ buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+ memset(buffer, 0, surface->w * surface->h * 4);
+ cairo_set_source_rgba(surface->cairo, 0, 0, 0, 0);
+ cairo_rectangle(surface->cairo, 0.0, 0.0, surface->w, surface->h);
+ cairo_fill(surface->cairo);
+}
+
+static void
+_eext_circle_bg_surface_memcpy(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+ Evas_Object *image_object, *bg_image, *bg_image_object;
+ unsigned char *buffer, *bg_buffer;
+
+ if (!surface || !surface->image_widget) return;
+
+ image_object = elm_image_object_get(surface->image_widget);
+ buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+
+ bg_image = eina_list_nth(obj->bg_image_objs, obj->bg_image_index);
+ bg_image_object = elm_image_object_get(bg_image);
+ evas_object_image_size_set(bg_image_object, surface->w, surface->h);
+ evas_object_image_fill_set(bg_image_object, 0, 0, surface->w, surface->h);
+ bg_buffer = (unsigned char *)evas_object_image_data_get(bg_image_object, 0);
+
+ memcpy(buffer, bg_buffer, surface->w * surface->h * 4);
+}
+
+static void
+_eext_circle_surface_render(void *data)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+ Eext_Circle_Object *render_obj;
+ Eina_List *l, *ll;
+ Eina_Bool skip_surface_clear = EINA_FALSE;
+
+ if (!surface)
+ {
+ ERR("Surface is NULL... Going to remove surface render function.");
+ return;
+ }
+
+ surface->render_job = NULL;
+
+ EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+ {
+ if (!render_obj->visible)
+ continue;
+
+ if (render_obj->bg_image_objs)
+ {
+ _eext_circle_bg_surface_memcpy(surface, render_obj);
+ skip_surface_clear = EINA_TRUE;
+ break;
+ }
+ }
+
+ if (!skip_surface_clear)
+ _eext_circle_surface_clear(surface);
+
+ EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+ {
+ Eext_Circle_Object_Item *item;
+
+ if (!render_obj->visible)
+ continue;
+ if (render_obj->visible_on_activate && !(render_obj->is_active))
+ continue;
+
+ EINA_LIST_FOREACH(render_obj->items, ll, item)
+ {
+ // Skip invisible item.
+ if (item->draw.color.a == 0) continue;
+
+ // If there is no text, the item is arc item.
+ if (!item->text)
+ {
+ // Draw Arc
+ if (item->line_width)
+ {
+ cairo_save(surface->cairo);
+ _eext_circle_surface_cairo_draw_arc(surface->cairo, item->line_width,
+ surface->center_x, surface->center_y, item->radius,
+ (double)item->draw.color.r / 255,
+ (double)item->draw.color.g / 255,
+ (double)item->draw.color.b / 255,
+ (double)item->draw.color.a / 255,
+ item->draw.angle_offset + item->min_angle - 90.0,
+ item->draw.angle_offset + item->draw.angle - 90.0,
+ item->round_cap);
+ cairo_restore(surface->cairo);
+ }
+ }
+ else if (item->font_size)
+ {
+ // Draw Text
+ cairo_save(surface->cairo);
+ _eext_circle_surface_cairo_draw_text(surface->cairo,
+ item->text, item->selected_font, item->font_size,
+ CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL,
+ surface->center_x, surface->center_y, item->radius,
+ (double)item->draw.color.r / 255,
+ (double)item->draw.color.g / 255,
+ (double)item->draw.color.b / 255,
+ (double)item->draw.color.a / 255,
+ item->draw.angle_offset + item->draw.angle - 90.0,
+ item->draw.angle_offset + item->draw.angle);
+ cairo_restore(surface->cairo);
+ }
+ }
+ }
+
+ evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
+ 0, 0, surface->w, surface->h);
+}
+
+static void
+_eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
+{
+ if (!surface) return;
+
+ if (surface->render_job) ecore_job_del(surface->render_job);
+ surface->render_job = NULL;
+}
+
+static void
+_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
+{
+ if (surface->cairo) cairo_destroy(surface->cairo);
+ if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
+
+ surface->cairo = NULL;
+ surface->cairo_surface = NULL;
+}
+
+static void
+_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
+{
+ Evas_Object *image_object;
+ cairo_surface_t *cairo_surface;
+ cairo_t *cairo;
+ unsigned char *buffer;
+ int stride;
+
+ if (surface->cairo_surface || surface->cairo)
+ _eext_circle_surface_cairo_finish(surface);
+
+ if (surface->image_widget == NULL)
+ {
+ ERR("Fail to get buffer from image object!");
+ return;
+ }
+
+ image_object = elm_image_object_get(surface->image_widget);
+
+ buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+ stride = evas_object_image_stride_get(image_object);
+ cairo_surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32,
+ surface->w, surface->h, stride);
+ cairo = cairo_create(cairo_surface);
+ cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
+
+ surface->cairo_surface = cairo_surface;
+ surface->cairo = cairo;
+}
+
+static void
+_eext_circle_surface_update(Eext_Circle_Surface *surface)
+{
+ Evas_Object *image_object;
+
+ if (!surface) return;
+ if (!evas_object_visible_get(surface->image_widget)) return;
+
+ image_object = elm_image_object_get(surface->image_widget);
+ evas_object_geometry_get(surface->image_widget, NULL, NULL, &surface->w, &surface->h);
+
+ surface->center_x = surface->w / 2;
+ surface->center_y = surface->h / 2;
+
+ evas_object_image_size_set(image_object, surface->w, surface->h);
+ evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
+
+ if ((surface->w != 0) && (surface->h != 0))
+ {
+ INF("Surface will be initialized!");
+ _eext_circle_surface_cairo_init(surface);
+ _eext_circle_surface_changed(surface);
+ }
+}
+
+static void
+_eext_circle_surface_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+ _eext_circle_surface_update(surface);
+}
+
+static void
+_eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+ INF("Surface is going to free in delete callback for image widget.");
+ _eext_circle_surface_del_internal(surface);
+}
+
+static void
+_eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+ surface->parent = NULL;
+}
+
+static void
+_eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+ _eext_circle_surface_cairo_finish(surface);
+ _eext_circle_surface_render_finish(surface);
+}
+
+static void
+_eext_circle_surface_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+ _eext_circle_surface_update(surface);
+}
+
+static void
+_eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ evas_object_show(circle_obj->image_widget);
+ circle_obj->is_active = EINA_TRUE;
+
+ // Previous view's circle object should not be disappeared while naviframe effect.
+ // At here, show the latest deactivated object if the conditions are satisfied.
+ if (circle_obj->surface)
+ {
+ if (circle_obj->surface->parent_surface &&
+ (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+ {
+ Eext_Circle_Object *deact_obj = circle_obj->surface->parent_surface->deactivated_obj;
+
+ if (deact_obj && (deact_obj->surface->parent != circle_obj->surface->parent))
+ {
+ evas_object_show(deact_obj->image_widget);
+ }
+ }
+ else if (circle_obj->surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+ {
+ if (circle_obj->surface->deactivated_obj)
+ evas_object_show(circle_obj->surface->deactivated_obj->image_widget);
+ }
+ }
+}
+
+static void
+_deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface &&
+ (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+ {
+ if (circle_obj->surface->parent_surface->deactivated_obj == circle_obj)
+ circle_obj->surface->parent_surface->deactivated_obj = NULL;
+ }
+}
+
+static void
+_eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+ evas_object_hide(circle_obj->image_widget);
+ circle_obj->is_active = EINA_FALSE;
+
+ // Previous view's circle object should not be disappeared while naviframe effect.
+ // At here, just keep the current deactivated object.
+ if (circle_obj->surface && circle_obj->surface->parent_surface &&
+ (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+ {
+ Eext_Circle_Object *deactivated_obj = circle_obj->surface->parent_surface->deactivated_obj;
+
+ if (deactivated_obj == circle_obj)
+ return;
+
+ if (deactivated_obj)
+ evas_object_event_callback_del_full(deactivated_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
+ circle_obj->surface->parent_surface->deactivated_obj = circle_obj;
+ evas_object_event_callback_add(circle_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
+ }
+}
+
+static Eext_Circle_Surface *
+_eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
+{
+ Eext_Circle_Surface *surface;
+
+ if (!layout)
+ {
+ ERR("The given Evas_Object is NULL! It returns NULL.");
+ return NULL;
+ }
+
+ if (edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
+ {
+ surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+ if (!surface->image_widget)
+ {
+ ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+ return NULL;
+ }
+
+ INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
+ elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+
+ return surface;
+ }
+ else
+ {
+ ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+ return NULL;
+ }
+}
+
+static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *view = (Evas_Object *)event_info;
+ Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+ Eext_Circle_Surface *view_surface;
+ Eext_Circle_Object *circle_obj;
+ Eina_List *l, *l_next;
+
+ if (!surface)
+ {
+ ERR("No matched surface exists for the naviframe:%p", obj);
+ return;
+ }
+
+ view_surface = _eext_circle_surface_naviframe_item_view_add(view);
+ view_surface->parent_surface = surface;
+ surface->sub_surfaces = eina_list_append(surface->sub_surfaces, view_surface);
+
+ EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, circle_obj)
+ {
+ Evas_Object *parent;
+ parent = elm_object_parent_widget_get(circle_obj->image_widget);
+
+ while (parent)
+ {
+ if (parent == view)
+ {
+ _eext_circle_surface_object_remove(surface, circle_obj);
+ _eext_circle_surface_object_append(view_surface, circle_obj);
+ circle_obj->surface = view_surface;
+ break;
+ }
+
+ parent = elm_object_parent_widget_get(parent);
+ if (parent == obj) break;
+ }
+ }
+}
+
+static void
+_eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
+{
+ Eext_Circle_Object *obj;
+ Eina_List *l, *l_next;
+
+ if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+ {
+ Eext_Circle_Surface *cur_surface;
+
+ evas_object_smart_callback_del_full(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
+ evas_object_event_callback_del_full(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+
+ EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
+ {
+ _eext_circle_surface_del_internal(cur_surface);
+ }
+
+ }
+ else if (surface->parent)
+ {
+ evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb);
+ }
+
+ _eext_circle_surface_cairo_finish(surface);
+ _eext_circle_surface_render_finish(surface);
+
+ if (surface->image_widget)
+ {
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
+ surface->image_widget = NULL;
+ surface->w = surface->h = 0;
+ }
+
+ if (surface->parent_surface)
+ surface->parent_surface->sub_surfaces = eina_list_remove(surface->parent_surface->sub_surfaces, surface);
+
+ // If public surface is deleted, prepare a private surface.
+ EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, obj)
+ {
+ if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+ {
+ Eext_Circle_Surface *private_surface;
+ INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
+ obj->image_widget, obj);
+
+ surface->render_objs = eina_list_remove_list(surface->render_objs, l);
+
+ private_surface =
+ _eext_circle_surface_init(obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+ _eext_circle_surface_object_append(private_surface, obj);
+
+ evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb);
+ if (obj->widget_object)
+ {
+ evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb);
+ }
+
+ _eext_circle_surface_update(private_surface);
+ }
+ else
+ {
+ _eext_circle_surface_object_remove(surface, obj);
+ }
+ }
+
+ free(surface);
+}
+
+//////////////////////////
+// Internal API //////////
+//////////////////////////
+Eext_Circle_Surface *
+_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type)
+{
+ Eext_Circle_Surface *surface;
+
+ surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface));
+ if (!surface)
+ {
+ ERR("Fail to calloc for (Eext_Circle_Surface)");
+ return NULL;
+ }
+
+ surface->type = type;
+ surface->parent = parent;
+
+ if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+ {
+ // If the surface is created with elm_naviframe.
+ evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
+ evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+ }
+ else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+ {
+ surface->image_widget = image_widget;
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+ evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
+ }
+ else
+ {
+ surface->image_widget = image_widget;
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+ evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+ evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
+ evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
+ }
+
+ return surface;
+}
+
+void
+_eext_circle_surface_finish(Eext_Circle_Surface *surface)
+{
+ _eext_circle_surface_del_internal(surface);
+}
+
+void
+_eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+ if (!surface) return;
+ if (!obj) return;
+
+ surface->render_objs = eina_list_remove(surface->render_objs, obj);
+ obj->surface = NULL;
+ _eext_circle_surface_changed(surface);
+
+ if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+ {
+ evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb);
+ evas_object_smart_callback_del(obj->image_widget, "rotary,deactivated",
+ _eext_circle_surface_object_rotary_deactivated_cb);
+
+ if (obj->widget_object)
+ {
+ evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb);
+ evas_object_smart_callback_del(obj->widget_object, "rotary,deactivated",
+ _eext_circle_surface_object_rotary_deactivated_cb);
+ }
+ }
+}
+
+void
+_eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+ if (!surface) return;
+ if (!obj) return;
+
+ if (obj->surface)
+ _eext_circle_surface_object_remove(obj->surface, obj);
+
+ // Search whether proper sub-surface exists or not for the circle object.
+ if ((surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) && surface->sub_surfaces)
+ {
+ Eina_List *l, *l_next;
+ Eext_Circle_Surface *cur_surface;
+
+ EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
+ {
+ Evas_Object *parent;
+ parent = elm_object_parent_widget_get(obj->image_widget);
+
+ while (parent)
+ {
+ if (parent == cur_surface->parent)
+ {
+ _eext_circle_surface_object_append(cur_surface, obj);
+ obj->surface = cur_surface;
+ return;
+ }
+
+ parent = elm_object_parent_widget_get(parent);
+ if (parent == surface->parent) break;
+ }
+
+ }
+ }
+
+ surface->render_objs = eina_list_append(surface->render_objs, obj);
+ _eext_circle_surface_changed(surface);
+ obj->surface = surface;
+
+ if (obj->surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+ {
+ evas_object_smart_callback_add(obj->image_widget, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb, obj);
+ evas_object_smart_callback_add(obj->image_widget, "rotary,deactivated",
+ _eext_circle_surface_object_rotary_deactivated_cb, obj);
+
+ if (obj->widget_object)
+ {
+ evas_object_smart_callback_add(obj->widget_object, "rotary,activated",
+ _eext_circle_surface_object_rotary_activated_cb, obj);
+ evas_object_smart_callback_add(obj->widget_object, "rotary,deactivated",
+ _eext_circle_surface_object_rotary_deactivated_cb, obj);
+ }
+ }
+}
+
+void
+_eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+ Eext_Circle_Object *render_obj;
+ Eina_List *l;
+
+ if (!surface) return;
+ if (!obj) return;
+
+ if (!evas_object_visible_get(obj->image_widget) &&
+ (obj->widget_object && evas_object_visible_get(obj->widget_object)))
+ evas_object_show(obj->image_widget);
+
+ EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+ {
+ if (render_obj != obj)
+ evas_object_hide(render_obj->image_widget);
+ }
+}
+
+void
+_eext_circle_surface_changed(Eext_Circle_Surface *surface)
+{
+ if (!surface) return;
+
+ if (!surface->render_job && surface->image_widget &&
+ evas_object_visible_get(surface->image_widget) &&
+ (surface->w != 0) && (surface->h != 0))
+ surface->render_job = ecore_job_add(_eext_circle_surface_render, surface);
+}
+
+Eext_Circle_Surface *
+_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
+{
+ Eext_Circle_Surface *surface;
+ Evas_Object *image_widget = NULL;
+
+ if (!parent) return NULL;
+
+ if (type != EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+ image_widget = _eext_circle_surface_image_widget_add(parent);
+
+ surface = _eext_circle_surface_init(image_widget, parent, type);
+
+ return surface;
+}
+
+////////////////////////
+// EAPI ////////////////
+////////////////////////
+EAPI Eext_Circle_Surface *
+eext_circle_surface_conformant_add(Evas_Object *conform)
+{
+ Eext_Circle_Surface *surface;
+ const char *type = NULL;
+
+ if (!conform)
+ {
+ ERR("The given Evas_Object is NULL! It returns NULL.");
+ return NULL;
+ }
+
+ type = evas_object_type_get(conform);
+
+ if (type && (!strcmp(type, "Elm_Conformant") || !strcmp(type, "elm_conformant")))
+ {
+ if (elm_object_style_set(conform, "circle"))
+ {
+ if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle"))
+ {
+ ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
+ return NULL;
+ }
+
+ surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+ if (!surface->image_widget)
+ {
+ ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+ return NULL;
+ }
+
+ INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->image_widget, conform);
+ elm_object_part_content_set(conform, "elm.swallow.circle", surface->image_widget);
+
+ return surface;
+ }
+ else
+ {
+ ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
+ return NULL;
+ }
+ }
+
+ ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
+ return NULL;
+}
+
+EAPI Eext_Circle_Surface *
+eext_circle_surface_layout_add(Evas_Object *layout)
+{
+ Eext_Circle_Surface *surface;
+ const char *type = NULL;
+
+ if (!layout)
+ {
+ ERR("The given Evas_Object is NULL! It returns NULL.");
+ return NULL;
+ }
+
+ type = evas_object_type_get(layout);
+
+ if (type && (!strcmp(type, "Elm_Layout") || !strcmp(type, "elm_layout")))
+ {
+ if (elm_layout_theme_set(layout, "layout", "circle", "surface"))
+ {
+ if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
+ {
+ ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+ return NULL;
+ }
+
+ surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+ if (!surface->image_widget)
+ {
+ ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+ return NULL;
+ }
+
+ INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
+ elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+
+ return surface;
+ }
+ else
+ {
+ ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
+ return NULL;
+ }
+ }
+
+ ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
+ return NULL;
+}
+
+EAPI Eext_Circle_Surface *
+eext_circle_surface_naviframe_add(Evas_Object *naviframe)
+{
+ Eext_Circle_Surface *surface;
+ const char *type = NULL;
+
+ if (!naviframe)
+ {
+ ERR("The given Evas_Object is NULL! It returns NULL.");
+ return NULL;
+ }
+
+ type = evas_object_type_get(naviframe);
+
+ if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe")))
+ {
+ surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME);
+ return surface;
+ }
+
+ ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
+ return NULL;
+}
+
+EAPI void
+eext_circle_surface_del(Eext_Circle_Surface *surface)
+{
+ if (!surface)
+ {
+ ERR("Surface is already NULL");
+ return;
+ }
+
+ if (surface->image_widget)
+ {
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+ evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+ evas_object_del(surface->image_widget);
+ surface->image_widget = NULL;
+ }
+
+ INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
+ _eext_circle_surface_del_internal(surface);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 <Elementary.h>
+#include "circle/efl_extension_rotary.h"
+#include "efl_extension_private.h"
+#ifdef WITH_X
+ #include <Ecore_X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/XInput2.h>
+ #include <X11/extensions/XI2.h>
+#elif WITH_WAYLAND
+ #include <Ecore_Wayland.h>
+ #include <Ecore_Input.h>
+#endif
+
+
+#define TIZEN_DEV "tizen_detent"
+
+static const char SIG_ACTIVATED[] = "rotary,activated";
+static const char SIG_DEACTIVATED[] = "rotary,deactivated";
+
+static int EEXT_EVENT_ROTARY_ROTATE = 0;
+static Eina_List *_callbacks = NULL;
+static Eina_List *_obj_pri_callbacks = NULL;
+#ifdef WITH_X
+static XIEventMask *_xi_event_mask = NULL;
+#endif
+static Evas_Object *_activated_obj = NULL;
+static int _init_count = 0;
+#ifdef WITH_X
+static Ecore_Event_Handler *_motion_handler = NULL;
+#endif
+#ifdef WITH_WAYLAND
+static Ecore_Event_Handler *_ecore_detent_handler = NULL;
+#endif
+static Ecore_Event_Handler *_rotate_handler = NULL;
+static Eina_Bool _handler_registered = EINA_FALSE;
+static Eina_List *handlers = NULL;
+
+typedef struct _Eext_Rotary_Cb Eext_Rotary_Cb;
+struct _Eext_Rotary_Cb
+{
+ Evas_Object *obj;
+ Eext_Rotary_Event_Cb func;
+ void *data;
+ Eext_Callback_Priority pri;
+ Eina_Bool del_registered;
+};
+
+typedef struct _Rotary_Raw_Info Rotary_Raw_Info;
+struct _Rotary_Raw_Info
+{
+ int devid;
+ Eext_Rotary_Event_Direction direction;
+ unsigned int time_stamp;
+};
+
+typedef struct _Eext_Rotary_Handler Eext_Rotary_Handler;
+struct _Eext_Rotary_Handler
+{
+ Eext_Rotary_Handler_Cb func;
+ void *data;
+};
+
+typedef struct _Eext_Rotary_Obj_Pri Eext_Rotary_Obj_Pri;
+struct _Eext_Rotary_Obj_Pri
+{
+ Evas_Object *obj;
+ Eina_List *pri_callbacks;
+};
+
+#ifdef WITH_X
+static Eina_Bool _init_Xi2_system(void);
+static Eina_Bool _motion_changed_cb(void *data, int type, void *event_info);
+static void _process_raw_event(void *data, int type, void *raw_event);
+#endif
+#ifdef WITH_WAYLAND
+static Eina_Bool _init_ecore_event(void);
+static Eina_Bool _ecore_detent_cb(void *data, int type, void *event_info);
+#endif
+static Eina_Bool _rotary_rotate_event_cb(void *data, int type, void *event_info);
+static void _object_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _remove_ecore_handlers(void);
+static Eina_Bool _rotary_rotate_handler_cb(void *data, Eext_Rotary_Event_Info *info);
+static int _pri_compare(const void *data1, const void *data2);
+static void _activated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+EAPI Eina_Bool
+eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
+{
+ Eext_Rotary_Handler *new_hd = NULL;
+ if (!func) return EINA_FALSE;
+
+ ERR("detent: In");
+ /* init event registration */
+ if (!_init_count)
+ {
+ ERR("init_count: %d", _init_count);
+#ifdef WITH_X
+ if (!_init_Xi2_system())
+ {
+ ERR("Failed to init Xi2 system");
+ return EINA_FALSE;
+ }
+#endif
+#ifdef WITH_WAYLAND
+ if (!_init_ecore_event())
+ {
+ ERR("Failed to init ecore_event");
+ return EINA_FALSE;
+ }
+#endif
+ }
+
+#ifdef WITH_X
+ /* register event handlers */
+ if (!_motion_handler)
+ {
+ _motion_handler = ecore_event_handler_add(ECORE_X_EVENT_GENERIC,
+ _motion_changed_cb, NULL);
+ if (!_motion_handler)
+ {
+ ERR("Cannot register generic ecore event handler");
+ return EINA_FALSE;
+ }
+ }
+#endif
+#ifdef WITH_WAYLAND
+ if (!_ecore_detent_handler)
+ {
+ _ecore_detent_handler = ecore_event_handler_add(ECORE_EVENT_DETENT_ROTATE,
+ _ecore_detent_cb, NULL);
+ if (!_ecore_detent_handler)
+ {
+ ERR("Cannot register ecore detent handler");
+ return EINA_FALSE;
+ }
+ }
+#endif
+ if (!_rotate_handler)
+ {
+ _rotate_handler = ecore_event_handler_add(EEXT_EVENT_ROTARY_ROTATE,
+ _rotary_rotate_event_cb, NULL);
+ if (!_rotate_handler)
+ {
+ ERR("Cannot register eext rotate event handler");
+ return EINA_FALSE;
+ }
+ }
+
+ new_hd = malloc(sizeof(Eext_Rotary_Handler));
+ if (!new_hd)
+ {
+ ERR("Cannot allocate memory");
+ return EINA_FALSE;
+ }
+ new_hd->func = func;
+ new_hd->data = data;
+ handlers = eina_list_append(handlers, new_hd);
+
+ return EINA_TRUE;
+}
+
+EAPI void *
+eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
+{
+ ERR("detent: In");
+ Eina_List *l = NULL;
+ Eext_Rotary_Handler *hd = NULL;
+ void *data = NULL;
+
+ EINA_LIST_FOREACH(handlers, l, hd)
+ {
+ if (hd->func == func)
+ {
+ data = hd->data;
+ handlers = eina_list_remove(handlers, hd);
+ free(hd);
+ if (!handlers)
+ {
+ _remove_ecore_handlers();
+ }
+ break;
+ }
+ }
+ return data;
+}
+
+EAPI Eina_Bool
+eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data)
+{
+ INF("In");
+ return eext_rotary_object_event_callback_priority_add(obj, 0, func, data);
+}
+
+EAPI Eina_Bool
+eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data)
+{
+ ERR("detent: In");
+ Eina_List *l;
+ Eext_Rotary_Obj_Pri *op = NULL;
+ Eext_Rotary_Cb *cb = NULL, *new_cb = NULL;
+ Eina_Bool registered = EINA_FALSE;
+ Eina_Bool added = EINA_FALSE;
+
+ if ((!obj) || (!func)) return EINA_FALSE;
+
+ if (!_handler_registered)
+ {
+ if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL))
+ {
+ ERR("Cannot register rotary handler");
+ return EINA_FALSE;
+ }
+ _handler_registered = EINA_TRUE;
+ }
+
+ new_cb = malloc(sizeof(Eext_Rotary_Cb));
+ if (!new_cb)
+ {
+ ERR("Cannot allocate memory");
+ return EINA_FALSE;
+ }
+ new_cb->obj = obj;
+ new_cb->func = func;
+ new_cb->data = data;
+ new_cb->pri = priority;
+ new_cb->del_registered = EINA_FALSE;
+
+ EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+ {
+ if (op->obj == obj)
+ {
+ added = EINA_TRUE;
+ op->pri_callbacks = eina_list_sorted_insert(op->pri_callbacks,
+ _pri_compare, new_cb);
+ break;
+ }
+ }
+ if (!added)
+ {
+ Eext_Rotary_Obj_Pri *new_op = NULL;
+
+ new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri));
+ if (!new_op)
+ {
+ ERR("Cannot allocate memory");
+ free(new_cb);
+ return EINA_FALSE;
+ }
+ new_op->obj = obj;
+ new_op->pri_callbacks = eina_list_append(new_op->pri_callbacks, new_cb);
+ _obj_pri_callbacks = eina_list_append(_obj_pri_callbacks, new_op);
+ }
+ _callbacks = eina_list_append(_callbacks, new_cb);
+
+ EINA_LIST_FOREACH(_callbacks, l, cb)
+ {
+ if (cb->obj == obj)
+ {
+ if (cb->del_registered)
+ {
+ registered = EINA_TRUE;
+ break;
+ }
+ }
+ }
+ if (!registered)
+ {
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+ _object_deleted_cb, obj);
+ new_cb->del_registered = EINA_TRUE;
+ }
+
+ return EINA_TRUE;
+}
+
+EAPI void *
+eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func)
+{
+ INF("In");
+ Eina_List *l = NULL;
+ Eext_Rotary_Cb *cb = NULL;
+ void *data = NULL;
+
+ ERR("callback del 0x%x, %s, func : 0x%x", obj, evas_object_type_get(obj), func);
+
+ EINA_LIST_FOREACH(_callbacks, l, cb)
+ {
+ if ((cb->func == func) && (cb->obj == obj))
+ {
+ data = cb->data;
+ _callbacks = eina_list_remove(_callbacks, cb);
+ INF("Removed cb from callbacks");
+ break;
+ }
+ cb = NULL;
+ }
+ if (cb)
+ {
+ Eext_Rotary_Obj_Pri *op = NULL;
+
+ EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+ {
+ if (op->obj == obj)
+ {
+ op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
+ break;
+ }
+ }
+ free(cb);
+ INF("Freed cb");
+ }
+ if (!_callbacks)
+ {
+ eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
+ _handler_registered = EINA_FALSE;
+ }
+ INF("done");
+
+ return data;
+}
+
+EAPI void
+eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
+{
+ if (!obj) return;
+
+ ERR("eext_rotary_object_event_activated_set : 0x%x, %s, _activated_obj : 0x%x, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
+
+ if (activated)
+ {
+ if (_activated_obj != obj)
+ {
+ if (_activated_obj != NULL)
+ {
+ ERR("Activation delete!!!!");
+ evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+ evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
+ }
+ _activated_obj = obj;
+ evas_object_event_callback_add(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb, NULL);
+ }
+ evas_object_smart_callback_call(_activated_obj, SIG_ACTIVATED, NULL);
+ }
+ else
+ {
+ if (obj == _activated_obj && _activated_obj != NULL)
+ {
+ evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+ evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
+ _activated_obj = NULL;
+ }
+ }
+}
+
+#ifdef WITH_WAYLAND
+static void
+_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
+{
+ ERR("detent: In");
+ INF("In: ddata: %p", fdata);
+ free(fdata);
+}
+
+static Eina_Bool
+_init_ecore_event(void)
+{
+ ERR("detent: In");
+ if (!ecore_event_init()) return EINA_FALSE;
+ EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
+ return EINA_TRUE;
+}
+static Eina_Bool
+_ecore_detent_cb(void *data, int type, void *event_info)
+{
+ ERR("detent: In");
+ Ecore_Event_Detent_Rotate *e = event_info;
+ Rotary_Raw_Info *event = NULL;
+
+ event = calloc(1, sizeof(Rotary_Raw_Info));
+ if (!event)
+ {
+ ERR("Cannot allocate memory");
+ return ECORE_CALLBACK_PASS_ON;
+ }
+ if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE)
+ event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
+ else
+ event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
+ event->time_stamp = e->timestamp;
+ ERR("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
+ ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+#endif
+
+#ifdef WITH_X
+static Eina_Bool
+_init_Xi2_system(void)
+{
+ INF("In");
+ Ecore_X_Display *display = NULL;
+ Ecore_X_Window root_win;
+ int opcode = 0, event = 0, error = 0;
+ int major = XI_2_Major;
+ int minor = XI_2_Minor;
+ int dev_count = 0;
+ int i = 0;
+
+ if (_init_count > 0) return EINA_TRUE;
+ _init_count++;
+
+ EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
+ _xi_event_mask = (XIEventMask *)calloc(1, sizeof(XIEventMask));
+ display = ecore_x_display_get();
+ root_win = ecore_x_window_root_first_get();
+
+ /* Initialize Xi2 system */
+ /* Check if X input extension available */
+ if (!XQueryExtension((Display *)display, "XInputExtension", &opcode,
+ &event, &error))
+ {
+ ERR("Failed to query XInputExtension");
+ return EINA_FALSE;
+ }
+
+ /* We support version 2.0 */
+ if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest)
+ {
+ ERR("Failed to query XI Version");
+ return EINA_FALSE;
+ }
+
+ _xi_event_mask->deviceid = XIAllDevices;
+
+ /* Check device id */
+ XIDeviceInfo *dev_info = NULL;
+ dev_info = XIQueryDevice(display, XIAllDevices, &dev_count);
+
+ for (i = 0; i < dev_count; i++)
+ {
+ XIDeviceInfo *di = &(dev_info[i]);
+ if (!strncmp(di->name, TIZEN_DEV, sizeof(TIZEN_DEV)))
+ {
+ _xi_event_mask->deviceid = di->deviceid;
+ break;
+ }
+ }
+
+ if (dev_info) XIFreeDeviceInfo(dev_info);
+ /* SelectXi2Event */
+ _xi_event_mask->mask = (unsigned char *)(calloc(1, XIMaskLen(XI_LASTEVENT)));
+ XISetMask(_xi_event_mask->mask, XI_RawMotion);
+ _xi_event_mask->mask_len = sizeof(_xi_event_mask->mask);
+ int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1);
+ if (ret != 0)
+ {
+ ERR("Failed to Select Events");
+ return EINA_FALSE;
+ }
+
+ INF("Done");
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_motion_changed_cb(void *data, int type, void *event_info)
+{
+ Ecore_X_Event_Generic *ev = event_info;
+
+ switch((int)(ev->evtype))
+ {
+ case XI_RawMotion:
+ _process_raw_event(data, type, (XIRawEvent *)ev->data);
+ break;
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
+{
+ INF("In: ddata: %p", fdata);
+ free(fdata);
+}
+
+static void
+_process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event)
+{
+ XIRawEvent *xi_raw_event = raw_event;
+ double *value = xi_raw_event->raw_values;
+ Rotary_Raw_Info *event = NULL;
+
+ if (_xi_event_mask->deviceid != xi_raw_event->deviceid)
+ {
+ return;
+ }
+
+ INF("In");
+ event = calloc(1, sizeof(Rotary_Raw_Info));
+ if (!event)
+ {
+ ERR("Cannot allocate memory");
+ return;
+ }
+ event->devid = xi_raw_event->deviceid;
+ /** X(0): rotate: NOT USED;
+ Y(1): timestamp;
+ Z(2): direction (-1: counter clockwise, 1: clockwise, 0: None)
+ **/
+ if (XIMaskIsSet(xi_raw_event->valuators.mask, 1))
+ {
+ event->time_stamp = (unsigned int)(*(value + 1));
+ INF("time stamp: %d", event->time_stamp);
+ }
+ if (XIMaskIsSet(xi_raw_event->valuators.mask, 2))
+ {
+ int dir = (int)(*(value + 2));
+ INF("raw dir: %d", dir);
+ switch (dir)
+ {
+ case -1:
+ event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
+ INF("direction: Counter Clockwise");
+ ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
+ _rotary_rotate_event_free, NULL);
+ break;
+ case 1:
+ event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
+ INF("direction: Clockwise");
+ ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
+ _rotary_rotate_event_free, NULL);
+ break;
+ case 0:
+ INF("Not detent");
+ free(event);
+ break;
+ default:
+ INF("Should not get in here");
+ free(event);
+ }
+ }
+ else
+ {
+ free(event);
+ }
+}
+#endif
+
+static Eina_Bool
+_rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info)
+{
+ INF("In");
+ Eina_List *l;
+ Eext_Rotary_Handler *hd;
+ Rotary_Raw_Info *ev = event_info;
+ Eext_Rotary_Event_Info info;
+ info.direction = ev->direction;
+ info.time_stamp = ev->time_stamp;
+
+ EINA_LIST_FOREACH(handlers, l, hd)
+ {
+ if (!hd->func(hd->data, &info))
+ {
+ return ECORE_CALLBACK_DONE;
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_pri_compare(const void *data1, const void *data2)
+{
+ const Eext_Rotary_Cb *cb1 = data1;
+ const Eext_Rotary_Cb *cb2 = data2;
+ if (cb1 && cb2)
+ {
+ if (cb1->pri < cb2->pri)
+ return -1;
+ else if (cb1->pri > cb2->pri)
+ return 1;
+ else
+ return 0;
+ }
+
+ return 0;
+}
+
+static Eina_Bool
+_rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
+{
+ ERR("_rotary_rotate_handler_cb : 0x%x, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
+ Eina_List *l;
+ Eext_Rotary_Cb *cb;
+
+ if (!info) return EINA_TRUE;
+
+ /* Deliver to the activated object and its parents */
+ if ((_activated_obj) &&
+ (evas_focus_state_get(evas_object_evas_get(_activated_obj))) &&
+ (evas_object_visible_get(_activated_obj)))
+ {
+ Evas_Object *obj = NULL;
+ Eext_Rotary_Obj_Pri *op = NULL;
+
+ obj = _activated_obj;
+ while(obj)
+ {
+ if (obj == _activated_obj)
+ {
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+ else
+ INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+ }
+ EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+ {
+ if (op->obj == obj)
+ {
+ EINA_LIST_FOREACH(op->pri_callbacks, l, cb)
+ {
+ if (!cb->func(cb->data, obj, info))
+ {
+ return EINA_FALSE;
+ }
+ }
+ break;
+ }
+ }
+ obj = elm_object_parent_widget_get(obj);
+ }
+ }
+
+ return EINA_TRUE;
+}
+
+static void
+_remove_ecore_handlers(void)
+{
+ INF("In");
+#ifdef HAVE_X
+ if (_motion_handler)
+ {
+ ecore_event_handler_del(_motion_handler);
+ _motion_handler = NULL;
+ INF("removed _motion_handler");
+ }
+#endif
+#ifdef HAVE_WAYLAND
+ if (_ecore_detent_handler)
+ {
+ ecore_event_handler_del(_ecore_detent_handler);
+ _ecore_detent_handler = NULL;
+ INF("removed _ecore_detent_handler");
+ }
+#endif
+ if (_rotate_handler)
+ {
+ ecore_event_handler_del(_rotate_handler);
+ _rotate_handler = NULL;
+ INF("removed _rotate_handler");
+ }
+}
+
+static void
+_object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ ERR("In: data: %p, obj: %p", data, obj);
+ Eina_List *l = NULL;
+
+ Eext_Rotary_Obj_Pri *op = NULL;
+ EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+ {
+ if (op->obj == obj)
+ {
+ Eina_List *l1 = NULL;
+ Eext_Rotary_Cb *cb = NULL;
+
+ EINA_LIST_FOREACH(op->pri_callbacks, l1, cb)
+ {
+ _callbacks = eina_list_remove(_callbacks, cb);
+ op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
+ free(cb);
+ }
+ _obj_pri_callbacks = eina_list_remove(_obj_pri_callbacks, op);
+ free(op);
+ break;
+ }
+ }
+ if (!_callbacks)
+ {
+ eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
+ _handler_registered = EINA_FALSE;
+ }
+ if (_activated_obj == obj)
+ _activated_obj = NULL;
+ INF("done");
+}
+
+static void
+_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ ERR("_activated_obj_del_cb : 0x%x", _activated_obj);
+
+ evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+ _activated_obj = NULL;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+
+/*===========================================================================*
+ * Local *
+ *===========================================================================*/
+
+int _eext_log_dom = -1;
+
+static const char *
+_magic_string_get(eext_magic m)
+{
+ switch (m) {
+ case EEXT_MAGIC_NONE:
+ return "None (Freed Object)";
+
+ default:
+ return "<UNKNOWN>";
+ }
+}
+
+__CONSTRUCTOR__ static void
+eext_mod_init(void)
+{
+ eina_init();
+ _eext_log_dom = eina_log_domain_register("efl-extension", EINA_COLOR_LIGHTBLUE);
+ if (!_eext_log_dom)
+ {
+ EINA_LOG_ERR("could not register efl-extension log domain.");
+ _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL;
+ }
+ INF("Init");
+}
+
+__DESTRUCTOR__ static void
+eext_mod_shutdown(void)
+{
+ INF("Shutdown\n");
+ if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL))
+ {
+ eina_log_domain_unregister(_eext_log_dom);
+ _eext_log_dom = -1;
+ }
+
+ eina_shutdown();
+}
+
+
+/*===========================================================================*
+ * Global *
+ *===========================================================================*/
+
+void
+_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
+{
+ ERR("\n*** MAGIC FAIL (%s) ***\n", fname);
+
+ if (!d)
+ ERR(" Input handle pointer is NULL!");
+ else if (m == EEXT_MAGIC_NONE)
+ ERR(" Input handle has already been freed!");
+ else if (m != req_m)
+ ERR(" Input handle is wrong type\n"
+ " Expected: %08x - %s\n"
+ " Supplied: %08x - %s",
+ (unsigned int)req_m, _magic_string_get(req_m),
+ (unsigned int)m, _magic_string_get(m));
+
+ if (getenv("EEXT_ERROR_ABORT")) abort();
+}
+
+/*===========================================================================*
+ * API *
+ *===========================================================================*/
+
+EAPI Eina_Bool
+eext_win_keygrab_set(Elm_Win *obj, const char *key)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+ if (!ret)
+ ERR(" Can't set keygrab of [%s].", key);
+ return ret;
+}
+EAPI Eina_Bool
+eext_win_keygrab_unset(Elm_Win *obj, const char *key)
+{
+ Eina_Bool ret = EINA_FALSE;
+ ret = elm_win_keygrab_unset(obj, key, 0, 0);
+ if (!ret)
+ ERR(" Can't unset keygrab of [%s].", key);
+ return ret;
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+
+typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
+
+struct _Eext_Event_Mgr
+{
+ Eina_List *obj_events;
+ Evas *e;
+ Evas_Object *key_grab_rect;
+};
+
+typedef struct _Eext_Object_Event
+{
+ Evas_Object *obj;
+ Evas_Object *parent;
+ Eina_List *callbacks;
+ Eina_Bool delete_me : 1;
+ Eina_Bool on_callback : 1;
+} Eext_Object_Event;
+
+typedef struct _Eext_Event_Callback
+{
+ Eext_Callback_Type type;
+ void (*func)(void *data, Evas_Object *obj, void *event_info);
+ void *data;
+} Eext_Event_Callback;
+
+const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
+const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
+const char *EEXT_KEY_STOP = "XF86Stop";
+const char *EEXT_KEY_STOP2 = "Escape";
+const char *EEXT_KEY_STOP3 = "XF86Back";
+const char *EEXT_KEY_SEND = "XF86Send";
+const char *EEXT_KEY_SEND2 = "Menu";
+const char *EEXT_KEY_SEND3 = "XF86Menu";
+
+
+static Eina_List *event_mgrs = NULL;
+
+static void
+_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
+{
+ if (event_mgr->obj_events) return;
+
+ //Redundant Event Mgr. Remove it.
+ evas_object_del(event_mgr->key_grab_rect);
+ event_mgrs = eina_list_remove(event_mgrs, event_mgr);
+ free(event_mgr);
+}
+
+static void
+_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+ Eext_Object_Event *obj_event = data;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+
+ l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
+ if (!l) return;
+
+ event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
+
+ EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
+ obj_event->callbacks = NULL;
+
+ if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+ else free(obj_event);
+
+ _eext_event_mgr_del(event_mgr);
+}
+
+static int
+_eext_layer_sort_cb(const void *data1, const void *data2)
+{
+ const Eext_Object_Event *obj_event = data1;
+ const Eext_Object_Event *obj_event2 = data2;
+
+ //1. Layer Compare
+ int layer1 = evas_object_layer_get(obj_event->obj);
+ int layer2 = evas_object_layer_get(obj_event2->obj);
+
+ return (layer1 < layer2) ? -1 : 1;
+}
+
+static Evas_Object *
+_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
+{
+ Evas_Object *temp;
+ Evas_Object *parent;
+ Eina_List *l, *l_next;
+ Eext_Object_Event *obj_event;
+ Eina_List *_candidates = *candidates;
+ Eina_Bool found = EINA_FALSE;
+
+ //Get the top parent lists
+ EINA_LIST_FOREACH(_candidates, l, obj_event)
+ {
+ temp = obj_event->obj;
+ parent = obj_event->obj;
+ while (temp)
+ {
+ parent = temp;
+ temp = evas_object_smart_parent_get(temp);
+ }
+ obj_event->parent = parent;
+ }
+
+ //Leave only parent candidates.
+ parent = evas_object_top_get(e);
+
+ while (parent)
+ {
+ EINA_LIST_FOREACH(_candidates, l, obj_event)
+ {
+ if (parent == obj_event->parent)
+ {
+ found = EINA_TRUE;
+ obj_event->parent = NULL;
+ }
+ }
+ if (found) break;
+ parent = evas_object_below_get(parent);
+ }
+
+ //Redundant parents (no candidates)
+ EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
+ {
+ if (!obj_event->parent) continue;
+ _candidates = eina_list_remove_list(_candidates, l);
+ }
+
+ *candidates = _candidates;
+ return parent;
+}
+
+static Eext_Object_Event *
+_eext_find_event_target(Eina_List *candidates, Evas_Object *parent)
+{
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l;
+ Evas_Object *obj;
+ Eina_List *members = evas_object_smart_members_get(parent);
+ if (members)
+ {
+ EINA_LIST_REVERSE_FOREACH(members, l, obj)
+ {
+ obj_event = _eext_find_event_target(candidates, obj);
+ //got you!
+ if (obj_event)
+ {
+ eina_list_free(members);
+ return obj_event;
+ }
+ }
+ eina_list_free(members);
+ }
+
+ EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
+ {
+ //got you!
+ if (parent == obj_event->obj) return obj_event;
+ }
+
+ return NULL;
+}
+
+static Eext_Object_Event *
+_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr)
+{
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l, *l_next;
+ Eina_List *candidates = NULL;
+ Evas_Object *parent;
+ int top_layer;
+ Eina_Bool invisible;
+
+ //1. filter the invisible objs
+ EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
+ {
+ parent = obj_event->obj;
+ invisible = EINA_FALSE;
+
+ while (parent)
+ {
+ if (!evas_object_visible_get(parent))
+ {
+ invisible = EINA_TRUE;
+ break;
+ }
+ parent = evas_object_smart_parent_get(parent);
+ }
+ if (invisible) continue;
+ candidates = eina_list_append(candidates, obj_event);
+ }
+ if (!candidates) return NULL; //no visible objects.
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //2.1. sort by layer order
+ candidates = eina_list_sort(candidates, eina_list_count(candidates),
+ _eext_layer_sort_cb);
+
+ //2.2. leave the only top layer
+ obj_event = eina_list_data_get(eina_list_last(candidates));
+ top_layer = evas_object_layer_get(obj_event->obj);
+
+ EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
+ {
+ if (evas_object_layer_get(obj_event->obj) < top_layer)
+ candidates = eina_list_remove_list(candidates, l);
+ }
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //3. find the top parent candidate.
+ parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
+ if (eina_list_count(candidates) == 1) goto found;
+
+ //4. find the target in this parent tree.
+ obj_event = _eext_find_event_target(candidates, parent);
+ eina_list_free(candidates);
+ return obj_event;
+
+found:
+ obj_event = eina_list_data_get(candidates);
+ eina_list_free(candidates);
+ return obj_event;
+}
+
+static void
+_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Event_Key_Down *ev = event_info;
+ Eext_Event_Mgr *event_mgr = data;
+ Eext_Object_Event *obj_event;
+ Eext_Event_Callback *callback;
+ Eext_Callback_Type type;
+ Eina_List *l;
+
+ obj_event = _eext_top_obj_event_find(event_mgr);
+ if (!obj_event) return;
+
+ if (!strcmp(ev->keyname, EEXT_KEY_STOP) ||
+ !strcmp(ev->keyname, EEXT_KEY_STOP2) ||
+ !strcmp(ev->keyname, EEXT_KEY_STOP3))
+ type = EEXT_CALLBACK_BACK;
+ else if (!strcmp(ev->keyname, EEXT_KEY_SEND) ||
+ !strcmp(ev->keyname, EEXT_KEY_SEND2) ||
+ !strcmp(ev->keyname, EEXT_KEY_SEND3))
+ type = EEXT_CALLBACK_MORE;
+ else return;
+
+ obj_event->on_callback = EINA_TRUE;
+ EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
+ {
+ if (callback->type != type) continue;
+ callback->func(callback->data, obj_event->obj, (void*) type);
+ if (obj_event->delete_me) break;
+ }
+ if (obj_event->delete_me) free(obj_event);
+ else obj_event->on_callback = EINA_FALSE;
+}
+
+static void
+_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
+{
+ Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
+
+ evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
+ _eext_key_grab_rect_key_up_cb, event_mgr);
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE))
+ ERR("Failed to grab END KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE))
+ ERR("Failed to grab END KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE))
+ ERR("Failed to grab END KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE))
+ ERR("Failed to grab MORE KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE))
+ ERR("Failed to grab MORE KEY\n");
+
+ if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE))
+ ERR("Failed to grab MORE KEY\n");
+
+ event_mgr->key_grab_rect = key_grab_rect;
+}
+
+static Eext_Event_Mgr *
+_eext_event_mgr_new(Evas *e)
+{
+ Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
+ if (!event_mgr)
+ {
+ ERR("Failed to allocate event manager");
+ return NULL;
+ }
+ event_mgr->e = e;
+ _eext_key_grab_obj_create(event_mgr);
+
+ return event_mgr;
+}
+
+EAPI void *
+eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
+{
+ Eext_Object_Event *obj_event;
+ Eext_Event_Mgr *event_mgr;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+ void *data;
+
+ //Check the validation
+ event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+ obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+ if (!event_mgr || !obj_event)
+ {
+ WRN("This object(%p) hasn't been registered before", obj);
+ return NULL;
+ }
+
+ //Remove the callback data
+ EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
+ {
+ if ((callback->func == func) && (callback->type == type)) break;
+ }
+
+ if (!callback)
+ {
+ WRN("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
+ return NULL;
+ }
+
+ data = callback->data;
+ obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
+ free(callback);
+
+ //This object is not managed anymore.
+ if (!obj_event->callbacks)
+ {
+ evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
+ evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
+ Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
+ obj_event);
+ if (l)
+ event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
+ l);
+ if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+ else free(obj_event);
+
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
+ }
+
+ _eext_event_mgr_del(event_mgr);
+
+ return data;
+}
+
+EAPI void
+eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
+{
+ Eext_Event_Mgr *event_mgr;
+ Evas *e;
+ Eext_Object_Event *obj_event = NULL;
+ Eina_List *l;
+ Eext_Event_Callback *callback;
+ Eina_Bool new_event_mgr = EINA_TRUE;
+
+ //Check the registered event manager for this Evas.
+ e = evas_object_evas_get(obj);
+
+ EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
+ {
+ if (event_mgr->e == e)
+ {
+ new_event_mgr = EINA_FALSE;
+ break;
+ }
+ }
+
+ //New Evas comes. Create new event manager for this Evas.
+ if (new_event_mgr)
+ {
+ if (!(event_mgr = _eext_event_mgr_new(e))) return;
+ event_mgrs = eina_list_append(event_mgrs, event_mgr);
+ }
+
+ obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+ //New Object Event. Probably user adds eext_object_event_callback first time.
+ if (!obj_event)
+ {
+ obj_event = calloc(1, sizeof(Eext_Object_Event));
+ if (!obj_event)
+ {
+ ERR("Failed to allocate object event");
+ return;
+ }
+ evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
+ evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+ _eext_object_del_cb,
+ obj_event);
+ event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
+ obj_event);
+ obj_event->obj = obj;
+ }
+
+ //Append this callback.
+ callback = calloc(1, sizeof(Eext_Event_Callback));
+ if (!callback)
+ {
+ ERR("Failed to allocate event callback");
+ return;
+ }
+ callback->type = type;
+ callback->func = func;
+ callback->data = data;
+
+ obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+#include "common/efl_extension_common_private.h"
+
+#define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data"
+
+/* === /internal object cb & util === */
+static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
+static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+/* === internal object creation (elm-demo-tizen/drawer.c) === */
+static Evas_Object *_drawer_layout_create(Evas_Object *parent);
+static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
+
+/* === more option API === */
+static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
+static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
+static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+/* === Accessibility === */
+static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
+static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
+
+/* === internal object cb & util === */
+static void
+_drawer_back_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *panel = obj;
+ if (!panel)
+ {
+ ERR("panel is NULL!!");
+ return;
+ }
+
+ Eext_More_Option_Data *mold = data;
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return;
+ }
+
+ if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel);
+}
+
+static void
+_panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Eext_More_Option_Data *mold = data;
+
+ if (mold)
+ {
+ evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL);
+ eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+ eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
+
+ Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
+ if (!msg) return;
+
+ msg->count = 1;
+ msg->val[0] = 0;
+
+ Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+ if (content_part)
+ {
+ edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
+ }
+ else
+ free(msg);
+ //for accessibility
+ // signal send to rotary selector for highlighted access object
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL);
+ elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_FALSE);
+ evas_object_show(mold->rotary_selector);
+ }
+ //
+ }
+}
+
+static void
+_panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Eext_More_Option_Data *mold = data;
+ if (mold)
+ {
+ evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL);
+ eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
+
+ Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
+ if (!msg) return;
+
+ msg->count = 1;
+ msg->val[0] = 1;
+
+ Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+ if (content_part)
+ {
+ edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
+ }
+ else
+ free(msg);
+
+ //item index is initialized as zero.
+ if (mold->rotary_selector)
+ {
+ //Initialize item to zero
+ Eina_List *l = NULL;
+ Eext_Object_Item *item = NULL;
+ EINA_LIST_FOREACH(mold->item_list, l, item)
+ {
+ break;
+ }
+
+ eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
+ }
+
+ //for accessibility
+ // signal send to rotary selector for highlighted access object
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_TRUE);
+ elm_atspi_component_highlight_grab(mold->cue_access_object);
+ evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL);
+ evas_object_hide(mold->rotary_selector);
+ }
+ //
+ }
+
+ eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb);
+}
+
+static void
+_panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ INF("more_option cue clicked!!");
+
+ Eext_More_Option_Data *mold = data;
+ if (mold)
+ evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
+}
+
+static void
+_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ elm_layout_signal_callback_del(obj, "elm,state,active,finished", "elm", _panel_active_cb);
+ elm_layout_signal_callback_del(obj, "elm,state,inactive,finished", "elm", _panel_inactive_cb);
+ elm_layout_signal_callback_del(obj, "cue,hide", "ext", _cue_hide_cb);
+ elm_layout_signal_callback_del(obj, "cue,show", "ext", _cue_show_cb);
+}
+
+/* === internal object creation (elm-demo-tizen/drawer.c) === */
+static Evas_Object *
+_drawer_layout_create(Evas_Object *parent)
+{
+ Evas_Object *layout;
+ layout = elm_layout_add(parent);
+ if (!layout)
+ {
+ ERR("drawer layout is NULL");
+ return NULL;
+ }
+
+ elm_layout_theme_set(layout, "layout", "drawer", "panel");
+ evas_object_show(layout);
+
+ return layout;
+}
+
+static Evas_Object *
+_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold)
+{
+ Evas_Object *panel;
+
+ panel = elm_panel_add(parent);
+ if (!panel)
+ {
+ ERR("panel is NULL");
+ return NULL;
+ }
+
+ evas_object_show(panel);
+
+ //Default : right
+ elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
+ elm_object_part_content_set(parent, "elm.swallow.right", panel);
+
+ evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL);
+
+ return panel;
+}
+
+/* === more option API === */
+static Eext_More_Option_Data *
+_more_option_data_init(Evas_Object *obj, Evas_Object *parent)
+{
+ Eext_More_Option_Data *mold = NULL;
+
+ mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ mold->parent = parent;
+ mold->more_option = obj;
+ mold->item_list = NULL;
+ mold->panel = NULL;
+ mold->rotary_selector = NULL;
+ mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT;
+
+ return mold;
+}
+
+static Eext_More_Option_Data *
+_more_option_data_get(const Evas_Object *more_option)
+{
+ if (!more_option)
+ {
+ ERR("more_option is NULL!!");
+ return NULL;
+ }
+
+ return evas_object_data_get(more_option, EEXT_MORE_OPTION_DATA_KEY);
+}
+
+static void
+_more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_More_Option_Data *mold = data;
+
+ if (mold->item_list)
+ {
+ mold->item_list = eina_list_free(mold->item_list);
+ }
+
+ evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY);
+
+ free(mold);
+}
+
+static void
+_cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ INF("called!!");
+
+ Eext_More_Option_Data *mold = data;
+
+ elm_layout_signal_emit(mold->panel, "cue,hide", "elm");
+}
+
+static void
+_cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ INF("called!!");
+
+ Eext_More_Option_Data *mold = data;
+
+ elm_layout_signal_emit(mold->panel, "cue,show", "elm");
+}
+
+static void
+_rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+ evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info);
+}
+
+static void
+_rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+ evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
+}
+
+/* === public API implementation === */
+
+EAPI Evas_Object *
+eext_more_option_add(Evas_Object *parent)
+{
+ if (!parent)
+ {
+ ERR("parent is NULL!!");
+ return NULL;
+ }
+
+ Eext_More_Option_Data *mold = NULL;
+ Evas_Object *more_option = NULL;
+
+ more_option = _drawer_layout_create(parent);
+ if (!more_option)
+ {
+ ERR("more_option is NULL!!");
+ return NULL;
+ }
+
+ mold = _more_option_data_init(more_option, parent);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ evas_object_data_set(mold->more_option, EEXT_MORE_OPTION_DATA_KEY, mold);
+ elm_layout_signal_callback_add(mold->more_option, "cue,hide", "ext", _cue_hide_cb, mold);
+ elm_layout_signal_callback_add(mold->more_option, "cue,show", "ext", _cue_show_cb, mold);
+ evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_DEL, _more_option_del_cb, mold);
+
+ mold->panel = _panel_create(mold->more_option, mold);
+ if (!mold->panel)
+ {
+ ERR("panel is NULL!!");
+ return NULL;
+ }
+
+ elm_layout_signal_callback_add(mold->panel, "elm,state,active,finished", "elm", _panel_active_cb, mold);
+ elm_layout_signal_callback_add(mold->panel, "elm,state,inactive,finished", "elm", _panel_inactive_cb, mold);
+ elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold);
+
+ mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
+ if (!mold->rotary_selector)
+ {
+ ERR("rotary_selector is NULL!!");
+ return NULL;
+ }
+ _rotary_selector_from_moreoption_set(mold->rotary_selector, EINA_TRUE);
+
+ evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
+ evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
+
+ Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
+ if (!selector_content)
+ {
+ ERR("selector_content is NULL!!");
+ return NULL;
+ }
+
+ elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
+
+ elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
+
+ elm_object_content_set(mold->panel, mold->rotary_selector);
+
+ elm_panel_toggle(mold->panel);
+
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ evas_object_hide(mold->rotary_selector);
+
+ Evas_Object *to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access");
+ mold->cue_access_object = elm_access_object_register(to, parent);
+
+ elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
+ elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
+ elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+ elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
+ }
+ //
+
+ return mold->more_option;
+}
+
+EAPI void
+eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction)
+{
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return;
+ }
+
+ Eext_More_Option_Data *mold = NULL;
+ mold = _more_option_data_get(obj);
+ if (mold)
+ {
+ elm_panel_orient_set(mold->panel, direction);
+ mold->direction = direction;
+ }
+}
+
+EAPI Eext_More_Option_Direction
+eext_more_option_direction_get(const Evas_Object *obj)
+{
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
+ }
+
+ Eext_More_Option_Data *mold = NULL;
+ mold = _more_option_data_get((Evas_Object *)obj);
+ if (mold)
+ {
+ Elm_Panel_Orient orient = elm_panel_orient_get(mold->panel);
+ return (Eext_More_Option_Direction)orient;
+ }
+
+ return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_append(Evas_Object *obj)
+{
+ Eext_Object_Item *item = NULL;
+ Eext_More_Option_Data *mold = NULL;
+ mold = _more_option_data_get(obj);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ item = eext_rotary_selector_item_append(mold->rotary_selector);
+
+ mold->item_list = eina_list_append(mold->item_list, item);
+
+ return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_prepend(Evas_Object *obj)
+{
+ Eext_More_Option_Data *mold = NULL;
+ Eext_Object_Item *item = NULL;
+
+ mold = _more_option_data_get(obj);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ item = eext_rotary_selector_item_prepend(mold->rotary_selector);
+
+ mold->item_list = eina_list_prepend(mold->item_list, item);
+
+ return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
+{
+ Eext_More_Option_Data *mold = NULL;
+ Eext_Object_Item *item = NULL;
+
+ mold = _more_option_data_get(obj);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
+
+ mold->item_list = eina_list_append_relative(mold->item_list, item, after);
+
+ return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
+{
+ Eext_More_Option_Data *mold = NULL;
+ Eext_Object_Item *item = NULL;
+
+ mold = _more_option_data_get(obj);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
+
+ mold->item_list = eina_list_prepend_relative(mold->item_list, item, before);
+
+ return item;
+}
+
+EAPI void
+eext_more_option_item_del(Eext_Object_Item *item)
+{
+ //Temporary
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+
+ Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return;
+ }
+
+ eext_rotary_selector_item_del(item);
+
+ mold->item_list = eina_list_remove(mold->item_list, item);
+
+ return;
+}
+
+EAPI void
+eext_more_option_items_clear(Evas_Object *obj)
+{
+ Evas_Object *more_option = obj;
+ Eext_More_Option_Data *mold = NULL;
+
+ if (!more_option)
+ {
+ ERR("more_option is NULL!!");
+ return;
+ }
+
+ mold = _more_option_data_get(more_option);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return;
+ }
+ eext_rotary_selector_items_clear(mold->rotary_selector);
+
+ mold->item_list = eina_list_free(mold->item_list);
+
+ return;
+}
+
+EAPI void
+eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
+{
+ eext_rotary_selector_item_part_text_set(item, part_name, text);
+
+ return;
+}
+
+EAPI void
+eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
+{
+ eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
+
+ return;
+}
+
+EAPI const char *
+eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
+{
+ return eext_rotary_selector_item_part_text_get(item, part_name);
+}
+
+EAPI void
+eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content)
+{
+ eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
+
+ return;
+}
+
+EAPI Evas_Object *
+eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name)
+{
+ return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+}
+
+EAPI void
+eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
+{
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return;
+ }
+
+ Eext_More_Option_Data *mold = NULL;
+ mold = _more_option_data_get(obj);
+ if (mold)
+ {
+ if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel);
+ else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
+ }
+}
+
+EAPI Eina_Bool
+eext_more_option_opened_get(Evas_Object *obj)
+{
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return EINA_FALSE;
+ }
+
+ Eext_More_Option_Data *mold = NULL;
+ mold = _more_option_data_get(obj);
+ if (mold)
+ {
+ return !elm_panel_hidden_get(mold->panel);
+ }
+
+ return EINA_FALSE;
+}
+
+EAPI const Eina_List*
+eext_more_option_items_get(const Evas_Object *obj)
+{
+ const Evas_Object *more_option = obj;
+ Eext_More_Option_Data *mold = NULL;
+
+ if (!more_option)
+ {
+ ERR("more_option is NULL!!");
+ return NULL;
+ }
+
+ mold = _more_option_data_get(more_option);
+ if (!mold)
+ {
+ ERR("mold is NULL!!");
+ return NULL;
+ }
+
+ return eext_rotary_selector_items_get(mold->rotary_selector);
+}
+
+//for accessibility
+static Eina_Bool
+_access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
+{
+ Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+
+ switch (action_info->action_type)
+ {
+ case ELM_ACCESS_ACTION_ACTIVATE:
+ if (mold)
+ {
+ elm_panel_toggle(mold->panel);
+ }
+ break;
+ }
+ return EINA_FALSE;
+}
+static char *
+_accessibility_name_set_cb(void *data, Evas_Object *obj)
+{
+ char buf[255] = "";
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+
+ snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
+ return strdup(buf);
+}
+//
--- /dev/null
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * 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 "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+#include "common/efl_extension_common_private.h"
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// efl_extension_rotary_selector.c
+//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#define EEXT_ROTARY_SELECTOR_DATA_KEY "eext_rotary_selector_data"
+#define _ROTARY_SELECTOR_SCREEN_WIDTH 360
+#define _ROTARY_SELECTOR_SCREEN_HEIGHT 360
+#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH 180
+#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_HEIGHT 180
+#define _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE 30
+#define _ROTARY_SELECTOR_PAGE_ITEM_MAX 11
+#define _ROTARY_SELECTOR_PAGE_ANIMATION_DURATION 0.35
+#define _ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME 0.1
+#define _ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION 0.6
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_X 0.33
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y 0.0
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X 0.3
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y 1.0
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID -3
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM -2
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM -1
+#define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500
+#define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60
+
+
+#define _ROTARY_SELECTOR_DEBUG_ENABLED 0
+
+// ====================================== util ==================================== //
+#define _DEGREES_TO_RADIANS(degrees) (degrees * M_PI / 180.0)
+#define _RADIANS_TO_DEGREES(radians) (radians * 180.0 / M_PI)
+#define ALMOST_ZERO_FLOAT 0.00001f
+
+#define ROTARY_SELECTOR_COLOR_VALUE_SET(obj, part, state, r, g, b, a) \
+ do { \
+ obj->part.state.r = r; \
+ obj->part.state.g = g; \
+ obj->part.state.b = b; \
+ obj->part.state.a = a; \
+ obj->part.state.set_flag = EINA_TRUE; \
+ } while (0)
+
+#define ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, obj, part, state) \
+ do { \
+ evas_object_color_set(content, \
+ obj->part.state.r, \
+ obj->part.state.g, \
+ obj->part.state.b, \
+ obj->part.state.a); \
+ } while (0)
+
+#define ROTARY_SELECTOR_COLOR_VALUE_GET(obj, part, state, r, g, b, a) \
+ do { \
+ if (r) *r = obj->part.state.r; \
+ if (g) *g = obj->part.state.g; \
+ if (b) *b = obj->part.state.b; \
+ if (a) *a = obj->part.state.a; \
+ } while (0)
+
+static double
+_min(const double a, const double b)
+{
+ if (a < b)
+ {
+ return a;
+ }
+ return b;
+}
+
+static Eina_Bool
+_doubleCompare(double p1, double p2)
+{
+ if ((p1 == 0.f) || (p2 == 0.f))
+ {
+ return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT);
+ }
+
+ return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT * _min(abs(p1), abs(p2)));
+}
+
+static double
+_mouse_event_angle_get(Evas_Coord x, Evas_Coord y)
+{
+ const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+ const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+
+ double default_angle = 90;
+ if (x < center_x)
+ {
+ default_angle = 270;
+ }
+ double calculated_x = x - center_x;
+ double calculated_y = y - center_y;
+ double radian = atan((double) calculated_y / calculated_x);
+
+ return (_RADIANS_TO_DEGREES(radian) + default_angle);
+}
+
+// ----------------------------------------- interpolator util --------------------------------------//
+
+void
+_circle_path_interpolator(Eext_Rotary_Selector_Data *rsd, double progress, const double startAngle, const double endAngle, const double startRadius, const double endRadius, double* pos_x, double* pos_y)
+{
+ const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+ const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+
+ // 1. calculate angle
+ double angle = 0.f;
+ if (_doubleCompare(startAngle, endAngle))
+ {
+ angle = startAngle;
+ }
+ else if (startAngle < endAngle)
+ {
+ angle = startAngle + ((endAngle - startAngle) * progress);
+ }
+ else
+ {
+ angle = startAngle - ((startAngle - endAngle) * progress);
+ }
+
+ double radian = _DEGREES_TO_RADIANS(angle);
+ double cosValue = cos(radian);
+ double sinValue = sin(radian);
+
+ // 2. calculate radius
+ float radius = startRadius;
+ if (endRadius >= 0)
+ {
+ if (startRadius <= endRadius)
+ {
+ radius = startRadius + ((endRadius-startRadius)*progress);
+ }
+ else
+ {
+ radius = startRadius - ((startRadius-endRadius)*progress);
+ }
+ }
+
+ // 3. calculate target point
+ *pos_x = center_x + (radius * (float)(cosValue)) - (rsd->item_width / 2.f);
+ *pos_y = center_y + (radius * (float)(sinValue)) - (rsd->item_height / 2.f);
+
+ return;
+}
+// ----------------------------------------- event area API --------------------------------------//
+static void _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_callback_add(Eext_Rotary_Selector_Data *rsd);
+
+// ----------------------------------------- internal header --------------------------------------//
+static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent);
+static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_get(Evas_Object *rotary_selector);
+static Eina_Bool _rotary_selector_visible_get(Evas_Object *rotary_selector);
+static Eina_Bool _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
+static void _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+// ----------------------------------------- item API --------------------------------------//
+static void _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item);
+static void _items_transformation_update(Eext_Rotary_Selector_Data *rsd);
+static void _items_invalidate(Eext_Rotary_Selector_Data *rsd);
+static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd);
+static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index);
+static void _item_select(Eext_Rotary_Selector_Data *rsd, int index);
+static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd);
+static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index);
+static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound);
+
+static Eext_Rotary_Selector_Item * _item_get(Eext_Rotary_Selector_Data *rsd, int index);
+static void _item_text_copy(char **target, const char* source);
+
+// ----------------------------------------- animation API --------------------------------------//
+static Eina_Bool _previous_page_animator_cb(void *data);
+static Eina_Bool _item_update_animator_cb(void *data);
+static void _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
+static void _end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
+static void _item_update_animation_run(Eext_Rotary_Selector_Data *rsd);
+static Eina_Bool _next_page_animator_cb(void *data);
+static Eina_Bool _next_page_timer_cb(void *data);
+static Eina_Bool _end_effect_animator_cb(void *data);
+
+// ----------------------------------------- selector API --------------------------------------//
+static void _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation);
+static void _selector_content_update(Eext_Rotary_Selector_Data *rsd);
+static void _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+// ----------------------------------------- Accessibility API --------------------------------------//
+static Eina_Bool _accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
+static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page);
+static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj);
+static char *_accessibility_name_set_cb(void *data, Evas_Object *obj);
+static char *_accessibility_description_set_cb(void *data, Evas_Object *obj);
+static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info);
+static void _rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info);
+void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
+static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector);
+static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+
+// ----------------------------------------- event area API --------------------------------------//
+static void
+_event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+ const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+ Evas_Event_Mouse_Down *ev = event_info;
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+ {
+ INF("animator is running!!");
+ return;
+ }
+ rsd->pressed = EINA_TRUE;
+
+ int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
+ if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+ {
+ double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+ int new_index = 0;
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ int i = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ if (last_index > rsd->item_count - 1)
+ {
+ last_index = rsd->item_count - 1;
+ }
+
+ if (angle < 20.f)
+ {
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM;
+ }
+ else if (angle > 340.f)
+ {
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM;
+ }
+ else
+ {
+ const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+ for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX;i++)
+ {
+ if(angle < touchAreaAngle[i]) break;
+ }
+
+ new_index = first_index + i;
+
+ if (last_index < new_index)
+ {
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+ }
+ else
+ {
+ rsd->pressed_item_index = new_index;
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_TRUE, EINA_FALSE);
+ }
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("pressed_item_index : %d", rsd->pressed_item_index);
+#endif
+ }
+ }
+}
+
+static void
+_event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+ const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+ Evas_Event_Mouse_Move *ev = event_info;
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+ {
+ INF("animator is running!!");
+ return;
+ }
+ if (!rsd->pressed)
+ {
+ return;
+ }
+
+ if (rsd->touched_item_changed || rsd->pressed_item_index == _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID)
+ {
+ return;
+ }
+
+ int point = sqrt(pow(center_x - ev->cur.canvas.x, 2) + pow(center_y - ev->cur.canvas.y, 2));
+ if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+ {
+ double angle = _mouse_event_angle_get(ev->cur.canvas.x, ev->cur.canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+ int new_index = 0;
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ int i = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ if (last_index > rsd->item_count - 1)
+ {
+ last_index = rsd->item_count - 1;
+ }
+
+ if (angle < 20.f)
+ {
+ if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM)
+ {
+ rsd->touched_item_changed = EINA_TRUE;
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+ }
+ }
+ else if (angle > 340.f)
+ {
+ if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM)
+ {
+ rsd->touched_item_changed = EINA_TRUE;
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+ }
+ }
+ else
+ {
+ const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+
+ for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
+ {
+ if(angle < touchAreaAngle[i]) break;
+ }
+ new_index = first_index + i;
+
+ if (rsd->pressed_item_index != new_index)
+ {
+ rsd->touched_item_changed = EINA_TRUE;
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+ }
+ }
+ }
+ else
+ {
+ if (rsd->pressed_item_index >= 0)
+ {
+ rsd->touched_item_changed = EINA_TRUE;
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+ }
+ }
+}
+
+static void
+_event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+ const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+ Evas_Event_Mouse_Up *ev = event_info;
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+ {
+ INF("animator is running!!");
+ return;
+ }
+ if (!rsd->pressed)
+ {
+ return;
+ }
+
+ int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
+ if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+ {
+ if (rsd->touched_item_changed)
+ {
+ rsd->touched_item_changed = EINA_FALSE;
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+ rsd->pressed = EINA_FALSE;
+
+ return;
+ }
+
+ double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+ int new_index = 0;
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ int previous_item_index = rsd->selected_index;
+ int i = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ if (last_index > rsd->item_count - 1)
+ {
+ last_index = rsd->item_count - 1;
+ }
+
+ if (angle < 20.f)
+ {
+ if (rsd->current_page> 0)
+ {
+ rsd->selected_index = first_index - 1;
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ _page_animation_run(rsd, EINA_FALSE);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ }
+ else if (angle > 340.f)
+ {
+ if (rsd->current_page < (rsd->item_count/_ROTARY_SELECTOR_PAGE_ITEM_MAX))
+ {
+ rsd->selected_index = last_index + 1;
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ _page_animation_run(rsd, EINA_TRUE);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ }
+ else
+ {
+ const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+ for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
+ {
+ if(angle < touchAreaAngle[i]) break;
+ }
+ new_index = first_index + i;
+
+ if (rsd->pressed_item_index == new_index)
+ {
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE);
+ rsd->selected_index = new_index;
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ _selector_update(rsd, EINA_FALSE, EINA_FALSE);
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ }
+ }
+
+ rsd->pressed = EINA_FALSE;
+ rsd->touched_item_changed = EINA_FALSE;
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+}
+
+static void
+_event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ if (rsd->pressed_item_index > 0)
+ {
+ _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+ }
+
+ rsd->pressed = EINA_FALSE;
+ rsd->touched_item_changed = EINA_FALSE;
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+}
+
+static void
+_event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ INF("called!!");
+
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb);
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb);
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb);
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb);
+}
+
+static void
+_event_area_callback_add(Eext_Rotary_Selector_Data *rsd)
+{
+ INF("called!!");
+
+ rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area");
+
+ if (rsd->event_area)
+ {
+ evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb, rsd);
+ evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb, rsd);
+ evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb, rsd);
+ evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb, rsd);
+ evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_DEL, _event_area_del_cb, rsd);
+ }
+}
+
+// ----------------------------------------- internal header --------------------------------------//
+static Eext_Rotary_Selector_Data *
+_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
+{
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ const char *radius = NULL;
+ const char *item_width = NULL;
+ const char *item_height = NULL;
+
+ rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data));
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+ rsd->parent = parent;
+ rsd->rotary_selector = obj;
+ rsd->event_area = NULL;
+ rsd->item_list = NULL;
+ rsd->item_count = 0;
+ rsd->selected_index = 0;
+ rsd->current_page = 0;
+ rsd->animation_direction = EINA_TRUE;
+ rsd->previous_page_animator = NULL;
+ rsd->next_page_animator = NULL;
+ rsd->previous_page_animator_start_time = 0.0f;
+ rsd->next_page_animator_start_time = 0.0f;
+ rsd->next_page_animation_started = EINA_FALSE;
+ rsd->previous_page_animation_started = EINA_FALSE;
+ rsd->next_page_timer = NULL;
+ rsd->end_effect_animation_started = EINA_FALSE;
+ rsd->end_effect_animator_start_time = 0.0f;
+ rsd->end_effect_animator = NULL;
+ rsd->item_update_animator = NULL;
+ rsd->selector_bg_image_color.normal_color.set_flag = EINA_FALSE;
+ rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE;
+ rsd->pressed = EINA_FALSE;
+ rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+ rsd->touched_item_changed = EINA_FALSE;
+ rsd->acceleration = EINA_FALSE;
+
+ radius = edje_object_data_get(elm_layout_edje_get(obj), "radius");
+ if (!radius)
+ {
+ ERR("radius is NULL!!");
+ free(rsd);
+ return NULL;
+ }
+ rsd->radius = atoi(radius);
+
+ item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width");
+ if (!item_width)
+ {
+ ERR("item_width is NULL!!");
+ free(rsd);
+ return NULL;
+ }
+ rsd->item_width = (Evas_Coord)atoi(item_width);
+
+ item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height");
+ if (!item_height)
+ {
+ ERR("item_height is NULL!!");
+ free(rsd);
+ return NULL;
+ }
+ rsd->item_height = (Evas_Coord)atoi(item_height);
+ rsd->rotary_event_time_stamp = 0.0;
+
+ INF("rsd is initialized!!");
+
+ return rsd;
+}
+
+static Eext_Rotary_Selector_Data *
+_eext_rotary_selector_data_get(Evas_Object *rotary_selector)
+{
+ if (!rotary_selector)
+ {
+ ERR("rotary_selector is NULL!!");
+ return NULL;
+ }
+
+ return evas_object_data_get(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY);
+}
+
+static Eina_Bool
+_rotary_selector_visible_get(Evas_Object *rotary_selector)
+{
+ if (!rotary_selector)
+ {
+ return EINA_FALSE;
+ }
+
+ Evas_Coord x, y, w, h;
+ evas_object_geometry_get(rotary_selector, &x, &y, &w, &h);
+ if (evas_object_visible_get(rotary_selector) && x == 0)
+ {
+ return EINA_TRUE;
+ }
+ else
+ {
+ return EINA_FALSE;
+ }
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
+
+ if (rsd->acceleration)
+ {
+ INF("rotary acceleration!!");
+ return EINA_FALSE;
+ }
+
+ if (elm_object_disabled_get(rsd->rotary_selector))
+ {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+ {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ int previous_item_index = rsd->selected_index;
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ if (last_index > rsd->item_count - 1)
+ {
+ last_index = rsd->item_count - 1;
+ }
+
+ if (rsd->rotary_event_time_stamp == 0 && !rsd->acceleration)
+ {
+ rsd->rotary_event_time_stamp = info->time_stamp;
+ rsd->acceleration = EINA_FALSE;
+ }
+ else
+ {
+ int diff = info->time_stamp - rsd->rotary_event_time_stamp;
+ if (diff < _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD)
+ {
+ rsd->acceleration = EINA_TRUE;
+ }
+ else
+ {
+ rsd->rotary_event_time_stamp = info->time_stamp;
+ }
+ }
+
+ if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+ {
+ if (rsd->selected_index < rsd->item_count - 1)
+ {
+ //for accessibility
+ if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+ //
+ {
+ if (!rsd->acceleration)
+ {
+ rsd->selected_index += 1;
+ }
+ else
+ {
+ rsd->selected_index = last_index;
+ }
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ }
+ if (last_index < rsd->selected_index)
+ {
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ rsd->selected_index -= 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+ rsd->control_by_rotary = EINA_TRUE;
+ elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ //
+ else
+ {
+ _page_animation_run(rsd, EINA_TRUE);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ }
+ else
+ {
+ _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+ if(_item)
+ {
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+ elm_atspi_component_highlight_grab(_item->base.obj);
+ }
+ }
+ //
+ }
+ }
+ else
+ {
+ _end_effect_animation_run(rsd, EINA_TRUE);
+ }
+ }
+ else
+ {
+ if (rsd->selected_index > 0)
+ {
+ //for accessibility
+ if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+ //
+ {
+ if (!rsd->acceleration)
+ {
+ rsd->selected_index -= 1;
+ }
+ else
+ {
+ rsd->selected_index = first_index;
+ }
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ }
+ if (first_index > rsd->selected_index)
+ {
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ rsd->selected_index += 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+ rsd->control_by_rotary = EINA_TRUE;
+ elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ else
+ //
+ {
+ _page_animation_run(rsd, EINA_FALSE);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ }
+ }
+ else
+ {
+ _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+ if(_item)
+ {
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+ elm_atspi_component_highlight_grab(_item->base.obj);
+ }
+ }
+ //
+ }
+ }
+ else
+ {
+ _end_effect_animation_run(rsd, EINA_FALSE);
+ }
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ _item_select(rsd, rsd->selected_index);
+}
+
+static void
+_rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = data;
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ _item_select(rsd, rsd->selected_index);
+
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ {
+ rsd->reading_page_number = -1;
+ elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+ if(!_rotary_selector_from_moreoption_get(rsd->rotary_selector))
+ elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+ }
+ //
+
+}
+
+static void
+_rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ if (rsd->item_list)
+ {
+ Eext_Rotary_Selector_Item *item = NULL;
+ EINA_LIST_FREE(rsd->item_list, item)
+ evas_object_del(item->base.obj);
+ rsd->item_list = NULL;
+ }
+ if (rsd->previous_page_animator)
+ {
+ ecore_animator_del(rsd->previous_page_animator);
+ rsd->previous_page_animator = NULL;
+ }
+ if (rsd->next_page_animator)
+ {
+ ecore_animator_del(rsd->next_page_animator);
+ rsd->next_page_animator = NULL;
+ }
+ if (rsd->next_page_timer)
+ {
+ ecore_timer_del(rsd->next_page_timer);
+ rsd->next_page_timer = NULL;
+ }
+ if (rsd->end_effect_animator)
+ {
+ ecore_animator_del(rsd->end_effect_animator);
+ rsd->end_effect_animator = NULL;
+ }
+ if (rsd->item_update_animator)
+ {
+ ecore_animator_del(rsd->item_update_animator);
+ rsd->item_update_animator = NULL;
+ }
+
+ edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal);
+ edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb);
+ eext_rotary_object_event_callback_del(obj, _rotary_selector_rotary_cb);
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb);
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb);
+
+ evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
+
+ free(rsd);
+}
+
+// ----------------------------------------- item API --------------------------------------//
+static void
+_item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item)
+{
+ const float endAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+
+ Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
+ _circle_path_interpolator(rsd, 1.0f, 0, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], 0, rsd->radius, &coords->x, &coords->y);
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ Evas_Coord x, y, w, h;
+ evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
+
+ INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
+#endif
+}
+
+static void
+_items_transformation_update(Eext_Rotary_Selector_Data *rsd)
+{
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ _item_coords_update(rsd, item);
+ }
+}
+
+static void
+_items_invalidate(Eext_Rotary_Selector_Data *rsd)
+{
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ double start_time = ecore_time_unix_get();
+#endif
+ if (rsd->item_count <= 0)
+ {
+ return;
+ }
+ int i = 0;
+ Eina_List *l = NULL;
+ Evas_Coord x, y, w, h;
+ evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+
+ if (i >= first_index && i <= last_index)
+ {
+ evas_object_color_set(button, 255, 255, 255, 255);
+ evas_object_move(button, x + item->coords.x, y + item->coords.y);
+ evas_object_raise(button);
+ evas_object_show(button);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
+#endif
+ }
+ else
+ {
+ evas_object_hide(button);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("obj : 0x%x hide index : %d", item->base.obj, item->index);
+#endif
+ }
+ i++;
+ }
+
+ _layer_items_invalidate(rsd);
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("elapsed time(%f)", ecore_time_unix_get() - start_time);
+#endif
+}
+
+static void
+_layer_items_invalidate(Eext_Rotary_Selector_Data *rsd)
+{
+ if (rsd->item_count <= 0)
+ {
+ return;
+ }
+ int i = 0;
+ Eina_List *l = NULL;
+ double coord_x, coord_y;
+ Evas_Coord x, y, w, h;
+ evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+
+ Evas_Object *current_first_item = NULL;
+ Evas_Object *current_last_item = NULL;
+ Evas_Object *second_layer_right_item = NULL;
+ Evas_Object *second_layer_left_item = NULL;
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+ if (i == first_index)
+ {
+ current_first_item = button;
+ }
+ else if (i == last_index)
+ {
+ current_last_item = button;
+ }
+
+ if(rsd->current_page > 0 && i == first_index-1) //Second layer Right
+ {
+ second_layer_right_item = button;
+ }
+ else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
+ {
+ second_layer_left_item = button;
+ }
+ i++;
+ }
+
+ l = NULL;
+ item = NULL;
+ i = 0;
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+ if (rsd->current_page > 0 && i == first_index-1) //Second layer Right
+ {
+ _circle_path_interpolator(rsd, 1, 0, -67, rsd->radius, rsd->radius, &coord_x, &coord_y);
+ evas_object_move(button, x + coord_x, y + coord_y);
+ evas_object_stack_below(button, current_first_item);
+ evas_object_color_set(button, 128, 128, 128, 128);
+ evas_object_show(button);
+ }
+ else if (rsd->current_page > 0 && i == first_index-2) //third layer Right
+ {
+ _circle_path_interpolator(rsd, 1, 0, -70, rsd->radius, rsd->radius, &coord_x, &coord_y);
+ evas_object_move(button, x + coord_x, y + coord_y);
+ evas_object_stack_below(button, second_layer_right_item);
+ evas_object_color_set(button, 102, 102, 102, 102);
+ evas_object_show(button);
+ }
+ else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
+ {
+ _circle_path_interpolator(rsd, 1, 0, -113, rsd->radius, rsd->radius, &coord_x, &coord_y);
+ evas_object_move(button, x + coord_x, y + coord_y);
+ evas_object_stack_below(button, current_last_item);
+ evas_object_color_set(button, 128, 128, 128, 128);
+ evas_object_show(button);
+ }
+ else if (last_index < (rsd->item_count - 1) && i == last_index + 2) //third layer Left
+ {
+ _circle_path_interpolator(rsd, 1, 0, -110, rsd->radius, rsd->radius, &coord_x, &coord_y);
+ evas_object_move(button, x + coord_x, y + coord_y);
+ evas_object_stack_below(button, second_layer_left_item);
+ evas_object_color_set(button, 102, 102, 102, 102);
+ evas_object_show(button);
+ }
+ i++;
+ }
+}
+
+static void
+_item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index)
+{
+ Eina_List *l = NULL;
+ int i = 0;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ item->index = i;
+ i++;
+ }
+ rsd->item_count = i;
+ rsd->selected_index = selected_index;
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item is rearranged!! : item_count(%d)", rsd->item_count);
+#endif
+}
+
+static void
+_item_select(Eext_Rotary_Selector_Data *rsd, int index)
+{
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item is selected!! : index(%d)", index);
+#endif
+ {
+ _item_selected_signal_send(rsd, rsd->selected_index, index);
+ rsd->selected_index = index;
+ _selector_update(rsd, EINA_FALSE, EINA_FALSE);
+ _items_transformation_update(rsd);
+ _items_invalidate(rsd);
+ }
+}
+
+static void
+_item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Item *item = data;
+
+ if (item->content_icon)
+ {
+ evas_object_del(item->content_icon);
+ item->content_icon = NULL;
+ }
+ if (item->custom_content)
+ {
+ evas_object_del(item->custom_content);
+ item->custom_content = NULL;
+ }
+ if (item->text1)
+ {
+ free(item->text1);
+ item->text1 = NULL;
+ }
+ if (item->text2)
+ {
+ free(item->text2);
+ item->text2 = NULL;
+ }
+ if (item->domain)
+ {
+ free(item->domain);
+ item->domain = NULL;
+ }
+
+ free(item);
+}
+
+static Eext_Rotary_Selector_Item *
+_item_create(Eext_Rotary_Selector_Data *rsd)
+{
+ Eext_Rotary_Selector_Item *item = NULL;
+ Evas_Object *button = NULL;
+ Evas_Object *rotary_selector = rsd->rotary_selector;
+
+ button = elm_button_add(rotary_selector);
+ if (!button)
+ {
+ ERR("button is NULL!!");
+ return NULL;
+ }
+
+
+ if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+ evas_object_freeze_events_set(button, EINA_TRUE);
+ evas_object_repeat_events_set(button, EINA_TRUE);
+
+ evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_style_set(button, "rotary_selector_item");
+ evas_object_move(button, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT);
+ evas_object_resize(button, rsd->item_width, rsd->item_height);
+ evas_object_smart_member_add(button, rotary_selector);
+
+ Evas_Object *action_bg = elm_layout_add(button);
+ elm_layout_theme_set(action_bg, "rotary_selector", "item", "bg_image");
+ elm_object_part_content_set(button, "item,bg_image", action_bg);
+
+ item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item));
+ if (!item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+
+ //for accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
+ evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+ //
+
+ if (item)
+ {
+ item->base.obj = button;
+ item->index = -1;
+ item->parent = rsd->parent;
+ item->rotary_selector = rotary_selector;
+ item->coords.x = 0.0f;
+ item->coords.y = 0.0f;
+ item->domain = NULL;
+ item->text1 = NULL;
+ item->text2 = NULL;
+ item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
+ item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
+ item->item_bg_image_color.normal_color.set_flag = EINA_FALSE;
+ item->item_bg_image_color.pressed_color.set_flag = EINA_FALSE;
+ item->item_icon_color.normal_color.set_flag = EINA_FALSE;
+ item->item_icon_color.pressed_color.set_flag = EINA_FALSE;
+ item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
+ item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
+ item->custom_content_color.normal_color.set_flag = EINA_FALSE;
+ item->custom_content_color.pressed_color.set_flag = EINA_FALSE;
+ item->content_icon = NULL;
+ item->custom_content = NULL;
+ }
+ evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _item_del_cb, item);
+
+ return item;
+}
+
+
+static void
+_item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index)
+{
+ Eina_List *l = NULL;
+ int i = 0;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ if (previous_item_index != -1 && i == previous_item_index)
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item is unselected!! : index(%d)", previous_item_index);
+#endif
+ }
+ if (current_item_index !=-1 && i == current_item_index)
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,selected", "");
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item is selected!! : index(%d)", current_item_index);
+#endif
+ }
+ i++;
+ }
+}
+
+static void
+_item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound)
+{
+ Eina_List *l = NULL;
+ int i = 0;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ if (index < 0)
+ {
+ return;
+ }
+ if (rsd->selected_index == index)
+ {
+ if (!pressed && sound)
+ {
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ if (i == index)
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
+ }
+ i++;
+ }
+ }
+ return;
+ }
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ if (i == index)
+ {
+ if (pressed)
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,pressed", "eext");
+ }
+ else
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,unpressed", "eext");
+ if (sound)
+ {
+ elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
+ }
+ }
+ }
+ i++;
+ }
+}
+
+static Eext_Rotary_Selector_Item *
+_item_get(Eext_Rotary_Selector_Data *rsd, int index)
+{
+ int i = 0;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ if (index == i)
+ {
+ return item;
+ }
+ i++;
+ }
+
+ return NULL;
+}
+
+static void
+_item_text_copy(char **target, const char* source)
+{
+ int size = 0;
+
+ if (*target)
+ {
+ free(*target);
+ *target = NULL;
+ }
+ size = strlen(source) + 1;
+ *target = malloc(sizeof(char)*size);
+ if (!(*target))
+ {
+ ERR("allocation is failed!!");
+ return;
+ }
+ memset(*target, 0, size);
+ strncpy(*target, source, size);
+}
+
+// ----------------------------------------- animation API --------------------------------------//
+static Eina_Bool
+_previous_page_animator_cb(void *data)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ int i = 0;
+ int last_index = 0;
+ double p = 0.0f;
+ double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+
+ if (rsd->previous_page_animation_started)
+ {
+ rsd->previous_page_animation_started = EINA_FALSE;
+ rsd->previous_page_animator_start_time = ecore_time_unix_get();
+ }
+
+ double dt = ecore_time_unix_get() - rsd->previous_page_animator_start_time;
+ p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+ if (p <= 1.0f)
+ {
+ const float startAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Coord new_a;
+ Evas_Object *button = item->base.obj;
+ Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
+ evas_object_raise(button);
+
+ //current page
+ if (first_index <= i && i <= last_index)
+ {
+ //Forward
+ if (rsd->animation_direction)
+ {
+ // page 0 --> 1 : 0page
+ const float endAngle[] = { 660.f, 660.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f };
+ _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+ }
+ else
+ {
+ // page 1 --> 0 : 1page
+ const float endAngle[] = { 240.f, 240.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f };
+ _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+ }
+ new_a = 255*(1-p);
+ evas_object_move(button, item->coords.x, item->coords.y);
+ evas_object_color_set(button, new_a, new_a, new_a, new_a);
+ }
+ if (rsd->animation_direction && rsd->current_page > 0 && (i == first_index-1 || i == first_index -2))
+ {
+ evas_object_color_set(button, 0, 0, 0, 0);
+ }
+ else if (last_index < (rsd->item_count - 1) && (i == last_index + 1 || i == last_index + 2))
+ {
+ evas_object_color_set(button, 0, 0, 0, 0);
+ }
+ i++;
+ }
+ }
+ if (p >= 1.0f)
+ {
+ rsd->previous_page_animator_start_time = 0.0f;
+ rsd->previous_page_animator = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_item_update_animator_cb(void *data)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ _item_rearrange(rsd, rsd->selected_index);
+ _item_select(rsd, rsd->selected_index);
+
+ rsd->item_update_animator = NULL;
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
+#endif
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
+{
+ if (direction) //Forward
+ {
+ rsd->animation_direction = EINA_TRUE;
+ }
+ else //Backward
+ {
+ rsd->animation_direction = EINA_FALSE;
+ }
+
+ Edje_Message_Float_Set *msg = malloc(sizeof(Edje_Message_Float_Set));
+ if (!msg) return;
+
+ msg->count = 1;
+ msg->val[0] = 1;
+ edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg);
+
+ rsd->previous_page_animator_start_time = ecore_loop_time_get();
+ rsd->previous_page_animation_started = EINA_TRUE;
+ rsd->previous_page_animator = ecore_animator_add(_previous_page_animator_cb, rsd);
+
+ rsd->next_page_timer = ecore_timer_add(_ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME, _next_page_timer_cb, rsd);
+}
+
+static void
+_end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
+{
+ if (direction) //Forward
+ {
+ rsd->animation_direction = EINA_TRUE;
+ }
+ else //Backward
+ {
+ rsd->animation_direction = EINA_FALSE;
+ }
+ rsd->end_effect_animation_started = EINA_TRUE;
+ rsd->end_effect_animator = ecore_animator_add(_end_effect_animator_cb, rsd);
+
+ elm_layout_signal_emit(rsd->rotary_selector, "eext,action,haptic,end_effect", "eext");
+}
+
+static void
+_item_update_animation_run(Eext_Rotary_Selector_Data *rsd)
+{
+ if (rsd->item_update_animator)
+ {
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+ INF("item update animator is already running!!");
+#endif
+ return;
+ }
+
+ rsd->item_update_animator = ecore_animator_add(_item_update_animator_cb, rsd);
+}
+
+static Eina_Bool
+_next_page_animator_cb(void *data)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int i = 0;
+ Evas_Coord new_a;
+ Eext_Rotary_Selector_Item_Coords *coords = NULL;
+ Evas_Object *button = NULL;
+ int last_index = 0;
+ if (rsd->current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+
+ double p = 0.0f;
+ double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+ if (rsd->next_page_animation_started)
+ {
+ rsd->next_page_animation_started = EINA_FALSE;
+ rsd->next_page_animator_start_time = ecore_time_unix_get();
+ }
+
+ double dt = ecore_time_unix_get() - rsd->next_page_animator_start_time;
+ p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+ if (p <= 1.0f)
+ {
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ button = item->base.obj;
+ coords = &item->coords;
+ evas_object_raise(button);
+
+ if (rsd->animation_direction) //Forward
+ {
+ if (first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX) //current page+1
+ {
+ // page 0 --> 1 : 1page
+ const float endAngle[] = { 300.f, 330.f, 360.f, 390.f, 420.f, 450.f, 480.f, 510.f, 540.f, 570.f, 600.f };
+ _circle_path_interpolator(rsd, p, 300, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+ new_a = 255*p;
+ evas_object_move(button, item->coords.x, item->coords.y);
+ evas_object_color_set(button, new_a, new_a, new_a, new_a);
+ evas_object_show(button);
+ }
+ }
+ else //Backward
+ {
+ if (first_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX) //current page-1
+ {
+ // page 1 --> 0 : 0page
+ const float endAngle[] = { -60.f, -30.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+ _circle_path_interpolator(rsd, p, 240, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+ new_a = 255*p;
+ evas_object_move(button, item->coords.x, item->coords.y);
+ evas_object_color_set(button, new_a, new_a, new_a, new_a);
+ evas_object_show(button);
+ }
+ }
+ i++;
+ }
+ }
+
+ if (p >= 1.0f)
+ {
+ //Forward
+ if (rsd->animation_direction)
+ {
+ rsd->current_page += 1;
+ _items_invalidate(rsd);
+ }
+ else //Backward
+ {
+ rsd->current_page -= 1;
+ _items_invalidate(rsd);
+ }
+
+ rsd->next_page_animator_start_time = 0.0f;
+ rsd->next_page_animator = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_next_page_timer_cb(void *data)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ rsd->next_page_timer = NULL;
+
+ rsd->next_page_animator_start_time = ecore_loop_time_get();
+ rsd->next_page_animation_started = EINA_TRUE;
+ rsd->next_page_animator = ecore_animator_add(_next_page_animator_cb, rsd);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_end_effect_animator_cb(void *data)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+ double p = 0.0f;
+ double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+ if (rsd->end_effect_animation_started)
+ {
+ rsd->end_effect_animation_started = EINA_FALSE;
+ rsd->end_effect_animator_start_time = ecore_time_unix_get();
+ }
+
+ double dt = ecore_time_unix_get() - rsd->end_effect_animator_start_time;
+ p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+ Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
+ if (!selector)
+ {
+ ERR("selector is NULL!!");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ Evas_Map *map = NULL;
+ map = evas_map_new(4);
+ if (!map)
+ {
+ ERR("map is NULL!!");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ double selector_angle = ((rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1) *_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE;
+ double effect_angle = rsd->animation_direction ? _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2 : -_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2;
+
+ evas_map_util_points_populate_from_object(map, selector);
+
+ if (p <= 0.5f)
+ {
+ evas_map_util_rotate(map, selector_angle + effect_angle*p/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
+ evas_object_map_enable_set(selector, EINA_TRUE);
+ evas_object_map_set(selector, map);
+ }
+ else if (p <= 1.0f)
+ {
+ evas_map_util_rotate(map, selector_angle + effect_angle - effect_angle*(p - 0.5)/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
+ evas_object_map_enable_set(selector, EINA_TRUE);
+ evas_object_map_set(selector, map);
+ }
+
+ if (p >= 1.0f)
+ {
+ rsd->animation_direction = EINA_TRUE;
+ rsd->end_effect_animator_start_time = 0.0f;
+ rsd->end_effect_animator = NULL;
+ if (map) evas_map_free(map);
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ if (map) evas_map_free(map);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+// ----------------------------------------- new API --------------------------------------//
+static void
+_selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation)
+{
+ Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
+ if (!edje)
+ {
+ ERR("edje is NULL!!");
+ return;
+ }
+
+ const char* signals[] = {"eext,rotate,0", "eext,rotate,30", "eext,rotate,60", "eext,rotate,90", "eext,rotate,120",
+ "eext,rotate,150", "eext,rotate,180", "eext,rotate,210", "eext,rotate,240", "eext,rotate,270", "eext,rotate,300",};
+
+ if (page_changed)
+ {
+ if (rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX == 0)
+ {
+ edje_object_signal_emit(edje, "eext,rotate,360", "eext");
+ }
+ else
+ {
+ edje_object_signal_emit(edje, "eext,rotate,-60", "eext");
+ }
+ }
+ else
+ {
+ if (is_animation)
+ edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext");
+ else
+ edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
+ }
+
+ _selector_content_update(rsd);
+}
+
+static void
+_selector_content_update(Eext_Rotary_Selector_Data *rsd)
+{
+ int i = 0;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ Evas_Object *content_icon = elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
+ if (content_icon)
+ {
+ evas_object_hide(content_icon);
+ }
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ if (item->index == rsd->selected_index)
+ {
+#if 0
+ if (item->custom_content)
+ {
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content,show", "eext");
+ elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content", item->custom_content);
+ }
+ else
+#endif
+ {
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
+
+ if (item->domain)
+ {
+ elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->domain, item->text1);
+ elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->domain, item->text2);
+ }
+ else
+ {
+ elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->text1);
+ elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->text2);
+ }
+ if (item->content_icon)
+ {
+ elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon", item->content_icon);
+ if (item->text1)
+ {
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,icon,show", "eext");
+ }
+ }
+ else if (item->text2)
+ {
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text2,show", "eext");
+ }
+ else
+ {
+ elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext");
+ }
+ }
+ }
+ i++;
+ }
+}
+
+static void
+_selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ INF("called!!");
+
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ if (rsd)
+ {
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+ }
+}
+static void
+_selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ INF("called!!");
+
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ if (rsd)
+ {
+ if (rsd->acceleration)
+ {
+ rsd->acceleration = EINA_FALSE;
+ rsd->rotary_event_time_stamp = 0;
+ }
+ }
+}
+
+// ----------------------------------------- public API implementation --------------------------------------//
+EAPI Evas_Object *
+eext_rotary_selector_add(Evas_Object *parent)
+{
+ if (!parent) return NULL;
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+
+ Evas_Object *rotary_selector = elm_layout_add(parent);
+ if (!rotary_selector)
+ {
+ ERR("rotary_selector is NULL!!");
+ return NULL;
+ }
+
+ elm_layout_theme_set(rotary_selector, "layout", "rotary_selector", "default");
+ evas_object_move(rotary_selector, 0, 0);
+ evas_object_resize(rotary_selector, _ROTARY_SELECTOR_SCREEN_WIDTH, _ROTARY_SELECTOR_SCREEN_HEIGHT);
+
+ rsd = _eext_rotary_selector_data_init(rotary_selector, parent);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
+
+ edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
+ edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);
+
+ //default selector bg part
+ Evas_Object *selector_bg = elm_layout_add(rotary_selector);
+ if (!selector_bg)
+ {
+ ERR("selector_bg is NULL!!");
+ return NULL;
+ }
+
+ elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
+
+ elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg);
+
+ //default selector content part
+ Evas_Object *content = elm_layout_add(rotary_selector);
+ if (!content)
+ {
+ ERR("content is NULL!!");
+ return NULL;
+ }
+
+ elm_layout_theme_set(content, "rotary_selector", "content", "default");
+ elm_object_part_content_set(rotary_selector, "content", content);
+
+ eext_rotary_object_event_callback_add(rotary_selector, _rotary_selector_rotary_cb, rsd);
+ evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb, rsd);
+ evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_DEL, _rotary_selector_del_cb, rsd);
+ evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb, rsd);
+
+ _event_area_callback_add(rsd);
+
+ //for accessibility
+ _rotary_selector_from_moreoption_set(rotary_selector, EINA_FALSE);
+ rsd->event_area_access_object = elm_access_object_register(rsd->event_area, rsd->rotary_selector);
+
+ evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd);
+ evas_object_smart_callback_add(rotary_selector, "more,option,closed", _rotary_selector_moreoption_closed_cb, rsd);
+
+ elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+ //
+ return rotary_selector;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_append(Evas_Object *obj)
+{
+ int selected_index = 0;
+ Evas_Object* rotary_selector = obj;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ item = _item_create(rsd);
+ if (!item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+
+ rsd->item_list = eina_list_append(rsd->item_list, item);
+
+ if (_rotary_selector_visible_get(rotary_selector))
+ {
+ selected_index = rsd->selected_index;
+ }
+
+ rsd->selected_index = selected_index;
+ _item_rearrange(rsd, rsd->selected_index);
+
+ _item_update_animation_run(rsd);
+
+ return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_prepend(Evas_Object *obj)
+{
+ int selected_index = 0;
+ Evas_Object* rotary_selector = obj;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ item = _item_create(rsd);
+ if (!item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+
+ rsd->item_list = eina_list_prepend(rsd->item_list, item);
+
+ if (_rotary_selector_visible_get(rotary_selector))
+ {
+ selected_index = rsd->selected_index + 1;
+ }
+
+ rsd->selected_index = selected_index;
+ _item_rearrange(rsd, rsd->selected_index);
+
+ _item_update_animation_run(rsd);
+
+ return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
+{
+ int selected_index = 0;
+ Evas_Object* rotary_selector = obj;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after;
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ item = _item_create(rsd);
+ if (!item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+
+ rsd->item_list = eina_list_append_relative(rsd->item_list, item, after_item);
+
+ if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index <= after_item->index)
+ {
+ selected_index = rsd->selected_index;
+ }
+ else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index > after_item->index)
+ {
+ selected_index = rsd->selected_index + 1;
+ }
+
+ rsd->selected_index = selected_index;
+ _item_rearrange(rsd, rsd->selected_index);
+
+ _item_update_animation_run(rsd);
+
+ return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
+{
+ int selected_index = 0;
+ Evas_Object* rotary_selector = obj;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before;
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ item = _item_create(rsd);
+ if (!item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+
+ rsd->item_list = eina_list_prepend_relative(rsd->item_list, item, before_item);
+
+ if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index >= before_item->index)
+ {
+ selected_index = rsd->selected_index + 1;
+ }
+ else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index < before_item->index)
+ {
+ selected_index = rsd->selected_index;
+ }
+
+ rsd->selected_index = selected_index;
+ _item_rearrange(rsd, rsd->selected_index);
+
+ _item_update_animation_run(rsd);
+
+ return (Eext_Object_Item *)item;
+}
+
+EAPI void
+eext_rotary_selector_item_del(Eext_Object_Item *item)
+{
+ int selected_index = 0;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index < rotary_selector_item->index)
+ {
+ selected_index = rsd->selected_index;
+ }
+ else if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index > rotary_selector_item->index)
+ {
+ selected_index = rsd->selected_index - 1;
+ }
+
+ rsd->item_list = eina_list_remove(rsd->item_list, rotary_selector_item);
+ evas_object_del(rotary_selector_item->base.obj);
+
+ rsd->selected_index = selected_index;
+ _item_rearrange(rsd, rsd->selected_index);
+
+ _item_update_animation_run(rsd);
+
+ return;
+}
+
+EAPI void
+eext_rotary_selector_items_clear(Evas_Object *obj)
+{
+ Evas_Object* rotary_selector = obj;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+
+ if (!rotary_selector)
+ {
+ ERR("rotary_selector is NULL!!");
+ return;
+ }
+
+ rsd = _eext_rotary_selector_data_get(rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ EINA_LIST_FREE(rsd->item_list, item)
+ evas_object_del(item->base.obj);
+
+ rsd->selected_index = 0;
+
+ _item_update_animation_run(rsd);
+
+ return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+ if (!text)
+ {
+ ERR("text is NULL!!");
+ return;
+ }
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "selector,main_text"))
+ {
+ _item_text_copy(&(rotary_selector_item->text1), text);
+ }
+ else if (!strcmp(part_name, "selector,sub_text"))
+ {
+ _item_text_copy(&(rotary_selector_item->text2), text);
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+
+ _selector_content_update(rsd);
+
+ return;
+}
+
+EAPI const char *
+eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("item is NULL!!");
+ return NULL;
+ }
+ if (!strcmp(part_name, "selector,main_text"))
+ {
+ return rotary_selector_item->text1;
+ }
+ else if (!strcmp(part_name, "selector,sub_text"))
+ {
+ return rotary_selector_item->text2;
+ }
+
+ return NULL;
+}
+
+EAPI void
+eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+ if (!domain)
+ {
+ ERR("domain is NULL!!");
+ return;
+ }
+ if (!text)
+ {
+ ERR("text is NULL!!");
+ return;
+ }
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "selector,main_text"))
+ {
+ _item_text_copy(&(rotary_selector_item->domain), domain);
+ _item_text_copy(&(rotary_selector_item->text1), text);
+ }
+ else if (!strcmp(part_name, "selector,sub_text"))
+ {
+ _item_text_copy(&(rotary_selector_item->domain), domain);
+ _item_text_copy(&(rotary_selector_item->text2), text);
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+
+ _selector_content_update(rsd);
+
+ return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content)
+{
+ //Supported part names : "item,bg_image", "item,icon", "selector,icon", "selector,content"
+
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+ if (!content)
+ {
+ ERR("content is NULL!!");
+ return;
+ }
+ if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ERR("Not implemented!!");
+ return;
+ }
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+ // for Accessibility
+ if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+ elm_atspi_accessible_role_set(content, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+ //
+ if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
+ {
+ elm_object_part_content_set(rotary_selector_item->base.obj, part_name, content);
+ }
+ else if (!strcmp(part_name, "selector,icon"))
+ {
+ if (rotary_selector_item->content_icon)
+ {
+ if (rotary_selector_item->index == rsd->selected_index)
+ {
+ elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
+ }
+ evas_object_del(rotary_selector_item->content_icon);
+ rotary_selector_item->content_icon = NULL;
+ }
+ rotary_selector_item->content_icon = content;
+ }
+ else if (!strcmp(part_name, "selector,content"))
+ {
+ if (rotary_selector_item->custom_content)
+ {
+ evas_object_del(rotary_selector_item->custom_content);
+ rotary_selector_item->custom_content = NULL;
+ }
+ rotary_selector_item->custom_content = content;
+ }
+ else
+ {
+ ERR("Not supported part name!!");
+ return;
+ }
+
+ _selector_content_update(rsd);
+}
+
+EAPI Evas_Object *
+eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return NULL;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return NULL;
+ }
+ if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ERR("Not implemented!!");
+ return NULL;
+ }
+
+ if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
+ {
+ return elm_object_part_content_get(rotary_selector_item->base.obj, part_name);
+ }
+ else if (!strcmp(part_name, "selector,icon"))
+ {
+ return rotary_selector_item->content_icon;
+ }
+ else if (!strcmp(part_name, "selector,content"))
+ {
+ return rotary_selector_item->custom_content;
+ }
+ else
+ {
+ ERR("Not supported part name!!");
+ return NULL;
+ }
+
+ return NULL;
+}
+
+EAPI void
+eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content)
+{
+ //Supported part names : "selector,bg_image"
+
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+ if (!content)
+ {
+ ERR("content is NULL!!");
+ return;
+ }
+
+ if (strcmp(part_name, "selector,bg_image"))
+ {
+ ERR("Not supported part name!!!");
+ return;
+ }
+
+ if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+ {
+ ERR("Not implemented!!");
+ return;
+ }
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get(obj);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ elm_object_part_content_set(rsd->rotary_selector, part_name, content);
+
+}
+
+EAPI Evas_Object *
+eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state)
+{
+ //Supported part names : "selector,bg_image"
+ if (!obj)
+ {
+ ERR("obj is NULL!!");
+ return NULL;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return NULL;
+ }
+ if (strcmp(part_name, "selector,bg_image"))
+ {
+ ERR("Not supported part name!!!");
+ return NULL;
+ }
+
+ if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+ {
+ ERR("Not implemented!!");
+ return NULL;
+ }
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ return elm_object_part_content_get(rsd->rotary_selector, part_name);
+}
+
+EAPI void
+eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+ Evas_Object *content;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "item,bg_image"))
+ {
+
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
+ }
+
+ if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, normal_color);
+ }
+ else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, pressed_color);
+ }
+ }
+ else if (!strcmp(part_name, "item,icon"))
+ {
+
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
+ }
+
+ if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, normal_color);
+ }
+ else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, pressed_color);
+ }
+ }
+ else if (!strcmp(part_name, "selector,icon"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
+ }
+
+ if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, normal_color);
+ }
+ else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, pressed_color);
+ }
+ }
+ else if (!strcmp(part_name, "selector,content"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
+ }
+
+ if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, normal_color);
+ }
+ else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, pressed_color);
+ }
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+
+ return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a)
+{
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "item,bg_image") )
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
+ }
+ }
+ else if (!strcmp(part_name, "item,icon"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
+ }
+ }
+ else if (!strcmp(part_name, "selector,icon"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
+ }
+ }
+ else if (!strcmp(part_name, "selector,content"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
+ }
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+}
+
+EAPI void
+eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a)
+{
+ Evas_Object *content;
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
+ }
+
+ content = elm_object_part_content_get(obj, "selector,bg_image");
+
+ if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, normal_color);
+ }
+ else if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, pressed_color);
+ }
+ return;
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+
+ return;
+}
+
+EAPI void
+eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a)
+{
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+ if (!part_name)
+ {
+ ERR("part_name is NULL!!");
+ return;
+ }
+
+ if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
+ {
+ if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
+ }
+ else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+ {
+ ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
+ }
+ return;
+ }
+ else
+ {
+ ERR("Not supported part name [%s]", part_name);
+ return;
+ }
+}
+
+EAPI void
+eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
+{
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+ if (!rotary_selector_item)
+ {
+ ERR("rotary_selector_item is NULL!!");
+ return;
+ }
+
+ rsd = _eext_rotary_selector_data_get(obj);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+ if (rsd->item_update_animator)
+ {
+ return;
+ }
+
+ if (rsd->selected_index != rotary_selector_item->index)
+ {
+ int previous_index = rsd->selected_index;
+ rsd->selected_index = rotary_selector_item->index;
+
+ _item_selected_signal_send(rsd, previous_index, rsd->selected_index);
+ rsd->current_page = rsd->selected_index/_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ _item_update_animation_run(rsd);
+ }
+
+ INF("selected item index(%d)", rsd->selected_index);
+}
+
+EAPI Eext_Object_Item*
+eext_rotary_selector_selected_item_get(const Evas_Object *obj)
+{
+ Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ return (Eext_Object_Item*)_item_get(rsd, rsd->selected_index);
+}
+
+EAPI const Eina_List*
+eext_rotary_selector_items_get(const Evas_Object *obj)
+{
+ Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return NULL;
+ }
+
+ return rsd->item_list;
+}
+
+
+// ----------------------------------------- Accessibility API --------------------------------------//
+static void
+_accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ Eina_List *l;
+
+ rsd = (Eext_Rotary_Selector_Data*)data;
+ if(!rsd)
+ return;
+
+ EINA_LIST_FOREACH(rsd->item_list,l,item)
+ {
+ if(item->base.obj == obj)
+ break;
+ }
+
+ int previous_item_index = rsd->selected_index;
+ rsd->selected_index = item->index;
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+ rsd->control_by_rotary = EINA_FALSE;
+}
+
+void _accessibility_page_change(Eext_Rotary_Selector_Data *rsd, int previous_item_index, Eina_Bool dir)
+{
+ _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+ _page_animation_run(rsd, dir);
+ _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+}
+
+static Eina_Bool
+_accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
+{
+ if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+ return EINA_FALSE;
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ rsd = (Eext_Rotary_Selector_Data*)data;
+ if(!rsd)
+ return EINA_FALSE;
+ int current_page = 0;
+ Eina_List *l;
+ int previous_item_index = rsd->selected_index;
+ int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+ int last_index = 0;
+ int changed_list = 0;
+ Eina_Bool ret = EINA_FALSE;
+
+ if (rsd->current_page == 0)
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ else
+ last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ if (last_index > rsd->item_count - 1)
+ last_index = rsd->item_count - 1;
+
+ if (last_index < rsd->selected_index+1 && last_index != rsd->item_count - 1)
+ changed_list = 1;
+ else if (first_index > rsd->selected_index-1 && first_index != 0)
+ changed_list = 2;
+
+ switch (action_info->action_type)
+ {
+ case ELM_ACCESS_ACTION_UNHIGHLIGHT:
+ elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT:
+ if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT || (changed_list == 1 && rsd->control_by_rotary))
+ {
+ rsd->selected_index += 1;
+ _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
+ current_page = rsd->current_page + 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+ _accessibility_set_relationship(rsd, current_page);
+ }
+ else if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV || (changed_list == 2 && rsd->control_by_rotary))
+ {
+ rsd->selected_index -= 1;
+ _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
+ current_page = rsd->current_page - 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+ _accessibility_set_relationship(rsd, current_page);
+ }
+ else
+ {
+ Elm_Accessible_Reading_Info_Type type = elm_atspi_accessible_reading_info_type_get(rsd->event_area_access_object);
+ char buf[255] = "";
+ if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_NAME)
+ {
+ if(_rotary_selector_from_moreoption_get(rsd->rotary_selector))
+ {
+ const char *buf_name;
+ buf_name = elm_atspi_accessible_name_get(rsd->event_area_access_object);
+ if(buf_name)
+ strcat(buf, buf_name);
+ }
+ }
+ if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)
+ {
+ strcat(buf, " ");
+ const char *buf_desc;
+ buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+ if(buf_desc)
+ strcat(buf, buf_desc);
+ }
+ if(strcmp(buf,""))
+ elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL);
+ _accessibility_set_relationship(rsd, rsd->current_page);
+ }
+ ret = EINA_FALSE;
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
+ rsd->control_by_rotary = EINA_FALSE;
+ if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+ {
+ rsd->selected_index += 1;
+ _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
+ current_page = rsd->current_page + 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+
+ _accessibility_set_relationship(rsd, current_page);
+ ret = EINA_TRUE;
+ const char *buf_desc;
+ buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+ if(buf_desc)
+ elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
+ }
+ else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+ {
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+ ret = EINA_FALSE;
+ }
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
+ rsd->control_by_rotary = EINA_FALSE;
+ if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+ {
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+ ret = EINA_FALSE;
+ }
+ else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+ {
+ rsd->selected_index -= 1;
+ _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
+ current_page = rsd->current_page - 1;
+ rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+
+ _accessibility_set_relationship(rsd, current_page);
+ ret = EINA_TRUE;
+ const char *buf_desc;
+ buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+ if(buf_desc)
+ elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
+ }
+ break;
+ }
+ return ret;
+}
+
+static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page)
+{
+ Eext_Rotary_Selector_Item *item = NULL;
+ Eext_Rotary_Selector_Item *before_item = NULL;
+ Evas_Object *first_item = NULL;
+ Evas_Object *last_item = NULL;
+ Eina_Bool is_next_page = EINA_FALSE;
+ Eina_Bool is_prev_page = EINA_FALSE;
+ int i = 0;
+ Eina_List *l;
+ int first_index = 0;
+ int last_index = 0;
+
+ rsd->reading_page_number = current_page;
+ elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+ first_index = current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+
+ if (current_page == 0)
+ {
+ last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ else
+ {
+ last_index = (current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+ }
+ if (last_index > rsd->item_count - 1)
+ {
+ last_index = rsd->item_count - 1;
+ }
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+ if (i >= first_index && i <= last_index)
+ {
+ if(before_item)
+ {
+ elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, button);
+ elm_atspi_accessible_relationship_append(button, ELM_ATSPI_RELATION_FLOWS_FROM, before_item->base.obj);
+ }
+ before_item = item;
+ }
+ if (i == first_index)
+ {
+ first_item = button;
+ }
+ else if (i == last_index)
+ {
+ last_item = button;
+ }
+ if(current_page > 0 && i == first_index-1)
+ {
+ is_prev_page = EINA_TRUE;
+ }
+ else if (last_index < (rsd->item_count - 1) && i == last_index + 1)
+ {
+ is_next_page = EINA_TRUE;
+ }
+ elm_atspi_accessible_name_cb_set(button, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)item);
+ elm_atspi_accessible_reading_info_type_set(button, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+ i++;
+ }
+
+ if(rsd->backup_first_item_for_atspi)
+ {
+ elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, rsd->backup_first_item_for_atspi);
+ elm_atspi_accessible_relationship_remove(rsd->backup_first_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+ }
+ if(rsd->backup_last_item_for_atspi)
+ {
+ elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->backup_last_item_for_atspi);
+ elm_atspi_accessible_relationship_remove(rsd->backup_last_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+ }
+
+ if(first_item)
+ {
+ elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, first_item);
+ elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+ if(!is_prev_page)
+ {
+ elm_atspi_accessible_relationship_remove(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+ elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, first_item);
+ }
+ }
+ if(last_item)
+ {
+ elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, last_item);
+ elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+ if(!is_next_page)
+ {
+ elm_atspi_accessible_relationship_remove(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+ elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, last_item);
+ }
+ }
+ rsd->backup_first_item_for_atspi = first_item;
+ rsd->backup_last_item_for_atspi = last_item;
+}
+
+static void
+_rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+ return ;
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ rsd = data;
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+ elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_TRUE);
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+ elm_atspi_accessible_can_highlight_set(button, EINA_TRUE);
+ }
+
+ rsd->reading_page_number = -1;
+ elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+ elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+ elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+}
+
+
+static void
+_rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+ return ;
+
+ Eext_Rotary_Selector_Data *rsd = NULL;
+ Eina_List *l = NULL;
+ Eext_Rotary_Selector_Item *item = NULL;
+ rsd = data;
+ if (!rsd)
+ {
+ ERR("rsd is NULL!!");
+ return;
+ }
+
+ elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
+
+ EINA_LIST_FOREACH(rsd->item_list, l, item)
+ {
+ Evas_Object *button = item->base.obj;
+ elm_atspi_accessible_can_highlight_set(button, EINA_FALSE);
+ }
+}
+void
+_rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option)
+{
+ Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
+
+ if(rsd)
+ rsd->from_moreoption = from_more_option;
+}
+
+static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector)
+{
+ Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
+
+ if(rsd)
+ return rsd->from_moreoption;
+ return EINA_FALSE;
+}
+
+static char *
+_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
+{
+ Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data;
+
+ char buf[255] = "";
+ if(item->text1)
+ {
+ strcat(buf, item->text1);
+ }
+ if(item->text2)
+ {
+ strcat(buf, " ");
+ strcat(buf, item->text2);
+ }
+ return strdup(buf);
+}
+
+static char *
+_accessibility_name_set_cb(void *data, Evas_Object *obj)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ char buf[255] = "";
+
+ if( _rotary_selector_from_moreoption_get(rsd->rotary_selector))
+ {
+ snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
+ }
+ return strdup(buf);
+}
+
+static char *
+_accessibility_description_set_cb(void *data, Evas_Object *obj)
+{
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ char buf[255] = "";
+
+ bindtextdomain (PACKAGE, LOCALE_DIR);
+ textdomain (PACKAGE);
+
+ if( rsd->reading_page_number == -1)
+ {
+ snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS"));
+ }
+ else
+ {
+ snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_N_OF_N_PAGE"), rsd->reading_page_number + 1, ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1);
+ }
+
+ return strdup(buf);
+}
+
+static void
+_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ INF("called!!");
+
+ Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+ if (rsd)
+ {
+ evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+ }
+}
+++ /dev/null
-SET(LIB_NAME ${PROJECT_NAME})
-
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
-LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/lib)
-
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
+++ /dev/null
-SET(LIB_INCS
- efl_extension_events.h
- circle/efl_extension_circle_surface.h
- circle/efl_extension_circle_object.h
- circle/efl_extension_circle_object_progressbar.h
- circle/efl_extension_circle_object_slider.h
- circle/efl_extension_circle_object_genlist.h
- circle/efl_extension_circle_object_datetime.h
- circle/efl_extension_circle_object_scroller.h
- circle/efl_extension_circle_object_spinner.h
- circle/efl_extension_rotary.h
- common/efl_extension_common.h
- common/efl_extension_rotary_selector.h
- common/efl_extension_more_option.h)
-
-FOREACH(inc ${LIB_INCS})
- SET(LIB_HEADERS "${LIB_HEADERS}#include \"${inc}\"\n")
-ENDFOREACH(inc)
-
-CONFIGURE_FILE(
- efl_extension.h.in efl_extension.h
- @ONLY)
-
-SET(LIB_INCS
- ${LIB_INCS}
- efl_extension.h)
-
-FOREACH(inc ${LIB_INCS})
- GET_FILENAME_COMPONENT(dir ${inc} PATH)
- INSTALL(FILES ${inc} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE Efl Extension Circle Object
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle object is used for circular design of circular ui-controls.
- * It can be combined with elementary widgets and be a part of design.
- * Or it can make itself as a ui-control which is operated by rotary event.
- *
- * @details A Circle object extends elementary widgets in a form of circular design.
- * It can be rendered either independently or by @ref Eext_Circle_Surface.
- * When a circle object handle is added with surface parameter of @c NULL,
- * it is rendered independently along with Evas_Object. On the other hand,
- * if a circle object is created with surface parameter of @ref Eext_Circle_Surface,
- * passed surface will render the circle object.
- *
- * eext_circle_object functions are same with eext_circle_object_item functions
- * with "default" for item_name parameter. You can check what is the meaning of "default" item
- * in each circle object's documentation.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the line width of the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] line_width The line width value of the circle object
- *
- * @see eext_circle_line_width_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_line_width_set(Evas_Object *obj, int line_width);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the line width of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The line width value of the circle object
- *
- * @see eext_circle_line_width_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI int eext_circle_object_line_width_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle in degree of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] angle The angle in degree of the circle object
- *
- * @see eext_circle_angle_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_set(Evas_Object *obj, double angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle in degree of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The angle of circle
- *
- * @see eext_circle_angle_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_angle_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle offset of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] angle_offset The angle offset value of the circle object
- *
- * @see eext_circle_angle_offset_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle offset of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The angle offset of the circle object
- *
- * @see eext_circle_angle_offset_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_angle_offset_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum angle for the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] min_angle The minimum angle in degree
- * @param[in] max_angle The maximum angle in degree
- *
- * @see eext_circle_angle_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum angle of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out] min_angle The pointer to store the minimum angle in degree
- * @param[out] max_angle The pointer to store the minimum angle in degree
- *
- * @see eext_circle_angle_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum value for the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] min_value The minimum value
- * @param[in] max_value The maximum value
- *
- * @see eext_circle_value_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum value of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out] min_value The pointer to store the minimum value
- * @param[out] max_value The pointer to store the minimum value
- *
- * @see eext_circle_value_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the value of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] value The value of circle object
- *
- * @see eext_circle_object_value_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_set(Evas_Object *obj, double value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the value of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The value of circle
- *
- * @see eext_circle_object_value_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_value_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the color of circle line and font in a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] r The red component of the given color
- * @param[in] g The green component of the given color
- * @param[in] b The blue component of the given color
- * @param[in] a The alpha component of the given color
- *
- * @see eext_circle_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get color of circle line and font color in a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out] r The pointer to an integer in which to store the red component
- * of the color
- * @param[out] g The pointer to an integer in which to store the green
- * component of the color
- * @param[out] b The pointer to an integer in which to store the blue component
- * of the color
- * @param[out] a The pointer to an integer in which to store the alpha
- * component of the color
- *
- * @see eext_circle_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set circle radius of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] radius The radius value of a given circle object
- *
- * @see eext_circle_radius_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_radius_set(Evas_Object *obj, double radius);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get circle radius of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The radius of circle
- *
- * @see eext_circle_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_radius_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the disabled state of the circle object.
- *
- * @details This sets the disabled state of the circle object.
- * If @c EINA_TRUE, circle object will be disabled
- * and will not recieve any event. If @c EINA_FALSE,
- * circle object will be enabled.
- *
- * @param[in] obj The circle object
- * @param[in] disabled The disabled state
- *
- * @see eext_circle_object_disabled_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the disabled state of the circle object.
- *
- * @param[in] obj The circle object
- * @return Disabled state. If @c EINA_TRUE, circle object will be disabled
- * and will not recieve any event. If @c EINA_FALSE, circle object
- * will be enabled.
- *
- * @see eext_circle_object_disabled_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_circle_object_disabled_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle object.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- *
- * @return A new circle object handle, otherwise
- * @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the line width of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] line_width The line width value of the circle object
- *
- * @see eext_circle_object_item_line_width_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the line width of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The line width value of the circle object if it succeeds to find the item,
- * otherwise -1 if it fails to find the item.
- *
- * @see eext_circle_object_item_line_width_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI int eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle in degree of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] angle The angle in degree of the circle object
- *
- * @see eext_circle_object_item_angle_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle in degree of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The angle of circle
- *
- * @see eext_circle_object_item_angle_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle offset of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] angle_offset The angle offset value of the circle object
- *
- * @see eext_circle_object_item_angle_offset_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle offset of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The angle offset of the circle object
- *
- * @see eext_circle_object_item_angle_offset_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum angle for the item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] min_angle The minimum angle in degree
- * @param[in] max_angle The maximum angle in degree
- *
- * @see eext_circle_object_item_angle_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum angle of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out] min_angle The pointer to store the minimum angle in degree
- * @param[out] max_angle The pointer to store the minimum angle in degree
- *
- * @see eext_circle_object_item_angle_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum value for the item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] min_value The minimum value
- * @param[in] max_value The maximum value
- *
- * @see eext_circle_object_item_value_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out] min_value The pointer to store the minimum value
- * @param[out] max_value The pointer to store the minimum value
- *
- * @see eext_circle_object_item_value_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] value The value of circle object
- *
- * @see eext_circle_object_item_value_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The value of circle
- *
- * @see eext_circle_object_item_value_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the color of circle line and font in a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] r The red component of the given color
- * @param[in] g The green component of the given color
- * @param[in] b The blue component of the given color
- * @param[in] a The alpha component of the given color
- *
- * @see eext_circle_object_item_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get color of circle line and font color in a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out] r The pointer to an integer in which to store the red component
- * of the color
- * @param[out] g The pointer to an integer in which to store the green
- * component of the color
- * @param[out] b The pointer to an integer in which to store the blue component
- * of the color
- * @param[out] a The pointer to an integer in which to store the alpha
- * component of the color
- *
- * @see eext_circle_object_item_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set circle radius of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] radius The radius value of a given circle object
- *
- * @see eext_circle_object_item_radius_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get circle radius of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The radius of the circle object if it succeeds to find the item,
- * otherwise -1.0 if it fails to find the item.
- *
- * @see eext_circle_object_item_radius_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_DATETIME_MODULE Efl Extension Circle Datetime
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle datetime is based on elm_datetime and is operated by rotary event.
- *
- * @details Circle datetime is to utilize selected field in elm_datetime.
- * If rotary event is activated by eext_rotary_object_event_activated_set(),
- * circle datetime increases/decreases value of selected field in elm_datetime
- * by the clockwise/counter clockwise rotary event.
- *
- * The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws a marker.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle datetime object.
- *
- * @param[in] datetime The datetime object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_GENLIST_MODULE Efl Extension Circle Genlist
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle genlist is based on elm_genlist and is scrolled by rotary event.
- *
- * @details Circle genlist is to visualize and utilize scroll effect for elm_genlist.
- * While elm_genlist provides scrollbar with straight horizontal/vertical
- * movement, circle genlist provides scrollbar with circular movement.
- * Rotary event can be activated by eext_rotary_object_event_activated_set(),
- * circle genlist scrolls genlist items upward/leftward responding to
- * counter clockwise rotary event, and scrolls downward/rightward responding
- * to clockwise rotary event.
- *
- * The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws vertical scroll bar.
- * @li @c "vertical,scroll,bg": Vertical scroll background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle genlist object.
- *
- * @param[in] genlist The genlist object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the scrollbar visibility policy.
- *
- * @details This sets the scrollbar visibility policy for a given scroller.
- * @c ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it is
- * needed, and otherwise kept hidden. @c ELM_SCROLLER_POLICY_ON turns it on all
- * the time, and @c ELM_SCROLLER_POLICY_OFF always keeps it off. This applies
- * respectively for the vertical scrollbars.
- *
- * @param[in] obj The circle genlist object
- * @param[in] policy_h The horizontal scrollbar policy
- * @param[in] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_genlist_scroller_policy_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the scrollbar visibility policy.
- *
- * @param[in] obj The circle genlist object
- * @param[out] policy_h The horizontal scrollbar policy
- * @param[out] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_genlist_scroller_policy_set();
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_PROGRESSBAR_MODULE Efl Extension Circle Progressbar
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle progressbar aims to show the progress status of a given task with circular design.
- * It visualizes progress status within a range set by eext_circle_object_angle_min_max_set()
- * as an arc of a circle.
- *
- * @details The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws progress bar.
- * @li @c "bg": Progress bar background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle progressbar to a given surface.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL in case of an error
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SCROLLER_MODULE Efl Extension Circle Scroller
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle scroller is based on elm_scroller and is scrolled by rotary event.
- *
- * @details Circle scroller is to visualize and utilize scroll effect for elm_scroller.
- * While elm_scroller provides scrollbar with straight horizontal/vertical
- * movement, circle scroller provides scrollbar with circular movement.
- * Rotary event can be activated by eext_rotary_object_event_activated_set(),
- * circle scroller scrolls items upward/leftward responding to counter clockwise
- * rotary event, and scrolls downward/rightward responding to clockwise rotary event.
- *
- * The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws vertical scroll bar.
- * @li @c "vertical,scroll,bg": Vertical scroll background circle item.
- * @li @c "horizontal,scroll,bar": Horizontal scroll bar circle item.
- * @li @c "horizontal,scroll,bg": Horizontal scroll background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle scroller object.
- *
- * @param[in] scroller The scroller object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the scrollbar visibility policy.
- *
- * @details This sets the scrollbar visibility policy of a given scroller.
- * @c ELM_SCROLLER_POLICY_AUTO indicates the scrollbar is made visible
- * if it is needed, and otherwise is kept hidden. @c ELM_SCROLLER_POLICY_ON
- * turns the scrollbar on all the time, and @c ELM_SCROLLER_POLICY_OFF
- * turns it off. This applies to the horizontal and vertical scrollbars
- * respectively.
- *
- * @param[in] obj The circle scroller object
- * @param[in] policy_h The horizontal scrollbar policy
- * @param[in] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_scroller_policy_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_scroller_policy_set(Evas_Object *obj,
- Elm_Scroller_Policy policy_h,
- Elm_Scroller_Policy policy_v);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the scrollbar visibility policy.
- *
- * @param[in] obj The circle scroller object
- * @param[out] policy_h The horizontal scrollbar policy
- * @param[out] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_scroller_policy_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_scroller_policy_get(const Evas_Object *obj,
- Elm_Scroller_Policy *policy_h,
- Elm_Scroller_Policy *policy_v);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SLIDER_MODULE Efl Extension Circle Slider
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle slider is circular designed widget to select a value in a range
- * by rotary event.
- *
- * @details Circle slider visualizes and utilizess slider as an arc of a circle.
- * Length of an arc indicates a value in a range set by
- * eext_circle_object_angle_min_max_set(). If rotary event is activated
- * by eext_rotary_object_event_activated_set(), Circle slider increases
- * its value by step value from eext_circle_object_slider_step_set()
- * when clockwise rotary event is received, vice versa.
- *
- * This widget emits the following signals:
- * @li "value,changed": Whenever the slider value is changed by the user.
- *
- * The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws slider bar.
- * @li @c "bg": Background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle slider object.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL in case of an error
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the step value of the circle slider object.
- *
- * @details This value is used when circle slider object's value is changed
- * by an event. The value of eext_circle_object_slider is increased/decreased
- * by the step value.
- *
- * @param[in] obj The circle slider object
- * @param[in] step The step value of the eext_circle_slider object
- *
- * @see eext_circle_object_slider_step_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_slider_step_set(Evas_Object *obj, double step);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the step value of the circle slider object.
- *
- * @param[in] obj The circle slider object
- * @return The step value of the circle slider object
- *
- * @see eext_circle_object_slider_step_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_slider_step_get(const Evas_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SPINNER_MODULE Efl Extension Circle Spinner
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle spinner is based on elm_spinner and is operated by rotary event.
- *
- * @details Circle spinner is to display and handle spinner value by rotary event.
- * If rotary event is activated by eext_rotary_object_event_activated_set(),
- * circle spinner increases/decreases value of elm_spinner
- * by the clockwise/counter clockwise rotary event.
- *
- * The available circle object items are as follows:
- * @li @c "default": Default circle item. It draws a marker.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle spinner object.
- *
- * @param[in] spinner The spinner object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- * If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the circle spinner angle per each spinner value.
- *
- * @details This is not set a circle spinner picker angle offset.
- * It's set the angle per each spinner value.
- * default angle per each spinner value is calculated below formula.
- * (360/ max - min) * step
- *
- * @param[in] obj The circle spinner object
- * @param[in] angle The angle value per each spinner value.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-
-EAPI void eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_PRIVATE_H__
-#define __EFL_EXTENSION_CIRCLE_PRIVATE_H__
-
-#include <cairo.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define EEXT_CIRCLE_OBJECT_TYPE "Eext_Circle_Object"
-
-#define EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) \
- Eext_Circle_Object *circle_obj = NULL; \
- circle_obj = evas_object_data_get(obj, EEXT_CIRCLE_OBJECT_TYPE); \
- if (!circle_obj)
-/**
- * Put Document
- */
-typedef struct _Eext_Circle_Object Eext_Circle_Object;
-
-typedef enum
-{
- EEXT_CIRCLE_SURFACE_TYPE_DEFAULT,
- EEXT_CIRCLE_SURFACE_TYPE_PRIVATE,
- EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME,
- EEXT_CIRCLE_SURFACE_TYPE_LAST
-} Eext_Circle_Surface_Type;
-
-struct _Eext_Circle_Surface {
- Evas_Object *parent;
- Evas_Object *image_widget;
- cairo_surface_t *cairo_surface;
- cairo_t *cairo;
- unsigned char *buffer;
- Evas_Coord w, h;
- Evas_Coord center_x, center_y;
- Eext_Circle_Surface_Type type;
-
- Eina_List *render_objs;
-
- Ecore_Job *render_job;
-
- Eext_Circle_Surface *parent_surface;
- Eina_List *sub_surfaces;
- Eext_Circle_Object *deactivated_obj;
-};
-
-typedef struct _Eext_Circle_Color Eext_Circle_Color;
-struct _Eext_Circle_Color {
- int r, g, b, a;
-};
-
-struct _Eext_Circle_Object {
- Evas_Object *image_widget;
- Evas_Object *widget_object;
- void *widget_data;
- const char *widget_type;
-
- Eina_List *bg_image_objs;
- int bg_image_index;
-
- Eext_Circle_Surface *surface;
- Eina_List *items;
- Eina_List *text_items;
-
- // del_func: Do only for widget_data.
- // Other things are handled by Eext_Circle_Object.
- void (*del_func)(Eext_Circle_Object *obj);
- // disabled_func: When disabled state is changed, it will be called.
- void (*disabled_func)(Eext_Circle_Object *obj);
- // color_changed_func: When color of an item is changed, it will be called.
- void (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name);
-
- Eina_Bool visible : 1;
- Eina_Bool disabled : 1;
- Eina_Bool visible_on_activate: 1;
- Eina_Bool is_active: 1;
-};
-
-typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item;
-struct _Eext_Circle_Object_Item {
- Eext_Circle_Object *obj;
- const char *name;
- void *data;
-
- // For text draw
- const char *text;
- const char *font;
- const char *selected_font;
- int font_size;
-
- double radius;
- int line_width;
-
- int center_x;
- int center_y;
-
- double min_angle;
- double max_angle;
-
- double value;
- double min_value;
- double max_value;
-
- double angle;
- double angle_offset;
-
- Eext_Circle_Color color;
-
- struct {
- double angle;
- double angle_offset;
- Eext_Circle_Color color;
- } draw;
-
- struct {
- Ecore_Animator *animator_cb;
- double duration;
- double start_time;
- double current_animator_pos;
- Eext_Circle_Color from_color;
- double cubic_bezier_v[4];
- Eina_Bool cubic_bezier_enabled : 1;
- } color_transit;
-
- struct {
- Ecore_Animator *animator_cb;
- double duration;
- double start_time;
- double current_animator_pos;
- double from_angle, from_angle_offset;
- double cubic_bezier_v[4];
- Eina_Bool cubic_bezier_enabled : 1;
- } angle_transit;
-
- Eina_Bool round_cap;
-};
-
-/* Datetime widget data */
-typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data;
-struct _Eext_Circle_Object_Datetime_Data {
- Elm_Datetime_Field_Type current_type;
- double rotary_angle;
- double type_current_angle;
-
- Eina_Bool circle_changed : 1;
-};
-
-/* Progressbar widget data */
-typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data;
-struct _Eext_Circle_Object_Progressbar_Data {
- Eext_Circle_Color color;
- Eext_Circle_Color bg_color;
- Eext_Circle_Color disabled_color;
- Eext_Circle_Color disabled_bg_color;
-};
-
-/* Slider widget data */
-typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data;
-struct _Eext_Circle_Object_Slider_Data {
- double value_step;
-
- Eext_Circle_Color color;
- Eext_Circle_Color bg_color;
- Eext_Circle_Color disabled_color;
- Eext_Circle_Color disabled_bg_color;
-};
-
-/* Genlist widget data */
-typedef struct _Eext_Circle_Object_Genlist_Data Eext_Circle_Object_Genlist_Data;
-struct _Eext_Circle_Object_Genlist_Data {
- Ecore_Timer *bar_hide_timer;
- Elm_Scroller_Policy policy_h, policy_v;
-
- Eext_Circle_Color color;
- Eext_Circle_Color bg_color;
- Eext_Circle_Color disabled_color;
- Eext_Circle_Color disabled_bg_color;
-
- Eina_Bool realized_callback_added : 1;
-};
-
-/* Scroller widget data */
-typedef struct _Eext_Circle_Object_Scroller_Data Eext_Circle_Object_Scroller_Data;
-struct _Eext_Circle_Object_Scroller_Data {
- Ecore_Timer *bar_hide_timer;
- Elm_Scroller_Policy policy_v, policy_h;
-
- Eext_Circle_Color vertical_color;
- Eext_Circle_Color vertical_bg_color;
- Eext_Circle_Color horizontal_color;
- Eext_Circle_Color horizontal_bg_color;
- Eext_Circle_Color disabled_color;
- Eext_Circle_Color disabled_bg_color;
-
- int step_x, step_y;
- int line_width;
- double radius;
-};
-
-/* Spinner widget data */
-typedef struct _Eext_Circle_Object_Spinner_Data Eext_Circle_Object_Spinner_Data;
-struct _Eext_Circle_Object_Spinner_Data {
- Ecore_Timer *rotary_timer;
- Ecore_Timer *end_effect_expired_timer;
- Eina_Bool rotary_event;
- double angle;
- double to_angle_offset;
- double end_effect_angle;
-};
-
-///////////////////////////////
-// Internal APIs //////////////
-///////////////////////////////
-
-// Surface
-Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type);
-
-void _eext_circle_surface_finish(Eext_Circle_Surface *surface);
-
-void _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-void _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-void _eext_circle_surface_changed(Eext_Circle_Surface *surface);
-
-Eext_Circle_Surface *_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type);
-
-void _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-// Item
-double _eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value);
-
-double _eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle);
-
-const char *_eext_circle_text_font_get(const char *text, const char *font_family);
-
-void _eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name);
-
-const char *_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item);
-
-Eext_Circle_Object_Item *_eext_circle_object_item_new(void);
-
-void _eext_circle_object_item_free(Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_remove(Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width);
-
-int _eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle);
-
-double _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset);
-
-double _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item,
- double min_angle, double max_angle);
-
-void _eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item,
- double *min_angle, double *max_angle);
-
-void _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item,
- double min_value, double max_value);
-
-void _eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item,
- double *min_value, double *max_value);
-
-void _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value);
-
-double _eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
- int r, int g, int b, int a);
-
-void _eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
- int *r, int *g, int *b, int *a);
-
-void _eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius);
-
-double _eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
- const char *text,
- const char *font);
-
-void _eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
- const char **text,
- const char **font);
-
-void _eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
- int font_size);
-
-int _eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
- int to_r, int to_g, int to_b, int to_a,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y
- );
-
-void _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
- double to_angle, double to_angle_offset,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y);
-
-void _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
- double to_value,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y);
-
-void _eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool round_cap);
-
-Eina_Bool _eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item);
-
-// Circle Common Private
-void _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_object, Eext_Circle_Surface *surface);
-
-void _eext_circle_object_finish(Evas_Object *obj, Eext_Circle_Object *circle_obj);
-
-void _eext_circle_object_changed(Eext_Circle_Object *obj);
-
-Eext_Circle_Object_Item *_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name);
-
-void _eext_circle_object_hide(Eext_Circle_Object *obj);
-
-void _eext_circle_object_show(Eext_Circle_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __EFL_EXTENSION_CIRCLE_PRIVATE_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_SURFACE_H__
-#define __EFL_EXTENSION_CIRCLE_SURFACE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE Efl Extension Circle UI
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides circular ui-controls which are for the devices with circular display.
- */
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE Efl Extension Circle Surface
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Surface aims to show one of its connected circle objects.
- *
- * @details The circle surface manages connected circle objects.
- * When a circle object is chosen to be shown,
- * the surface shows the circle object and hides the others.
- * A circle object can be shown and received the rotary event on the surface by
- * @ref eext_rotary_object_event_activated_set() or @ref evas_object_show().
- *
- * The circle surface can be created by @ref eext_circle_surface_conformant_add()
- * and @ref eext_circle_surface_layout_add().
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Circle_Surface
- * @brief The structure of circle surface to render a connected circle object.
- *
- * @details The circle surface manages and shows a connected circle object.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Circle_Surface Eext_Circle_Surface;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given comformant.
- *
- * @details The circle surface needs the conformant to be seen in upper layer.
- *
- * @remarks The confom parameter is a conformant object pointer
- * which is created by @ref elm_conformant_add()
- * and the conformant's style should not be changed
- * because in eext_circle_surface_conformant_add()
- * it will be changed to circle style for circle surface.
- *
- * @param[in] conform The conformant
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_conformant_add(Evas_Object *conform);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given layout.
- *
- * @details The circle surface needs the layout to be set to the given layout.
- *
- * @remarks The layout parameter is a layout object pointer which is created by @ref elm_layout_add()
- * and the style of it should not change because in @ref eext_circle_surface_layout_add()
- * it will be changed to circle style for circle surface.
- *
- * @param[in] layout The layout
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_layout_add(Evas_Object *layout);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given naviframe.
- *
- * @details The circle surface needs the naviframe to be set to the pushed naviframe items.
- *
- * @remarks The naviframe parameter is a naviframe object pointer
- * which is created by @ref elm_naviframe_add()
- *
- * @param[in] naviframe The naviframe
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_naviframe_add(Evas_Object *naviframe);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete the given circle surface.
- *
- * @param[in] surface The @ref Eext_Circle_Surface
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_surface_del(Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_ROTARY_H__
-#define __EFL_EXTENSION_ROTARY_H__
-
-#include "Evas.h"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_ROTARY_EVENT_MODULE Efl Extension Rotary Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle rotary events.
- *
- * @details This rotary object emits the following signals.
- *
- * @li "rotary,activated": A circle object is activated.
- * @li "rotary,deactivated": A circle object is deactivated.
- *
- * @{
- *
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Enumeration of rotary direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Rotary_Event_Direction
-{
- EEXT_ROTARY_DIRECTION_CLOCKWISE, /**< Rotary is rotated clockwise direction */
- EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */
-} Eext_Rotary_Event_Direction;
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary event information structure
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Rotary_Event_Info
-{
- Eext_Rotary_Event_Direction direction; /**< Direction of rotary event */
- unsigned int time_stamp; /**< Timestamp of rotary event */
-} Eext_Rotary_Event_Info;
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary object event callback function signature
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef Eina_Bool (*Eext_Rotary_Event_Cb)(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary event handler function signature
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef Eina_Bool (*Eext_Rotary_Handler_Cb)(void *data, Eext_Rotary_Event_Info *info);
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_BEFORE
- * Slightly more prioritized than default.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_BEFORE -100
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_DEFAULT
- * Default callback priority level
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_DEFAULT 0
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_AFTER
- * Slightly less prioritized than default.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_AFTER 100
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Callback_Priority
- *
- * Callback priority value. Range is -32k - 32k. The lower the number, the
- * higher the priority.
- *
- * @see EEXT_CALLBACK_PRIORITY_AFTER
- * @see EEXT_CALLBACK_PRIORITY_BEFORE
- * @see EEXT_CALLBACK_PRIORITY_DEFAULT
- *
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef short Eext_Callback_Priority;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a rotary event callback for evas object @a obj.
- *
- * @details This function adds a callback function to object with default
- * priority level, so that when rotary event happens,
- * the callback can be called for that object.
- * A callback function must have the ::Eext_Rotary_Event_Cb prototype
- * definition.
- * @note Be carefull not to add the same callback multiple times, if
- * that is not what you want, because Eext won't check if a callback
- * existed before exactly as the one being registered (and thus, call
- * it more than once on the event, in this case).
- *
- * @param[in] obj The object that will receive rotary event.
- * @param[in] func Callback function.
- * @param[in] data User data to pass to callback function @a func.
- *
- * @return @c EINA_TRUE if the callback is successfully registered.
- * @c EINA_FALSE otherwise.
- *
- * @see eext_rotary_object_event_callback_priority_add
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a rotary event callback for evas object @a obj
- * with priority @a priority.
- *
- * @details This function adds a callback function to object with
- * priority level @a priority, so that when rotary event happens,
- * the callback can be called for that object. Except for the priority field,
- * it is exactly the same as @ref eext_rotary_object_event_callback_add.
- *
- * @param[in] obj The object that will receive rotary event.
- * @param[in] priority The priority of the callback, lower values called first.
- * @param[in] func Callback function.
- * @param[in] data User data to pass to callback function @a func.
- *
- * @return @c EINA_TRUE if the callback is successfully registered.
- * @c EINA_FALSE otherwise.
- *
- * @see eext_rotary_object_event_callback_add
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove registered rotary event callback from evas object @a obj.
- *
- * @param[in] obj The object from which the callback function is removed.
- * @param[in] func Callback function.
- *
- * @return The data which is passed when registers callback function.
- *
- * @see eext_rotary_object_event_callback_add.
- * @see eext_rotary_object_event_callback_priority_add.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a handler for rotary event.
- *
- * @details This function adds a handler function for the rotary event,
- * so that when rotary event happens, the handler can be called.
- * A handler function must have the ::Eext_Rotary_Handler_Cb prototype
- * definition.
- * @note Be carefull not to add the same handler multiple times, if
- * that is not what you want, because Eext won't check if a handler
- * existed before exactly as the one being registered (and thus, call
- * it more than once on the event, in this case).
- *
- * @param[in] func Handler function.
- * @param[in] data User data to pass to handler function @a func.
- *
- * @return @c EINA_TRUE if the handler is successfully registered.
- * @c EINA_FALSE otherwise.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove registered rotary event handler.
- *
- * @param[in] func Handler function.
- *
- * @return The data which is passed when registers callback function.
- *
- * @see eext_rotary_event_handler_add.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set an object @a obj as activated object.
- *
- * @details This function sets object as an activated object.
- * The activated object and its parent are only objects to receive rotary event.
- * Only one object is registered as activated object. If the new object is
- * registered as activated object, the previous activated object will be
- * de-activated. Set EINA_FALSE to activated parameter will set current activated
- * object as non-activated object also.
- * A signal named "rotary,activated" is emitted to the object when it is set as
- * activated object and similar for "rotary,deactivated" signal.
- * To receive the rotary event, the object must be visible and a callback function
- * must be registered to the object with
- * @ref eext_rotary_object_event_callback_add or
- * @ref eext_rotary_object_event_callback_priority_add.
- *
- * @param[in] obj The object to set as activated object.
- * @param[in] activated Set EINA_TRUE to activate or EINA_FALSE to de-activate object.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __EFL_EXTENSION_ROTARY_H__
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_COMMON_H__
-#define __EFL_EXTENSION_COMMON_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE Efl Extension Common UI
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides common ui-controls which are compatible for various devices.
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Object_Item
- * @brief An efl-extension object item handle.
-
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Object_Item Eext_Object_Item;
-
-#define EEXT_OBJECT_ITEM Eext_Object_Item base
-
-struct _Eext_Object_Item {
- Evas_Object *obj;
- void *data;
-};
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_COMMON_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_COMMON_PRIVATE_H__
-#define __EFL_EXTENSION_COMMON_PRIVATE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct _Eext_Index_Layout_Item Eext_Index_Layout_Item;
-struct _Eext_Index_Layout_Item {
- EEXT_OBJECT_ITEM;
- Eext_Circle_Object_Item *item;
-
- const char *letter;
- int priority;
- Eina_Bool selected;
-
- Evas_Smart_Cb func;
-};
-
-/* Index Layout data */
-typedef struct _Eext_Index_Layout_Data Eext_Index_Layout_Data;
-struct _Eext_Index_Layout_Data {
- Evas_Object *main_ly;
- Evas_Object *panel;
- Evas_Object *index;
- Evas_Object *cue;
- Ecore_Timer *hide_timer;
-
- int max_index;
- int max_item;
- int highlighted_index;
- int index_priority;
- int *item_index;
- int default_item_count;
-
- Eina_List *current_list;
- Eina_List *item_list;
- Eina_List *omit_list;
-
- Eina_Bool panel_hide;
- Eina_Bool second_list_exist;
-};
-
-/* Rotary Selector data */
-typedef struct _Eext_Rotary_Selector_Selector_Color Eext_Rotary_Selector_Selector_Color;
-struct _Eext_Rotary_Selector_Selector_Color {
- int r;
- int g;
- int b;
- int a;
- Eina_Bool set_flag;
-};
-
-typedef struct _Eext_Rotary_Selector_State_Data Eext_Rotary_Selector_State_Data;
-struct _Eext_Rotary_Selector_State_Data {
- Evas_Object *normal;
- Evas_Object *pressed;
-};
-
-typedef struct _Eext_Rotary_Selector_Selector_State_Color Eext_Rotary_Selector_Selector_State_Color;
-struct _Eext_Rotary_Selector_Selector_State_Color {
- Eext_Rotary_Selector_Selector_Color normal_color;
- Eext_Rotary_Selector_Selector_Color pressed_color;
- Eext_Rotary_Selector_Selector_Color disabled_color;
-};
-
-//for accessibility
-typedef enum
-{
- EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL = 0,
- EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT,
- EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT,
-} Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State;
-//
-
-typedef struct _Eext_Rotary_Selector_Data Eext_Rotary_Selector_Data;
-struct _Eext_Rotary_Selector_Data {
- Evas_Object *parent;
- Evas_Object *rotary_selector;
- Evas_Object *event_area;
- Eina_List *item_list;
- int item_count;
- int selected_index;
- int current_page;
- Eina_Bool animation_direction;
- Ecore_Animator *previous_page_animator;
- Ecore_Animator *next_page_animator;
- double previous_page_animator_start_time;
- double next_page_animator_start_time;
- Eina_Bool next_page_animation_started;
- Eina_Bool previous_page_animation_started;
- Ecore_Timer *next_page_timer;
- Eina_Bool end_effect_animation_started;
- double end_effect_animator_start_time;
- Ecore_Animator *end_effect_animator;
- Ecore_Animator *item_update_animator;
- Eext_Rotary_Selector_Selector_State state;
- Eext_Rotary_Selector_Selector_State_Color selector_bg_image_color;
- Eext_Rotary_Selector_State_Data custom_content;
- Eina_Bool pressed;
- int pressed_item_index;
- Eina_Bool touched_item_changed;
- int radius;
- Evas_Coord item_width;
- Evas_Coord item_height;
- unsigned int rotary_event_time_stamp;
- Eina_Bool acceleration;
- //for accessibility
- Evas_Object *event_area_access_object;
- Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State event_area_highlighted_state;
- Evas_Object *backup_first_item_for_atspi;
- Evas_Object *backup_last_item_for_atspi;
- int reading_page_number;
- Eina_Bool from_moreoption;
- Eina_Bool control_by_rotary
- //
-};
-
-typedef struct _Eext_Rotary_Selector_Item_Coords Eext_Rotary_Selector_Item_Coords;
-struct _Eext_Rotary_Selector_Item_Coords {
- double x;
- double y;
-};
-
-typedef struct _Eext_Rotary_Selector_Item_Color Eext_Rotary_Selector_Item_Color;
-struct _Eext_Rotary_Selector_Item_Color {
- int r;
- int g;
- int b;
- int a;
- Eina_Bool set_flag;
-};
-
-typedef struct _Eext_Rotary_Selector_Item_State_Color Eext_Rotary_Selector_Item_State_Color;
-struct _Eext_Rotary_Selector_Item_State_Color {
- Eext_Rotary_Selector_Item_Color normal_color;
- Eext_Rotary_Selector_Item_Color pressed_color;
- Eext_Rotary_Selector_Item_Color disabled_color;
-};
-
-typedef struct _Eext_Rotary_Selector_Item Eext_Rotary_Selector_Item;
-struct _Eext_Rotary_Selector_Item {
- EEXT_OBJECT_ITEM;
- int index;
- Evas_Object *parent;
- Evas_Object *rotary_selector;
- Eext_Rotary_Selector_Item_Coords coords;
- char *domain;
- char *text1;
- char *text2;
- Eext_Rotary_Selector_Item_State state;
- Eext_Rotary_Selector_Item_Color color;
- Eext_Rotary_Selector_State_Data item_bg_image;
- Eext_Rotary_Selector_State_Data item_icon;
- Eext_Rotary_Selector_State_Data selector_icon;
- Eext_Rotary_Selector_State_Data selector_content;
- Eext_Rotary_Selector_Item_State_Color item_bg_image_color;
- Eext_Rotary_Selector_Item_State_Color item_icon_color;
- Eext_Rotary_Selector_Item_State_Color selector_icon_color;
- Eext_Rotary_Selector_Item_State_Color custom_content_color;
- Evas_Object *content_icon;
- Evas_Object *custom_content;
-};
-
-
-/* More Option data */
-typedef struct _Eext_More_Option_Data Eext_More_Option_Data;
-struct _Eext_More_Option_Data {
- Evas_Object* parent;
- Evas_Object* more_option;
- Eina_List *item_list;
- Evas_Object* panel;
- Evas_Object* rotary_selector;
- Eext_More_Option_Direction direction;
- //for accessibility
- Evas_Object* cue_access_object;
- //
-};
-
-//for accessibility(internal API)
-void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
-//
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __EFL_EXTENSION_COMMON_PRIVATE_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_INDEX_H__
-#define __EFL_EXTENSION_INDEX_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_INDEX_LAYOUT_MODULE Efl Extension Index Layout
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief Index layout is based on elm_layout with draggable index view, and an item of index
- * can be selected by rotary event.
- *
- * @details This widget emits the following signals.
- *
- * @li "changed": The index layout item is changed.
- * @li "index,show": The index layout item is shown.
- * @li "index,hide": The index layout item is hidden.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new index layout to the given parent
- * Elementary object.
- *
- * @param[in] parent The parent object
- * @return A new index layout handle,
- * otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_index_layout_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item on a given index layout.
- *
- * @param[in] obj The index layout
- * @param[in] text The text under which the item should be indexed
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_append(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Prepend a new item on a given index layout.
- *
- * @param[in] obj The index layout object
- * @param[in] text The text under which the item should be indexed
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_prepend(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the index object before the input index layout item.
- *
- * @param[in] obj The index layout object
- * @param[in] before The index layout item to insert before
- * @param[in] text The text under which the item should be indexed
- * @param[in] priority The priority of index layout item
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_insert_before(Evas_Object *obj, Eext_Object_Item *before, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the index object after the input index layout item.
- *
- * @param[in] obj The index layout object
- * @param[in] after The index layout item to insert after
- * @param[in] text The text under which the item should be indexed
- * @param[in] priority The priority of index layout item
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_insert_after(Evas_Object *obj, Eext_Object_Item *after, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given index layout object.
- *
- * @param[in] obj The index layout
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given index layout item.
- *
- * @param[in] item The index layout item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Find a given index widget's item using item data.
- *
- * @param[in] obj The index layout
- * @param[in] data The item data pointed by the desired index layout item
- * @return The index layout item handle if found, otherwise @c NULL
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_find(Evas_Object *obj, const void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the last selected item, for a given index layout object.
- *
- * @param[in] obj The index layout object
- * @return The index layout item handle if selected, otherwise @c NULL
- *
- * @see eext_index_layout_item_selected_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_selected_item_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selected state of an item.
- *
- * @remarks Selected item will be highlighted.
- *
- * @param[in] item The index layout item
- * @param[in] selected The selected state
- *
- * @see eext_index_layout_selected_item_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_selected_item_set(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text to the given index layout item.
- *
- * @param[in] item The index layout item
- * @param[in] text The text under which the item should be indexed
- *
- * @see eext_index_layout_item_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_item_text_set(Eext_Object_Item *item, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the text (string) set on a given index layout item.
- *
- * @param[in] item The index layout item
- * @return The text string set on @a item
- *
- * @see eext_index_layout_item_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char* eext_index_layout_item_text_get(Eext_Object_Item *item);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_INDEX_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_MORE_OPTION_H__
-#define __EFL_EXTENSION_MORE_OPTION_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_MORE_OPTION_MODULE Efl Extension More Option
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief More option is composed of the toggle(cue button) and more option view,
- * and more option can change a visibility through the toggle.
- *
- * @details More option is based on elm_panel, but more option is different
- * from elm_panel in that the former does not set the scrollable option.
- * To show the more option view, select the toggle or manually use
- * eext_more_option_opened_set(). To hide the more option view,
- * trigger the back event or manually use eext_more_option_opened_set().
- * Additionally, the toggle disappears when more option view appears.
- * On the other hand, the toggle appears when more option view disappears.
- * The more option view can be manually set by eext_more_option_opened_set() API.
- * An item of more option object can be selected by rotary event.
- *
- * This widget emits the following signals:
- * @li "item,selected": When the user selects an item.
- * @li "item,clicked": When the user selects the already selected item again
- * or selects a selector.
- * @li "more,option,opened": When more option view is shown.
- * @li "more,option,closed": When more option view is hidden.
- *
- * @{
- */
-
-/**
- * @brief Enumeration of More Option Diection type
- */
-typedef enum
-{
- EEXT_MORE_OPTION_DIRECTION_TOP, /**< More option (dis)appears from the top */
- EEXT_MORE_OPTION_DIRECTION_BOTTOM, /**< More option (dis)appears from the bottom */
- EEXT_MORE_OPTION_DIRECTION_LEFT, /**< More option (dis)appears from the left */
- EEXT_MORE_OPTION_DIRECTION_RIGHT /**< More option (dis)appears from the right */
-} Eext_More_Option_Direction;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new more option.
- *
- * @details Because the return value is the elm_layout handle,
- * the elm_layout APIs can be applicable to more option handle.
- *
- * @param[in] parent The parent object
- * @return A new more option handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object * eext_more_option_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the direction of more option.
- *
- * @param[in] obj The more option
- * @param[in] direction The direction of more option
- *
- * @see eext_more_option_direction_get()
- * @ref Eext_More_Option_Direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get @ref Eext_More_Option_Direction.
- *
- * @param[in] obj The more option
- * @return A direction of more option
- *
- * @see eext_more_option_direction_set()
- * @ref Eext_More_Option_Direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_More_Option_Direction eext_more_option_direction_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item to a more option.
- *
- * @param[in] obj The more option
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_append(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief prepend a new item to a more option.
- *
- * @param[in] obj The more option
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_prepend(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the more option after more option item @a after.
- *
- * @param[in] obj The more option
- * @param[in] after The more option item to insert after
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the more option before more option item @a before.
- *
- * @param[in] obj The more option
- * @param[in] before The more option item to insert before
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given more option item @a item.
- *
- * @param[in] item The more option item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given more option object.
- *
- * @param[in] obj The more option
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a more option object.
- *
- * @details The part name exists with the next.
- * @li "selector,main_text": This locates in the middle of the selector.
- * @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] text The new text of the part
- *
- * @see eext_more_option_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a more option object.
- *
- * @details The part name exists with the next.
- * @li "selector,main_text": This locates in the middle of the selector.
- * @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to get (@c NULL for the default part)
- * @return The text of the part, otherwise @c NULL in case of an error
- *
- * @see eext_more_option_item_part_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char * eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the translatable text of a more option object.
- *
- * @details The part name exists with the next.
- * @li "selector,main_text": This locates in the middle of the selector.
- * @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] domain The name of the domain which contains translatable text
- * @param[in] text ID of the new translatable text
- *
- * @see eext_more_option_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content to the part of a given container widget.
- *
- * @details The part name exists with the next.
- * @li "item,icon": This locates in the middle of the selector.
- *
- * @remarks The more option item may hold child objects as content at given parts.
- * This sets new content to a given part.
- * If any object is already set as a content object in the same part,
- * the previous object is automatically deleted. with this call.
- *
- * @param[in] item The more option item
- * @param[in] part_name The more option item's part name to set
- * @param[in] content The new content for that part
- *
- * @see eext_more_option_item_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content from the part of a given container widget.
- *
- * @details The part name exists with the next.
- * @li "item,icon": This locates in the middle of the selector.
- *
- * @param[in] item The more option item
- * @param[in] part_name The more option item's part name to get
- * @return The content of the object at the given part,
- * otherwise @c NULL in case of an error
- *
- * @see eext_more_option_item_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object * eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the visibility of more option view.
- *
- * @details If opened is @c EINA_TRUE, more option view in which
- * the rotary selector is included disappears and toggle appears.
- * If opened is @c EINA_FALSE, more option view in which
- * the rotary selector is included appears and toggle disappear.
- *
- * @remarks When more option is closed and opened again, the first item
- * is always selected.
- *
- * @param[in] obj The more option object
- * @param[in] opened If @c EINA_TRUE, the more option runs the animation to appear,
- * If @c EINA_FALSE, the more option runs the animation to disappear
- *
- * @see eext_more_option_opened_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get whether the more option is set to be shown or to be hidden.
- *
- * @param[in] obj The more option object
- * @return If @c EINA_TRUE, more option is shown.
- * Otherwise @c EINA_FALSE, more option is hidden.
- *
- * @see eext_more_option_opened_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_more_option_opened_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the list of all items from a given more option object.
- *
- * @param[in] obj The more option object
- * @return All item lists of the more option..
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const Eina_List* eext_more_option_items_get(const Evas_Object *obj);
-/**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_MORE_OPTION_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_ROTARY_SELECTOR_H__
-#define __EFL_EXTENSION_ROTARY_SELECTOR_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_ROTARY_SELECTOR_MODULE Efl Extension Rotary Selector
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief Rotary Selector is based on elm_layout, and an item can be
- * selected by rotary event or user item click.
- *
- * @details This widget emits the following signals.
- *
- * @li "item,selected": When the user selected an item.
- * @li "item,clicked": When selecting again the alredy selected item or selecting a selector.
- *
- * @{
- */
-
-/**
- * @brief Enumeration of Rotary Selector state
- */
-typedef enum
-{
- EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL = 0, /**< Selector is normal state */
- EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED, /**< Selector is pressed state */
- EEXT_ROTARY_SELECTOR_SELECTOR_STATE_DISABLED, /**< Selector is disabled state */
-} Eext_Rotary_Selector_Selector_State;
-
-/**
- * @brief Enumeration of Rotary Selector item state
- */
-typedef enum
-{
- EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL = 0, /**< Selector Item is normal state */
- EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED, /**< Selector Item is pressed state */
- EEXT_ROTARY_SELECTOR_ITEM_STATE_DISABLED, /**< Selector Item is disabled state */
-} Eext_Rotary_Selector_Item_State;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new Rotary Selector.
- * @details Because the return value is the elm_layout handle,
- the elm_layout APIs can be applicable to rotary selector handle.
- *
- * @param[in] parent The parent object
- *
- * @return A new rotary selector handle, otherwise @c NULL if it cannot be created
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item to a rotary selector.
- *
- * @param[in] obj The rotary selector
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_rotary_selector_item_append(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Prepend a new item to a rotary selector.
- *
- * @param[in] obj The rotary selector
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_prepend(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into a rotary selector after rotary selector item @a after.
- *
- * @param[in] obj The rotary selector
- * @param[in] after The rotary selector item to insert after
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into a rotary selector before rotary selector item @a before.
- *
- * @param[in] obj The rotary selector
- * @param[in] before The rotary selector item to insert before
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given rotary selector item.
- *
- * @param[in] item The rotary selector item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given rotary selector object.
- *
- * @param[in] obj The rotary selector
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] text The new text of the part
- *
- * @details This api supports following part names by default.
- *
- * @li "selector,main_text": Selector main text.
- * @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to get (@c NULL for the default part)
- * @return The text of the part, otherwise @c NULL for any error
- *
- * @details This api supports following part names by default.
- *
- * @li "selector,main_text": Selector main text.
- * @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char* eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the translatable text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] domain The name of the domain which contains translatable text
- * @param[in] text ID of the new translatable text
- *
- * @details This api supports following part names by default.
- *
- * @li "selector,main_text": Selector main text.
- * @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content at a part of a given container widget.
- *
- * @remarks The rotary selector item may hold child objects as its contents in given parts.
- * This new content to a given part. If any object is already set as a content
- * object in the given part, the previous object is automatically deleted
- * with this call.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The rotary selector item's part name to set
- * @param[in] state The rotary selector item part
- * @param[in] content The new content for that part
- *
- * @details This api supports following part names by default.
- *
- * @li "item,bg_image": Selector Item background image
- * @li "item,icon": Selector item icon
- * @li "selector,icon": Selector icon
- * @li "selector,content": Selector content
- *
- * @see eext_rotary_selector_item_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content at a part of a given container widget.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The rotary selector item's part name to get
- * @param[in] state The rotary selector item part
- * @return The content of the object at the given part, otherwise @c NULL in case of an error
- *
- * @details This api supports following part names by default.
- *
- * @li "item,bg_image": Selector Item background image
- * @li "item,icon": Selector item icon
- * @li "selector,icon": Selector icon
- * @li "selector,content": Selector content
- *
- * @see eext_rotary_selector_item_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content at a part of a given container widget.
- *
- * @remarks The rotary selector may hold child objects as its contents in given parts.
- * This sets a new content to a given part. If any object is already set as a content
- * object in the given part, the previous object is automatically deleted
- * with this call.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The rotary selector part name to set
- * @param[in] state The selector part
- * @param[in] content The new content for that part
- * @details This api supports following part names by default.
- *
- * @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_selector_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content from the part of the given container widget.
- *
- * @param[in] obj The rotary selector.
- * @param[in] part_name The rotary selector part name to set
- * @param[in] state The selector part
- * @return The content of the object at the given part, otherwise @c NULL in case of an error
- *
- * @details This api supports following part names by default.
- *
- * @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_selector_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state);
-
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the item part color of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The item part name to set
- * @param[in] state The rotary selector item part
- * @param[in] r Red (0 - 255)
- * @param[in] g Green (0 - 255)
- * @param[in] b Blue (0 - 255)
- * @param[in] a Alpha (0 - 255)
- *
- * @details This api supports following part names by default.
- *
- * @li "item,bg_image": Selector Item background image
- * @li "item,icon": Selector item icon
- * @li "selector,icon": Selector icon
- * @li "selector,content": Selector content
- * @li "selector,main_text": Selector main text.
- * @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the item part color of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The item part name to get
- * @param[in] state The rotary selector item part
- * @param[out] r A pointer to Red (0 - 255)
- * @param[out] g A pointer to Green (0 - 255)
- * @param[out] b A pointer to Blue (0 - 255)
- * @param[out] a A pointer to Alpha (0 - 255)
- * @see eext_rotary_selector_item_part_color_set()
- *
- * @details This api supports following part names by default.
- *
- * @li "item,bg_image": Selector Item background image
- * @li "item,icon": Selector item icon
- * @li "selector,icon": Selector icon
- * @li "selector,content": Selector content
- * @li "selector,main_text": Selector main text.
- * @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_color_get()
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selector part color of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The selector part name to set
- * @param[in] state The selector part
- * @param[in] r Red (0 - 255)
- * @param[in] g Green (0 - 255)
- * @param[in] b Blue (0 - 255)
- * @param[in] a Alpha (0 - 255)
- *
- * @details This api defualt support part names.
- *
- * @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_part_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the selector part color of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The selector part name to get
- * @param[in] state The selector part
- * @param[out] r A pointer to Red (0 - 255)
- * @param[out] g A pointer to Green (0 - 255)
- * @param[out] b A pointer to Blue (0 - 255)
- * @param[out] a A pointer to Alpha (0 - 255)
- * @see eext_rotary_selector_item_part_color_set()
- *
- * @details This api defualt support part names.
- *
- * @li "selector,bg_image": Selector background image.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selected item of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] item The rotary selector item
- * @see eext_rotary_selector_selected_item_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the selected item of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @see eext_rotary_selector_selected_item_set()
- * @return A selected item handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_rotary_selector_selected_item_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the rotary selector item list of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @return A rotary selector item list handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const Eina_List* eext_rotary_selector_items_get(const Evas_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_ROTARY_SELECTOR_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_H__
-#define __EFL_EXTENSION_H__
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-@HEADER_INCS@
-@LIB_HEADERS@
-
-/**
- * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This group provides functionalities to grab hardware key events.
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- *
- * @{
- */
-
-/**
- * @brief Set the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_set.
- * Key callback is only called when the window located in topmost(top of the window stack).
- *
- * @param[in] obj object to set the keygrab
- * The widget type of this object should be elm_win
- * @param[in] key keyname string to set keygrab
- *
- * @return The result of keygrab set
- *
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- */
-EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
-
-/**
- * @brief Unset the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_unset.
- *
- * @param[in] obj object to unset the keygrab
- * The widget type of this object should be elm_win
- * @param[in] key keyname string to unset keygrab
- *
- * @return The result of keygrab unset
- *
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- */
-EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_H__ */
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_EVENTS_H__
-#define __EFL_EXTENSION_EVENTS_H__
-
-#include <Elementary.h>
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_EVENT_MODULE Efl Extension Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle back/send key events.
- * @{
- */
-
-/**
- * @brief Convenient macro function that sends back key events to the popup
- * to be removed.
- *
- * @details Popup will be removed when it has the back key event with
- * eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- evas_object_del(obj);
-}
-
-/**
- * @brief Convenient macro function that sends back key events to the ctxpopup
- * to be dismissed.
- *
- * @details Ctxpopup will be dismissed when it has the back key event with
- * eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- elm_ctxpopup_dismiss(obj);
-}
-
-/**
- * @brief Convenient macro function that sends more key events to the naviframe
- * top item.
- *
- * @details More key action of naviframe will be executed when naviframe has the
- * more key event with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
- if (!top) return;
- Evas_Object *more_btn = elm_object_item_part_content_get(top,
- "toolbar_more_btn");
- if (more_btn)
- evas_object_smart_callback_call(more_btn, "clicked", NULL);
-}
-
-/**
- * @brief Convenient macro function that pop the naviframe item.
- *
- * @details Naviframe will be popped when naviframe has the back key event
- * with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- elm_naviframe_item_pop(obj);
-}
-
-/**
- * Identifier of callbacks to be set for Ea events.
- *
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Callback_Type
-{
- EEXT_CALLBACK_BACK, /**< H/W Back Key Event */
- EEXT_CALLBACK_MORE, /**< H/W More Key Event */
- EEXT_CALLBACK_LAST /**< Reserved value. Acutally This is not matched to
- any meaningful behavior. */
-} Eext_Callback_Type;
-
-/**
- * @brief Ea event callback function signature.
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information (if the event passes an additional in
- formation.)
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
-
-/**
- * @brief Delete a callback function from an object.
- *
- * @details This function removes the most recently added callback from the
- * object @p obj which was triggered by the type @p type and
- * was calling the function @p func when triggered. If the removal is
- * successful it will also return the data pointer that was passed to
- * eext_object_event_callback_add() when the callback was added to
- * the object. If not successful @c NULl will be returned.
- *
- * @param[in] obj Object to remove a callback from.
- * @param[in] type The type of event that was triggering the callback.
- * @param[in] func The function that was to be called when the event was
- * triggered
- * @return data The data pointer that was to be passed to the callback.
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
-
-/**
- * @brief Add (register) a callback function to a given evas object.
- *
- * @details This function adds a function callback to an object when the key
- * event occurs on object @p obj. The key event on the object is only
- * triggered when the object is the most top in objects stack and
- * visible. This means, like the naviframe widget, if your application
- * needs to have the events based on the view but not focus, you can
- * use this callback. A callback function must have the Eext_Event_Cb
- * prototype definition. The first parameter (@p data) in this
- * definition will have the same value passed to
- * eext_object_event_callback_add() as the @p data parameter, at
- * runtime. The second parameter @p obj is the evas object on which
- * event occurred. Finally, the third parameter @p event_info is a
- * pointer to a data structure that may or may not be passed to the
- * callback, depending on the event type that triggered the callback.
- * This is so because some events don't carry extra context with them,
- * but others do.
- *
- * @param[in] obj evas object.
- * @param[in] type The type of event that will trigger the callback.
- * @param[in] func The function to be called when the key event is triggered.
- * @param[in] data The data pointer to be passed to @p func.
- *
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
-
-/**
- * @brief Convenient macro function that cancels the selection of the entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (elm_entry_selection_get(obj))
- elm_entry_select_none(obj);
-
- eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
- evas_object_data_set(obj, "eext_entry", NULL);
-}
-
-/**
- * @brief Convenient macro function that registers back key callback for entry.
- *
- * @details If the selection handler should be canceled when back key event is
- * triggered, then use this API.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (!evas_object_data_get(obj, "eext_entry"))
- {
- evas_object_data_set(obj, "eext_entry", (void *) 1);
- eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
- NULL);
- }
-}
-
-/**
- * @brief Convenient macro function that clears back key callback for entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see eext_entry_selection_back_event_allow_set()
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- if (evas_object_data_get(obj, "eext_entry"))
- {
- eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
- evas_object_data_set(obj, "eext_entry", NULL);
- }
-}
-
-/**
- * @brief Convenient macro function that handle the back event to cancel the
- * selection handler of the entry.
- * @details If the selection handler should be canceled (or not) when back key
- * event is triggered, then use this API.
- * @param[in] obj Entry object.
- * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
- * otherwise.
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
-{
- if (allow)
- {
- evas_object_smart_callback_add(obj, "selection,start",
- eext_entry_selection_start_cb, NULL);
- evas_object_smart_callback_add(obj, "selection,cleared",
- eext_entry_selection_cleared_cb, NULL);
- }
- else
- {
- evas_object_smart_callback_del(obj, "selection,start",
- eext_entry_selection_start_cb);
- evas_object_smart_callback_del(obj, "selection,cleared",
- eext_entry_selection_cleared_cb);
- }
-}
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_EVENTS_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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.
- */
-
-#ifndef __EFL_EXTENSION_PRIVATE_H__
-#define __EFL_EXTENSION_PRIVATE_H__
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <fontconfig/fontconfig.h>
-#include <fontconfig/fcfreetype.h>
-
-#define _(str) (gettext(str))
-#define LOCALE_DIR "/usr/share/locale"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-# ifdef DLL_EXPORT
-# define EAPI __declspec(dllexport)
-# else
-# define EAPI
-# endif /* ! DLL_EXPORT */
-# else
-# define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-# if __GNUC__ >= 4
-# define EAPI __attribute__ ((visibility("default")))
-# else
-# define EAPI
-# endif
-# else
-# define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @internal
- *
- * @ {
- */
-
-extern int _eext_log_dom;
-
-#define CRI(...) EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
-#define ERR(...) EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
-#define WRN(...) EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
-#define INF(...) EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
-#define DBG(...) EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
-
-#define __CONSTRUCTOR__ __attribute__ ((constructor))
-#define __DESTRUCTOR__ __attribute__ ((destructor))
-
-/* eina magic types */
-#define EEXT_MAGIC_NONE 0x87657890
-
-typedef unsigned int eext_magic;
-#define EEXT_MAGIC eext_magic __magic
-
-#define EEXT_MAGIC_SET(d, m) (d)->__magic = (m)
-#define EEXT_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
-#define EEXT_MAGIC_FAIL(d, m, fn) \
- _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_PRIVATE_H__ */
+++ /dev/null
-SET(LIB_SRCS
- efl_extension.c
- efl_extension_events.c
- circle/efl_extension_circle_surface.c
- circle/efl_extension_circle_object.c
- circle/efl_extension_circle_object_item.c
- circle/efl_extension_circle_object_progressbar.c
- circle/efl_extension_circle_object_slider.c
- circle/efl_extension_circle_object_genlist.c
- circle/efl_extension_circle_object_datetime.c
- circle/efl_extension_circle_object_scroller.c
- circle/efl_extension_circle_object_spinner.c
- circle/efl_extension_rotary.c
- common/efl_extension_rotary_selector.c
- common/efl_extension_more_option.c)
-
-ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
-
-ADD_DEFINITIONS("-DEFL_EXTENSION_BUILD")
-IF(DEFINED WITH_X)
- message("Build with X")
- ADD_DEFINITIONS("-DWITH_X")
- PKG_CHECK_MODULES(LIB_PKGS REQUIRED
- eina
- ecore
- ecore-x
- elementary
- cairo
- x11
- xext
- xi
- inputproto
- fontconfig
- )
-ELSEIF(DEFINED WITH_WAYLAND)
- message("Build with Wayland")
- ADD_DEFINITIONS("-DWITH_WAYLAND")
- PKG_CHECK_MODULES(LIB_PKGS REQUIRED
- eina
- ecore
- ecore-wayland
- ecore-input
- elementary
- cairo
- fontconfig
- )
-ELSEIF(DEFINED WIN32)
- message("Build on Windows")
- ADD_DEFINITIONS("-DDLL_EXPORT")
- PKG_CHECK_MODULES(LIB_PKGS REQUIRED
- eina
- ecore
- elementary
- evil
- cairo
- fontconfig
- )
-ELSE()
- message("Build without X and Wayland")
- PKG_CHECK_MODULES(LIB_PKGS REQUIRED
- eina
- ecore
- elementary
- cairo
- fontconfig
- )
-ENDIF()
-
-FOREACH(flag ${LIB_PKGS_CFLAGS})
- SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
-TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
-
-INSTALL(TARGETS ${LIB_NAME} DESTINATION lib)
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void
-_eext_circle_object_del_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Item *item;
- Eina_List *l, *l_next;
-
- if (!circle_obj)
- {
- ERR("Eext_Circle_Object is NULL");
- return;
- }
-
- if (circle_obj->del_func)
- circle_obj->del_func(circle_obj);
-
- EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
- {
- _eext_circle_object_item_free(item);
- }
-
- if (circle_obj->surface)
- {
- _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
- circle_obj->surface = NULL;
- }
-
- circle_obj->visible = EINA_FALSE;
-
- if (obj)
- evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
-
- free(circle_obj);
-}
-
-static void
-_eext_circle_object_show_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (!circle_obj) return;
- if (circle_obj->visible) return;
-
- if (circle_obj->widget_object)
- {
- if (evas_object_visible_get(circle_obj->widget_object))
- {
- circle_obj->visible = EINA_TRUE;
- _eext_circle_object_changed(circle_obj);
- }
- }
- else
- {
- circle_obj->visible = EINA_TRUE;
- _eext_circle_object_changed(circle_obj);
- }
-}
-
-static void
-_eext_circle_object_hide_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (!circle_obj) return;
- if (!circle_obj->visible) return;
-
- circle_obj->visible = EINA_FALSE;
- _eext_circle_object_changed(circle_obj);
-}
-
-static void
-_eext_circle_object_widget_object_show_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (!circle_obj) return;
- if (circle_obj->visible) return;
-
- if (evas_object_visible_get(circle_obj->image_widget))
- {
- circle_obj->visible = EINA_TRUE;
- _eext_circle_object_changed(circle_obj);
- }
- else
- {
- evas_object_show(circle_obj->image_widget);
- }
-}
-
-static void
-_eext_circle_object_widget_object_hide_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- evas_object_hide(circle_obj->image_widget);
-}
-
-static void
-_eext_circle_object_widget_object_disabled_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *main_obj = circle_obj->image_widget;
-
- if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
- eext_circle_object_disabled_set(main_obj, EINA_TRUE);
-}
-
-static void
-_eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *main_obj = circle_obj->image_widget;
-
- if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
- eext_circle_object_disabled_set(main_obj, EINA_FALSE);
-}
-
-//////////////////////////////
-// Internal API //////////////
-//////////////////////////////
-void
-_eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
-{
- Eext_Circle_Object *circle_obj;
-
- circle_obj = (Eext_Circle_Object *)calloc(1, sizeof(Eext_Circle_Object));
- // Obj is expected to be elm_image object.
- circle_obj->image_widget = obj;
- circle_obj->widget_object = widget_obj;
- circle_obj->widget_data = NULL;
- circle_obj->widget_type = EEXT_CIRCLE_OBJECT_TYPE;
- circle_obj->del_func = NULL;
- circle_obj->disabled_func = NULL;
-
- evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
-
- //FIXME: It's for adjusting evas_image geometry.
- // Image object has weird geometry during the window calc own size.
- // We need to recalc image object after buffer memory copy in render time.
- // But now we don't have any way to call image's internal sizing eval function.
- elm_image_aspect_fixed_set(obj, EINA_FALSE);
- evas_object_repeat_events_set(obj, EINA_TRUE);
-
- evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj);
-
- if (widget_obj)
- {
- evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_SHOW,
- _eext_circle_object_widget_object_show_cb, circle_obj);
- evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_HIDE,
- _eext_circle_object_widget_object_hide_cb, circle_obj);
- evas_object_smart_callback_add(widget_obj, "disabled", _eext_circle_object_widget_object_disabled_cb, circle_obj);
- evas_object_smart_callback_add(widget_obj, "enabled", _eext_circle_object_widget_object_enabled_cb, circle_obj);
- }
-
- if (surface)
- _eext_circle_surface_object_append(surface, circle_obj);
- else
- {
- Eext_Circle_Surface *private_surface =
- _eext_circle_surface_init(circle_obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
- _eext_circle_surface_object_append(private_surface, circle_obj);
- }
-}
-
-void
-_eext_circle_object_changed(Eext_Circle_Object *obj)
-{
- if (!obj) return;
-
- if (obj->surface)
- _eext_circle_surface_changed(obj->surface);
-}
-
-Eext_Circle_Object_Item *
-_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
-{
- Eina_List *l;
- Eext_Circle_Object_Item *item;
-
- if (!obj)
- {
- ERR("Eext_Circle_Object is NULL! It returns NULL!");
- return NULL;
- }
-
- if (!name)
- {
- ERR("The given item name is NULL! It returns NULL!");
- return NULL;
- }
-
- EINA_LIST_FOREACH(obj->items, l, item)
- {
- const char *item_name = _eext_circle_object_item_name_get(item);
- if (item_name &&
- (name && !strcmp(_eext_circle_object_item_name_get(item), name)))
- return item;
- }
-
- ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->image_widget, obj->widget_type);
- return NULL;
-}
-
-void
-_eext_circle_object_hide(Eext_Circle_Object *obj)
-{
- if (!obj) return;
- if (!obj->visible) return;
-
- obj->visible = EINA_FALSE;
-
- _eext_circle_object_changed(obj);
-}
-
-void
-_eext_circle_object_show(Eext_Circle_Object *obj)
-{
- if (!obj) return;
- if (obj->visible) return;
-
- obj->visible = EINA_TRUE;
-
- if (obj->surface)
- _eext_circle_surface_object_exclusive_show(obj->surface, obj);
-
- _eext_circle_object_changed(obj);
-}
-
-/////////////////////////////////////////////////
-// EAPI /////////////////////////////////////////
-/////////////////////////////////////////////////
-EAPI void
-eext_circle_object_line_width_set(Evas_Object *obj, int line_width)
-{
- eext_circle_object_item_line_width_set(obj, "default", line_width);
-}
-
-EAPI int
-eext_circle_object_line_width_get(const Evas_Object *obj)
-{
- return eext_circle_object_item_line_width_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_set(Evas_Object *obj, double angle)
-{
- eext_circle_object_item_angle_set(obj, "default", angle);
-}
-
-EAPI double
-eext_circle_object_angle_get(const Evas_Object *obj)
-{
- return eext_circle_object_item_angle_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset)
-{
- eext_circle_object_item_angle_offset_set(obj, "default", angle_offset);
-}
-
-EAPI double
-eext_circle_object_angle_offset_get(const Evas_Object *obj)
-{
- return eext_circle_object_item_angle_offset_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle)
-{
- eext_circle_object_item_angle_min_max_set(obj, "default", min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle)
-{
- eext_circle_object_item_angle_min_max_get(obj, "default", min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value)
-{
- eext_circle_object_item_value_min_max_set(obj, "default", min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value)
-{
- eext_circle_object_item_value_min_max_get(obj, "default", min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_value_set(Evas_Object *obj, double value)
-{
- eext_circle_object_item_value_set(obj, "default", value);
-}
-
-EAPI double
-eext_circle_object_value_get(const Evas_Object *obj)
-{
- return eext_circle_object_item_value_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
-{
- eext_circle_object_item_color_set(obj, "default", r, g, b, a);
-}
-
-EAPI void
-eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
-{
- eext_circle_object_item_color_get(obj, "default", r, g, b, a);
-}
-
-EAPI void
-eext_circle_object_radius_set(Evas_Object *obj, double radius)
-{
- eext_circle_object_item_radius_set(obj, "default", radius);
-}
-
-EAPI double
-eext_circle_object_radius_get(const Evas_Object *obj)
-{
- return eext_circle_object_item_radius_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- if (circle_obj->disabled == disabled) return;
-
- circle_obj->disabled = disabled;
-
- if (circle_obj->disabled_func)
- circle_obj->disabled_func(circle_obj);
-
- if (circle_obj->widget_object &&
- (elm_object_disabled_get(circle_obj->widget_object) != disabled))
- elm_object_disabled_set(circle_obj->widget_object, disabled);
-}
-
-EAPI Eina_Bool
-eext_circle_object_disabled_get(Evas_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE;
-
- return circle_obj->disabled;
-}
-
-EAPI Evas_Object *
-eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
- Eext_Circle_Object_Item *item;
-
- obj = elm_image_add(parent);
- _eext_circle_object_init(obj, NULL, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_append(circle_obj, item);
-
- return obj;
-}
-
-EAPI void
-eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_line_width_set(item, line_width);
-}
-
-EAPI int
-eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- return _eext_circle_object_item_line_width_get(item);
-
- return -1;
-}
-
-EAPI void
-eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_angle_set(item, angle);
-}
-
-EAPI double
-eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- return _eext_circle_object_item_angle_get(item);
-
- return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_angle_offset_set(item, angle_offset);
-}
-
-EAPI double
-eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- return _eext_circle_object_item_angle_offset_get(item);
-
- return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_angle_min_max_set(item, min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
- {
- if (min_angle) *min_angle = 0;
- if (max_angle) *max_angle = 0;
-
- return;
- }
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- {
- _eext_circle_object_item_angle_min_max_get(item, min_angle, max_angle);
- }
- else
- {
- if (min_angle) *min_angle = 0;
- if (max_angle) *max_angle = 0;
- }
-}
-
-EAPI void
-eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_value_min_max_set(item, min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
- {
- if (min_value) *min_value = 0;
- if (max_value) *max_value = 0;
-
- return;
- }
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- {
- _eext_circle_object_item_value_min_max_get(item, min_value, max_value);
- }
- else
- {
- if (min_value) *min_value = 0;
- if (max_value) *max_value = 0;
- }
-}
-
-EAPI void
-eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_value_set(item, value);
-}
-
-EAPI double
-eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- return _eext_circle_object_item_value_get(item);
-
- return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- {
- _eext_circle_object_item_color_set(item, r, g, b, a);
-
- if (circle_obj->color_changed_func)
- {
- if (item_name)
- circle_obj->color_changed_func(circle_obj, item_name);
- else
- circle_obj->color_changed_func(circle_obj, "default");
- }
- }
-}
-
-EAPI void
-eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
- {
- if (r) *r = 0;
- if (g) *g = 0;
- if (b) *b = 0;
- if (a) *a = 0;
-
- return;
- }
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- {
- _eext_circle_object_item_color_get(item, r, g, b, a);
- }
- else
- {
- if (r) *r = 0;
- if (g) *g = 0;
- if (b) *b = 0;
- if (a) *a = 0;
- }
-}
-
-EAPI void
-eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- _eext_circle_object_item_radius_set(item, radius);
-}
-
-EAPI double
-eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item = NULL;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
- item = _eext_circle_object_item_get(circle_obj, item_name);
-
- if (item)
- return _eext_circle_object_item_radius_get(item);
-
- return -1.0;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_DATETIME_TYPE "Eext_Circle_Object_Datetime"
-#define MIN_DAYS_IN_MONTH 28
-#define MAX_DAYS_IN_MONTH 31
-#define DATETIME_FIELD_NAME_BUF_MAX 8
-
-#define PICKER_MARK_PARTITION_COUNT_YEAR 50
-#define PICKER_MARK_ANGLE_MONTH 30
-#define PICKER_MARK_ANGLE_HOUR 30
-#define PICKER_MARK_ANGLE_MIN 6
-
-#define EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Datetime_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_DATETIME_TYPE)) \
- data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data; \
- if (!data)
-
-#define BG_FILE_COUNT 7
-
-#define DATETIME_ITEM_NAME "default"
-
-static const double BG_WIDTH = 360.0;
-static const double BG_HEIGHT = 360.0;
-static const double mark_width = 6;
-static const double mark_height =23;
-static const double radius = 168.5; //BG_HEIGHT / 2 - mark_height / 2;
-static const double mark_radius = 2.000317; //1 / sqrt(1 - pow(mark_width / 2 / radius , 2)) * 2;
-static const double ANIMATION_DURATION = 0.3;
-
-static char *bg_file_name[] = {
- "date_picker_day_28_bg",
- "date_picker_day_29_bg",
- "date_picker_day_30_bg",
- "date_picker_day_31_bg",
- "date_picker_month_bg",
- "date_picker_year_bg",
- "time_picker_bg",
- NULL
-};
-
-static const int picker_mark_angle_year[] =
-{0,7,14,21,28,36,43,50,57,64,72,79,86,93,100,108,115,122,129,136,144,151,158,165,172,180,187,194,201,208,216,223,230,237,244,252,259,266,273,280,288,295,302,309,316,324,331,338,345,352};
-
-static const int picker_mark_angle_day[4][31] =
-//28 day
-{{0,13,26,39,52,65,78,90,103,116,129,142,155,168,180,193,206,219,232,245,258,270,283,296,309,322,335,348},
-//29 day
-{0,13,25,38,50,63,75,87,100,112,125,137,149,162,174,187,199,211,224,236,249,261,273,286,298,311,323,335,348},
-//30 day
-{0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240,252,264,276,288,300,312,324,336,348},
-//31 day
-{0,12,24,36,47,59,70,82,93,105,116,128,139,151,163,175,186,198,209,221,232,244,255,267,278,290,302,314,325,337,349}};
-
-static void
-_eext_circle_object_datetime_picker_mark_angle_set(Eext_Circle_Object *obj, double angle, Eina_Bool anim)
-{
- double angle_offset, real_part;
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, DATETIME_ITEM_NAME);
- if (anim)
- {
- angle_offset = _eext_circle_object_item_angle_offset_get(item);
- real_part = angle_offset - (int)angle_offset;
-
- angle_offset = (int)angle_offset % 360 + real_part;
- if (angle_offset < 0.0) angle_offset += 360.0;
-
- if (angle - angle_offset > 180.0)
- angle_offset += 360.0;
- else if (angle_offset - angle > 180.0)
- angle_offset -= 360.0;
-
- _eext_circle_object_item_angle_offset_set(item, angle_offset - (mark_radius / 2));
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- mark_radius, angle - (mark_radius / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
- }
- else
- {
- _eext_circle_object_item_angle_offset_set(item, angle -(mark_radius / 2));
- _eext_circle_object_item_angle_set(item, mark_radius);
- }
-
- _eext_circle_object_changed(obj);
-}
-
-static int
-_max_days_get(int year, int month)
-{
- struct tm time1;
- time_t t;
- int day;
-
- t = time(NULL);
- localtime_r(&t, &time1);
- time1.tm_year = year;
- time1.tm_mon = month;
- for (day = MIN_DAYS_IN_MONTH; day <= MAX_DAYS_IN_MONTH; day++)
- {
- time1.tm_mday = day;
- /* FIXME: To restrict month wrapping because of summer time in some locales,
- * ignore day light saving mode in mktime(). */
- time1.tm_isdst = -1;
- mktime(&time1);
- if (time1.tm_mday == 1) break;
- }
-
- day--;
- return day;
-}
-
-static Evas_Object *
-_eext_circle_object_datetime_selected_field_object_get(Evas_Object *datetime)
-{
- Evas_Object *radio;
- Elm_Datetime_Field_Type type;
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
-
- for (type = ELM_DATETIME_YEAR; type < ELM_DATETIME_AMPM; type++)
- {
- snprintf(buf, sizeof(buf), "field%d", type);
- radio = elm_object_part_content_get(datetime, buf);
- if (radio)
- return elm_radio_selected_object_get(radio);
- }
-
- return NULL;
-}
-
-static void
-_eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim)
-{
- Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
- Evas_Object *datetime = obj->widget_object;
- Evas_Object *radio;
- struct tm t;
- int max_day;
- double picker_angle = 0.0;
-
- elm_datetime_value_get(datetime, &t);
-
- radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
- data->current_type = elm_radio_state_value_get(radio);
- data->rotary_angle = eext_circle_object_angle_get(datetime);
-
- switch (data->current_type)
- {
- case ELM_DATETIME_YEAR:
- obj->bg_image_index = 5;
- picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
- break;
- case ELM_DATETIME_MONTH:
- obj->bg_image_index = 4;
- picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
- break;
- case ELM_DATETIME_DATE:
- max_day = _max_days_get(t.tm_year, t.tm_mon);
- obj->bg_image_index = max_day % 28;
- picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
- break;
- case ELM_DATETIME_HOUR:
- picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
- obj->bg_image_index = 6;
- break;
- case ELM_DATETIME_MINUTE:
- picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
- obj->bg_image_index = 6;
- break;
- case ELM_DATETIME_AMPM:
- default:
- break;
- }
-
- _eext_circle_object_changed(obj);
-
-}
-
-static void
-_eext_circle_object_datetime_circle_update(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
- Evas_Object *datetime = obj->widget_object;
- struct tm t;
- int min, max;
-
- elm_datetime_value_get(datetime, &t);
- elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
-
- switch (data->current_type)
- {
- case ELM_DATETIME_YEAR:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_year);
- break;
- case ELM_DATETIME_MONTH:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_mon);
- break;
- case ELM_DATETIME_DATE:
- min = 1;
- max = _max_days_get(t.tm_year, t.tm_mon);
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_mday);
- break;
- case ELM_DATETIME_HOUR:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_hour);
- break;
- case ELM_DATETIME_MINUTE:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_min);
- break;
- case ELM_DATETIME_AMPM:
- eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
- eext_circle_object_value_set(datetime, (double)t.tm_hour);
- default:
- break;
- }
-
- data->rotary_angle = eext_circle_object_angle_get(datetime);
-}
-
-static void
-_eext_circle_object_datetime_radio_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (circle_obj->widget_object == event_info)
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
- else
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-
- _eext_circle_object_datetime_circle_update(circle_obj);
-}
-
-static void
-_eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-
- if (!widget_data->circle_changed)
- _eext_circle_object_datetime_circle_update(circle_obj);
-}
-
-static void
-_date_update(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
- Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
- Evas_Object *datetime = obj->widget_object;
- struct tm t;
- int min, max;
- int max_day;
- double picker_angle = 0.0;
-
- elm_datetime_value_get(datetime, &t);
- elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
-
- switch (data->current_type)
- {
- case ELM_DATETIME_YEAR:
- if (value_up) t.tm_year += 1;
- else t.tm_year -= 1;
-
- if (t.tm_year < min) t.tm_year = max;
- else if (t.tm_year > max) t.tm_year = min;
-
- picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
- break;
- case ELM_DATETIME_MONTH:
- if (value_up) t.tm_mon += 1;
- else t.tm_mon -= 1;
-
- if (t.tm_mon < min) t.tm_mon = max;
- else if (t.tm_mon > max) t.tm_mon = min;
-
- picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
- break;
- case ELM_DATETIME_DATE:
- if (value_up) t.tm_mday += 1;
- else t.tm_mday -= 1;
-
- int old_mday = t.tm_mday;
-
- if (t.tm_mday < min) t.tm_mday = max;
- else if (t.tm_mday > max) t.tm_mday = min;
- else
- {
- elm_datetime_value_set(datetime, &t);
- elm_datetime_value_get(datetime, &t);
- if (t.tm_mday < old_mday)
- {
- if (value_up) t.tm_mday = min;
- else
- {
- t.tm_mday = max;
- elm_datetime_value_set(datetime, &t);
- elm_datetime_value_get(datetime, &t);
- }
- }
- }
-
- max_day = _max_days_get(t.tm_year, t.tm_mon);
-
- picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
- break;
- case ELM_DATETIME_HOUR:
- if (value_up) t.tm_hour += 1;
- else t.tm_hour -= 1;
-
- if (t.tm_hour < min) t.tm_hour = max;
- else if (t.tm_hour > max) t.tm_hour = min;
-
- elm_datetime_value_set(datetime, &t);
- elm_datetime_value_get(datetime, &t);
-
- picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
- break;
- case ELM_DATETIME_MINUTE:
- if (value_up) t.tm_min += 1;
- else t.tm_min -= 1;
-
- if (t.tm_min < min) t.tm_min = max;
- else if (t.tm_min > max) t.tm_min = min;
-
- elm_datetime_value_set(datetime, &t);
- elm_datetime_value_get(datetime, &t);
- picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
- _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
- break;
- case ELM_DATETIME_AMPM:
- if (value_up && t.tm_hour < 12) t.tm_hour += 12;
- else if (t.tm_hour >= 12) t.tm_hour -= 12;
- default:
- break;
- }
-
- elm_datetime_value_set(datetime, &t);
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
-{
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *selected_radio;
-
- //Send rotary active signal to selected radio to off animation(Tizen_2.3.2 UX)
- selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
- elm_object_signal_emit(selected_radio, "elm,state,rotary,active", "eext");
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- _date_update(circle_obj, EINA_TRUE);
- else
- _date_update(circle_obj, EINA_FALSE);
-
- //for accessibility
- Eext_Circle_Object_Datetime_Data *datetime_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
- Evas_Object *datetime = circle_obj->widget_object;
- struct tm t;
- char buf_read_text[255];
- char buf_month[255];
- char buf_ampm[3];
- int idx = 0;
-
- elm_datetime_value_get(datetime, &t);
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
- elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
-
- switch(datetime_data->current_type)
- {
- case ELM_DATETIME_DATE:
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
- break;
- case ELM_DATETIME_MONTH:
- if(t.tm_mon == 0)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JANUARY"));
- else if(t.tm_mon == 1)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_FEBRUARY"));
- else if(t.tm_mon == 2)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MARCH"));
- else if(t.tm_mon == 3)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_APRIL"));
- else if(t.tm_mon == 4)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MAY"));
- else if(t.tm_mon == 5)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JUNE"));
- else if(t.tm_mon == 6)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JULY"));
- else if(t.tm_mon == 7)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_AUGUST"));
- else if(t.tm_mon == 8)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_SEPTEMBER"));
- else if(t.tm_mon == 9)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_OCTOBER"));
- else if(t.tm_mon == 10)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_NOVEMBER"));
- else if(t.tm_mon == 11)
- snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_DECEMBER"));
- snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
- break;
- case ELM_DATETIME_YEAR:
- snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
- break;
- case ELM_DATETIME_HOUR:
- if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
- (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
- snprintf(buf_ampm, sizeof(buf_ampm), _("WDS_TTS_TBBODY_PM"));
- else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
- (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
- snprintf(buf_ampm, sizeof(buf_ampm), _("WDS_TTS_TBBODY_AM"));
- else
- snprintf(buf_ampm, sizeof(buf_ampm), "");
-
- if (t.tm_hour > 12)
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
- else if (t.tm_hour == 0)
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
- else
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
-
- break;
- case ELM_DATETIME_MINUTE:
- snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
- break;
- }
- elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
- //
-
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
-{
- if (!obj) return;
-
- if (obj->widget_data)
- {
- free(obj->widget_data);
- obj->widget_data = NULL;
- }
-
- if (obj->bg_image_objs)
- {
- eina_list_free(obj->bg_image_objs);
- obj->bg_image_objs = NULL;
- }
-}
-
-static void
-_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
-{
- if (obj->disabled)
- {
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
- }
- else
- {
- eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
- }
-}
-
-static void
-_eext_circle_object_datetime_bg_image_append(Eext_Circle_Object *obj)
-{
- Evas_Object *bg_image;
- char buf[PATH_MAX];
- int i;
-
- for (i = 0; i <= BG_FILE_COUNT; i++)
- {
- bg_image = elm_image_add(obj->widget_object);
- snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[i]);
- elm_image_file_set(bg_image, buf, NULL);
- obj->bg_image_objs = eina_list_append(obj->bg_image_objs, bg_image);
- }
-
- obj->bg_image_index = BG_FILE_COUNT;
-}
-static char *
-_accessibility_item_make_trait(char *trait, char *unit)
-{
- sprintf(trait, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), unit);
- return strdup(trait);
-}
-
-//for accessibility
-static char *
-_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
-{
- char buf[255] = "";
- char buf_month[255];
- char buf_unit[255];
- char buf_ampm[255];
- char buf_trait[255];
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *datetime = circle_obj->widget_object;
- int idx = 0;
- int selected = -1;
- struct tm t;
- Evas_Object *radio;
-
- if(obj == elm_object_part_content_get(datetime, "field0"))
- {
- selected = ELM_DATETIME_DATE;
- }
- else if(obj == elm_object_part_content_get(datetime, "field1"))
- {
- selected = ELM_DATETIME_MONTH;
- }
- else if(obj == elm_object_part_content_get(datetime, "field2"))
- {
- selected = ELM_DATETIME_YEAR;
- }
- for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
- Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
- if (field_obj)
- {
- if(obj == field_obj)
- {
- selected = idx;
- }
- }
- }
-
- elm_datetime_value_get(datetime, &t);
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
-
- switch(selected)
- {
- case ELM_DATETIME_DATE:
- sprintf(buf_unit, _("WDS_TTS_TBBODY_DAY"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_MONTH:
- if(t.tm_mon == 0)
- sprintf(buf_month, _("WDS_TTS_TBBODY_JANUARY"));
- else if(t.tm_mon == 1)
- sprintf(buf_month, _("WDS_TTS_TBBODY_FEBRUARY"));
- else if(t.tm_mon == 2)
- sprintf(buf_month, _("WDS_TTS_TBBODY_MARCH"));
- else if(t.tm_mon == 3)
- sprintf(buf_month, _("WDS_TTS_TBBODY_APRIL"));
- else if(t.tm_mon == 4)
- sprintf(buf_month, _("WDS_TTS_TBBODY_MAY"));
- else if(t.tm_mon == 5)
- sprintf(buf_month, _("WDS_TTS_TBBODY_JUNE"));
- else if(t.tm_mon == 6)
- sprintf(buf_month, _("WDS_TTS_TBBODY_JULY"));
- else if(t.tm_mon == 7)
- sprintf(buf_month, _("WDS_TTS_TBBODY_AUGUST"));
- else if(t.tm_mon == 8)
- sprintf(buf_month, _("WDS_TTS_TBBODY_SEPTEMBER"));
- else if(t.tm_mon == 9)
- sprintf(buf_month, _("WDS_TTS_TBBODY_OCTOBER"));
- else if(t.tm_mon == 10)
- sprintf(buf_month, _("WDS_TTS_TBBODY_NOVEMBER"));
- else if(t.tm_mon == 11)
- sprintf(buf_month, _("WDS_TTS_TBBODY_DECEMBER"));
- sprintf(buf_unit, _("WDS_TTS_TBBODY_MONTH"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%s %s %s",buf_month, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_YEAR:
- sprintf(buf_unit, _("WDS_TTS_TBBODY_YEAR"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
- break;
- case ELM_DATETIME_AMPM:
- sprintf(buf_trait, _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
- if((double)t.tm_hour <= 12.0f)
- sprintf(buf_unit, _("WDS_TTS_TBBODY_AM"));
- else
- sprintf(buf_unit, _("WDS_TTS_TBBODY_PM"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%s %s",buf_unit, buf_trait);
- break;
- case ELM_DATETIME_HOUR:
- sprintf(buf_unit, _("WDS_TTS_TBBODY_HOUR"));
- if((double)t.tm_hour <= 12.0f)
- {
- sprintf(buf_ampm, _("WDS_TTS_TBBODY_AM"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour, buf_ampm, buf_unit, buf_trait);
- }
- else
- {
- sprintf(buf_ampm, _("WDS_TTS_TBBODY_PM"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour - (double)12.0f, buf_ampm, buf_unit, buf_trait);
- }
- break;
- case ELM_DATETIME_MINUTE:
- sprintf(buf_unit, _("WDS_TTS_TBBODY_MINUTE"));
- strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
- sprintf(buf, "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
- break;
- }
-
- return strdup(buf);
-
-}
-static void
-_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
- char buf[255] = "";
- char buf_month[255];
- char buf_unit[255];
- char buf_ampm[255];
- char buf_trait[255];
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *datetime = circle_obj->widget_object;
- int idx = 0;
- int selected = -1;
- struct tm t;
- Evas_Object *radio;
-
- if(obj == elm_object_part_content_get(datetime, "field0"))
- selected = ELM_DATETIME_DATE;
- else if(obj == elm_object_part_content_get(datetime, "field1"))
- selected = ELM_DATETIME_MONTH;
- else if(obj == elm_object_part_content_get(datetime, "field2"))
- selected = ELM_DATETIME_YEAR;
-
- for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
- Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
- if (field_obj)
- {
- if(obj == field_obj)
- {
- selected = idx;
- }
- }
- }
-
- radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
- if(selected == ELM_DATETIME_AMPM)
- elm_radio_value_set(radio, ELM_DATETIME_HOUR);
- else
- elm_radio_value_set(radio, selected);
-
- _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
-
- elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_set_cb, (Eext_Circle_Object*)circle_obj);
- elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-
- return EINA_TRUE;
-}
-//
-
-static void
-_eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
-{
- Eext_Circle_Object_Datetime_Data *data;
- Eext_Circle_Object_Item *item;
-
- char buf[DATETIME_FIELD_NAME_BUF_MAX];
- int idx;
-
- obj->widget_object = datetime;
- obj->widget_type = EEXT_CIRCLE_OBJECT_DATETIME_TYPE;
- obj->del_func = _eext_circle_object_datetime_del_cb;
- obj->disabled_func = _eext_circle_object_datetime_disabled_cb;
-
- data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
- obj->widget_data = (void *)data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
- _eext_circle_object_item_radius_set(item, radius);
- _eext_circle_object_item_line_width_set(item, mark_height);
- _eext_circle_object_item_angle_offset_set(item, item->angle_offset -(mark_radius / 2));
- _eext_circle_object_item_angle_set(item, mark_radius);
- _eext_circle_object_item_append(obj, item);
-
- elm_object_style_set(datetime, "datepicker/circle");
-
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "changed",
- _eext_circle_object_datetime_radio_changed_cb, obj);
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "changed",
- _eext_circle_object_datetime_radio_changed_cb, obj);
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
- _eext_circle_object_datetime_radio_changed_cb, obj);
- //for accessibility
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
- evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
- //
-
- for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
- {
- snprintf(buf, sizeof(buf), "field%d", idx);
-
- Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
- if (field_obj)
- {
- Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
- if (field_type != ELM_DATETIME_AMPM)
- evas_object_smart_callback_add(field_obj, "changed",
- _eext_circle_object_datetime_radio_changed_cb, obj);
- //for accessibility
- evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
- //
- }
- }
-
- evas_object_smart_callback_add(datetime, "changed",
- _eext_circle_object_datetime_changed_cb, obj);
-
- _eext_circle_object_datetime_current_type_update(obj, EINA_FALSE);
- _eext_circle_object_datetime_circle_update(obj);
-
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-
- _eext_circle_object_datetime_bg_image_append(obj);
-
-}
-
-EAPI Evas_Object *
-eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!datetime) return NULL;
-
- obj = elm_image_add(datetime);
- _eext_circle_object_init(obj, datetime, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_datetime_init(circle_obj, datetime);
-
- return obj;
-}
-
-/**
- * FIXME(150420) : After deciding how to support current types to application developer, we will define these APIs' name and parameters.
- *
-EAPI Elm_Datetime_Field_Type
-eext_circle_object_datetime_selected_field_type_get(const Evas_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return 0;
- EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return 0;
-
- return data->current_type;
-}
-
-EAPI void
-eext_circle_object_datetime_selected_field_type_set(Evas_Object *obj, Elm_Datetime_Field_Type type)
-{
- Evas_Object *radio;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return;
-
- if (data->current_type == type) return;
-
- radio = _eext_circle_object_datetime_selected_field_object_get(obj);
- elm_radio_value_set(radio, type);
- data->current_type = type;
- _eext_circle_object_datetime_circle_update(circle_obj);
-}
-*/
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist"
-
-#define VERTICAL_BAR_ANGLE_START 60.0
-#define VERTICAL_BAR_ANGLE_RANGE 60.0
-#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
-#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
-#define VERTICAL_BAR_TRANSIT_TIME 0.2
-#define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2
-#define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
-#define VERTICAL_BAR_WIDTH_SIZE 10
-#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
-
-#define SCROLL_BAR_COLOR_R 14
-#define SCROLL_BAR_COLOR_G 137
-#define SCROLL_BAR_COLOR_B 181
-#define SCROLL_BAR_COLOR_A 255
-
-#define SCROLL_BAR_BG_COLOR_R 250
-#define SCROLL_BAR_BG_COLOR_G 250
-#define SCROLL_BAR_BG_COLOR_B 250
-#define SCROLL_BAR_BG_COLOR_A 38
-
-#define SCROLL_BAR_COLOR_DISABLED_R 45
-#define SCROLL_BAR_COLOR_DISABLED_G 45
-#define SCROLL_BAR_COLOR_DISABLED_B 45
-#define SCROLL_BAR_COLOR_DISABLED_A 255
-
-#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
-
-#define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Genlist_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_GENLIST_TYPE)) \
- data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \
- if (!data)
-
-#define GENLIST_ITEM_NAME "default"
-#define GENLIST_BG_ITEM_NAME "vertical,scroll,bg"
-
-static void
-_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise)
-{
- Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
- Evas_Coord x, y, vw, vh;
- Elm_Object_Item *next_item;
-
- if (!obj) return;
-
- elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh);
- evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL);
-
- next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0);
-
- if (!next_item) return;
-
- if (clockwise)
- next_item = elm_genlist_item_next_get(next_item);
- else
- next_item = elm_genlist_item_prev_get(next_item);
-
- if (!next_item) return;
-
- elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- _eext_circle_object_genlist_region_show(data, EINA_TRUE);
- else
- _eext_circle_object_genlist_region_show(data, EINA_FALSE);
-
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item;
- Evas_Coord ch; /* content h */
- Evas_Coord py, vh; /* postion y, viewport h*/
- double ratio;
- double bar_pos_y = VERTICAL_BAR_ANGLE_START;
- double bar_size_y = VERTICAL_BAR_ANGLE_RANGE;
- double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
-
- if (!obj) return;
-
- item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-
- elm_scroller_child_size_get(obj->widget_object, NULL, &ch);
- elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh);
-
- if (ch > 0)
- {
- ratio = (double)ch / (double)vh;
-
- if (ratio == 0) return;
-
- if (ch > vh)
- {
- bar_size_y = vertical_bar_angle_range / ratio;
-
- if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
- bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
- if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
- bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
- }
- bar_pos_y += (double)py / ch * vertical_bar_angle_range;
-
- _eext_circle_object_item_angle_set(item, bar_size_y);
- _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
- }
-}
-
-static void
-_eext_circle_object_genlist_realized_cb(void *data,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
- if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
- _eext_circle_object_genlist_scrollbar_update(circle_obj);
-}
-
-static void
-_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item;
- int r, g, b, a;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
- item = _eext_circle_object_item_get(obj, item_name);
- if (!item) return;
-
- _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
- if (!strcmp(item_name, GENLIST_ITEM_NAME))
- {
- widget_data->color.r = r;
- widget_data->color.g = g;
- widget_data->color.b = b;
- widget_data->color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
- {
- widget_data->bg_color.r = r;
- widget_data->bg_color.g = g;
- widget_data->bg_color.b = b;
- widget_data->bg_color.a = a;
-
- return;
- }
-}
-
-static Eina_Bool
-_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
-{
- Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Item *item;
- Eina_List *l;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
-
- if (widget_data->realized_callback_added)
- {
- evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
- widget_data->realized_callback_added = EINA_FALSE;
- }
-
- EINA_LIST_FOREACH(obj->items, l, item)
- {
- _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME,
- 0, 0, 0, 0,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
-
- if (widget_data->bar_hide_timer)
- {
- ecore_timer_del(widget_data->bar_hide_timer);
- widget_data->bar_hide_timer = NULL;
- }
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
- double hide_waiting_time)
-{
- Eext_Circle_Object_Item *item;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
- if (widget_data->realized_callback_added)
- {
- evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
- widget_data->realized_callback_added = EINA_FALSE;
- }
-
- if (widget_data->bar_hide_timer)
- {
- ecore_timer_del(widget_data->bar_hide_timer);
- widget_data->bar_hide_timer = NULL;
- }
-
- item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
- if (obj->disabled)
- _eext_circle_object_item_color_set(item,
- widget_data->disabled_bg_color.r,
- widget_data->disabled_bg_color.g,
- widget_data->disabled_bg_color.b,
- widget_data->disabled_bg_color.a);
- else
- _eext_circle_object_item_color_set(item,
- widget_data->bg_color.r,
- widget_data->bg_color.g,
- widget_data->bg_color.b,
- widget_data->bg_color.a);
-
- item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
- if (obj->disabled)
- _eext_circle_object_item_color_set(item,
- widget_data->disabled_color.r,
- widget_data->disabled_color.g,
- widget_data->disabled_color.b,
- widget_data->disabled_color.a);
- else
- _eext_circle_object_item_color_set(item,
- widget_data->color.r,
- widget_data->color.g,
- widget_data->color.b,
- widget_data->color.a);
-
- if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
- {
- widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
- _eext_circle_object_genlist_scrollbar_policy_hide_cb,
- obj);
- }
-}
-
-static void
-_eext_circle_object_genlist_show_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
- if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
- _eext_circle_object_genlist_scrollbar_update(circle_obj);
- _eext_circle_object_genlist_scrollbar_show(circle_obj,
- VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
- if (!widget_data->realized_callback_added)
- {
- evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj);
- widget_data->realized_callback_added = EINA_TRUE;
- }
-}
-
-static void
-_eext_circle_object_genlist_scroll_cb(void *data,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
- if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
- _eext_circle_object_genlist_scrollbar_update(circle_obj);
- _eext_circle_object_genlist_scrollbar_show(circle_obj,
- VERTICAL_BAR_HIDE_WAITTING_TIME);
-}
-
-static void
-_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
- evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
- evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
-
- if (widget_data->realized_callback_added)
- {
- evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
- widget_data->realized_callback_added = EINA_FALSE;
- }
-
- if (widget_data->bar_hide_timer)
- {
- ecore_timer_del(widget_data->bar_hide_timer);
- widget_data->bar_hide_timer = NULL;
- }
-
- free(obj->widget_data);
- obj->widget_data = NULL;
-
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-}
-
-static void
-_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item;
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return;
-
- if (obj->disabled)
- {
- item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a);
-
- item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a);
-
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
- }
- else
- {
- item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->color.r,
- data->color.g,
- data->color.b,
- data->color.a);
-
- item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->bg_color.r,
- data->bg_color.g,
- data->bg_color.b,
- data->bg_color.a);
-
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
- }
-}
-
-static void
-_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
-{
- Eext_Circle_Object_Genlist_Data *data;
- Eext_Circle_Object_Item *item;
-
- obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
- obj->del_func = _eext_circle_object_genlist_del_cb;
- obj->disabled_func = _eext_circle_object_genlist_disabled_cb;
- obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
-
- data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
- data->policy_v = ELM_SCROLLER_POLICY_AUTO;
- data->color.r = SCROLL_BAR_COLOR_R;
- data->color.g = SCROLL_BAR_COLOR_G;
- data->color.b = SCROLL_BAR_COLOR_B;
- data->color.a = SCROLL_BAR_COLOR_A;
- data->bg_color.r = SCROLL_BAR_BG_COLOR_R;
- data->bg_color.g = SCROLL_BAR_BG_COLOR_G;
- data->bg_color.b = SCROLL_BAR_BG_COLOR_B;
- data->bg_color.a = SCROLL_BAR_BG_COLOR_A;
- data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
- data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
- data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
- data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
- data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
- data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
- data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
- data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
- obj->widget_data = (void *)data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->bg_color.r,
- data->bg_color.g,
- data->bg_color.b,
- data->bg_color.a);
- _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
- _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
- _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
- _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME);
- _eext_circle_object_item_color_set(item,
- data->color.r,
- data->color.g,
- data->color.b,
- data->color.a);
- _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
- _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
- _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
- evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
- evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!genlist) return NULL;
-
- obj = elm_image_add(genlist);
- _eext_circle_object_init(obj, genlist, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_genlist_init(circle_obj, genlist);
-
- return obj;
-}
-
-
-EAPI void
-eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
- Elm_Scroller_Policy policy_h,
- Elm_Scroller_Policy policy_v)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
- {
- ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
- EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
- return;
- }
-
- if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
- (policy_v >= ELM_SCROLLER_POLICY_LAST))
- return;
-
- data->policy_h = policy_h;
- data->policy_v = policy_v;
-
- if (data->policy_v == ELM_SCROLLER_POLICY_ON)
- {
- _eext_circle_object_genlist_scrollbar_update(circle_obj);
- _eext_circle_object_genlist_scrollbar_show(circle_obj,
- VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
- }
-}
-
-EAPI void
-eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj,
- Elm_Scroller_Policy *policy_h,
- Elm_Scroller_Policy *policy_v)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
- {
- if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
- if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
- return;
- }
-
- EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
- {
- ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
- EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
- if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
- if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
- return;
- }
-
- if (policy_h) *policy_h = data->policy_h;
- if (policy_v) *policy_v = data->policy_v;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item);
-static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item);
-
-static Eina_Bool
-_eext_circle_object_item_color_transit_animator_cb(void *data, double pos)
-{
- Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
- int diff_r, diff_g, diff_b, diff_a;
- double mapped_pos;
-
- diff_r = item->color_transit.from_color.r - item->color.r;
- diff_g = item->color_transit.from_color.g - item->color.g;
- diff_b = item->color_transit.from_color.b - item->color.b;
- diff_a = item->color_transit.from_color.a - item->color.a;
-
- item->color_transit.current_animator_pos = pos;
-
- if (item->color_transit.cubic_bezier_enabled)
- mapped_pos = ecore_animator_pos_map_n(pos,
- ECORE_POS_MAP_CUBIC_BEZIER,
- 4,
- item->color_transit.cubic_bezier_v);
- else
- mapped_pos = pos;
-
- item->draw.color.r = item->color_transit.from_color.r - diff_r * mapped_pos;
- item->draw.color.g = item->color_transit.from_color.g - diff_g * mapped_pos;
- item->draw.color.b = item->color_transit.from_color.b - diff_b * mapped_pos;
- item->draw.color.a = item->color_transit.from_color.a - diff_a * mapped_pos;
-
- _eext_circle_object_changed(item->obj);
-
- if (pos >= 1.0)
- {
- _eext_circle_object_item_color_transit_animator_del(item);
- return ECORE_CALLBACK_CANCEL;
- }
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_transit_animator_cb(void *data, double pos)
-{
- Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
- double diff_angle, diff_angle_offset;
- double mapped_pos;
-
- diff_angle = item->angle_transit.from_angle - item->angle;
- diff_angle_offset =
- item->angle_transit.from_angle_offset - item->angle_offset;
-
- item->angle_transit.current_animator_pos = pos;
-
- if (item->angle_transit.cubic_bezier_enabled)
- mapped_pos = ecore_animator_pos_map_n(pos,
- ECORE_POS_MAP_CUBIC_BEZIER,
- 4,
- item->angle_transit.cubic_bezier_v);
- else
- mapped_pos = pos;
-
- item->draw.angle = item->angle_transit.from_angle - diff_angle * mapped_pos;
- item->draw.angle_offset = item->angle_transit.from_angle_offset - diff_angle_offset * mapped_pos;
-
- _eext_circle_object_changed(item->obj);
-
- if (pos >= 1.0)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
- return ECORE_CALLBACK_CANCEL;
- }
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle)
-{
- double temp_angle;
-
- if (item->angle == angle) return EINA_FALSE;
-
- temp_angle = angle;
-
- if (angle < item->min_angle) temp_angle = item->min_angle;
- if (angle > item->max_angle) temp_angle = item->max_angle;
-
- if (item->angle == temp_angle) return EINA_FALSE;
-
- item->angle = temp_angle;
- item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
-
- return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item, double angle_offset)
-{
- if (item->angle_offset == angle_offset) return EINA_FALSE;
-
- item->angle_offset = angle_offset;
-
- return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value)
-{
- double angle;
-
- if (item->value == value) return EINA_FALSE;
-
- item->value = value;
-
- if (item->value < item->min_value) item->value = item->min_value;
- if (item->value > item->max_value) item->value = item->max_value;
-
- angle = _eext_circle_object_item_value_angle_get(item, item->value);
-
- if (item->angle == angle) return EINA_FALSE;
-
- item->angle = angle;
-
- return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_color_set_internal(Eext_Circle_Object_Item *item,
- int r, int g, int b, int a)
-{
- if (r > 255) r = 255; if (r < 0) r = 0;
- if (g > 255) g = 255; if (g < 0) g = 0;
- if (b > 255) b = 255; if (b < 0) b = 0;
- if (a > 255) a = 255; if (a < 0) a = 0;
-
- if ((item->color.r == r) && (item->color.g == g) && (item->color.b == b) && (item->color.a == a))
- return EINA_FALSE;
-
- item->color.r = r;
- item->color.g = g;
- item->color.b = b;
- item->color.a = a;
-
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item)
-{
- if (!item) return;
-
- if (item->color_transit.animator_cb)
- ecore_animator_del(item->color_transit.animator_cb);
-
- item->color_transit.animator_cb = NULL;
-}
-
-static void
-_eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item)
-{
- if (!item) return;
-
- if (item->angle_transit.animator_cb)
- ecore_animator_del(item->angle_transit.animator_cb);
-
- item->angle_transit.animator_cb = NULL;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_transit_set_internal(Eext_Circle_Object_Item *item, double duration,
- double to_angle, double to_angle_offset,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
- if (duration == 0.0) return EINA_FALSE;
- if ((item->angle_transit.duration == duration) &&
- (item->angle == to_angle) &&
- (item->angle_offset == to_angle_offset))
- return EINA_FALSE;
-
- if (item->angle_transit.animator_cb)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
-
- // If previous animator is never excuted, run animator callback manually once.
- if (item->angle_transit.current_animator_pos == 0.0)
- {
- double current_time = ecore_time_unix_get();
-
- if (item->angle_transit.start_time != current_time)
- {
- double pos = (current_time - item->angle_transit.start_time) /
- item->angle_transit.duration;
-
- _eext_circle_object_item_angle_transit_animator_cb(item, pos);
- }
- }
- }
-
- _eext_circle_object_item_angle_set_internal(item, to_angle);
- _eext_circle_object_item_angle_offset_set_internal(item, to_angle_offset);
-
- item->angle_transit.start_time = ecore_time_unix_get();
- item->angle_transit.current_animator_pos = 0.0;
- item->angle_transit.duration = duration;
- item->angle_transit.from_angle = item->draw.angle;
- item->angle_transit.from_angle_offset = item->draw.angle_offset;
- item->angle_transit.cubic_bezier_enabled = cubic_bezier_enabled;
-
- if (cubic_bezier_enabled)
- {
- item->angle_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
- item->angle_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
- item->angle_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
- item->angle_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
- }
-
- item->angle_transit.animator_cb = ecore_animator_timeline_add(duration,
- _eext_circle_object_item_angle_transit_animator_cb,
- item);
-
- return EINA_TRUE;
-}
-
-//////////////////////////////
-// Internal API //////////////
-//////////////////////////////
-double
-_eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value)
-{
- double angle;
-
- angle = item->min_angle;
- if (item->max_value != item->min_value)
- angle += (value - item->min_value) * (item->max_angle - item->min_angle) / (item->max_value - item->min_value);
-
- if (angle < item->min_angle) angle = item->min_angle;
- if (angle > item->max_angle) angle = item->max_angle;
-
- return angle;
-}
-
-double
-_eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle)
-{
- double value;
-
- value = item->min_value;
- if (item->max_angle != item->min_angle)
- value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle);
-
- if (value < item->min_value) value = item->min_value;
- if (value > item->max_value) value = item->max_value;
-
- return value;
-}
-
-const char *
-_eext_circle_text_font_get(const char *text, const char *font_family)
-{
- FcFontSet *set = NULL;
- FcPattern *p_nm = NULL;
- FcCharSet *c_set = NULL;
- FcValue family;
- FcResult result;
- Eina_Unicode u_str;
- int u_str_index = 0;
-
- if (!text || !font_family)
- return NULL;
-
- // Going to use first character.
- u_str = eina_unicode_utf8_next_get(text, &u_str_index);
-
- // Query font using FontConfig.
- c_set = FcCharSetCreate();
- p_nm = FcPatternBuild (NULL,
- FC_WEIGHT, FcTypeInteger, FC_WEIGHT_NORMAL,
- FC_SLANT, FcTypeInteger, FC_SLANT_ROMAN,
- FC_WIDTH, FcTypeInteger, FC_WIDTH_NORMAL,
- NULL);
-
- FcCharSetAddChar(c_set, (FcChar32)u_str);
- FcPatternAddCharSet(p_nm, FC_CHARSET, c_set);
- FcPatternAddString(p_nm, FC_FAMILY, (FcChar8 *)font_family);
- FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
- FcDefaultSubstitute(p_nm);
- set = FcFontSort(NULL, p_nm, FcTrue, NULL, &result);
-
- FcCharSetDestroy(c_set);
- FcPatternDestroy(p_nm);
-
- result = FcPatternGet(set->fonts[0], FC_FAMILY, 0, &family);
- FcFontSetSortDestroy(set);
-
- if (result == FcResultNoMatch)
- {
- ERR("Fail to Load Family Name to draw %s [%X]", text, u_str);
- return NULL;
- }
-
- return (const char *)family.u.s;
-}
-
-Eext_Circle_Object_Item *
-_eext_circle_object_item_new(void)
-{
- Eext_Circle_Object_Item *item;
-
- item = (Eext_Circle_Object_Item *)calloc(1, sizeof(Eext_Circle_Object_Item));
-
- // Initialize...
- item->name = eina_stringshare_add("default");
- item->angle = item->draw.angle = 0.0;
- item->angle_offset = item->draw.angle_offset = 0.0;
- item->min_angle = 0;
- item->max_angle = 360;
- item->min_value = 0;
- item->max_value = 360;
- item->radius = 176;
- item->line_width = 8;
- item->color.r = item->draw.color.r = 102;
- item->color.g = item->draw.color.g = 179;
- item->color.b = item->draw.color.b = 230;
- item->color.a = item->draw.color.a = 255;
-
- return item;
-}
-
-void
-_eext_circle_object_item_free(Eext_Circle_Object_Item *item)
-{
- if (!item) return;
-
- eina_stringshare_del(item->name);
-
- if (item->color_transit.animator_cb)
- _eext_circle_object_item_color_transit_animator_del(item);
-
- if (item->angle_transit.animator_cb)
- _eext_circle_object_item_angle_transit_animator_del(item);
-
- if (item->obj)
- _eext_circle_object_item_remove(item);
-
- free(item);
-}
-
-void
-_eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
-{
- if (!obj || !item) return;
-
- if (obj == item->obj)
- {
- ERR("You are trying to append the item that is already appended");
- return;
- }
-
- if (item->obj)
- {
- ERR("You are trying to append the item that is already appended to the other object!");
- return;
- }
-
- obj->items = eina_list_append(obj->items, item);
- item->obj = obj;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
-{
- if (!obj || !item) return;
-
- if (obj == item->obj)
- {
- ERR("You are trying to append the item that is already appended");
- return;
- }
-
- if (item->obj)
- {
- ERR("You are trying to append the item that is already appended to the other object!");
- return;
- }
-
- obj->items = eina_list_prepend(obj->items, item);
- item->obj = obj;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item)
-{
- if (!obj || !item) return;
-
- if (obj == item->obj)
- {
- ERR("You are trying to append the item that is already appended");
- return;
- }
-
- if (item->obj)
- {
- ERR("You are trying to append the item that is already appended to the other object!");
- return;
- }
-
- if (!before) _eext_circle_object_item_prepend(obj, item);
-
- obj->items = eina_list_prepend_relative(obj->items, item, before);
- item->obj = obj;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item)
-{
- if (!obj || !item) return;
-
- if (obj == item->obj)
- {
- ERR("You are trying to append the item that is already appended");
- return;
- }
-
- if (item->obj)
- {
- ERR("You are trying to append the item that is already appended to the other object!");
- return;
- }
-
- if (!after) _eext_circle_object_item_append(obj, item);
-
- obj->items = eina_list_append_relative(obj->items, item, after);
- item->obj = obj;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_remove(Eext_Circle_Object_Item *item)
-{
- if (!item || !item->obj) return;
-
- // You must have to free this item.
- item->obj->items = eina_list_remove(item->obj->items, item);
-
- _eext_circle_object_changed(item->obj);
- item->obj = NULL;
-}
-
-void
-_eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name)
-{
- if (!item) return;
-
- if (name)
- eina_stringshare_replace(&item->name, name);
- else
- eina_stringshare_replace(&item->name, "default");
-}
-
-const char *
-_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return NULL;
-
- return item->name;
-}
-
-void
-_eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width)
-{
- if (!item) return;
-
- if ((line_width <= 0) || (item->line_width == line_width)) return;
-
- item->line_width = line_width;
-
- _eext_circle_object_changed(item->obj);
-}
-
-int
-_eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1;
-
- return item->line_width;
-}
-
-void
-_eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle)
-{
- if (!item) return;
-
- if (item->angle_transit.animator_cb)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-
- if (_eext_circle_object_item_angle_set_internal(item, angle))
- {
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-}
-
-double
-_eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1.0;
-
- return item->angle;
-}
-
-void
-_eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset)
-{
- if (!item) return;
-
- if (_eext_circle_object_item_angle_offset_set_internal(item, angle_offset))
- {
- item->draw.angle_offset = item->angle_offset;
- _eext_circle_object_changed(item->obj);
- }
-}
-
-double
-_eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1.0;
-
- return item->angle_offset;
-}
-
-void
-_eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle)
-{
- double angle = 0.0;
-
- if (!item) return;
-
- if (item->angle_transit.animator_cb)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-
- if ((item->min_angle == min_angle) && (item->max_angle == max_angle)) return;
-
- item->min_angle = min_angle;
- item->max_angle = max_angle;
-
- if (item->angle < item->min_angle) angle = item->min_angle;
- if (item->angle > item->max_angle) angle = item->max_angle;
-
- if (item->angle == angle) return;
-
- item->angle = angle;
- item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
- item->draw.angle = item->angle;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item, double *min_angle, double *max_angle)
-{
- if (!item)
- {
- if (min_angle) *min_angle = 0.0;
- if (max_angle) *max_angle = 0.0;
-
- return;
- }
-
- if (min_angle) *min_angle = item->min_angle;
- if (max_angle) *max_angle = item->max_angle;
-}
-
-void
-_eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double min_value, double max_value)
-{
- double angle;
-
- if (!item) return;
-
- if (item->angle_transit.animator_cb)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-
- if ((item->min_value == min_value) && (item->max_value == max_value)) return;
-
- item->min_value = min_value;
- item->max_value = max_value;
-
- if (item->value < item->min_value) item->value = item->min_value;
- if (item->value > item->max_value) item->value = item->max_value;
-
- angle = _eext_circle_object_item_value_angle_get(item, item->value);
-
- if (item->angle == angle) return;
-
- item->angle = angle;
- item->draw.angle = item->angle;
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item, double *min_value, double *max_value)
-{
- if (!item)
- {
- if (min_value) *min_value = 0.0;
- if (max_value) *max_value = 0.0;
-
- return;
- }
-
- if (min_value) *min_value = item->min_value;
- if (max_value) *max_value = item->max_value;
-}
-
-void
-_eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value)
-{
- if (!item) return;
-
- if (item->angle_transit.animator_cb)
- {
- _eext_circle_object_item_angle_transit_animator_del(item);
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-
- if (_eext_circle_object_item_value_set_internal(item, value))
- {
- item->draw.angle = item->angle;
- _eext_circle_object_changed(item->obj);
- }
-}
-
-double
-_eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1.0;
-
- return item->value;
-}
-
-void
-_eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
- int r, int g, int b, int a)
-{
- if (!item) return;
-
- if (item->color_transit.animator_cb)
- {
- _eext_circle_object_item_color_transit_animator_del(item);
- item->draw.color.r = item->color.r;
- item->draw.color.g = item->color.g;
- item->draw.color.b = item->color.b;
- item->draw.color.a = item->color.a;
-
- _eext_circle_object_changed(item->obj);
- }
-
- if (_eext_circle_object_item_color_set_internal(item, r, g, b, a))
- {
- item->draw.color.r = item->color.r;
- item->draw.color.g = item->color.g;
- item->draw.color.b = item->color.b;
- item->draw.color.a = item->color.a;
-
- _eext_circle_object_changed(item->obj);
- }
-}
-
-void
-_eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
- int *r, int *g, int *b, int *a)
-{
- if (!item)
- {
- if (r) *r = 0;
- if (g) *g = 0;
- if (b) *b = 0;
- if (a) *a = 0;
-
- return;
- }
-
- if (r) *r = item->color.r;
- if (g) *g = item->color.g;
- if (b) *b = item->color.b;
- if (a) *a = item->color.a;
-}
-
-void
-_eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius)
-{
- if (!item) return;
-
- if (radius < 0.0) radius = 0.0; if (radius > 180.0) radius = 180.0;
-
- if (item->radius == radius) return;
-
- item->radius = radius;
-
- _eext_circle_object_changed(item->obj);
-}
-
-double
-_eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1.0;
-
- return item->radius;
-}
-
-void
-_eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
- const char *text,
- const char *font)
-{
- const char *selected_font;
-
- if (!item) return;
-
- if (font)
- eina_stringshare_replace(&item->font, font);
- else
- eina_stringshare_replace(&item->font, "Tizen");
-
- eina_stringshare_replace(&item->text, text);
-
- selected_font = _eext_circle_text_font_get(item->text, item->font);
-
- if (!selected_font)
- {
- ERR("There is no font for the text: %s", text);
- }
-
- eina_stringshare_replace(&item->selected_font, selected_font);
-
- _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
- const char **text,
- const char **font)
-{
- if (!item)
- {
- if (text) *text = NULL;
- if (font) *font = NULL;
-
- return;
- }
-
- if (text) *text = item->text;
- if (font) *font = item->font;
-}
-
-void
-_eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
- int font_size)
-{
- if (!item) return;
-
- if (item->font_size == font_size) return;
-
- item->font_size = font_size;
-
- _eext_circle_object_changed(item->obj);
-}
-
-int
-_eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1;
-
- return item->font_size;
-}
-
-void
-_eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
- int to_r, int to_g, int to_b, int to_a,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
- if (!item) return;
-
- if (duration == 0.0) return;
- if ((item->color_transit.duration == duration) &&
- (item->color.r == to_r) && (item->color.g == to_g) && (item->color.b == to_b) && (item->color.a == to_a))
- return;
-
- if (item->color_transit.animator_cb)
- {
- _eext_circle_object_item_color_transit_animator_del(item);
-
- if (item->color_transit.current_animator_pos == 0.0)
- {
- double current_time = ecore_time_unix_get();
-
- if (item->color_transit.start_time != current_time)
- {
- double pos = (current_time - item->color_transit.start_time) /
- item->color_transit.duration;
-
- _eext_circle_object_item_color_transit_animator_cb(item, pos);
- }
- }
- }
-
- _eext_circle_object_item_color_set_internal(item, to_r, to_g, to_b, to_a);
-
- item->color_transit.start_time = ecore_time_unix_get();
- item->color_transit.current_animator_pos = 0.0;
- item->color_transit.duration = duration;
- item->color_transit.from_color.r = item->draw.color.r;
- item->color_transit.from_color.g = item->draw.color.g;
- item->color_transit.from_color.b = item->draw.color.b;
- item->color_transit.from_color.a = item->draw.color.a;
- item->color_transit.cubic_bezier_enabled = cubic_bezier_enabled;
-
- if (cubic_bezier_enabled)
- {
- item->color_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
- item->color_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
- item->color_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
- item->color_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
- }
-
- item->color_transit.animator_cb = ecore_animator_timeline_add(duration,
- _eext_circle_object_item_color_transit_animator_cb,
- item);
-}
-
-
-void
-_eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
- double to_angle, double to_angle_offset,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
- Eina_Bool ret;
-
- if (!item) return;
-
- ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
- to_angle, to_angle_offset,
- cubic_bezier_enabled,
- cubic_bezier_p1_x, cubic_bezier_p1_y,
- cubic_bezier_p2_x, cubic_bezier_p2_y);
-
- if (ret)
- item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
-}
-
-void
-_eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
- double to_value,
- Eina_Bool cubic_bezier_enabled,
- double cubic_bezier_p1_x, double cubic_bezier_p1_y,
- double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
- Eina_Bool ret;
- double to_angle, to_angle_offset;
-
- if (!item) return;
-
- to_angle = _eext_circle_object_item_value_angle_get(item, to_value);
- to_angle_offset = item->angle_offset;
-
- ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
- to_angle, to_angle_offset,
- cubic_bezier_enabled,
- cubic_bezier_p1_x, cubic_bezier_p1_y,
- cubic_bezier_p2_x, cubic_bezier_p2_y);
-
- if (ret)
- item->value = to_value;
-}
-
-void
-_eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool enable)
-{
- if (!item) return;
-
- if (item->round_cap == enable) return;
-
- item->round_cap = enable;
-
- _eext_circle_object_changed(item->obj);
-}
-
-Eina_Bool
-_eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item)
-{
- if (!item) return -1;
-
- return item->round_cap;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE "Eext_Circle_Progressbar"
-
-#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Progressbar_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE)) \
- data = (Eext_Circle_Object_Progressbar_Data *)circle_obj->widget_data; \
- if (!data)
-
-#define PROGRESSBAR_ITEM_NAME "default"
-#define PROGRESSBAR_BG_ITEM_NAME "bg"
-
-#define PROGRESSBAR_COLOR_R 77
-#define PROGRESSBAR_COLOR_G 207
-#define PROGRESSBAR_COLOR_B 255
-#define PROGRESSBAR_COLOR_A 255
-
-#define PROGRESSBAR_BG_COLOR_R 0
-#define PROGRESSBAR_BG_COLOR_G 67
-#define PROGRESSBAR_BG_COLOR_B 115
-#define PROGRESSBAR_BG_COLOR_A 255
-
-#define PROGRESSBAR_COLOR_DISABLED_R 77
-#define PROGRESSBAR_COLOR_DISABLED_G 207
-#define PROGRESSBAR_COLOR_DISABLED_B 255
-#define PROGRESSBAR_COLOR_DISABLED_A 153
-
-#define PROGRESSBAR_BG_COLOR_DISABLED_R 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_G 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_B 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_A 255
-
-#define PROGRESSBAR_WIDTH_SIZE 8
-#define PROGRESSBAR_RADIUS_SIZE 176
-
-static void
-_eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj)
-{
- if (obj->widget_data)
- {
- free(obj->widget_data);
- obj->widget_data = NULL;
- }
-}
-
-static void
-_eext_circle_object_progressbar_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item;
- int r, g, b, a;
-
- EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, widget_data) return;
-
- item = _eext_circle_object_item_get(obj, item_name);
- if (!item) return;
-
- _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
- if (!strcmp(item_name, PROGRESSBAR_ITEM_NAME))
- {
- widget_data->color.r = r;
- widget_data->color.g = g;
- widget_data->color.b = b;
- widget_data->color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, PROGRESSBAR_BG_ITEM_NAME))
- {
- widget_data->bg_color.r = r;
- widget_data->bg_color.g = g;
- widget_data->bg_color.b = b;
- widget_data->bg_color.a = a;
-
- return;
- }
-}
-
-static void
-_eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item, *bg_item;
-
- EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
-
- item = _eext_circle_object_item_get(obj, PROGRESSBAR_ITEM_NAME);
- bg_item = _eext_circle_object_item_get(obj, PROGRESSBAR_BG_ITEM_NAME);
-
- if (obj->disabled)
- {
- if (item)
- _eext_circle_object_item_color_set(item,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a);
- if (bg_item)
- _eext_circle_object_item_color_set(bg_item,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a);
- }
- else
- {
- if (item)
- _eext_circle_object_item_color_set(item,
- data->color.r,
- data->color.g,
- data->color.b,
- data->color.a);
- if (bg_item)
- _eext_circle_object_item_color_set(bg_item,
- data->bg_color.r,
- data->bg_color.g,
- data->bg_color.b,
- data->bg_color.a);
- }
-}
-
-static void
-_eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item;
- Eext_Circle_Object_Progressbar_Data *data;
-
- obj->widget_object = NULL;
- obj->widget_type = EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE;
- obj->del_func = _eext_circle_object_progressbar_del_cb;
- obj->disabled_func = _eext_circle_object_progressbar_disabled_cb;
- obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb;
-
- data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data));
- data->color.r = PROGRESSBAR_COLOR_R;
- data->color.g = PROGRESSBAR_COLOR_G;
- data->color.b = PROGRESSBAR_COLOR_B;
- data->color.a = PROGRESSBAR_COLOR_A;
- data->bg_color.r = PROGRESSBAR_BG_COLOR_R;
- data->bg_color.g = PROGRESSBAR_BG_COLOR_G;
- data->bg_color.b = PROGRESSBAR_BG_COLOR_B;
- data->bg_color.a = PROGRESSBAR_BG_COLOR_A;
- data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R;
- data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G;
- data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B;
- data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A;
- data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
- data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
- data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
- data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
- obj->widget_data = (void *)data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME);
- _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
- _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
- _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
- _eext_circle_object_item_angle_set(item, 360);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, PROGRESSBAR_ITEM_NAME);
- _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
- _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
- _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
- _eext_circle_object_item_append(obj, item);
-}
-
-static char *
-_accessible_name_cb(void *data, Evas_Object *obj)
-{
- Evas_Object *progressbar;
- double value;
- char ret[255];
-
- progressbar = data;
- value = eext_circle_object_value_get(progressbar);
-
- snprintf(ret, sizeof(ret), "%d Percent", (int)value);
- return strdup(ret);
-}
-
-EAPI Evas_Object *
-eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!parent) return NULL;
-
- obj = elm_image_add(parent);
- _eext_circle_object_init(obj, NULL, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_progressbar_init(circle_obj);
-
- /* Accessibility */
- if (!surface)
- {
- elm_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_PROGRESS_BAR);
- elm_atspi_accessible_name_cb_set(obj, _accessible_name_cb, obj);
- }
- else
- {
- elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PROGRESS_BAR);
- elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj);
- }
-
- return obj;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_SCROLLER_TYPE "Eext_Circle_Object_Scroller"
-
-#define VERTICAL_BAR_NAME "default"
-#define VERTICAL_BAR_BG_NAME "vertical,scroll,bg"
-#define VERTICAL_BAR_ANGLE_START 60.0
-#define VERTICAL_BAR_ANGLE_RANGE 60.0
-#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
-#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
-
-#define HORIZONTAL_BAR_NAME "horizontal,scroll,bar"
-#define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg"
-#define HORIZONTAL_BAR_ANGLE_START -30.0
-#define HORIZONTAL_BAR_ANGLE_RANGE 60.0
-#define HORIZONTAL_BAR_ANGLE_MAX_SIZE 60.0
-#define HORIZONTAL_BAR_ANGLE_MIN_SIZE 6.0
-
-#define SCROLL_BAR_TRANSIT_TIME 0.2
-#define SCROLL_BAR_HIDE_WAITTING_TIME 10.2
-#define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
-#define SCROLL_BAR_WIDTH_SIZE 10
-#define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
-
-#define SCROLL_BAR_COLOR_R 14
-#define SCROLL_BAR_COLOR_G 137
-#define SCROLL_BAR_COLOR_B 181
-#define SCROLL_BAR_COLOR_A 255
-
-#define SCROLL_BAR_BG_COLOR_R 250
-#define SCROLL_BAR_BG_COLOR_G 250
-#define SCROLL_BAR_BG_COLOR_B 250
-#define SCROLL_BAR_BG_COLOR_A 38
-
-#define SCROLL_BAR_COLOR_DISABLED_R 45
-#define SCROLL_BAR_COLOR_DISABLED_G 45
-#define SCROLL_BAR_COLOR_DISABLED_B 45
-#define SCROLL_BAR_COLOR_DISABLED_A 255
-
-#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
-
-#define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Scroller_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \
- data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \
- if (!data)
-
-static void
-_eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item;
- int r, g, b, a;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return;
-
- item = _eext_circle_object_item_get(obj, item_name);
- if (!item) return;
-
- _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
- if (!strcmp(item_name, VERTICAL_BAR_NAME))
- {
- widget_data->vertical_color.r = r;
- widget_data->vertical_color.g = g;
- widget_data->vertical_color.b = b;
- widget_data->vertical_color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, VERTICAL_BAR_BG_NAME))
- {
- widget_data->vertical_bg_color.r = r;
- widget_data->vertical_bg_color.g = g;
- widget_data->vertical_bg_color.b = b;
- widget_data->vertical_bg_color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, HORIZONTAL_BAR_NAME))
- {
- widget_data->horizontal_color.r = r;
- widget_data->horizontal_color.g = g;
- widget_data->horizontal_color.b = b;
- widget_data->horizontal_color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, HORIZONTAL_BAR_BG_NAME))
- {
- widget_data->horizontal_bg_color.r = r;
- widget_data->horizontal_bg_color.g = g;
- widget_data->horizontal_bg_color.b = b;
- widget_data->horizontal_bg_color.a = a;
-
- return;
- }
-}
-
-static Eina_Bool
-_eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
-{
- Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Item *item, *bg_item;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
-
- if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
- {
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
- bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- 0, 0, 0, 0,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- 0, 0, 0, 0,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
-
- if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO)
- {
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
- bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- 0, 0, 0, 0,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- 0, 0, 0, 0,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
-
- if (widget_data->bar_hide_timer)
- {
- ecore_timer_del(widget_data->bar_hide_timer);
- widget_data->bar_hide_timer = NULL;
- }
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
- double hide_waiting_time)
-{
- Eext_Circle_Object_Item *item, *bg_item;
- Evas_Object *scroller = obj->widget_object;
- Evas_Coord cont_v = 0, cont_h = 0; /* content v/h */
- Evas_Coord pos_x = 0, pos_y = 0; /* postion x/y */
- Evas_Coord vp_v = 0, vp_h = 0; /* viewport v/h */
- double bar_pos_v = 0.0, bar_pos_h = 0.0; /* bar position v/h */
- double bar_size_v = 0.0, bar_size_h = 0.0; /* bar size v/h */
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
- elm_scroller_child_size_get(scroller, &cont_h, &cont_v);
- elm_scroller_region_get(scroller, &pos_y, &pos_x, &vp_h, &vp_v);
-
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
- bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-
- if ((cont_v > 0.0) && (vp_v > 0.0) &&
- (data->policy_v != ELM_SCROLLER_POLICY_OFF))
- {
- if (cont_v > vp_v)
- {
- bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)cont_v / (double)vp_v);
-
- if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
- bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
- if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
- bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
- }
- else
- bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
-
- bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)cont_v) * (double)pos_x;
- bar_pos_v += VERTICAL_BAR_ANGLE_START;
-
- _eext_circle_object_item_angle_offset_set(item, bar_pos_v);
- _eext_circle_object_item_angle_set(item, bar_size_v);
-
- if (obj->disabled)
- {
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
- else
- {
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- data->vertical_color.r,
- data->vertical_color.g,
- data->vertical_color.b,
- data->vertical_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- data->vertical_bg_color.r,
- data->vertical_bg_color.g,
- data->vertical_bg_color.b,
- data->vertical_bg_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
- }
- else
- {
- _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
- _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
- }
-
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
- bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-
- if ((cont_h > 0.0) && (vp_h > 0.0) &&
- (data->policy_h != ELM_SCROLLER_POLICY_OFF))
- {
- if (cont_h > vp_h)
- {
- bar_size_h = HORIZONTAL_BAR_ANGLE_RANGE / ((double)cont_h / (double)vp_h);
-
- if (bar_size_h > HORIZONTAL_BAR_ANGLE_MAX_SIZE)
- bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
- if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE)
- bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE;
- }
- else
- bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
-
- bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)cont_h) * (double)pos_y;
- bar_pos_h += HORIZONTAL_BAR_ANGLE_START;
-
- _eext_circle_object_item_angle_offset_set(item, bar_pos_h);
- _eext_circle_object_item_angle_set(item, bar_size_h);
-
- if (obj->disabled)
- {
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
- else
- {
- _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
- data->horizontal_color.r,
- data->horizontal_color.g,
- data->horizontal_color.b,
- data->horizontal_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
- data->horizontal_bg_color.r,
- data->horizontal_bg_color.g,
- data->horizontal_bg_color.b,
- data->horizontal_bg_color.a,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
- }
- }
- else
- {
- _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
- _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
- }
-
- if ((hide_waiting_time > 0.0) &&
- ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
- (data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
- {
- if (data->bar_hide_timer)
- ecore_timer_del(data->bar_hide_timer);
-
- data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
- _eext_circle_object_scroller_scrollbar_policy_hide_cb,
- obj);
- }
-}
-
-static void
-_eext_circle_object_scroller_scroll_cb(void *data,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
- if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
- (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
- return;
-
- _eext_circle_object_scroller_scrollbar_update(circle_obj,
- SCROLL_BAR_HIDE_WAITTING_TIME);
-}
-
-static void
-_eext_circle_object_scroller_show_cb(void *data,
- Evas *e,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
- if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
- (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
- return;
-
- _eext_circle_object_scroller_scrollbar_update(circle_obj,
- SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-static void
-_eext_circle_object_scroller_content_resize_cb(void *data,
- Evas_Object *obj,
- void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
- if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
- (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
- return;
-
- _eext_circle_object_scroller_scrollbar_update(circle_obj,
- SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-static Eina_Bool
-_eext_circle_object_scroller_rotary_changed_cb(void *data,
- Evas_Object *obj,
- Eext_Rotary_Event_Info *info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Evas_Object *scroller = circle_obj->widget_object;
- int h_pagesize, v_pagesize;
- int cw, ch;
- int x, y, w, h;
- int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1;
- Elm_Scroller_Movement_Block scroller_block;
- Eina_Bool scroll_locked_x, scroll_locked_y;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
-
- if (elm_object_scroll_freeze_get(scroller))
- return EINA_TRUE;
-
- elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
- elm_scroller_child_size_get(scroller, &cw, &ch);
- elm_scroller_region_get(scroller, &x, &y, &w, &h);
-
- scroller_block = elm_scroller_movement_block_get(scroller);
- scroll_locked_x = elm_object_scroll_lock_x_get(scroller);
- scroll_locked_y = elm_object_scroll_lock_y_get(scroller);
-
- if ((h_pagesize > 0) || (v_pagesize > 0))
- {
- int h_current_page, v_current_page;
-
- // Handle scroll per page
- elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page);
-
- if (!scroll_locked_y &&
- !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
- (ch > h) && (v_pagesize > 0))
- {
- v_current_page += d;
- }
- else if (!scroll_locked_x &&
- !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
- (cw > w) && (h_pagesize > 0))
- {
- h_current_page += d;
- }
-
- if (v_current_page < 0) v_current_page = 0;
- if (h_current_page < 0) h_current_page = 0;
-
- elm_scroller_page_bring_in(scroller, h_current_page,v_current_page);
- }
- else
- {
- // Handle scroll
- if (!scroll_locked_y &&
- !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
- (ch > h))
- {
- y += d * widget_data->step_y;
- }
- else if (!scroll_locked_x &&
- !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
- (cw > w))
- {
- x += d * widget_data->step_x;
- }
-
- if (y < 0) y = 0;
- if (x < 0) x = 0;
-
- elm_scroller_region_bring_in(scroller, x, y, w, h);
- }
-
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
- evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
- evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
- evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
- eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
-
- if (data->bar_hide_timer)
- {
- ecore_timer_del(data->bar_hide_timer);
- data->bar_hide_timer = NULL;
- }
-
- free(obj->widget_data);
- obj->widget_data = NULL;
-}
-
-static void
-_eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item;
-
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
- if (obj->disabled)
- {
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a);
-
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a);
-
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a);
-
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a);
-
- eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
- eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
- }
- else
- {
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->vertical_color.r,
- data->vertical_color.g,
- data->vertical_color.b,
- data->vertical_color.a);
-
- item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->vertical_bg_color.r,
- data->vertical_bg_color.g,
- data->vertical_bg_color.b,
- data->vertical_bg_color.a);
-
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->horizontal_color.r,
- data->horizontal_color.g,
- data->horizontal_color.b,
- data->horizontal_color.a);
-
- item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->horizontal_bg_color.r,
- data->horizontal_bg_color.g,
- data->horizontal_bg_color.b,
- data->horizontal_bg_color.a);
-
- eext_rotary_object_event_callback_add(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
- }
-}
-
-static void
-_eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller)
-{
- Eext_Circle_Object_Scroller_Data *data;
- Eext_Circle_Object_Item *item;
-
- obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE;
- obj->del_func = _eext_circle_object_scroller_del_cb;
- obj->disabled_func = _eext_circle_object_scroller_disabled_cb;
- obj->color_changed_func = _eext_circle_object_scroller_color_changed_cb;
-
- data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data));
- data->policy_v = ELM_SCROLLER_POLICY_AUTO;
- data->policy_h = ELM_SCROLLER_POLICY_AUTO;
- data->line_width = SCROLL_BAR_WIDTH_SIZE;
- data->radius = SCROLL_BAR_RADIUS_SIZE;
- data->step_x = data->step_y = 32;
- data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R;
- data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G;
- data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B;
- data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A;
- data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R;
- data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G;
- data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B;
- data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A;
- data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
- data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
- data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
- data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
- data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
- data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
- data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
- data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
- obj->widget_data = (void *)data;
-
- // We don't want to allow to change properties of these items.
- // There is no item with "default" as its name.
- // So, eext_circle_object_* APIs is meaningless in here.
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, VERTICAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->vertical_bg_color.r,
- data->vertical_bg_color.g,
- data->vertical_bg_color.b,
- 0);
- _eext_circle_object_item_line_width_set(item, data->line_width);
- _eext_circle_object_item_radius_set(item, data->radius);
- _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
- _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_BG_NAME);
- _eext_circle_object_item_color_set(item,
- data->horizontal_bg_color.r,
- data->horizontal_bg_color.g,
- data->horizontal_bg_color.b,
- 0);
- _eext_circle_object_item_line_width_set(item, data->line_width);
- _eext_circle_object_item_radius_set(item, data->radius);
- _eext_circle_object_item_angle_offset_set(item, HORIZONTAL_BAR_ANGLE_START);
- _eext_circle_object_item_angle_set(item, HORIZONTAL_BAR_ANGLE_RANGE);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, VERTICAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->vertical_color.r,
- data->vertical_color.g,
- data->vertical_color.b,
- data->vertical_color.a);
- _eext_circle_object_item_line_width_set(item, data->line_width);
- _eext_circle_object_item_radius_set(item, data->radius);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_NAME);
- _eext_circle_object_item_color_set(item,
- data->horizontal_color.r,
- data->horizontal_color.g,
- data->horizontal_color.b,
- data->horizontal_color.a);
- _eext_circle_object_item_line_width_set(item, data->line_width);
- _eext_circle_object_item_radius_set(item, data->radius);
- _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
- _eext_circle_object_item_append(obj, item);
-
- elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
- evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
- evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
- evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
-
- eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
- eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!scroller) return NULL;
-
- obj = elm_image_add(scroller);
- _eext_circle_object_init(obj, scroller, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_scroller_init(circle_obj, scroller);
-
- return obj;
-}
-
-EAPI void
-eext_circle_object_scroller_policy_set(Evas_Object *obj,
- Elm_Scroller_Policy policy_h,
- Elm_Scroller_Policy policy_v)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
-
- if ((data->policy_v == policy_v) && (data->policy_h == policy_h))
- return;
-
- if (policy_v < ELM_SCROLLER_POLICY_LAST)
- data->policy_v = policy_v;
-
- if (policy_h < ELM_SCROLLER_POLICY_LAST)
- data->policy_h = policy_h;
-
- _eext_circle_object_scroller_scrollbar_update(circle_obj,
- SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-EAPI void
-eext_circle_object_scroller_policy_get(const Evas_Object *obj,
- Elm_Scroller_Policy *policy_h,
- Elm_Scroller_Policy *policy_v)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
-
- if (policy_v) *policy_v = data->policy_v;
- if (policy_h) *policy_h = data->policy_h;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_SLIDER_TYPE "Eext_Circle_Object_Slider"
-
-#define SLIDER_TRANSIT_TIME 0.3
-
-#define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Slider_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SLIDER_TYPE)) \
- data = (Eext_Circle_Object_Slider_Data *)circle_obj->widget_data; \
- if (!data)
-
-#define SLIDER_ITEM_NAME "default"
-#define SLIDER_BG_ITEM_NAME "bg"
-
-#define SLIDER_COLOR_R 77
-#define SLIDER_COLOR_G 207
-#define SLIDER_COLOR_B 255
-#define SLIDER_COLOR_A 255
-
-#define SLIDER_BG_COLOR_R 0
-#define SLIDER_BG_COLOR_G 67
-#define SLIDER_BG_COLOR_B 115
-#define SLIDER_BG_COLOR_A 255
-
-#define SLIDER_COLOR_DISABLED_R 77
-#define SLIDER_COLOR_DISABLED_G 207
-#define SLIDER_COLOR_DISABLED_B 255
-#define SLIDER_COLOR_DISABLED_A 153
-
-#define SLIDER_BG_COLOR_DISABLED_R 64
-#define SLIDER_BG_COLOR_DISABLED_G 64
-#define SLIDER_BG_COLOR_DISABLED_B 64
-#define SLIDER_BG_COLOR_DISABLED_A 255
-
-#define SLIDER_WIDTH_SIZE 8
-#define SLIDER_RADIUS_SIZE 176
-
-static const char SIG_VALUE_CHANGED[] = "value,changed";
-
-static void
-_eext_circle_object_slider_del_cb(Eext_Circle_Object *obj)
-{
- if (obj->widget_data)
- {
- free(obj->widget_data);
- obj->widget_data = NULL;
- }
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
- Evas_Object *slider = obj;
- double current_value;
- double next_value;
- double min, max;
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj);
- EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data);
-
- Eext_Circle_Object_Item *item = NULL;
- item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
-
- current_value = _eext_circle_object_item_value_get(item);
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- next_value = current_value + widget_data->value_step;
- else
- next_value = current_value - widget_data->value_step;
-
- _eext_circle_object_item_value_min_max_get(item, &min, &max);
-
- if (next_value < min) next_value = min;
- else if (next_value > max) next_value = max;
-
- _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME,
- next_value,
- EINA_TRUE,
- 0.25, 0.46, 0.45, 1.0);
-
- evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
-
- /* Accessibility */
- if (elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- const char *slider_desc = NULL;
- slider_desc = elm_atspi_accessible_description_get(slider);
- if (slider_desc && strlen(slider_desc) > 0)
- elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL);
- }
-
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_slider_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
- Eext_Circle_Object_Item *item;
- int r, g, b, a;
-
- EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, widget_data) return;
-
- item = _eext_circle_object_item_get(obj, item_name);
- if (!item) return;
-
- _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
- if (!strcmp(item_name, SLIDER_ITEM_NAME))
- {
- widget_data->color.r = r;
- widget_data->color.g = g;
- widget_data->color.b = b;
- widget_data->color.a = a;
-
- return;
- }
-
- if (!strcmp(item_name, SLIDER_BG_ITEM_NAME))
- {
- widget_data->bg_color.r = r;
- widget_data->bg_color.g = g;
- widget_data->bg_color.b = b;
- widget_data->bg_color.a = a;
-
- return;
- }
-}
-
-static void
-_eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Item *item, *bg_item;
-
- EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
-
- item = _eext_circle_object_item_get(obj, SLIDER_ITEM_NAME);
- bg_item = _eext_circle_object_item_get(obj, SLIDER_BG_ITEM_NAME);
-
- if (obj->disabled)
- {
- if (item)
- _eext_circle_object_item_color_set(item,
- data->disabled_color.r,
- data->disabled_color.g,
- data->disabled_color.b,
- data->disabled_color.a);
- if (bg_item)
- _eext_circle_object_item_color_set(bg_item,
- data->disabled_bg_color.r,
- data->disabled_bg_color.g,
- data->disabled_bg_color.b,
- data->disabled_bg_color.a);
-
- eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
- }
- else
- {
- if (item)
- _eext_circle_object_item_color_set(item,
- data->color.r,
- data->color.g,
- data->color.b,
- data->color.a);
- if (bg_item)
- _eext_circle_object_item_color_set(bg_item,
- data->bg_color.r,
- data->bg_color.g,
- data->bg_color.b,
- data->bg_color.a);
-
- eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
- }
-}
-
-static void
-_eext_circle_object_slider_init(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Slider_Data *data;
- Eext_Circle_Object_Item *item;
-
- obj->widget_object = NULL;
- obj->widget_type = EEXT_CIRCLE_OBJECT_SLIDER_TYPE;
- obj->del_func = _eext_circle_object_slider_del_cb;
- obj->disabled_func = _eext_circle_object_slider_disabled_cb;
- obj->color_changed_func = _eext_circle_object_slider_color_changed_cb;
-
- data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data));
- data->value_step = 1.0;
- data->color.r = SLIDER_COLOR_R;
- data->color.g = SLIDER_COLOR_G;
- data->color.b = SLIDER_COLOR_B;
- data->color.a = SLIDER_COLOR_A;
- data->bg_color.r = SLIDER_BG_COLOR_R;
- data->bg_color.g = SLIDER_BG_COLOR_G;
- data->bg_color.b = SLIDER_BG_COLOR_B;
- data->bg_color.a = SLIDER_BG_COLOR_A;
- data->disabled_color.r = SLIDER_COLOR_DISABLED_R;
- data->disabled_color.g = SLIDER_COLOR_DISABLED_G;
- data->disabled_color.b = SLIDER_COLOR_DISABLED_B;
- data->disabled_color.a = SLIDER_COLOR_DISABLED_A;
- data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R;
- data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G;
- data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B;
- data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A;
- obj->widget_data = data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, SLIDER_BG_ITEM_NAME);
- _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
- _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
- _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
- _eext_circle_object_item_angle_set(item, 360);
- _eext_circle_object_item_append(obj, item);
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, SLIDER_ITEM_NAME);
- _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
- _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
- _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
- _eext_circle_object_item_value_min_max_set(item, 0, 10);
- _eext_circle_object_item_value_set(item, 0);
- _eext_circle_object_item_append(obj, item);
-
- eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
-}
-
-static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
-{
- char *ret;
- char *buf[255];
- Eina_Strbuf *sbuf;
- const char *slider_name;
- Evas_Object *slider;
-
- sbuf = eina_strbuf_new();
- slider = data;
- slider_name = elm_atspi_accessible_name_get(slider);
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
- if (!slider_name) slider = "Slider";
-
- eina_strbuf_append(sbuf, slider_name);
- eina_strbuf_append(sbuf, ", ");
-
- snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), slider_name);
- eina_strbuf_append(sbuf, buf);
-
- ret = eina_strbuf_string_steal(sbuf);
- eina_strbuf_free(sbuf);
- return ret;
-}
-
-EAPI Evas_Object *
-eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!parent) return NULL;
-
- obj = elm_image_add(parent);
- _eext_circle_object_init(obj, NULL, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_slider_init(circle_obj);
-
- /* TODO: Reading information should be changed with UX team */
- /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */
- elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON);
- elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj);
- elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- return obj;
-}
-
-EAPI void
-eext_circle_object_slider_step_set(Evas_Object *obj, double step)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
-
- double min, max;
- Eext_Circle_Object_Item *item = NULL;
- item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
-
- if (widget_data->value_step == step) return;
-
- _eext_circle_object_item_value_min_max_get(item, &min, &max);
-
- if (step < min) step = min;
- else if (step > max) step = max;
-
- widget_data->value_step = step;
-}
-
-EAPI double
-eext_circle_object_slider_step_get(const Evas_Object *obj)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
- EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return -1.0;
-
- return widget_data->value_step;
-}
-
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_SPINNER_TYPE "Eext_Circle_Object_Spinner"
-#define SPINNER_ITEM_NAME "default"
-
-#define EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, data) \
- Eext_Circle_Object_Spinner_Data *data = NULL; \
- if (circle_obj && circle_obj->widget_data && \
- circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SPINNER_TYPE)) \
- data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
- if (!data)
-
-static const double MARK_WIDTH = 6.0;
-static const double MARK_HEIGHT = 23.0;
-static const double RADIUS = 168.5; //BG_HEIGHT / 2 - MARK_HEIGHT / 2;
-static const double MARK_RADIUS = 2.000317;
-// chord = 2 * radius * sin(x/2), x = arcsin(sin(x)), arcsin(x) = 1 / sqrt(1 - pow(x, 2))
-
-static const double END_EFFECT_ANGLE = 15.0;
-
-static const double ANIMATION_DURATION = 0.3;
-
-// ----------------------------------------- animation API --------------------------------------//
-static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-
-static void
-_eext_circle_object_spinner_mark_angle_offset_set(Eext_Circle_Object *obj, double angle)
-{
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
- _eext_circle_object_item_angle_offset_set(item, angle - (MARK_RADIUS / 2));
- _eext_circle_object_item_angle_set(item, MARK_RADIUS);
-}
-
-static Eina_Bool
-_end_effect_expired_timer_cb(void *data)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
-
- widget_data->end_effect_expired_timer = NULL;
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_spinner_mark_update(Eext_Circle_Object *obj, Eina_Bool animate)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-
- if (evas_object_visible_get(obj->widget_object) && animate)
- {
- Eext_Circle_Object_Item *item;
-
- item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
- if (widget_data->end_effect_angle)
- {
- if (widget_data->end_effect_expired_timer) return;
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset + widget_data->end_effect_angle - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
-
- widget_data->end_effect_expired_timer = ecore_timer_add(ANIMATION_DURATION, _end_effect_expired_timer_cb, obj);
- }
- else
- {
- if (widget_data->end_effect_expired_timer)
- {
- ecore_timer_del(widget_data->end_effect_expired_timer);
- widget_data->end_effect_expired_timer = NULL;
- }
-
- _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
- MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
- EINA_TRUE,
- 0.25, 0.46,
- 0.45, 1.0);
- }
- }
- else
- _eext_circle_object_spinner_mark_angle_offset_set(obj, widget_data->to_angle_offset);
-}
-
-static double
-_eext_circle_object_spinner_angle_get(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double min, max, angle;
-
- if (widget_data->angle) return widget_data->angle;
-
- elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
- if (elm_spinner_wrap_get(obj->widget_object))
- angle = 360 / (max - min + 1);
- else
- {
- if (min == max)
- angle = 0.0;
- else
- angle = 360 / (max - min);
- }
-
- return angle;
-}
-
-static double
-_eext_circle_object_spinner_angle_offset_get(Eext_Circle_Object *obj, double val)
-{
- double min, angle_offset, real_part;
-
- elm_spinner_min_max_get(obj->widget_object, &min, NULL);
-
- angle_offset = (val - min) * _eext_circle_object_spinner_angle_get(obj);
- real_part = angle_offset - (int)angle_offset;
- angle_offset = (int)angle_offset % 360 + real_part;
-
- return angle_offset;
-}
-
-static void
-_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double val;
-
- val = elm_spinner_value_get(obj->widget_object);
-
- widget_data->to_angle_offset = _eext_circle_object_spinner_angle_offset_get(obj, val);
-
- _eext_circle_object_spinner_mark_update(obj, EINA_FALSE);
-}
-
-static void
-_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
- if (widget_data->rotary_event)
- _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
- else
- _eext_circle_object_spinner_update(circle_obj);
-}
-
-static double
-_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
-{
- double angle_distance = 0;
-
- if (value_up)
- {
- if (from_angle_offset > to_angle_offset)
- angle_distance = 360 - from_angle_offset + to_angle_offset;
- else if (from_angle_offset < to_angle_offset)
- angle_distance = to_angle_offset - from_angle_offset;
- }
- else
- {
- if (from_angle_offset > to_angle_offset)
- angle_distance = from_angle_offset - to_angle_offset;
- else if (from_angle_offset < to_angle_offset)
- angle_distance = from_angle_offset + 360 - to_angle_offset;
- }
-
- return angle_distance;
-}
-
-static void
-_eext_circle_object_spinner_value_update(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- double val, step, min, max;
-
- val = elm_spinner_value_get(obj->widget_object);
-
- step = elm_spinner_step_get(obj->widget_object);
- elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
- widget_data->end_effect_angle = 0.0;
-
- if (elm_spinner_wrap_get(obj->widget_object))
- {
- if (value_up)
- {
- if (val + step > max)
- {
- widget_data->to_angle_offset += _looping_angle_distance_get(
- _eext_circle_object_spinner_angle_offset_get(obj, max),
- _eext_circle_object_spinner_angle_offset_get(obj, min),
- value_up);
- val = min;
- }
- else
- {
- widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
- val += step;
- }
- }
- else
- {
- if (val - step < min)
- {
- widget_data->to_angle_offset -= _looping_angle_distance_get(
- _eext_circle_object_spinner_angle_offset_get(obj, min),
- _eext_circle_object_spinner_angle_offset_get(obj, max),
- value_up);
- val = max;
- }
- else
- {
- widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
- val -= step;
- }
- }
- }
- else
- {
- if (value_up)
- {
- if (val + step > max)
- {
- if (val == max)
- widget_data->end_effect_angle = END_EFFECT_ANGLE;
- else
- widget_data->to_angle_offset += widget_data->angle * (max - val);
- }
- else
- widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
-
- val += step;
- }
- else
- {
- if (val - step < min)
- {
- if (val == min)
- widget_data->end_effect_angle = -END_EFFECT_ANGLE;
- else
- widget_data->to_angle_offset -= widget_data->angle * (val - min);
- }
- else
- widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
-
- val -= step;
- }
- }
-
- widget_data->rotary_event = EINA_TRUE;
- elm_spinner_value_set(obj->widget_object, val);
- widget_data->rotary_event = EINA_FALSE;
-}
-
-static Eina_Bool
-_rotary_timer_cb(void *data)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
- Eext_Circle_Object_Item *item;
- double angle_offset_diff;
-
- item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
- if (!item) return ECORE_CALLBACK_CANCEL;
-
- angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
- - item->draw.angle_offset);
-
- if (angle_offset_diff <= 1.0e-8)
- elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
- "elm,state,rotary,inactive", "eext");
-
- widget_data->rotary_timer = NULL;
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
- elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
- "elm,state,rotary,active", "eext");
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- _eext_circle_object_spinner_value_update(circle_obj, EINA_TRUE);
- else
- _eext_circle_object_spinner_value_update(circle_obj, EINA_FALSE);
-
- if (widget_data->rotary_timer)
- {
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
-
- widget_data->rotary_timer = ecore_timer_add(1.0, _rotary_timer_cb, circle_obj);
-
- /* Accessibility */
- if (elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- double val;
- char buf[255];
- char *buf_val = NULL;
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
- val = elm_spinner_value_get(circle_obj->widget_object);
- buf_val = elm_layout_text_get(btn, "elm.text");
- if(buf_val)
- snprintf(buf, sizeof(buf), "%s",buf_val);
- else
- snprintf(buf, sizeof(buf), "%.0f",val);
- elm_atspi_bridge_utils_say((const char*)buf, EINA_TRUE, NULL, NULL);
- }
- return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
-{
- if (!obj) return;
-
- if (obj->widget_data)
- {
- Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
- if (widget_data->end_effect_expired_timer)
- {
- ecore_timer_del(widget_data->end_effect_expired_timer);
- widget_data->end_effect_expired_timer = NULL;
- }
-
- if (widget_data->rotary_timer)
- {
- ecore_timer_del(widget_data->rotary_timer);
- widget_data->rotary_timer = NULL;
- }
-
- free(obj->widget_data);
- obj->widget_data = NULL;
- }
-}
-
-static void
-_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
-{
- if (obj->disabled)
- eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
- else
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-}
-
-static void
-_eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
-{
- Eext_Circle_Object_Spinner_Data *data;
- Eext_Circle_Object_Item *item;
-
- obj->widget_object = spinner;
- obj->widget_type = EEXT_CIRCLE_OBJECT_SPINNER_TYPE;
- obj->del_func = _eext_circle_object_spinner_del_cb;
- obj->disabled_func = _eext_circle_object_spinner_disabled_cb;
- obj->visible_on_activate = EINA_TRUE;
-
- data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data));
- obj->widget_data = (void *)data;
-
- item = _eext_circle_object_item_new();
- _eext_circle_object_item_name_set(item, SPINNER_ITEM_NAME);
- _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
- _eext_circle_object_item_radius_set(item, RADIUS);
- _eext_circle_object_item_line_width_set(item, MARK_HEIGHT);
- _eext_circle_object_item_angle_offset_set(item, item->angle_offset - (MARK_RADIUS / 2));
- _eext_circle_object_item_angle_set(item, MARK_RADIUS);
- _eext_circle_object_item_append(obj, item);
-
- elm_spinner_editable_set(spinner, EINA_FALSE);
-
- evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
-
- //for accessibility
- evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,highlighted", _accessibility_spinner_highlighted_cb, obj);
- //
-
- eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface)
-{
- Evas_Object *obj;
-
- if (!spinner) return NULL;
-
- obj = elm_image_add(spinner);
- _eext_circle_object_init(obj, spinner, surface);
-
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
- _eext_circle_object_spinner_init(circle_obj, spinner);
-
- return obj;
-}
-
-EAPI void
-eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle)
-{
- EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
- EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
- if ((angle <= 0) || (widget_data->angle == angle)) return;
-
- widget_data->angle = angle;
-}
-static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
-{
- Eext_Circle_Object *circle_obj = data;
- double val;
- char buf_desc[255];
- char buf[255];
- char *buf_val = NULL;
- char *buf_unit = NULL;
-
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
- val = elm_spinner_value_get(circle_obj->widget_object);
- buf_unit = elm_object_part_text_get(circle_obj->widget_object, "elm.text");
- buf_val = elm_layout_text_get(btn, "elm.text");
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
- if(buf_unit)
- {
- snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),buf_unit);
- if(buf_val)
- snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
- else
- snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
- }
- else
- {
- snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),"");
- if(buf_val)
- snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
- else
- snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
- }
- return strdup(buf);
-}
-static void
-_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
- if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
- return ;
-
- Eext_Circle_Object *circle_obj = data;
- Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
- /* TODO: Reading information should be changed with UX team */
- elm_atspi_accessible_description_cb_set(btn, _accessible_description_cb, circle_obj);
- elm_atspi_accessible_reading_info_type_set(btn, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- evas_object_smart_callback_call(circle_obj->widget_object, "focused",NULL);
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface);
-static void _eext_circle_surface_render(void *data);
-
-static Evas_Object *
-_eext_circle_surface_image_widget_add(Evas_Object *parent)
-{
- Evas_Object *image_widget;
-
- image_widget = elm_image_add(parent);
-
- if (!image_widget)
- {
- ERR("Failed to create elm_image_object");
- return NULL;
- }
-
- //for accessibility
- elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
-
- //FIXME: It's for adjusting evas_image geometry.
- // Image object has weird geometry during the window calc own size.
- // We need to recalc image object after buffer memory copy in render time.
- // But now we don't have any way to call image's internal sizing eval function.
- elm_image_aspect_fixed_set(image_widget, EINA_FALSE);
- evas_object_repeat_events_set(image_widget, EINA_TRUE);
-
- return image_widget;
-}
-
-static void
-_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
- int line_width,
- double center_x, double center_y, double radius,
- double r, double g, double b, double a,
- double angle1, double angle2, Eina_Bool round_cap)
-{
- cairo_set_line_width(cairo, line_width);
-
- if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
-
- cairo_set_source_rgba(cairo, r, g, b, a);
-
- cairo_arc(cairo, center_x, center_y, radius,
- angle1 * M_PI / 180, angle2 * M_PI / 180);
- cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_cairo_draw_text(cairo_t *cairo,
- const char *text, const char *font, int font_size,
- cairo_font_slant_t slant, cairo_font_weight_t weight,
- double center_x, double center_y, double radius,
- double r, double g, double b, double a,
- double angle, double rotate_angle)
-{
- int x, y;
-
- x = radius * cos(angle * M_PI / 180);
- y = radius * sin(angle * M_PI / 180);
- x += center_x;
- y += center_y;
-
- cairo_set_source_rgba(cairo, r, g, b, a);
- cairo_set_font_size(cairo, font_size);
- cairo_select_font_face(cairo, font, slant, weight);
- cairo_move_to(cairo, x, y);
- cairo_rotate(cairo, rotate_angle * M_PI / 180);
- cairo_show_text(cairo, text);
- cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_clear(Eext_Circle_Surface *surface)
-{
- Evas_Object *image_object;
- unsigned char *buffer;
-
- if (!surface || !surface->image_widget) return;
-
- image_object = elm_image_object_get(surface->image_widget);
-
- buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
- memset(buffer, 0, surface->w * surface->h * 4);
- cairo_set_source_rgba(surface->cairo, 0, 0, 0, 0);
- cairo_rectangle(surface->cairo, 0.0, 0.0, surface->w, surface->h);
- cairo_fill(surface->cairo);
-}
-
-static void
-_eext_circle_bg_surface_memcpy(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
- Evas_Object *image_object, *bg_image, *bg_image_object;
- unsigned char *buffer, *bg_buffer;
-
- if (!surface || !surface->image_widget) return;
-
- image_object = elm_image_object_get(surface->image_widget);
- buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-
- bg_image = eina_list_nth(obj->bg_image_objs, obj->bg_image_index);
- bg_image_object = elm_image_object_get(bg_image);
- evas_object_image_size_set(bg_image_object, surface->w, surface->h);
- evas_object_image_fill_set(bg_image_object, 0, 0, surface->w, surface->h);
- bg_buffer = (unsigned char *)evas_object_image_data_get(bg_image_object, 0);
-
- memcpy(buffer, bg_buffer, surface->w * surface->h * 4);
-}
-
-static void
-_eext_circle_surface_render(void *data)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
- Eext_Circle_Object *render_obj;
- Eina_List *l, *ll;
- Eina_Bool skip_surface_clear = EINA_FALSE;
-
- if (!surface)
- {
- ERR("Surface is NULL... Going to remove surface render function.");
- return;
- }
-
- surface->render_job = NULL;
-
- EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
- {
- if (!render_obj->visible)
- continue;
-
- if (render_obj->bg_image_objs)
- {
- _eext_circle_bg_surface_memcpy(surface, render_obj);
- skip_surface_clear = EINA_TRUE;
- break;
- }
- }
-
- if (!skip_surface_clear)
- _eext_circle_surface_clear(surface);
-
- EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
- {
- Eext_Circle_Object_Item *item;
-
- if (!render_obj->visible)
- continue;
- if (render_obj->visible_on_activate && !(render_obj->is_active))
- continue;
-
- EINA_LIST_FOREACH(render_obj->items, ll, item)
- {
- // Skip invisible item.
- if (item->draw.color.a == 0) continue;
-
- // If there is no text, the item is arc item.
- if (!item->text)
- {
- // Draw Arc
- if (item->line_width)
- {
- cairo_save(surface->cairo);
- _eext_circle_surface_cairo_draw_arc(surface->cairo, item->line_width,
- surface->center_x, surface->center_y, item->radius,
- (double)item->draw.color.r / 255,
- (double)item->draw.color.g / 255,
- (double)item->draw.color.b / 255,
- (double)item->draw.color.a / 255,
- item->draw.angle_offset + item->min_angle - 90.0,
- item->draw.angle_offset + item->draw.angle - 90.0,
- item->round_cap);
- cairo_restore(surface->cairo);
- }
- }
- else if (item->font_size)
- {
- // Draw Text
- cairo_save(surface->cairo);
- _eext_circle_surface_cairo_draw_text(surface->cairo,
- item->text, item->selected_font, item->font_size,
- CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL,
- surface->center_x, surface->center_y, item->radius,
- (double)item->draw.color.r / 255,
- (double)item->draw.color.g / 255,
- (double)item->draw.color.b / 255,
- (double)item->draw.color.a / 255,
- item->draw.angle_offset + item->draw.angle - 90.0,
- item->draw.angle_offset + item->draw.angle);
- cairo_restore(surface->cairo);
- }
- }
- }
-
- evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
- 0, 0, surface->w, surface->h);
-}
-
-static void
-_eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
-{
- if (!surface) return;
-
- if (surface->render_job) ecore_job_del(surface->render_job);
- surface->render_job = NULL;
-}
-
-static void
-_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
-{
- if (surface->cairo) cairo_destroy(surface->cairo);
- if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
-
- surface->cairo = NULL;
- surface->cairo_surface = NULL;
-}
-
-static void
-_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
-{
- Evas_Object *image_object;
- cairo_surface_t *cairo_surface;
- cairo_t *cairo;
- unsigned char *buffer;
- int stride;
-
- if (surface->cairo_surface || surface->cairo)
- _eext_circle_surface_cairo_finish(surface);
-
- if (surface->image_widget == NULL)
- {
- ERR("Fail to get buffer from image object!");
- return;
- }
-
- image_object = elm_image_object_get(surface->image_widget);
-
- buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
- stride = evas_object_image_stride_get(image_object);
- cairo_surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32,
- surface->w, surface->h, stride);
- cairo = cairo_create(cairo_surface);
- cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
-
- surface->cairo_surface = cairo_surface;
- surface->cairo = cairo;
-}
-
-static void
-_eext_circle_surface_update(Eext_Circle_Surface *surface)
-{
- Evas_Object *image_object;
-
- if (!surface) return;
- if (!evas_object_visible_get(surface->image_widget)) return;
-
- image_object = elm_image_object_get(surface->image_widget);
- evas_object_geometry_get(surface->image_widget, NULL, NULL, &surface->w, &surface->h);
-
- surface->center_x = surface->w / 2;
- surface->center_y = surface->h / 2;
-
- evas_object_image_size_set(image_object, surface->w, surface->h);
- evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
-
- if ((surface->w != 0) && (surface->h != 0))
- {
- INF("Surface will be initialized!");
- _eext_circle_surface_cairo_init(surface);
- _eext_circle_surface_changed(surface);
- }
-}
-
-static void
-_eext_circle_surface_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
- _eext_circle_surface_update(surface);
-}
-
-static void
-_eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
- INF("Surface is going to free in delete callback for image widget.");
- _eext_circle_surface_del_internal(surface);
-}
-
-static void
-_eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
- surface->parent = NULL;
-}
-
-static void
-_eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
- _eext_circle_surface_cairo_finish(surface);
- _eext_circle_surface_render_finish(surface);
-}
-
-static void
-_eext_circle_surface_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
- _eext_circle_surface_update(surface);
-}
-
-static void
-_eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- evas_object_show(circle_obj->image_widget);
- circle_obj->is_active = EINA_TRUE;
-
- // Previous view's circle object should not be disappeared while naviframe effect.
- // At here, show the latest deactivated object if the conditions are satisfied.
- if (circle_obj->surface)
- {
- if (circle_obj->surface->parent_surface &&
- (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
- {
- Eext_Circle_Object *deact_obj = circle_obj->surface->parent_surface->deactivated_obj;
-
- if (deact_obj && (deact_obj->surface->parent != circle_obj->surface->parent))
- {
- evas_object_show(deact_obj->image_widget);
- }
- }
- else if (circle_obj->surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
- {
- if (circle_obj->surface->deactivated_obj)
- evas_object_show(circle_obj->surface->deactivated_obj->image_widget);
- }
- }
-}
-
-static void
-_deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface &&
- (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
- {
- if (circle_obj->surface->parent_surface->deactivated_obj == circle_obj)
- circle_obj->surface->parent_surface->deactivated_obj = NULL;
- }
-}
-
-static void
-_eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
- evas_object_hide(circle_obj->image_widget);
- circle_obj->is_active = EINA_FALSE;
-
- // Previous view's circle object should not be disappeared while naviframe effect.
- // At here, just keep the current deactivated object.
- if (circle_obj->surface && circle_obj->surface->parent_surface &&
- (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
- {
- Eext_Circle_Object *deactivated_obj = circle_obj->surface->parent_surface->deactivated_obj;
-
- if (deactivated_obj == circle_obj)
- return;
-
- if (deactivated_obj)
- evas_object_event_callback_del_full(deactivated_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
- circle_obj->surface->parent_surface->deactivated_obj = circle_obj;
- evas_object_event_callback_add(circle_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
- }
-}
-
-static Eext_Circle_Surface *
-_eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
-{
- Eext_Circle_Surface *surface;
-
- if (!layout)
- {
- ERR("The given Evas_Object is NULL! It returns NULL.");
- return NULL;
- }
-
- if (edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
- {
- surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
- if (!surface->image_widget)
- {
- ERR("Surface doesn't have image widget for drawing. It returns NULL.");
- return NULL;
- }
-
- INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
- elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
-
- return surface;
- }
- else
- {
- ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
- return NULL;
- }
-}
-
-static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Evas_Object *view = (Evas_Object *)event_info;
- Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
- Eext_Circle_Surface *view_surface;
- Eext_Circle_Object *circle_obj;
- Eina_List *l, *l_next;
-
- if (!surface)
- {
- ERR("No matched surface exists for the naviframe:%p", obj);
- return;
- }
-
- view_surface = _eext_circle_surface_naviframe_item_view_add(view);
- view_surface->parent_surface = surface;
- surface->sub_surfaces = eina_list_append(surface->sub_surfaces, view_surface);
-
- EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, circle_obj)
- {
- Evas_Object *parent;
- parent = elm_object_parent_widget_get(circle_obj->image_widget);
-
- while (parent)
- {
- if (parent == view)
- {
- _eext_circle_surface_object_remove(surface, circle_obj);
- _eext_circle_surface_object_append(view_surface, circle_obj);
- circle_obj->surface = view_surface;
- break;
- }
-
- parent = elm_object_parent_widget_get(parent);
- if (parent == obj) break;
- }
- }
-}
-
-static void
-_eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
-{
- Eext_Circle_Object *obj;
- Eina_List *l, *l_next;
-
- if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
- {
- Eext_Circle_Surface *cur_surface;
-
- evas_object_smart_callback_del_full(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
- evas_object_event_callback_del_full(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-
- EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
- {
- _eext_circle_surface_del_internal(cur_surface);
- }
-
- }
- else if (surface->parent)
- {
- evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb);
- }
-
- _eext_circle_surface_cairo_finish(surface);
- _eext_circle_surface_render_finish(surface);
-
- if (surface->image_widget)
- {
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
- surface->image_widget = NULL;
- surface->w = surface->h = 0;
- }
-
- if (surface->parent_surface)
- surface->parent_surface->sub_surfaces = eina_list_remove(surface->parent_surface->sub_surfaces, surface);
-
- // If public surface is deleted, prepare a private surface.
- EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, obj)
- {
- if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
- {
- Eext_Circle_Surface *private_surface;
- INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
- obj->image_widget, obj);
-
- surface->render_objs = eina_list_remove_list(surface->render_objs, l);
-
- private_surface =
- _eext_circle_surface_init(obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
- _eext_circle_surface_object_append(private_surface, obj);
-
- evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb);
- if (obj->widget_object)
- {
- evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb);
- }
-
- _eext_circle_surface_update(private_surface);
- }
- else
- {
- _eext_circle_surface_object_remove(surface, obj);
- }
- }
-
- free(surface);
-}
-
-//////////////////////////
-// Internal API //////////
-//////////////////////////
-Eext_Circle_Surface *
-_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type)
-{
- Eext_Circle_Surface *surface;
-
- surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface));
- if (!surface)
- {
- ERR("Fail to calloc for (Eext_Circle_Surface)");
- return NULL;
- }
-
- surface->type = type;
- surface->parent = parent;
-
- if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
- {
- // If the surface is created with elm_naviframe.
- evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
- evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
- }
- else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
- {
- surface->image_widget = image_widget;
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
- evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
- }
- else
- {
- surface->image_widget = image_widget;
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
- evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
- evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
- evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
- }
-
- return surface;
-}
-
-void
-_eext_circle_surface_finish(Eext_Circle_Surface *surface)
-{
- _eext_circle_surface_del_internal(surface);
-}
-
-void
-_eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
- if (!surface) return;
- if (!obj) return;
-
- surface->render_objs = eina_list_remove(surface->render_objs, obj);
- obj->surface = NULL;
- _eext_circle_surface_changed(surface);
-
- if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
- {
- evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb);
- evas_object_smart_callback_del(obj->image_widget, "rotary,deactivated",
- _eext_circle_surface_object_rotary_deactivated_cb);
-
- if (obj->widget_object)
- {
- evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb);
- evas_object_smart_callback_del(obj->widget_object, "rotary,deactivated",
- _eext_circle_surface_object_rotary_deactivated_cb);
- }
- }
-}
-
-void
-_eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
- if (!surface) return;
- if (!obj) return;
-
- if (obj->surface)
- _eext_circle_surface_object_remove(obj->surface, obj);
-
- // Search whether proper sub-surface exists or not for the circle object.
- if ((surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) && surface->sub_surfaces)
- {
- Eina_List *l, *l_next;
- Eext_Circle_Surface *cur_surface;
-
- EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
- {
- Evas_Object *parent;
- parent = elm_object_parent_widget_get(obj->image_widget);
-
- while (parent)
- {
- if (parent == cur_surface->parent)
- {
- _eext_circle_surface_object_append(cur_surface, obj);
- obj->surface = cur_surface;
- return;
- }
-
- parent = elm_object_parent_widget_get(parent);
- if (parent == surface->parent) break;
- }
-
- }
- }
-
- surface->render_objs = eina_list_append(surface->render_objs, obj);
- _eext_circle_surface_changed(surface);
- obj->surface = surface;
-
- if (obj->surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
- {
- evas_object_smart_callback_add(obj->image_widget, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb, obj);
- evas_object_smart_callback_add(obj->image_widget, "rotary,deactivated",
- _eext_circle_surface_object_rotary_deactivated_cb, obj);
-
- if (obj->widget_object)
- {
- evas_object_smart_callback_add(obj->widget_object, "rotary,activated",
- _eext_circle_surface_object_rotary_activated_cb, obj);
- evas_object_smart_callback_add(obj->widget_object, "rotary,deactivated",
- _eext_circle_surface_object_rotary_deactivated_cb, obj);
- }
- }
-}
-
-void
-_eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
- Eext_Circle_Object *render_obj;
- Eina_List *l;
-
- if (!surface) return;
- if (!obj) return;
-
- if (!evas_object_visible_get(obj->image_widget) &&
- (obj->widget_object && evas_object_visible_get(obj->widget_object)))
- evas_object_show(obj->image_widget);
-
- EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
- {
- if (render_obj != obj)
- evas_object_hide(render_obj->image_widget);
- }
-}
-
-void
-_eext_circle_surface_changed(Eext_Circle_Surface *surface)
-{
- if (!surface) return;
-
- if (!surface->render_job && surface->image_widget &&
- evas_object_visible_get(surface->image_widget) &&
- (surface->w != 0) && (surface->h != 0))
- surface->render_job = ecore_job_add(_eext_circle_surface_render, surface);
-}
-
-Eext_Circle_Surface *
-_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
-{
- Eext_Circle_Surface *surface;
- Evas_Object *image_widget = NULL;
-
- if (!parent) return NULL;
-
- if (type != EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
- image_widget = _eext_circle_surface_image_widget_add(parent);
-
- surface = _eext_circle_surface_init(image_widget, parent, type);
-
- return surface;
-}
-
-////////////////////////
-// EAPI ////////////////
-////////////////////////
-EAPI Eext_Circle_Surface *
-eext_circle_surface_conformant_add(Evas_Object *conform)
-{
- Eext_Circle_Surface *surface;
- const char *type = NULL;
-
- if (!conform)
- {
- ERR("The given Evas_Object is NULL! It returns NULL.");
- return NULL;
- }
-
- type = evas_object_type_get(conform);
-
- if (type && (!strcmp(type, "Elm_Conformant") || !strcmp(type, "elm_conformant")))
- {
- if (elm_object_style_set(conform, "circle"))
- {
- if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle"))
- {
- ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
- return NULL;
- }
-
- surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
- if (!surface->image_widget)
- {
- ERR("Surface doesn't have image widget for drawing. It returns NULL.");
- return NULL;
- }
-
- INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->image_widget, conform);
- elm_object_part_content_set(conform, "elm.swallow.circle", surface->image_widget);
-
- return surface;
- }
- else
- {
- ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
- return NULL;
- }
- }
-
- ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
- return NULL;
-}
-
-EAPI Eext_Circle_Surface *
-eext_circle_surface_layout_add(Evas_Object *layout)
-{
- Eext_Circle_Surface *surface;
- const char *type = NULL;
-
- if (!layout)
- {
- ERR("The given Evas_Object is NULL! It returns NULL.");
- return NULL;
- }
-
- type = evas_object_type_get(layout);
-
- if (type && (!strcmp(type, "Elm_Layout") || !strcmp(type, "elm_layout")))
- {
- if (elm_layout_theme_set(layout, "layout", "circle", "surface"))
- {
- if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
- {
- ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
- return NULL;
- }
-
- surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
- if (!surface->image_widget)
- {
- ERR("Surface doesn't have image widget for drawing. It returns NULL.");
- return NULL;
- }
-
- INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
- elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
-
- return surface;
- }
- else
- {
- ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
- return NULL;
- }
- }
-
- ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
- return NULL;
-}
-
-EAPI Eext_Circle_Surface *
-eext_circle_surface_naviframe_add(Evas_Object *naviframe)
-{
- Eext_Circle_Surface *surface;
- const char *type = NULL;
-
- if (!naviframe)
- {
- ERR("The given Evas_Object is NULL! It returns NULL.");
- return NULL;
- }
-
- type = evas_object_type_get(naviframe);
-
- if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe")))
- {
- surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME);
- return surface;
- }
-
- ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
- return NULL;
-}
-
-EAPI void
-eext_circle_surface_del(Eext_Circle_Surface *surface)
-{
- if (!surface)
- {
- ERR("Surface is already NULL");
- return;
- }
-
- if (surface->image_widget)
- {
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
- evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
- evas_object_del(surface->image_widget);
- surface->image_widget = NULL;
- }
-
- INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
- _eext_circle_surface_del_internal(surface);
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 <Elementary.h>
-#include "circle/efl_extension_rotary.h"
-#include "efl_extension_private.h"
-#ifdef WITH_X
- #include <Ecore_X.h>
- #include <X11/Xlib.h>
- #include <X11/extensions/XInput2.h>
- #include <X11/extensions/XI2.h>
-#elif WITH_WAYLAND
- #include <Ecore_Wayland.h>
- #include <Ecore_Input.h>
-#endif
-
-
-#define TIZEN_DEV "tizen_detent"
-
-static const char SIG_ACTIVATED[] = "rotary,activated";
-static const char SIG_DEACTIVATED[] = "rotary,deactivated";
-
-static int EEXT_EVENT_ROTARY_ROTATE = 0;
-static Eina_List *_callbacks = NULL;
-static Eina_List *_obj_pri_callbacks = NULL;
-#ifdef WITH_X
-static XIEventMask *_xi_event_mask = NULL;
-#endif
-static Evas_Object *_activated_obj = NULL;
-static int _init_count = 0;
-#ifdef WITH_X
-static Ecore_Event_Handler *_motion_handler = NULL;
-#endif
-#ifdef WITH_WAYLAND
-static Ecore_Event_Handler *_ecore_detent_handler = NULL;
-#endif
-static Ecore_Event_Handler *_rotate_handler = NULL;
-static Eina_Bool _handler_registered = EINA_FALSE;
-static Eina_List *handlers = NULL;
-
-typedef struct _Eext_Rotary_Cb Eext_Rotary_Cb;
-struct _Eext_Rotary_Cb
-{
- Evas_Object *obj;
- Eext_Rotary_Event_Cb func;
- void *data;
- Eext_Callback_Priority pri;
- Eina_Bool del_registered;
-};
-
-typedef struct _Rotary_Raw_Info Rotary_Raw_Info;
-struct _Rotary_Raw_Info
-{
- int devid;
- Eext_Rotary_Event_Direction direction;
- unsigned int time_stamp;
-};
-
-typedef struct _Eext_Rotary_Handler Eext_Rotary_Handler;
-struct _Eext_Rotary_Handler
-{
- Eext_Rotary_Handler_Cb func;
- void *data;
-};
-
-typedef struct _Eext_Rotary_Obj_Pri Eext_Rotary_Obj_Pri;
-struct _Eext_Rotary_Obj_Pri
-{
- Evas_Object *obj;
- Eina_List *pri_callbacks;
-};
-
-#ifdef WITH_X
-static Eina_Bool _init_Xi2_system(void);
-static Eina_Bool _motion_changed_cb(void *data, int type, void *event_info);
-static void _process_raw_event(void *data, int type, void *raw_event);
-#endif
-#ifdef WITH_WAYLAND
-static Eina_Bool _init_ecore_event(void);
-static Eina_Bool _ecore_detent_cb(void *data, int type, void *event_info);
-#endif
-static Eina_Bool _rotary_rotate_event_cb(void *data, int type, void *event_info);
-static void _object_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _remove_ecore_handlers(void);
-static Eina_Bool _rotary_rotate_handler_cb(void *data, Eext_Rotary_Event_Info *info);
-static int _pri_compare(const void *data1, const void *data2);
-static void _activated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-EAPI Eina_Bool
-eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
-{
- Eext_Rotary_Handler *new_hd = NULL;
- if (!func) return EINA_FALSE;
-
- ERR("detent: In");
- /* init event registration */
- if (!_init_count)
- {
- ERR("init_count: %d", _init_count);
-#ifdef WITH_X
- if (!_init_Xi2_system())
- {
- ERR("Failed to init Xi2 system");
- return EINA_FALSE;
- }
-#endif
-#ifdef WITH_WAYLAND
- if (!_init_ecore_event())
- {
- ERR("Failed to init ecore_event");
- return EINA_FALSE;
- }
-#endif
- }
-
-#ifdef WITH_X
- /* register event handlers */
- if (!_motion_handler)
- {
- _motion_handler = ecore_event_handler_add(ECORE_X_EVENT_GENERIC,
- _motion_changed_cb, NULL);
- if (!_motion_handler)
- {
- ERR("Cannot register generic ecore event handler");
- return EINA_FALSE;
- }
- }
-#endif
-#ifdef WITH_WAYLAND
- if (!_ecore_detent_handler)
- {
- _ecore_detent_handler = ecore_event_handler_add(ECORE_EVENT_DETENT_ROTATE,
- _ecore_detent_cb, NULL);
- if (!_ecore_detent_handler)
- {
- ERR("Cannot register ecore detent handler");
- return EINA_FALSE;
- }
- }
-#endif
- if (!_rotate_handler)
- {
- _rotate_handler = ecore_event_handler_add(EEXT_EVENT_ROTARY_ROTATE,
- _rotary_rotate_event_cb, NULL);
- if (!_rotate_handler)
- {
- ERR("Cannot register eext rotate event handler");
- return EINA_FALSE;
- }
- }
-
- new_hd = malloc(sizeof(Eext_Rotary_Handler));
- if (!new_hd)
- {
- ERR("Cannot allocate memory");
- return EINA_FALSE;
- }
- new_hd->func = func;
- new_hd->data = data;
- handlers = eina_list_append(handlers, new_hd);
-
- return EINA_TRUE;
-}
-
-EAPI void *
-eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
-{
- ERR("detent: In");
- Eina_List *l = NULL;
- Eext_Rotary_Handler *hd = NULL;
- void *data = NULL;
-
- EINA_LIST_FOREACH(handlers, l, hd)
- {
- if (hd->func == func)
- {
- data = hd->data;
- handlers = eina_list_remove(handlers, hd);
- free(hd);
- if (!handlers)
- {
- _remove_ecore_handlers();
- }
- break;
- }
- }
- return data;
-}
-
-EAPI Eina_Bool
-eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data)
-{
- INF("In");
- return eext_rotary_object_event_callback_priority_add(obj, 0, func, data);
-}
-
-EAPI Eina_Bool
-eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data)
-{
- ERR("detent: In");
- Eina_List *l;
- Eext_Rotary_Obj_Pri *op = NULL;
- Eext_Rotary_Cb *cb = NULL, *new_cb = NULL;
- Eina_Bool registered = EINA_FALSE;
- Eina_Bool added = EINA_FALSE;
-
- if ((!obj) || (!func)) return EINA_FALSE;
-
- if (!_handler_registered)
- {
- if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL))
- {
- ERR("Cannot register rotary handler");
- return EINA_FALSE;
- }
- _handler_registered = EINA_TRUE;
- }
-
- new_cb = malloc(sizeof(Eext_Rotary_Cb));
- if (!new_cb)
- {
- ERR("Cannot allocate memory");
- return EINA_FALSE;
- }
- new_cb->obj = obj;
- new_cb->func = func;
- new_cb->data = data;
- new_cb->pri = priority;
- new_cb->del_registered = EINA_FALSE;
-
- EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
- {
- if (op->obj == obj)
- {
- added = EINA_TRUE;
- op->pri_callbacks = eina_list_sorted_insert(op->pri_callbacks,
- _pri_compare, new_cb);
- break;
- }
- }
- if (!added)
- {
- Eext_Rotary_Obj_Pri *new_op = NULL;
-
- new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri));
- if (!new_op)
- {
- ERR("Cannot allocate memory");
- free(new_cb);
- return EINA_FALSE;
- }
- new_op->obj = obj;
- new_op->pri_callbacks = eina_list_append(new_op->pri_callbacks, new_cb);
- _obj_pri_callbacks = eina_list_append(_obj_pri_callbacks, new_op);
- }
- _callbacks = eina_list_append(_callbacks, new_cb);
-
- EINA_LIST_FOREACH(_callbacks, l, cb)
- {
- if (cb->obj == obj)
- {
- if (cb->del_registered)
- {
- registered = EINA_TRUE;
- break;
- }
- }
- }
- if (!registered)
- {
- evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
- _object_deleted_cb, obj);
- new_cb->del_registered = EINA_TRUE;
- }
-
- return EINA_TRUE;
-}
-
-EAPI void *
-eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func)
-{
- INF("In");
- Eina_List *l = NULL;
- Eext_Rotary_Cb *cb = NULL;
- void *data = NULL;
-
- ERR("callback del 0x%x, %s, func : 0x%x", obj, evas_object_type_get(obj), func);
-
- EINA_LIST_FOREACH(_callbacks, l, cb)
- {
- if ((cb->func == func) && (cb->obj == obj))
- {
- data = cb->data;
- _callbacks = eina_list_remove(_callbacks, cb);
- INF("Removed cb from callbacks");
- break;
- }
- cb = NULL;
- }
- if (cb)
- {
- Eext_Rotary_Obj_Pri *op = NULL;
-
- EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
- {
- if (op->obj == obj)
- {
- op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
- break;
- }
- }
- free(cb);
- INF("Freed cb");
- }
- if (!_callbacks)
- {
- eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
- _handler_registered = EINA_FALSE;
- }
- INF("done");
-
- return data;
-}
-
-EAPI void
-eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
-{
- if (!obj) return;
-
- ERR("eext_rotary_object_event_activated_set : 0x%x, %s, _activated_obj : 0x%x, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
-
- if (activated)
- {
- if (_activated_obj != obj)
- {
- if (_activated_obj != NULL)
- {
- ERR("Activation delete!!!!");
- evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
- evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
- }
- _activated_obj = obj;
- evas_object_event_callback_add(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb, NULL);
- }
- evas_object_smart_callback_call(_activated_obj, SIG_ACTIVATED, NULL);
- }
- else
- {
- if (obj == _activated_obj && _activated_obj != NULL)
- {
- evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
- evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
- _activated_obj = NULL;
- }
- }
-}
-
-#ifdef WITH_WAYLAND
-static void
-_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
-{
- ERR("detent: In");
- INF("In: ddata: %p", fdata);
- free(fdata);
-}
-
-static Eina_Bool
-_init_ecore_event(void)
-{
- ERR("detent: In");
- if (!ecore_event_init()) return EINA_FALSE;
- EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
- return EINA_TRUE;
-}
-static Eina_Bool
-_ecore_detent_cb(void *data, int type, void *event_info)
-{
- ERR("detent: In");
- Ecore_Event_Detent_Rotate *e = event_info;
- Rotary_Raw_Info *event = NULL;
-
- event = calloc(1, sizeof(Rotary_Raw_Info));
- if (!event)
- {
- ERR("Cannot allocate memory");
- return ECORE_CALLBACK_PASS_ON;
- }
- if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE)
- event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
- else
- event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
- event->time_stamp = e->timestamp;
- ERR("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
- ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL);
-
- return ECORE_CALLBACK_PASS_ON;
-}
-#endif
-
-#ifdef WITH_X
-static Eina_Bool
-_init_Xi2_system(void)
-{
- INF("In");
- Ecore_X_Display *display = NULL;
- Ecore_X_Window root_win;
- int opcode = 0, event = 0, error = 0;
- int major = XI_2_Major;
- int minor = XI_2_Minor;
- int dev_count = 0;
- int i = 0;
-
- if (_init_count > 0) return EINA_TRUE;
- _init_count++;
-
- EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
- _xi_event_mask = (XIEventMask *)calloc(1, sizeof(XIEventMask));
- display = ecore_x_display_get();
- root_win = ecore_x_window_root_first_get();
-
- /* Initialize Xi2 system */
- /* Check if X input extension available */
- if (!XQueryExtension((Display *)display, "XInputExtension", &opcode,
- &event, &error))
- {
- ERR("Failed to query XInputExtension");
- return EINA_FALSE;
- }
-
- /* We support version 2.0 */
- if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest)
- {
- ERR("Failed to query XI Version");
- return EINA_FALSE;
- }
-
- _xi_event_mask->deviceid = XIAllDevices;
-
- /* Check device id */
- XIDeviceInfo *dev_info = NULL;
- dev_info = XIQueryDevice(display, XIAllDevices, &dev_count);
-
- for (i = 0; i < dev_count; i++)
- {
- XIDeviceInfo *di = &(dev_info[i]);
- if (!strncmp(di->name, TIZEN_DEV, sizeof(TIZEN_DEV)))
- {
- _xi_event_mask->deviceid = di->deviceid;
- break;
- }
- }
-
- if (dev_info) XIFreeDeviceInfo(dev_info);
- /* SelectXi2Event */
- _xi_event_mask->mask = (unsigned char *)(calloc(1, XIMaskLen(XI_LASTEVENT)));
- XISetMask(_xi_event_mask->mask, XI_RawMotion);
- _xi_event_mask->mask_len = sizeof(_xi_event_mask->mask);
- int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1);
- if (ret != 0)
- {
- ERR("Failed to Select Events");
- return EINA_FALSE;
- }
-
- INF("Done");
- return EINA_TRUE;
-}
-
-static Eina_Bool
-_motion_changed_cb(void *data, int type, void *event_info)
-{
- Ecore_X_Event_Generic *ev = event_info;
-
- switch((int)(ev->evtype))
- {
- case XI_RawMotion:
- _process_raw_event(data, type, (XIRawEvent *)ev->data);
- break;
- }
-
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static void
-_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
-{
- INF("In: ddata: %p", fdata);
- free(fdata);
-}
-
-static void
-_process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event)
-{
- XIRawEvent *xi_raw_event = raw_event;
- double *value = xi_raw_event->raw_values;
- Rotary_Raw_Info *event = NULL;
-
- if (_xi_event_mask->deviceid != xi_raw_event->deviceid)
- {
- return;
- }
-
- INF("In");
- event = calloc(1, sizeof(Rotary_Raw_Info));
- if (!event)
- {
- ERR("Cannot allocate memory");
- return;
- }
- event->devid = xi_raw_event->deviceid;
- /** X(0): rotate: NOT USED;
- Y(1): timestamp;
- Z(2): direction (-1: counter clockwise, 1: clockwise, 0: None)
- **/
- if (XIMaskIsSet(xi_raw_event->valuators.mask, 1))
- {
- event->time_stamp = (unsigned int)(*(value + 1));
- INF("time stamp: %d", event->time_stamp);
- }
- if (XIMaskIsSet(xi_raw_event->valuators.mask, 2))
- {
- int dir = (int)(*(value + 2));
- INF("raw dir: %d", dir);
- switch (dir)
- {
- case -1:
- event->direction = EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
- INF("direction: Counter Clockwise");
- ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
- _rotary_rotate_event_free, NULL);
- break;
- case 1:
- event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
- INF("direction: Clockwise");
- ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
- _rotary_rotate_event_free, NULL);
- break;
- case 0:
- INF("Not detent");
- free(event);
- break;
- default:
- INF("Should not get in here");
- free(event);
- }
- }
- else
- {
- free(event);
- }
-}
-#endif
-
-static Eina_Bool
-_rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info)
-{
- INF("In");
- Eina_List *l;
- Eext_Rotary_Handler *hd;
- Rotary_Raw_Info *ev = event_info;
- Eext_Rotary_Event_Info info;
- info.direction = ev->direction;
- info.time_stamp = ev->time_stamp;
-
- EINA_LIST_FOREACH(handlers, l, hd)
- {
- if (!hd->func(hd->data, &info))
- {
- return ECORE_CALLBACK_DONE;
- }
- }
-
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static int
-_pri_compare(const void *data1, const void *data2)
-{
- const Eext_Rotary_Cb *cb1 = data1;
- const Eext_Rotary_Cb *cb2 = data2;
- if (cb1 && cb2)
- {
- if (cb1->pri < cb2->pri)
- return -1;
- else if (cb1->pri > cb2->pri)
- return 1;
- else
- return 0;
- }
-
- return 0;
-}
-
-static Eina_Bool
-_rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
-{
- ERR("_rotary_rotate_handler_cb : 0x%x, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
- Eina_List *l;
- Eext_Rotary_Cb *cb;
-
- if (!info) return EINA_TRUE;
-
- /* Deliver to the activated object and its parents */
- if ((_activated_obj) &&
- (evas_focus_state_get(evas_object_evas_get(_activated_obj))) &&
- (evas_object_visible_get(_activated_obj)))
- {
- Evas_Object *obj = NULL;
- Eext_Rotary_Obj_Pri *op = NULL;
-
- obj = _activated_obj;
- while(obj)
- {
- if (obj == _activated_obj)
- {
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
- else
- INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
- }
- EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
- {
- if (op->obj == obj)
- {
- EINA_LIST_FOREACH(op->pri_callbacks, l, cb)
- {
- if (!cb->func(cb->data, obj, info))
- {
- return EINA_FALSE;
- }
- }
- break;
- }
- }
- obj = elm_object_parent_widget_get(obj);
- }
- }
-
- return EINA_TRUE;
-}
-
-static void
-_remove_ecore_handlers(void)
-{
- INF("In");
-#ifdef HAVE_X
- if (_motion_handler)
- {
- ecore_event_handler_del(_motion_handler);
- _motion_handler = NULL;
- INF("removed _motion_handler");
- }
-#endif
-#ifdef HAVE_WAYLAND
- if (_ecore_detent_handler)
- {
- ecore_event_handler_del(_ecore_detent_handler);
- _ecore_detent_handler = NULL;
- INF("removed _ecore_detent_handler");
- }
-#endif
- if (_rotate_handler)
- {
- ecore_event_handler_del(_rotate_handler);
- _rotate_handler = NULL;
- INF("removed _rotate_handler");
- }
-}
-
-static void
-_object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
- ERR("In: data: %p, obj: %p", data, obj);
- Eina_List *l = NULL;
-
- Eext_Rotary_Obj_Pri *op = NULL;
- EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
- {
- if (op->obj == obj)
- {
- Eina_List *l1 = NULL;
- Eext_Rotary_Cb *cb = NULL;
-
- EINA_LIST_FOREACH(op->pri_callbacks, l1, cb)
- {
- _callbacks = eina_list_remove(_callbacks, cb);
- op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
- free(cb);
- }
- _obj_pri_callbacks = eina_list_remove(_obj_pri_callbacks, op);
- free(op);
- break;
- }
- }
- if (!_callbacks)
- {
- eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
- _handler_registered = EINA_FALSE;
- }
- if (_activated_obj == obj)
- _activated_obj = NULL;
- INF("done");
-}
-
-static void
-_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
- ERR("_activated_obj_del_cb : 0x%x", _activated_obj);
-
- evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
- _activated_obj = NULL;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-#include "common/efl_extension_common_private.h"
-
-#define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data"
-
-/* === /internal object cb & util === */
-static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
-static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-
-/* === internal object creation (elm-demo-tizen/drawer.c) === */
-static Evas_Object *_drawer_layout_create(Evas_Object *parent);
-static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
-
-/* === more option API === */
-static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
-static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
-static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-/* === Accessibility === */
-static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
-static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
-
-/* === internal object cb & util === */
-static void
-_drawer_back_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Evas_Object *panel = obj;
- if (!panel)
- {
- ERR("panel is NULL!!");
- return;
- }
-
- Eext_More_Option_Data *mold = data;
- if (!mold)
- {
- ERR("mold is NULL!!");
- return;
- }
-
- if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel);
-}
-
-static void
-_panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- Eext_More_Option_Data *mold = data;
-
- if (mold)
- {
- evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL);
- eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
- eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
-
- Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
- if (!msg) return;
-
- msg->count = 1;
- msg->val[0] = 0;
-
- Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
- if (content_part)
- {
- edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
- }
- else
- free(msg);
- //for accessibility
- // signal send to rotary selector for highlighted access object
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL);
- elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_FALSE);
- evas_object_show(mold->rotary_selector);
- }
- //
- }
-}
-
-static void
-_panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- Eext_More_Option_Data *mold = data;
- if (mold)
- {
- evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL);
- eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
-
- Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
- if (!msg) return;
-
- msg->count = 1;
- msg->val[0] = 1;
-
- Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
- if (content_part)
- {
- edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
- }
- else
- free(msg);
-
- //item index is initialized as zero.
- if (mold->rotary_selector)
- {
- //Initialize item to zero
- Eina_List *l = NULL;
- Eext_Object_Item *item = NULL;
- EINA_LIST_FOREACH(mold->item_list, l, item)
- {
- break;
- }
-
- eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
- }
-
- //for accessibility
- // signal send to rotary selector for highlighted access object
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_TRUE);
- elm_atspi_component_highlight_grab(mold->cue_access_object);
- evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL);
- evas_object_hide(mold->rotary_selector);
- }
- //
- }
-
- eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb);
-}
-
-static void
-_panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- INF("more_option cue clicked!!");
-
- Eext_More_Option_Data *mold = data;
- if (mold)
- evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
-}
-
-static void
-_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- elm_layout_signal_callback_del(obj, "elm,state,active,finished", "elm", _panel_active_cb);
- elm_layout_signal_callback_del(obj, "elm,state,inactive,finished", "elm", _panel_inactive_cb);
- elm_layout_signal_callback_del(obj, "cue,hide", "ext", _cue_hide_cb);
- elm_layout_signal_callback_del(obj, "cue,show", "ext", _cue_show_cb);
-}
-
-/* === internal object creation (elm-demo-tizen/drawer.c) === */
-static Evas_Object *
-_drawer_layout_create(Evas_Object *parent)
-{
- Evas_Object *layout;
- layout = elm_layout_add(parent);
- if (!layout)
- {
- ERR("drawer layout is NULL");
- return NULL;
- }
-
- elm_layout_theme_set(layout, "layout", "drawer", "panel");
- evas_object_show(layout);
-
- return layout;
-}
-
-static Evas_Object *
-_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold)
-{
- Evas_Object *panel;
-
- panel = elm_panel_add(parent);
- if (!panel)
- {
- ERR("panel is NULL");
- return NULL;
- }
-
- evas_object_show(panel);
-
- //Default : right
- elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
- elm_object_part_content_set(parent, "elm.swallow.right", panel);
-
- evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL);
-
- return panel;
-}
-
-/* === more option API === */
-static Eext_More_Option_Data *
-_more_option_data_init(Evas_Object *obj, Evas_Object *parent)
-{
- Eext_More_Option_Data *mold = NULL;
-
- mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- mold->parent = parent;
- mold->more_option = obj;
- mold->item_list = NULL;
- mold->panel = NULL;
- mold->rotary_selector = NULL;
- mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT;
-
- return mold;
-}
-
-static Eext_More_Option_Data *
-_more_option_data_get(const Evas_Object *more_option)
-{
- if (!more_option)
- {
- ERR("more_option is NULL!!");
- return NULL;
- }
-
- return evas_object_data_get(more_option, EEXT_MORE_OPTION_DATA_KEY);
-}
-
-static void
-_more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_More_Option_Data *mold = data;
-
- if (mold->item_list)
- {
- mold->item_list = eina_list_free(mold->item_list);
- }
-
- evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY);
-
- free(mold);
-}
-
-static void
-_cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- INF("called!!");
-
- Eext_More_Option_Data *mold = data;
-
- elm_layout_signal_emit(mold->panel, "cue,hide", "elm");
-}
-
-static void
-_cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- INF("called!!");
-
- Eext_More_Option_Data *mold = data;
-
- elm_layout_signal_emit(mold->panel, "cue,show", "elm");
-}
-
-static void
-_rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
- evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info);
-}
-
-static void
-_rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
- evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
-}
-
-/* === public API implementation === */
-
-EAPI Evas_Object *
-eext_more_option_add(Evas_Object *parent)
-{
- if (!parent)
- {
- ERR("parent is NULL!!");
- return NULL;
- }
-
- Eext_More_Option_Data *mold = NULL;
- Evas_Object *more_option = NULL;
-
- more_option = _drawer_layout_create(parent);
- if (!more_option)
- {
- ERR("more_option is NULL!!");
- return NULL;
- }
-
- mold = _more_option_data_init(more_option, parent);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- evas_object_data_set(mold->more_option, EEXT_MORE_OPTION_DATA_KEY, mold);
- elm_layout_signal_callback_add(mold->more_option, "cue,hide", "ext", _cue_hide_cb, mold);
- elm_layout_signal_callback_add(mold->more_option, "cue,show", "ext", _cue_show_cb, mold);
- evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_DEL, _more_option_del_cb, mold);
-
- mold->panel = _panel_create(mold->more_option, mold);
- if (!mold->panel)
- {
- ERR("panel is NULL!!");
- return NULL;
- }
-
- elm_layout_signal_callback_add(mold->panel, "elm,state,active,finished", "elm", _panel_active_cb, mold);
- elm_layout_signal_callback_add(mold->panel, "elm,state,inactive,finished", "elm", _panel_inactive_cb, mold);
- elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold);
-
- mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
- if (!mold->rotary_selector)
- {
- ERR("rotary_selector is NULL!!");
- return NULL;
- }
- _rotary_selector_from_moreoption_set(mold->rotary_selector, EINA_TRUE);
-
- evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
- evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
-
- Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
- if (!selector_content)
- {
- ERR("selector_content is NULL!!");
- return NULL;
- }
-
- elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
-
- elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
-
- elm_object_content_set(mold->panel, mold->rotary_selector);
-
- elm_panel_toggle(mold->panel);
-
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- evas_object_hide(mold->rotary_selector);
-
- Evas_Object *to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access");
- mold->cue_access_object = elm_access_object_register(to, parent);
-
- elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
- elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
- elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
- elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
- }
- //
-
- return mold->more_option;
-}
-
-EAPI void
-eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction)
-{
- if (!obj)
- {
- ERR("obj is NULL!!");
- return;
- }
-
- Eext_More_Option_Data *mold = NULL;
- mold = _more_option_data_get(obj);
- if (mold)
- {
- elm_panel_orient_set(mold->panel, direction);
- mold->direction = direction;
- }
-}
-
-EAPI Eext_More_Option_Direction
-eext_more_option_direction_get(const Evas_Object *obj)
-{
- if (!obj)
- {
- ERR("obj is NULL!!");
- return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
- }
-
- Eext_More_Option_Data *mold = NULL;
- mold = _more_option_data_get((Evas_Object *)obj);
- if (mold)
- {
- Elm_Panel_Orient orient = elm_panel_orient_get(mold->panel);
- return (Eext_More_Option_Direction)orient;
- }
-
- return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_append(Evas_Object *obj)
-{
- Eext_Object_Item *item = NULL;
- Eext_More_Option_Data *mold = NULL;
- mold = _more_option_data_get(obj);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- item = eext_rotary_selector_item_append(mold->rotary_selector);
-
- mold->item_list = eina_list_append(mold->item_list, item);
-
- return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_prepend(Evas_Object *obj)
-{
- Eext_More_Option_Data *mold = NULL;
- Eext_Object_Item *item = NULL;
-
- mold = _more_option_data_get(obj);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- item = eext_rotary_selector_item_prepend(mold->rotary_selector);
-
- mold->item_list = eina_list_prepend(mold->item_list, item);
-
- return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
-{
- Eext_More_Option_Data *mold = NULL;
- Eext_Object_Item *item = NULL;
-
- mold = _more_option_data_get(obj);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
-
- mold->item_list = eina_list_append_relative(mold->item_list, item, after);
-
- return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
-{
- Eext_More_Option_Data *mold = NULL;
- Eext_Object_Item *item = NULL;
-
- mold = _more_option_data_get(obj);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
-
- mold->item_list = eina_list_prepend_relative(mold->item_list, item, before);
-
- return item;
-}
-
-EAPI void
-eext_more_option_item_del(Eext_Object_Item *item)
-{
- //Temporary
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
-
- Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return;
- }
-
- eext_rotary_selector_item_del(item);
-
- mold->item_list = eina_list_remove(mold->item_list, item);
-
- return;
-}
-
-EAPI void
-eext_more_option_items_clear(Evas_Object *obj)
-{
- Evas_Object *more_option = obj;
- Eext_More_Option_Data *mold = NULL;
-
- if (!more_option)
- {
- ERR("more_option is NULL!!");
- return;
- }
-
- mold = _more_option_data_get(more_option);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return;
- }
- eext_rotary_selector_items_clear(mold->rotary_selector);
-
- mold->item_list = eina_list_free(mold->item_list);
-
- return;
-}
-
-EAPI void
-eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
-{
- eext_rotary_selector_item_part_text_set(item, part_name, text);
-
- return;
-}
-
-EAPI void
-eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
-{
- eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
-
- return;
-}
-
-EAPI const char *
-eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
-{
- return eext_rotary_selector_item_part_text_get(item, part_name);
-}
-
-EAPI void
-eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content)
-{
- eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
-
- return;
-}
-
-EAPI Evas_Object *
-eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name)
-{
- return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-}
-
-EAPI void
-eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
-{
- if (!obj)
- {
- ERR("obj is NULL!!");
- return;
- }
-
- Eext_More_Option_Data *mold = NULL;
- mold = _more_option_data_get(obj);
- if (mold)
- {
- if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel);
- else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
- }
-}
-
-EAPI Eina_Bool
-eext_more_option_opened_get(Evas_Object *obj)
-{
- if (!obj)
- {
- ERR("obj is NULL!!");
- return EINA_FALSE;
- }
-
- Eext_More_Option_Data *mold = NULL;
- mold = _more_option_data_get(obj);
- if (mold)
- {
- return !elm_panel_hidden_get(mold->panel);
- }
-
- return EINA_FALSE;
-}
-
-EAPI const Eina_List*
-eext_more_option_items_get(const Evas_Object *obj)
-{
- const Evas_Object *more_option = obj;
- Eext_More_Option_Data *mold = NULL;
-
- if (!more_option)
- {
- ERR("more_option is NULL!!");
- return NULL;
- }
-
- mold = _more_option_data_get(more_option);
- if (!mold)
- {
- ERR("mold is NULL!!");
- return NULL;
- }
-
- return eext_rotary_selector_items_get(mold->rotary_selector);
-}
-
-//for accessibility
-static Eina_Bool
-_access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
-{
- Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
-
- switch (action_info->action_type)
- {
- case ELM_ACCESS_ACTION_ACTIVATE:
- if (mold)
- {
- elm_panel_toggle(mold->panel);
- }
- break;
- }
- return EINA_FALSE;
-}
-static char *
-_accessibility_name_set_cb(void *data, Evas_Object *obj)
-{
- char buf[255] = "";
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
-
- snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
- return strdup(buf);
-}
-//
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-#include "common/efl_extension_common_private.h"
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// efl_extension_rotary_selector.c
-//
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-#define EEXT_ROTARY_SELECTOR_DATA_KEY "eext_rotary_selector_data"
-#define _ROTARY_SELECTOR_SCREEN_WIDTH 360
-#define _ROTARY_SELECTOR_SCREEN_HEIGHT 360
-#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH 180
-#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_HEIGHT 180
-#define _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE 30
-#define _ROTARY_SELECTOR_PAGE_ITEM_MAX 11
-#define _ROTARY_SELECTOR_PAGE_ANIMATION_DURATION 0.35
-#define _ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME 0.1
-#define _ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION 0.6
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_X 0.33
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y 0.0
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X 0.3
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y 1.0
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID -3
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM -2
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM -1
-#define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500
-#define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60
-
-
-#define _ROTARY_SELECTOR_DEBUG_ENABLED 0
-
-// ====================================== util ==================================== //
-#define _DEGREES_TO_RADIANS(degrees) (degrees * M_PI / 180.0)
-#define _RADIANS_TO_DEGREES(radians) (radians * 180.0 / M_PI)
-#define ALMOST_ZERO_FLOAT 0.00001f
-
-#define ROTARY_SELECTOR_COLOR_VALUE_SET(obj, part, state, r, g, b, a) \
- do { \
- obj->part.state.r = r; \
- obj->part.state.g = g; \
- obj->part.state.b = b; \
- obj->part.state.a = a; \
- obj->part.state.set_flag = EINA_TRUE; \
- } while (0)
-
-#define ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, obj, part, state) \
- do { \
- evas_object_color_set(content, \
- obj->part.state.r, \
- obj->part.state.g, \
- obj->part.state.b, \
- obj->part.state.a); \
- } while (0)
-
-#define ROTARY_SELECTOR_COLOR_VALUE_GET(obj, part, state, r, g, b, a) \
- do { \
- if (r) *r = obj->part.state.r; \
- if (g) *g = obj->part.state.g; \
- if (b) *b = obj->part.state.b; \
- if (a) *a = obj->part.state.a; \
- } while (0)
-
-static double
-_min(const double a, const double b)
-{
- if (a < b)
- {
- return a;
- }
- return b;
-}
-
-static Eina_Bool
-_doubleCompare(double p1, double p2)
-{
- if ((p1 == 0.f) || (p2 == 0.f))
- {
- return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT);
- }
-
- return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT * _min(abs(p1), abs(p2)));
-}
-
-static double
-_mouse_event_angle_get(Evas_Coord x, Evas_Coord y)
-{
- const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
- const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-
- double default_angle = 90;
- if (x < center_x)
- {
- default_angle = 270;
- }
- double calculated_x = x - center_x;
- double calculated_y = y - center_y;
- double radian = atan((double) calculated_y / calculated_x);
-
- return (_RADIANS_TO_DEGREES(radian) + default_angle);
-}
-
-// ----------------------------------------- interpolator util --------------------------------------//
-
-void
-_circle_path_interpolator(Eext_Rotary_Selector_Data *rsd, double progress, const double startAngle, const double endAngle, const double startRadius, const double endRadius, double* pos_x, double* pos_y)
-{
- const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
- const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-
- // 1. calculate angle
- double angle = 0.f;
- if (_doubleCompare(startAngle, endAngle))
- {
- angle = startAngle;
- }
- else if (startAngle < endAngle)
- {
- angle = startAngle + ((endAngle - startAngle) * progress);
- }
- else
- {
- angle = startAngle - ((startAngle - endAngle) * progress);
- }
-
- double radian = _DEGREES_TO_RADIANS(angle);
- double cosValue = cos(radian);
- double sinValue = sin(radian);
-
- // 2. calculate radius
- float radius = startRadius;
- if (endRadius >= 0)
- {
- if (startRadius <= endRadius)
- {
- radius = startRadius + ((endRadius-startRadius)*progress);
- }
- else
- {
- radius = startRadius - ((startRadius-endRadius)*progress);
- }
- }
-
- // 3. calculate target point
- *pos_x = center_x + (radius * (float)(cosValue)) - (rsd->item_width / 2.f);
- *pos_y = center_y + (radius * (float)(sinValue)) - (rsd->item_height / 2.f);
-
- return;
-}
-// ----------------------------------------- event area API --------------------------------------//
-static void _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_callback_add(Eext_Rotary_Selector_Data *rsd);
-
-// ----------------------------------------- internal header --------------------------------------//
-static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent);
-static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_get(Evas_Object *rotary_selector);
-static Eina_Bool _rotary_selector_visible_get(Evas_Object *rotary_selector);
-static Eina_Bool _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
-static void _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- item API --------------------------------------//
-static void _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item);
-static void _items_transformation_update(Eext_Rotary_Selector_Data *rsd);
-static void _items_invalidate(Eext_Rotary_Selector_Data *rsd);
-static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd);
-static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index);
-static void _item_select(Eext_Rotary_Selector_Data *rsd, int index);
-static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd);
-static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index);
-static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound);
-
-static Eext_Rotary_Selector_Item * _item_get(Eext_Rotary_Selector_Data *rsd, int index);
-static void _item_text_copy(char **target, const char* source);
-
-// ----------------------------------------- animation API --------------------------------------//
-static Eina_Bool _previous_page_animator_cb(void *data);
-static Eina_Bool _item_update_animator_cb(void *data);
-static void _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
-static void _end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
-static void _item_update_animation_run(Eext_Rotary_Selector_Data *rsd);
-static Eina_Bool _next_page_animator_cb(void *data);
-static Eina_Bool _next_page_timer_cb(void *data);
-static Eina_Bool _end_effect_animator_cb(void *data);
-
-// ----------------------------------------- selector API --------------------------------------//
-static void _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation);
-static void _selector_content_update(Eext_Rotary_Selector_Data *rsd);
-static void _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static Eina_Bool _accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
-static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page);
-static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj);
-static char *_accessibility_name_set_cb(void *data, Evas_Object *obj);
-static char *_accessibility_description_set_cb(void *data, Evas_Object *obj);
-static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info);
-static void _rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info);
-void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
-static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector);
-static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- event area API --------------------------------------//
-static void
-_event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
- const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
- Evas_Event_Mouse_Down *ev = event_info;
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
- {
- INF("animator is running!!");
- return;
- }
- rsd->pressed = EINA_TRUE;
-
- int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
- if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
- {
- double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
- int new_index = 0;
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- int i = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- if (last_index > rsd->item_count - 1)
- {
- last_index = rsd->item_count - 1;
- }
-
- if (angle < 20.f)
- {
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM;
- }
- else if (angle > 340.f)
- {
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM;
- }
- else
- {
- const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
- for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX;i++)
- {
- if(angle < touchAreaAngle[i]) break;
- }
-
- new_index = first_index + i;
-
- if (last_index < new_index)
- {
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
- }
- else
- {
- rsd->pressed_item_index = new_index;
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_TRUE, EINA_FALSE);
- }
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("pressed_item_index : %d", rsd->pressed_item_index);
-#endif
- }
- }
-}
-
-static void
-_event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
- const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
- Evas_Event_Mouse_Move *ev = event_info;
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
- {
- INF("animator is running!!");
- return;
- }
- if (!rsd->pressed)
- {
- return;
- }
-
- if (rsd->touched_item_changed || rsd->pressed_item_index == _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID)
- {
- return;
- }
-
- int point = sqrt(pow(center_x - ev->cur.canvas.x, 2) + pow(center_y - ev->cur.canvas.y, 2));
- if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
- {
- double angle = _mouse_event_angle_get(ev->cur.canvas.x, ev->cur.canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
- int new_index = 0;
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- int i = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- if (last_index > rsd->item_count - 1)
- {
- last_index = rsd->item_count - 1;
- }
-
- if (angle < 20.f)
- {
- if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM)
- {
- rsd->touched_item_changed = EINA_TRUE;
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
- }
- }
- else if (angle > 340.f)
- {
- if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM)
- {
- rsd->touched_item_changed = EINA_TRUE;
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
- }
- }
- else
- {
- const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
-
- for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
- {
- if(angle < touchAreaAngle[i]) break;
- }
- new_index = first_index + i;
-
- if (rsd->pressed_item_index != new_index)
- {
- rsd->touched_item_changed = EINA_TRUE;
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
- }
- }
- }
- else
- {
- if (rsd->pressed_item_index >= 0)
- {
- rsd->touched_item_changed = EINA_TRUE;
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
- }
- }
-}
-
-static void
-_event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
- const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
- Evas_Event_Mouse_Up *ev = event_info;
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
- {
- INF("animator is running!!");
- return;
- }
- if (!rsd->pressed)
- {
- return;
- }
-
- int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
- if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
- {
- if (rsd->touched_item_changed)
- {
- rsd->touched_item_changed = EINA_FALSE;
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
- rsd->pressed = EINA_FALSE;
-
- return;
- }
-
- double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
- int new_index = 0;
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- int previous_item_index = rsd->selected_index;
- int i = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- if (last_index > rsd->item_count - 1)
- {
- last_index = rsd->item_count - 1;
- }
-
- if (angle < 20.f)
- {
- if (rsd->current_page> 0)
- {
- rsd->selected_index = first_index - 1;
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- _page_animation_run(rsd, EINA_FALSE);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- }
- else if (angle > 340.f)
- {
- if (rsd->current_page < (rsd->item_count/_ROTARY_SELECTOR_PAGE_ITEM_MAX))
- {
- rsd->selected_index = last_index + 1;
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- _page_animation_run(rsd, EINA_TRUE);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- }
- else
- {
- const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
- for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
- {
- if(angle < touchAreaAngle[i]) break;
- }
- new_index = first_index + i;
-
- if (rsd->pressed_item_index == new_index)
- {
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE);
- rsd->selected_index = new_index;
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- _selector_update(rsd, EINA_FALSE, EINA_FALSE);
- evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
- }
- }
- }
-
- rsd->pressed = EINA_FALSE;
- rsd->touched_item_changed = EINA_FALSE;
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-}
-
-static void
-_event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- if (rsd->pressed_item_index > 0)
- {
- _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
- }
-
- rsd->pressed = EINA_FALSE;
- rsd->touched_item_changed = EINA_FALSE;
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-}
-
-static void
-_event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- INF("called!!");
-
- evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb);
- evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb);
- evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb);
- evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb);
-}
-
-static void
-_event_area_callback_add(Eext_Rotary_Selector_Data *rsd)
-{
- INF("called!!");
-
- rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area");
-
- if (rsd->event_area)
- {
- evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb, rsd);
- evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb, rsd);
- evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb, rsd);
- evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb, rsd);
- evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_DEL, _event_area_del_cb, rsd);
- }
-}
-
-// ----------------------------------------- internal header --------------------------------------//
-static Eext_Rotary_Selector_Data *
-_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
-{
- Eext_Rotary_Selector_Data *rsd = NULL;
- const char *radius = NULL;
- const char *item_width = NULL;
- const char *item_height = NULL;
-
- rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data));
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
- rsd->parent = parent;
- rsd->rotary_selector = obj;
- rsd->event_area = NULL;
- rsd->item_list = NULL;
- rsd->item_count = 0;
- rsd->selected_index = 0;
- rsd->current_page = 0;
- rsd->animation_direction = EINA_TRUE;
- rsd->previous_page_animator = NULL;
- rsd->next_page_animator = NULL;
- rsd->previous_page_animator_start_time = 0.0f;
- rsd->next_page_animator_start_time = 0.0f;
- rsd->next_page_animation_started = EINA_FALSE;
- rsd->previous_page_animation_started = EINA_FALSE;
- rsd->next_page_timer = NULL;
- rsd->end_effect_animation_started = EINA_FALSE;
- rsd->end_effect_animator_start_time = 0.0f;
- rsd->end_effect_animator = NULL;
- rsd->item_update_animator = NULL;
- rsd->selector_bg_image_color.normal_color.set_flag = EINA_FALSE;
- rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE;
- rsd->pressed = EINA_FALSE;
- rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
- rsd->touched_item_changed = EINA_FALSE;
- rsd->acceleration = EINA_FALSE;
-
- radius = edje_object_data_get(elm_layout_edje_get(obj), "radius");
- if (!radius)
- {
- ERR("radius is NULL!!");
- free(rsd);
- return NULL;
- }
- rsd->radius = atoi(radius);
-
- item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width");
- if (!item_width)
- {
- ERR("item_width is NULL!!");
- free(rsd);
- return NULL;
- }
- rsd->item_width = (Evas_Coord)atoi(item_width);
-
- item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height");
- if (!item_height)
- {
- ERR("item_height is NULL!!");
- free(rsd);
- return NULL;
- }
- rsd->item_height = (Evas_Coord)atoi(item_height);
- rsd->rotary_event_time_stamp = 0.0;
-
- INF("rsd is initialized!!");
-
- return rsd;
-}
-
-static Eext_Rotary_Selector_Data *
-_eext_rotary_selector_data_get(Evas_Object *rotary_selector)
-{
- if (!rotary_selector)
- {
- ERR("rotary_selector is NULL!!");
- return NULL;
- }
-
- return evas_object_data_get(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY);
-}
-
-static Eina_Bool
-_rotary_selector_visible_get(Evas_Object *rotary_selector)
-{
- if (!rotary_selector)
- {
- return EINA_FALSE;
- }
-
- Evas_Coord x, y, w, h;
- evas_object_geometry_get(rotary_selector, &x, &y, &w, &h);
- if (evas_object_visible_get(rotary_selector) && x == 0)
- {
- return EINA_TRUE;
- }
- else
- {
- return EINA_FALSE;
- }
-
- return EINA_FALSE;
-}
-
-static Eina_Bool
-_rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
-
- if (rsd->acceleration)
- {
- INF("rotary acceleration!!");
- return EINA_FALSE;
- }
-
- if (elm_object_disabled_get(rsd->rotary_selector))
- {
- return ECORE_CALLBACK_PASS_ON;
- }
-
- if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
- {
- return ECORE_CALLBACK_PASS_ON;
- }
-
- int previous_item_index = rsd->selected_index;
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- if (last_index > rsd->item_count - 1)
- {
- last_index = rsd->item_count - 1;
- }
-
- if (rsd->rotary_event_time_stamp == 0 && !rsd->acceleration)
- {
- rsd->rotary_event_time_stamp = info->time_stamp;
- rsd->acceleration = EINA_FALSE;
- }
- else
- {
- int diff = info->time_stamp - rsd->rotary_event_time_stamp;
- if (diff < _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD)
- {
- rsd->acceleration = EINA_TRUE;
- }
- else
- {
- rsd->rotary_event_time_stamp = info->time_stamp;
- }
- }
-
- if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
- {
- if (rsd->selected_index < rsd->item_count - 1)
- {
- //for accessibility
- if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
- //
- {
- if (!rsd->acceleration)
- {
- rsd->selected_index += 1;
- }
- else
- {
- rsd->selected_index = last_index;
- }
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- }
- if (last_index < rsd->selected_index)
- {
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- rsd->selected_index -= 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
- rsd->control_by_rotary = EINA_TRUE;
- elm_atspi_component_highlight_grab(rsd->event_area_access_object);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- //
- else
- {
- _page_animation_run(rsd, EINA_TRUE);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- }
- else
- {
- _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
- if(_item)
- {
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
- elm_atspi_component_highlight_grab(_item->base.obj);
- }
- }
- //
- }
- }
- else
- {
- _end_effect_animation_run(rsd, EINA_TRUE);
- }
- }
- else
- {
- if (rsd->selected_index > 0)
- {
- //for accessibility
- if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
- //
- {
- if (!rsd->acceleration)
- {
- rsd->selected_index -= 1;
- }
- else
- {
- rsd->selected_index = first_index;
- }
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- }
- if (first_index > rsd->selected_index)
- {
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- rsd->selected_index += 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
- rsd->control_by_rotary = EINA_TRUE;
- elm_atspi_component_highlight_grab(rsd->event_area_access_object);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- else
- //
- {
- _page_animation_run(rsd, EINA_FALSE);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- }
- }
- else
- {
- _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
- evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
- if(_item)
- {
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
- elm_atspi_component_highlight_grab(_item->base.obj);
- }
- }
- //
- }
- }
- else
- {
- _end_effect_animation_run(rsd, EINA_FALSE);
- }
- }
-
- return ECORE_CALLBACK_PASS_ON;
-}
-
-static void
-_rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- _item_select(rsd, rsd->selected_index);
-}
-
-static void
-_rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = data;
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- _item_select(rsd, rsd->selected_index);
-
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- {
- rsd->reading_page_number = -1;
- elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- if(!_rotary_selector_from_moreoption_get(rsd->rotary_selector))
- elm_atspi_component_highlight_grab(rsd->event_area_access_object);
- }
- //
-
-}
-
-static void
-_rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- if (rsd->item_list)
- {
- Eext_Rotary_Selector_Item *item = NULL;
- EINA_LIST_FREE(rsd->item_list, item)
- evas_object_del(item->base.obj);
- rsd->item_list = NULL;
- }
- if (rsd->previous_page_animator)
- {
- ecore_animator_del(rsd->previous_page_animator);
- rsd->previous_page_animator = NULL;
- }
- if (rsd->next_page_animator)
- {
- ecore_animator_del(rsd->next_page_animator);
- rsd->next_page_animator = NULL;
- }
- if (rsd->next_page_timer)
- {
- ecore_timer_del(rsd->next_page_timer);
- rsd->next_page_timer = NULL;
- }
- if (rsd->end_effect_animator)
- {
- ecore_animator_del(rsd->end_effect_animator);
- rsd->end_effect_animator = NULL;
- }
- if (rsd->item_update_animator)
- {
- ecore_animator_del(rsd->item_update_animator);
- rsd->item_update_animator = NULL;
- }
-
- edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal);
- edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb);
- eext_rotary_object_event_callback_del(obj, _rotary_selector_rotary_cb);
- evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb);
- evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb);
-
- evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
-
- free(rsd);
-}
-
-// ----------------------------------------- item API --------------------------------------//
-static void
-_item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item)
-{
- const float endAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
-
- Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
- _circle_path_interpolator(rsd, 1.0f, 0, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], 0, rsd->radius, &coords->x, &coords->y);
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- Evas_Coord x, y, w, h;
- evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
-
- INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
-#endif
-}
-
-static void
-_items_transformation_update(Eext_Rotary_Selector_Data *rsd)
-{
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- _item_coords_update(rsd, item);
- }
-}
-
-static void
-_items_invalidate(Eext_Rotary_Selector_Data *rsd)
-{
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- double start_time = ecore_time_unix_get();
-#endif
- if (rsd->item_count <= 0)
- {
- return;
- }
- int i = 0;
- Eina_List *l = NULL;
- Evas_Coord x, y, w, h;
- evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
- Eext_Rotary_Selector_Item *item = NULL;
-
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
-
- if (i >= first_index && i <= last_index)
- {
- evas_object_color_set(button, 255, 255, 255, 255);
- evas_object_move(button, x + item->coords.x, y + item->coords.y);
- evas_object_raise(button);
- evas_object_show(button);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
-#endif
- }
- else
- {
- evas_object_hide(button);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("obj : 0x%x hide index : %d", item->base.obj, item->index);
-#endif
- }
- i++;
- }
-
- _layer_items_invalidate(rsd);
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("elapsed time(%f)", ecore_time_unix_get() - start_time);
-#endif
-}
-
-static void
-_layer_items_invalidate(Eext_Rotary_Selector_Data *rsd)
-{
- if (rsd->item_count <= 0)
- {
- return;
- }
- int i = 0;
- Eina_List *l = NULL;
- double coord_x, coord_y;
- Evas_Coord x, y, w, h;
- evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
- Eext_Rotary_Selector_Item *item = NULL;
-
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
-
- Evas_Object *current_first_item = NULL;
- Evas_Object *current_last_item = NULL;
- Evas_Object *second_layer_right_item = NULL;
- Evas_Object *second_layer_left_item = NULL;
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
- if (i == first_index)
- {
- current_first_item = button;
- }
- else if (i == last_index)
- {
- current_last_item = button;
- }
-
- if(rsd->current_page > 0 && i == first_index-1) //Second layer Right
- {
- second_layer_right_item = button;
- }
- else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
- {
- second_layer_left_item = button;
- }
- i++;
- }
-
- l = NULL;
- item = NULL;
- i = 0;
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
- if (rsd->current_page > 0 && i == first_index-1) //Second layer Right
- {
- _circle_path_interpolator(rsd, 1, 0, -67, rsd->radius, rsd->radius, &coord_x, &coord_y);
- evas_object_move(button, x + coord_x, y + coord_y);
- evas_object_stack_below(button, current_first_item);
- evas_object_color_set(button, 128, 128, 128, 128);
- evas_object_show(button);
- }
- else if (rsd->current_page > 0 && i == first_index-2) //third layer Right
- {
- _circle_path_interpolator(rsd, 1, 0, -70, rsd->radius, rsd->radius, &coord_x, &coord_y);
- evas_object_move(button, x + coord_x, y + coord_y);
- evas_object_stack_below(button, second_layer_right_item);
- evas_object_color_set(button, 102, 102, 102, 102);
- evas_object_show(button);
- }
- else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
- {
- _circle_path_interpolator(rsd, 1, 0, -113, rsd->radius, rsd->radius, &coord_x, &coord_y);
- evas_object_move(button, x + coord_x, y + coord_y);
- evas_object_stack_below(button, current_last_item);
- evas_object_color_set(button, 128, 128, 128, 128);
- evas_object_show(button);
- }
- else if (last_index < (rsd->item_count - 1) && i == last_index + 2) //third layer Left
- {
- _circle_path_interpolator(rsd, 1, 0, -110, rsd->radius, rsd->radius, &coord_x, &coord_y);
- evas_object_move(button, x + coord_x, y + coord_y);
- evas_object_stack_below(button, second_layer_left_item);
- evas_object_color_set(button, 102, 102, 102, 102);
- evas_object_show(button);
- }
- i++;
- }
-}
-
-static void
-_item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index)
-{
- Eina_List *l = NULL;
- int i = 0;
- Eext_Rotary_Selector_Item *item = NULL;
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- item->index = i;
- i++;
- }
- rsd->item_count = i;
- rsd->selected_index = selected_index;
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item is rearranged!! : item_count(%d)", rsd->item_count);
-#endif
-}
-
-static void
-_item_select(Eext_Rotary_Selector_Data *rsd, int index)
-{
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item is selected!! : index(%d)", index);
-#endif
- {
- _item_selected_signal_send(rsd, rsd->selected_index, index);
- rsd->selected_index = index;
- _selector_update(rsd, EINA_FALSE, EINA_FALSE);
- _items_transformation_update(rsd);
- _items_invalidate(rsd);
- }
-}
-
-static void
-_item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Item *item = data;
-
- if (item->content_icon)
- {
- evas_object_del(item->content_icon);
- item->content_icon = NULL;
- }
- if (item->custom_content)
- {
- evas_object_del(item->custom_content);
- item->custom_content = NULL;
- }
- if (item->text1)
- {
- free(item->text1);
- item->text1 = NULL;
- }
- if (item->text2)
- {
- free(item->text2);
- item->text2 = NULL;
- }
- if (item->domain)
- {
- free(item->domain);
- item->domain = NULL;
- }
-
- free(item);
-}
-
-static Eext_Rotary_Selector_Item *
-_item_create(Eext_Rotary_Selector_Data *rsd)
-{
- Eext_Rotary_Selector_Item *item = NULL;
- Evas_Object *button = NULL;
- Evas_Object *rotary_selector = rsd->rotary_selector;
-
- button = elm_button_add(rotary_selector);
- if (!button)
- {
- ERR("button is NULL!!");
- return NULL;
- }
-
-
- if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
- evas_object_freeze_events_set(button, EINA_TRUE);
- evas_object_repeat_events_set(button, EINA_TRUE);
-
- evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_object_style_set(button, "rotary_selector_item");
- evas_object_move(button, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT);
- evas_object_resize(button, rsd->item_width, rsd->item_height);
- evas_object_smart_member_add(button, rotary_selector);
-
- Evas_Object *action_bg = elm_layout_add(button);
- elm_layout_theme_set(action_bg, "rotary_selector", "item", "bg_image");
- elm_object_part_content_set(button, "item,bg_image", action_bg);
-
- item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item));
- if (!item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
-
- //for accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
- evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
- //
-
- if (item)
- {
- item->base.obj = button;
- item->index = -1;
- item->parent = rsd->parent;
- item->rotary_selector = rotary_selector;
- item->coords.x = 0.0f;
- item->coords.y = 0.0f;
- item->domain = NULL;
- item->text1 = NULL;
- item->text2 = NULL;
- item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
- item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
- item->item_bg_image_color.normal_color.set_flag = EINA_FALSE;
- item->item_bg_image_color.pressed_color.set_flag = EINA_FALSE;
- item->item_icon_color.normal_color.set_flag = EINA_FALSE;
- item->item_icon_color.pressed_color.set_flag = EINA_FALSE;
- item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
- item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
- item->custom_content_color.normal_color.set_flag = EINA_FALSE;
- item->custom_content_color.pressed_color.set_flag = EINA_FALSE;
- item->content_icon = NULL;
- item->custom_content = NULL;
- }
- evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _item_del_cb, item);
-
- return item;
-}
-
-
-static void
-_item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index)
-{
- Eina_List *l = NULL;
- int i = 0;
- Eext_Rotary_Selector_Item *item = NULL;
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- if (previous_item_index != -1 && i == previous_item_index)
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item is unselected!! : index(%d)", previous_item_index);
-#endif
- }
- if (current_item_index !=-1 && i == current_item_index)
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,selected", "");
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item is selected!! : index(%d)", current_item_index);
-#endif
- }
- i++;
- }
-}
-
-static void
-_item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound)
-{
- Eina_List *l = NULL;
- int i = 0;
- Eext_Rotary_Selector_Item *item = NULL;
-
- if (index < 0)
- {
- return;
- }
- if (rsd->selected_index == index)
- {
- if (!pressed && sound)
- {
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- if (i == index)
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
- }
- i++;
- }
- }
- return;
- }
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- if (i == index)
- {
- if (pressed)
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,pressed", "eext");
- }
- else
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,unpressed", "eext");
- if (sound)
- {
- elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
- }
- }
- }
- i++;
- }
-}
-
-static Eext_Rotary_Selector_Item *
-_item_get(Eext_Rotary_Selector_Data *rsd, int index)
-{
- int i = 0;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- if (index == i)
- {
- return item;
- }
- i++;
- }
-
- return NULL;
-}
-
-static void
-_item_text_copy(char **target, const char* source)
-{
- int size = 0;
-
- if (*target)
- {
- free(*target);
- *target = NULL;
- }
- size = strlen(source) + 1;
- *target = malloc(sizeof(char)*size);
- if (!(*target))
- {
- ERR("allocation is failed!!");
- return;
- }
- memset(*target, 0, size);
- strncpy(*target, source, size);
-}
-
-// ----------------------------------------- animation API --------------------------------------//
-static Eina_Bool
-_previous_page_animator_cb(void *data)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- int i = 0;
- int last_index = 0;
- double p = 0.0f;
- double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
-
- if (rsd->previous_page_animation_started)
- {
- rsd->previous_page_animation_started = EINA_FALSE;
- rsd->previous_page_animator_start_time = ecore_time_unix_get();
- }
-
- double dt = ecore_time_unix_get() - rsd->previous_page_animator_start_time;
- p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
- if (p <= 1.0f)
- {
- const float startAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Coord new_a;
- Evas_Object *button = item->base.obj;
- Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
- evas_object_raise(button);
-
- //current page
- if (first_index <= i && i <= last_index)
- {
- //Forward
- if (rsd->animation_direction)
- {
- // page 0 --> 1 : 0page
- const float endAngle[] = { 660.f, 660.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f };
- _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
- }
- else
- {
- // page 1 --> 0 : 1page
- const float endAngle[] = { 240.f, 240.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f };
- _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
- }
- new_a = 255*(1-p);
- evas_object_move(button, item->coords.x, item->coords.y);
- evas_object_color_set(button, new_a, new_a, new_a, new_a);
- }
- if (rsd->animation_direction && rsd->current_page > 0 && (i == first_index-1 || i == first_index -2))
- {
- evas_object_color_set(button, 0, 0, 0, 0);
- }
- else if (last_index < (rsd->item_count - 1) && (i == last_index + 1 || i == last_index + 2))
- {
- evas_object_color_set(button, 0, 0, 0, 0);
- }
- i++;
- }
- }
- if (p >= 1.0f)
- {
- rsd->previous_page_animator_start_time = 0.0f;
- rsd->previous_page_animator = NULL;
-
- return ECORE_CALLBACK_CANCEL;
- }
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_item_update_animator_cb(void *data)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- _item_rearrange(rsd, rsd->selected_index);
- _item_select(rsd, rsd->selected_index);
-
- rsd->item_update_animator = NULL;
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
-#endif
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
-{
- if (direction) //Forward
- {
- rsd->animation_direction = EINA_TRUE;
- }
- else //Backward
- {
- rsd->animation_direction = EINA_FALSE;
- }
-
- Edje_Message_Float_Set *msg = malloc(sizeof(Edje_Message_Float_Set));
- if (!msg) return;
-
- msg->count = 1;
- msg->val[0] = 1;
- edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg);
-
- rsd->previous_page_animator_start_time = ecore_loop_time_get();
- rsd->previous_page_animation_started = EINA_TRUE;
- rsd->previous_page_animator = ecore_animator_add(_previous_page_animator_cb, rsd);
-
- rsd->next_page_timer = ecore_timer_add(_ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME, _next_page_timer_cb, rsd);
-}
-
-static void
-_end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
-{
- if (direction) //Forward
- {
- rsd->animation_direction = EINA_TRUE;
- }
- else //Backward
- {
- rsd->animation_direction = EINA_FALSE;
- }
- rsd->end_effect_animation_started = EINA_TRUE;
- rsd->end_effect_animator = ecore_animator_add(_end_effect_animator_cb, rsd);
-
- elm_layout_signal_emit(rsd->rotary_selector, "eext,action,haptic,end_effect", "eext");
-}
-
-static void
-_item_update_animation_run(Eext_Rotary_Selector_Data *rsd)
-{
- if (rsd->item_update_animator)
- {
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
- INF("item update animator is already running!!");
-#endif
- return;
- }
-
- rsd->item_update_animator = ecore_animator_add(_item_update_animator_cb, rsd);
-}
-
-static Eina_Bool
-_next_page_animator_cb(void *data)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int i = 0;
- Evas_Coord new_a;
- Eext_Rotary_Selector_Item_Coords *coords = NULL;
- Evas_Object *button = NULL;
- int last_index = 0;
- if (rsd->current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
-
- double p = 0.0f;
- double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
- if (rsd->next_page_animation_started)
- {
- rsd->next_page_animation_started = EINA_FALSE;
- rsd->next_page_animator_start_time = ecore_time_unix_get();
- }
-
- double dt = ecore_time_unix_get() - rsd->next_page_animator_start_time;
- p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
- if (p <= 1.0f)
- {
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- button = item->base.obj;
- coords = &item->coords;
- evas_object_raise(button);
-
- if (rsd->animation_direction) //Forward
- {
- if (first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX) //current page+1
- {
- // page 0 --> 1 : 1page
- const float endAngle[] = { 300.f, 330.f, 360.f, 390.f, 420.f, 450.f, 480.f, 510.f, 540.f, 570.f, 600.f };
- _circle_path_interpolator(rsd, p, 300, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
- new_a = 255*p;
- evas_object_move(button, item->coords.x, item->coords.y);
- evas_object_color_set(button, new_a, new_a, new_a, new_a);
- evas_object_show(button);
- }
- }
- else //Backward
- {
- if (first_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX) //current page-1
- {
- // page 1 --> 0 : 0page
- const float endAngle[] = { -60.f, -30.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
- _circle_path_interpolator(rsd, p, 240, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
- new_a = 255*p;
- evas_object_move(button, item->coords.x, item->coords.y);
- evas_object_color_set(button, new_a, new_a, new_a, new_a);
- evas_object_show(button);
- }
- }
- i++;
- }
- }
-
- if (p >= 1.0f)
- {
- //Forward
- if (rsd->animation_direction)
- {
- rsd->current_page += 1;
- _items_invalidate(rsd);
- }
- else //Backward
- {
- rsd->current_page -= 1;
- _items_invalidate(rsd);
- }
-
- rsd->next_page_animator_start_time = 0.0f;
- rsd->next_page_animator = NULL;
-
- return ECORE_CALLBACK_CANCEL;
- }
-
- return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_next_page_timer_cb(void *data)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- rsd->next_page_timer = NULL;
-
- rsd->next_page_animator_start_time = ecore_loop_time_get();
- rsd->next_page_animation_started = EINA_TRUE;
- rsd->next_page_animator = ecore_animator_add(_next_page_animator_cb, rsd);
-
- return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool
-_end_effect_animator_cb(void *data)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
- double p = 0.0f;
- double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
- if (rsd->end_effect_animation_started)
- {
- rsd->end_effect_animation_started = EINA_FALSE;
- rsd->end_effect_animator_start_time = ecore_time_unix_get();
- }
-
- double dt = ecore_time_unix_get() - rsd->end_effect_animator_start_time;
- p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
- Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
- if (!selector)
- {
- ERR("selector is NULL!!");
- return ECORE_CALLBACK_CANCEL;
- }
-
- Evas_Map *map = NULL;
- map = evas_map_new(4);
- if (!map)
- {
- ERR("map is NULL!!");
- return ECORE_CALLBACK_CANCEL;
- }
-
- double selector_angle = ((rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1) *_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE;
- double effect_angle = rsd->animation_direction ? _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2 : -_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2;
-
- evas_map_util_points_populate_from_object(map, selector);
-
- if (p <= 0.5f)
- {
- evas_map_util_rotate(map, selector_angle + effect_angle*p/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
- evas_object_map_enable_set(selector, EINA_TRUE);
- evas_object_map_set(selector, map);
- }
- else if (p <= 1.0f)
- {
- evas_map_util_rotate(map, selector_angle + effect_angle - effect_angle*(p - 0.5)/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
- evas_object_map_enable_set(selector, EINA_TRUE);
- evas_object_map_set(selector, map);
- }
-
- if (p >= 1.0f)
- {
- rsd->animation_direction = EINA_TRUE;
- rsd->end_effect_animator_start_time = 0.0f;
- rsd->end_effect_animator = NULL;
- if (map) evas_map_free(map);
-
- return ECORE_CALLBACK_CANCEL;
- }
-
- if (map) evas_map_free(map);
-
- return ECORE_CALLBACK_RENEW;
-}
-
-// ----------------------------------------- new API --------------------------------------//
-static void
-_selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation)
-{
- Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
- if (!edje)
- {
- ERR("edje is NULL!!");
- return;
- }
-
- const char* signals[] = {"eext,rotate,0", "eext,rotate,30", "eext,rotate,60", "eext,rotate,90", "eext,rotate,120",
- "eext,rotate,150", "eext,rotate,180", "eext,rotate,210", "eext,rotate,240", "eext,rotate,270", "eext,rotate,300",};
-
- if (page_changed)
- {
- if (rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX == 0)
- {
- edje_object_signal_emit(edje, "eext,rotate,360", "eext");
- }
- else
- {
- edje_object_signal_emit(edje, "eext,rotate,-60", "eext");
- }
- }
- else
- {
- if (is_animation)
- edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext");
- else
- edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
- }
-
- _selector_content_update(rsd);
-}
-
-static void
-_selector_content_update(Eext_Rotary_Selector_Data *rsd)
-{
- int i = 0;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- Evas_Object *content_icon = elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
- if (content_icon)
- {
- evas_object_hide(content_icon);
- }
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- if (item->index == rsd->selected_index)
- {
-#if 0
- if (item->custom_content)
- {
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content,show", "eext");
- elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content", item->custom_content);
- }
- else
-#endif
- {
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
-
- if (item->domain)
- {
- elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->domain, item->text1);
- elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->domain, item->text2);
- }
- else
- {
- elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->text1);
- elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->text2);
- }
- if (item->content_icon)
- {
- elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon", item->content_icon);
- if (item->text1)
- {
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,icon,show", "eext");
- }
- }
- else if (item->text2)
- {
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text2,show", "eext");
- }
- else
- {
- elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext");
- }
- }
- }
- i++;
- }
-}
-
-static void
-_selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- INF("called!!");
-
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- if (rsd)
- {
- evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
- }
-}
-static void
-_selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
- INF("called!!");
-
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- if (rsd)
- {
- if (rsd->acceleration)
- {
- rsd->acceleration = EINA_FALSE;
- rsd->rotary_event_time_stamp = 0;
- }
- }
-}
-
-// ----------------------------------------- public API implementation --------------------------------------//
-EAPI Evas_Object *
-eext_rotary_selector_add(Evas_Object *parent)
-{
- if (!parent) return NULL;
-
- Eext_Rotary_Selector_Data *rsd = NULL;
-
- Evas_Object *rotary_selector = elm_layout_add(parent);
- if (!rotary_selector)
- {
- ERR("rotary_selector is NULL!!");
- return NULL;
- }
-
- elm_layout_theme_set(rotary_selector, "layout", "rotary_selector", "default");
- evas_object_move(rotary_selector, 0, 0);
- evas_object_resize(rotary_selector, _ROTARY_SELECTOR_SCREEN_WIDTH, _ROTARY_SELECTOR_SCREEN_HEIGHT);
-
- rsd = _eext_rotary_selector_data_init(rotary_selector, parent);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
-
- edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
- edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);
-
- //default selector bg part
- Evas_Object *selector_bg = elm_layout_add(rotary_selector);
- if (!selector_bg)
- {
- ERR("selector_bg is NULL!!");
- return NULL;
- }
-
- elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
-
- elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg);
-
- //default selector content part
- Evas_Object *content = elm_layout_add(rotary_selector);
- if (!content)
- {
- ERR("content is NULL!!");
- return NULL;
- }
-
- elm_layout_theme_set(content, "rotary_selector", "content", "default");
- elm_object_part_content_set(rotary_selector, "content", content);
-
- eext_rotary_object_event_callback_add(rotary_selector, _rotary_selector_rotary_cb, rsd);
- evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb, rsd);
- evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_DEL, _rotary_selector_del_cb, rsd);
- evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb, rsd);
-
- _event_area_callback_add(rsd);
-
- //for accessibility
- _rotary_selector_from_moreoption_set(rotary_selector, EINA_FALSE);
- rsd->event_area_access_object = elm_access_object_register(rsd->event_area, rsd->rotary_selector);
-
- evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd);
- evas_object_smart_callback_add(rotary_selector, "more,option,closed", _rotary_selector_moreoption_closed_cb, rsd);
-
- elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
- //
- return rotary_selector;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_append(Evas_Object *obj)
-{
- int selected_index = 0;
- Evas_Object* rotary_selector = obj;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- rsd = _eext_rotary_selector_data_get(rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- item = _item_create(rsd);
- if (!item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
-
- rsd->item_list = eina_list_append(rsd->item_list, item);
-
- if (_rotary_selector_visible_get(rotary_selector))
- {
- selected_index = rsd->selected_index;
- }
-
- rsd->selected_index = selected_index;
- _item_rearrange(rsd, rsd->selected_index);
-
- _item_update_animation_run(rsd);
-
- return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_prepend(Evas_Object *obj)
-{
- int selected_index = 0;
- Evas_Object* rotary_selector = obj;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- rsd = _eext_rotary_selector_data_get(rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- item = _item_create(rsd);
- if (!item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
-
- rsd->item_list = eina_list_prepend(rsd->item_list, item);
-
- if (_rotary_selector_visible_get(rotary_selector))
- {
- selected_index = rsd->selected_index + 1;
- }
-
- rsd->selected_index = selected_index;
- _item_rearrange(rsd, rsd->selected_index);
-
- _item_update_animation_run(rsd);
-
- return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
-{
- int selected_index = 0;
- Evas_Object* rotary_selector = obj;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after;
-
- rsd = _eext_rotary_selector_data_get(rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- item = _item_create(rsd);
- if (!item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
-
- rsd->item_list = eina_list_append_relative(rsd->item_list, item, after_item);
-
- if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index <= after_item->index)
- {
- selected_index = rsd->selected_index;
- }
- else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index > after_item->index)
- {
- selected_index = rsd->selected_index + 1;
- }
-
- rsd->selected_index = selected_index;
- _item_rearrange(rsd, rsd->selected_index);
-
- _item_update_animation_run(rsd);
-
- return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
-{
- int selected_index = 0;
- Evas_Object* rotary_selector = obj;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before;
-
- rsd = _eext_rotary_selector_data_get(rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- item = _item_create(rsd);
- if (!item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
-
- rsd->item_list = eina_list_prepend_relative(rsd->item_list, item, before_item);
-
- if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index >= before_item->index)
- {
- selected_index = rsd->selected_index + 1;
- }
- else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index < before_item->index)
- {
- selected_index = rsd->selected_index;
- }
-
- rsd->selected_index = selected_index;
- _item_rearrange(rsd, rsd->selected_index);
-
- _item_update_animation_run(rsd);
-
- return (Eext_Object_Item *)item;
-}
-
-EAPI void
-eext_rotary_selector_item_del(Eext_Object_Item *item)
-{
- int selected_index = 0;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
-
- rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index < rotary_selector_item->index)
- {
- selected_index = rsd->selected_index;
- }
- else if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index > rotary_selector_item->index)
- {
- selected_index = rsd->selected_index - 1;
- }
-
- rsd->item_list = eina_list_remove(rsd->item_list, rotary_selector_item);
- evas_object_del(rotary_selector_item->base.obj);
-
- rsd->selected_index = selected_index;
- _item_rearrange(rsd, rsd->selected_index);
-
- _item_update_animation_run(rsd);
-
- return;
-}
-
-EAPI void
-eext_rotary_selector_items_clear(Evas_Object *obj)
-{
- Evas_Object* rotary_selector = obj;
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
-
- if (!rotary_selector)
- {
- ERR("rotary_selector is NULL!!");
- return;
- }
-
- rsd = _eext_rotary_selector_data_get(rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- EINA_LIST_FREE(rsd->item_list, item)
- evas_object_del(item->base.obj);
-
- rsd->selected_index = 0;
-
- _item_update_animation_run(rsd);
-
- return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
- if (!text)
- {
- ERR("text is NULL!!");
- return;
- }
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "selector,main_text"))
- {
- _item_text_copy(&(rotary_selector_item->text1), text);
- }
- else if (!strcmp(part_name, "selector,sub_text"))
- {
- _item_text_copy(&(rotary_selector_item->text2), text);
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-
- _selector_content_update(rsd);
-
- return;
-}
-
-EAPI const char *
-eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
- if (!rotary_selector_item)
- {
- ERR("item is NULL!!");
- return NULL;
- }
- if (!strcmp(part_name, "selector,main_text"))
- {
- return rotary_selector_item->text1;
- }
- else if (!strcmp(part_name, "selector,sub_text"))
- {
- return rotary_selector_item->text2;
- }
-
- return NULL;
-}
-
-EAPI void
-eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
- if (!domain)
- {
- ERR("domain is NULL!!");
- return;
- }
- if (!text)
- {
- ERR("text is NULL!!");
- return;
- }
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "selector,main_text"))
- {
- _item_text_copy(&(rotary_selector_item->domain), domain);
- _item_text_copy(&(rotary_selector_item->text1), text);
- }
- else if (!strcmp(part_name, "selector,sub_text"))
- {
- _item_text_copy(&(rotary_selector_item->domain), domain);
- _item_text_copy(&(rotary_selector_item->text2), text);
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-
- _selector_content_update(rsd);
-
- return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content)
-{
- //Supported part names : "item,bg_image", "item,icon", "selector,icon", "selector,content"
-
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
- if (!content)
- {
- ERR("content is NULL!!");
- return;
- }
- if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ERR("Not implemented!!");
- return;
- }
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
- // for Accessibility
- if(elm_atspi_bridge_utils_is_screen_reader_enabled())
- elm_atspi_accessible_role_set(content, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
- //
- if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
- {
- elm_object_part_content_set(rotary_selector_item->base.obj, part_name, content);
- }
- else if (!strcmp(part_name, "selector,icon"))
- {
- if (rotary_selector_item->content_icon)
- {
- if (rotary_selector_item->index == rsd->selected_index)
- {
- elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
- }
- evas_object_del(rotary_selector_item->content_icon);
- rotary_selector_item->content_icon = NULL;
- }
- rotary_selector_item->content_icon = content;
- }
- else if (!strcmp(part_name, "selector,content"))
- {
- if (rotary_selector_item->custom_content)
- {
- evas_object_del(rotary_selector_item->custom_content);
- rotary_selector_item->custom_content = NULL;
- }
- rotary_selector_item->custom_content = content;
- }
- else
- {
- ERR("Not supported part name!!");
- return;
- }
-
- _selector_content_update(rsd);
-}
-
-EAPI Evas_Object *
-eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return NULL;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return NULL;
- }
- if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ERR("Not implemented!!");
- return NULL;
- }
-
- if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
- {
- return elm_object_part_content_get(rotary_selector_item->base.obj, part_name);
- }
- else if (!strcmp(part_name, "selector,icon"))
- {
- return rotary_selector_item->content_icon;
- }
- else if (!strcmp(part_name, "selector,content"))
- {
- return rotary_selector_item->custom_content;
- }
- else
- {
- ERR("Not supported part name!!");
- return NULL;
- }
-
- return NULL;
-}
-
-EAPI void
-eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content)
-{
- //Supported part names : "selector,bg_image"
-
- if (!obj)
- {
- ERR("obj is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
- if (!content)
- {
- ERR("content is NULL!!");
- return;
- }
-
- if (strcmp(part_name, "selector,bg_image"))
- {
- ERR("Not supported part name!!!");
- return;
- }
-
- if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
- {
- ERR("Not implemented!!");
- return;
- }
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get(obj);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- elm_object_part_content_set(rsd->rotary_selector, part_name, content);
-
-}
-
-EAPI Evas_Object *
-eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state)
-{
- //Supported part names : "selector,bg_image"
- if (!obj)
- {
- ERR("obj is NULL!!");
- return NULL;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return NULL;
- }
- if (strcmp(part_name, "selector,bg_image"))
- {
- ERR("Not supported part name!!!");
- return NULL;
- }
-
- if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
- {
- ERR("Not implemented!!");
- return NULL;
- }
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- return elm_object_part_content_get(rsd->rotary_selector, part_name);
-}
-
-EAPI void
-eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
- Evas_Object *content;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "item,bg_image"))
- {
-
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
- }
-
- if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, normal_color);
- }
- else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, pressed_color);
- }
- }
- else if (!strcmp(part_name, "item,icon"))
- {
-
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
- }
-
- if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, normal_color);
- }
- else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, pressed_color);
- }
- }
- else if (!strcmp(part_name, "selector,icon"))
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
- }
-
- if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, normal_color);
- }
- else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, pressed_color);
- }
- }
- else if (!strcmp(part_name, "selector,content"))
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
- }
-
- if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, normal_color);
- }
- else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, pressed_color);
- }
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-
- return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a)
-{
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "item,bg_image") )
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
- }
- }
- else if (!strcmp(part_name, "item,icon"))
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
- }
- }
- else if (!strcmp(part_name, "selector,icon"))
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
- }
- }
- else if (!strcmp(part_name, "selector,content"))
- {
- if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
- }
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-}
-
-EAPI void
-eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a)
-{
- Evas_Object *content;
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
- {
- if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
- }
-
- content = elm_object_part_content_get(obj, "selector,bg_image");
-
- if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
- {
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, normal_color);
- }
- else if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
- {
- ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, pressed_color);
- }
- return;
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-
- return;
-}
-
-EAPI void
-eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a)
-{
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
- if (!part_name)
- {
- ERR("part_name is NULL!!");
- return;
- }
-
- if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
- {
- if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
- }
- else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
- {
- ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
- }
- return;
- }
- else
- {
- ERR("Not supported part name [%s]", part_name);
- return;
- }
-}
-
-EAPI void
-eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
-{
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
- if (!rotary_selector_item)
- {
- ERR("rotary_selector_item is NULL!!");
- return;
- }
-
- rsd = _eext_rotary_selector_data_get(obj);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
- if (rsd->item_update_animator)
- {
- return;
- }
-
- if (rsd->selected_index != rotary_selector_item->index)
- {
- int previous_index = rsd->selected_index;
- rsd->selected_index = rotary_selector_item->index;
-
- _item_selected_signal_send(rsd, previous_index, rsd->selected_index);
- rsd->current_page = rsd->selected_index/_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- _item_update_animation_run(rsd);
- }
-
- INF("selected item index(%d)", rsd->selected_index);
-}
-
-EAPI Eext_Object_Item*
-eext_rotary_selector_selected_item_get(const Evas_Object *obj)
-{
- Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- return (Eext_Object_Item*)_item_get(rsd, rsd->selected_index);
-}
-
-EAPI const Eina_List*
-eext_rotary_selector_items_get(const Evas_Object *obj)
-{
- Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return NULL;
- }
-
- return rsd->item_list;
-}
-
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static void
-_accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- Eina_List *l;
-
- rsd = (Eext_Rotary_Selector_Data*)data;
- if(!rsd)
- return;
-
- EINA_LIST_FOREACH(rsd->item_list,l,item)
- {
- if(item->base.obj == obj)
- break;
- }
-
- int previous_item_index = rsd->selected_index;
- rsd->selected_index = item->index;
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
- rsd->control_by_rotary = EINA_FALSE;
-}
-
-void _accessibility_page_change(Eext_Rotary_Selector_Data *rsd, int previous_item_index, Eina_Bool dir)
-{
- _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
- _page_animation_run(rsd, dir);
- _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-}
-
-static Eina_Bool
-_accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
-{
- if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
- return EINA_FALSE;
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- rsd = (Eext_Rotary_Selector_Data*)data;
- if(!rsd)
- return EINA_FALSE;
- int current_page = 0;
- Eina_List *l;
- int previous_item_index = rsd->selected_index;
- int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
- int last_index = 0;
- int changed_list = 0;
- Eina_Bool ret = EINA_FALSE;
-
- if (rsd->current_page == 0)
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- else
- last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- if (last_index > rsd->item_count - 1)
- last_index = rsd->item_count - 1;
-
- if (last_index < rsd->selected_index+1 && last_index != rsd->item_count - 1)
- changed_list = 1;
- else if (first_index > rsd->selected_index-1 && first_index != 0)
- changed_list = 2;
-
- switch (action_info->action_type)
- {
- case ELM_ACCESS_ACTION_UNHIGHLIGHT:
- elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
- break;
- case ELM_ACCESS_ACTION_HIGHLIGHT:
- if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT || (changed_list == 1 && rsd->control_by_rotary))
- {
- rsd->selected_index += 1;
- _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
- current_page = rsd->current_page + 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
- _accessibility_set_relationship(rsd, current_page);
- }
- else if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV || (changed_list == 2 && rsd->control_by_rotary))
- {
- rsd->selected_index -= 1;
- _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
- current_page = rsd->current_page - 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
- _accessibility_set_relationship(rsd, current_page);
- }
- else
- {
- Elm_Accessible_Reading_Info_Type type = elm_atspi_accessible_reading_info_type_get(rsd->event_area_access_object);
- char buf[255] = "";
- if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_NAME)
- {
- if(_rotary_selector_from_moreoption_get(rsd->rotary_selector))
- {
- const char *buf_name;
- buf_name = elm_atspi_accessible_name_get(rsd->event_area_access_object);
- if(buf_name)
- strcat(buf, buf_name);
- }
- }
- if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)
- {
- strcat(buf, " ");
- const char *buf_desc;
- buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
- if(buf_desc)
- strcat(buf, buf_desc);
- }
- if(strcmp(buf,""))
- elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL);
- _accessibility_set_relationship(rsd, rsd->current_page);
- }
- ret = EINA_FALSE;
- break;
- case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
- rsd->control_by_rotary = EINA_FALSE;
- if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
- {
- rsd->selected_index += 1;
- _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
- current_page = rsd->current_page + 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
-
- _accessibility_set_relationship(rsd, current_page);
- ret = EINA_TRUE;
- const char *buf_desc;
- buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
- if(buf_desc)
- elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
- }
- else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
- {
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
- ret = EINA_FALSE;
- }
- break;
- case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
- rsd->control_by_rotary = EINA_FALSE;
- if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
- {
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
- ret = EINA_FALSE;
- }
- else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
- {
- rsd->selected_index -= 1;
- _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
- current_page = rsd->current_page - 1;
- rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
-
- _accessibility_set_relationship(rsd, current_page);
- ret = EINA_TRUE;
- const char *buf_desc;
- buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
- if(buf_desc)
- elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
- }
- break;
- }
- return ret;
-}
-
-static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page)
-{
- Eext_Rotary_Selector_Item *item = NULL;
- Eext_Rotary_Selector_Item *before_item = NULL;
- Evas_Object *first_item = NULL;
- Evas_Object *last_item = NULL;
- Eina_Bool is_next_page = EINA_FALSE;
- Eina_Bool is_prev_page = EINA_FALSE;
- int i = 0;
- Eina_List *l;
- int first_index = 0;
- int last_index = 0;
-
- rsd->reading_page_number = current_page;
- elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- first_index = current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-
- if (current_page == 0)
- {
- last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- else
- {
- last_index = (current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
- }
- if (last_index > rsd->item_count - 1)
- {
- last_index = rsd->item_count - 1;
- }
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
- if (i >= first_index && i <= last_index)
- {
- if(before_item)
- {
- elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, button);
- elm_atspi_accessible_relationship_append(button, ELM_ATSPI_RELATION_FLOWS_FROM, before_item->base.obj);
- }
- before_item = item;
- }
- if (i == first_index)
- {
- first_item = button;
- }
- else if (i == last_index)
- {
- last_item = button;
- }
- if(current_page > 0 && i == first_index-1)
- {
- is_prev_page = EINA_TRUE;
- }
- else if (last_index < (rsd->item_count - 1) && i == last_index + 1)
- {
- is_next_page = EINA_TRUE;
- }
- elm_atspi_accessible_name_cb_set(button, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)item);
- elm_atspi_accessible_reading_info_type_set(button, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
- i++;
- }
-
- if(rsd->backup_first_item_for_atspi)
- {
- elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, rsd->backup_first_item_for_atspi);
- elm_atspi_accessible_relationship_remove(rsd->backup_first_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
- }
- if(rsd->backup_last_item_for_atspi)
- {
- elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->backup_last_item_for_atspi);
- elm_atspi_accessible_relationship_remove(rsd->backup_last_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
- }
-
- if(first_item)
- {
- elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, first_item);
- elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
- if(!is_prev_page)
- {
- elm_atspi_accessible_relationship_remove(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
- elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, first_item);
- }
- }
- if(last_item)
- {
- elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, last_item);
- elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
- if(!is_next_page)
- {
- elm_atspi_accessible_relationship_remove(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
- elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, last_item);
- }
- }
- rsd->backup_first_item_for_atspi = first_item;
- rsd->backup_last_item_for_atspi = last_item;
-}
-
-static void
-_rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info)
-{
- if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
- return ;
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- rsd = data;
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
- elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_TRUE);
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
- elm_atspi_accessible_can_highlight_set(button, EINA_TRUE);
- }
-
- rsd->reading_page_number = -1;
- elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
- elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
- elm_atspi_component_highlight_grab(rsd->event_area_access_object);
-}
-
-
-static void
-_rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info)
-{
- if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
- return ;
-
- Eext_Rotary_Selector_Data *rsd = NULL;
- Eina_List *l = NULL;
- Eext_Rotary_Selector_Item *item = NULL;
- rsd = data;
- if (!rsd)
- {
- ERR("rsd is NULL!!");
- return;
- }
-
- elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
-
- EINA_LIST_FOREACH(rsd->item_list, l, item)
- {
- Evas_Object *button = item->base.obj;
- elm_atspi_accessible_can_highlight_set(button, EINA_FALSE);
- }
-}
-void
-_rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option)
-{
- Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
-
- if(rsd)
- rsd->from_moreoption = from_more_option;
-}
-
-static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector)
-{
- Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
-
- if(rsd)
- return rsd->from_moreoption;
- return EINA_FALSE;
-}
-
-static char *
-_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
-{
- Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data;
-
- char buf[255] = "";
- if(item->text1)
- {
- strcat(buf, item->text1);
- }
- if(item->text2)
- {
- strcat(buf, " ");
- strcat(buf, item->text2);
- }
- return strdup(buf);
-}
-
-static char *
-_accessibility_name_set_cb(void *data, Evas_Object *obj)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- char buf[255] = "";
-
- if( _rotary_selector_from_moreoption_get(rsd->rotary_selector))
- {
- snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
- }
- return strdup(buf);
-}
-
-static char *
-_accessibility_description_set_cb(void *data, Evas_Object *obj)
-{
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- char buf[255] = "";
-
- bindtextdomain (PACKAGE, LOCALE_DIR);
- textdomain (PACKAGE);
-
- if( rsd->reading_page_number == -1)
- {
- snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS"));
- }
- else
- {
- snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_N_OF_N_PAGE"), rsd->reading_page_number + 1, ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1);
- }
-
- return strdup(buf);
-}
-
-static void
-_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
-{
- INF("called!!");
-
- Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
- if (rsd)
- {
- evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-
-/*===========================================================================*
- * Local *
- *===========================================================================*/
-
-int _eext_log_dom = -1;
-
-static const char *
-_magic_string_get(eext_magic m)
-{
- switch (m) {
- case EEXT_MAGIC_NONE:
- return "None (Freed Object)";
-
- default:
- return "<UNKNOWN>";
- }
-}
-
-__CONSTRUCTOR__ static void
-eext_mod_init(void)
-{
- eina_init();
- _eext_log_dom = eina_log_domain_register("efl-extension", EINA_COLOR_LIGHTBLUE);
- if (!_eext_log_dom)
- {
- EINA_LOG_ERR("could not register efl-extension log domain.");
- _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL;
- }
- INF("Init");
-}
-
-__DESTRUCTOR__ static void
-eext_mod_shutdown(void)
-{
- INF("Shutdown\n");
- if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL))
- {
- eina_log_domain_unregister(_eext_log_dom);
- _eext_log_dom = -1;
- }
-
- eina_shutdown();
-}
-
-
-/*===========================================================================*
- * Global *
- *===========================================================================*/
-
-void
-_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
-{
- ERR("\n*** MAGIC FAIL (%s) ***\n", fname);
-
- if (!d)
- ERR(" Input handle pointer is NULL!");
- else if (m == EEXT_MAGIC_NONE)
- ERR(" Input handle has already been freed!");
- else if (m != req_m)
- ERR(" Input handle is wrong type\n"
- " Expected: %08x - %s\n"
- " Supplied: %08x - %s",
- (unsigned int)req_m, _magic_string_get(req_m),
- (unsigned int)m, _magic_string_get(m));
-
- if (getenv("EEXT_ERROR_ABORT")) abort();
-}
-
-/*===========================================================================*
- * API *
- *===========================================================================*/
-
-EAPI Eina_Bool
-eext_win_keygrab_set(Elm_Win *obj, const char *key)
-{
- Eina_Bool ret = EINA_FALSE;
- ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
- if (!ret)
- ERR(" Can't set keygrab of [%s].", key);
- return ret;
-}
-EAPI Eina_Bool
-eext_win_keygrab_unset(Elm_Win *obj, const char *key)
-{
- Eina_Bool ret = EINA_FALSE;
- ret = elm_win_keygrab_unset(obj, key, 0, 0);
- if (!ret)
- ERR(" Can't unset keygrab of [%s].", key);
- return ret;
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * 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 "efl_extension.h"
-#include "efl_extension_private.h"
-
-typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
-
-struct _Eext_Event_Mgr
-{
- Eina_List *obj_events;
- Evas *e;
- Evas_Object *key_grab_rect;
-};
-
-typedef struct _Eext_Object_Event
-{
- Evas_Object *obj;
- Evas_Object *parent;
- Eina_List *callbacks;
- Eina_Bool delete_me : 1;
- Eina_Bool on_callback : 1;
-} Eext_Object_Event;
-
-typedef struct _Eext_Event_Callback
-{
- Eext_Callback_Type type;
- void (*func)(void *data, Evas_Object *obj, void *event_info);
- void *data;
-} Eext_Event_Callback;
-
-const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
-const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
-const char *EEXT_KEY_STOP = "XF86Stop";
-const char *EEXT_KEY_STOP2 = "Escape";
-const char *EEXT_KEY_STOP3 = "XF86Back";
-const char *EEXT_KEY_SEND = "XF86Send";
-const char *EEXT_KEY_SEND2 = "Menu";
-const char *EEXT_KEY_SEND3 = "XF86Menu";
-
-
-static Eina_List *event_mgrs = NULL;
-
-static void
-_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
-{
- if (event_mgr->obj_events) return;
-
- //Redundant Event Mgr. Remove it.
- evas_object_del(event_mgr->key_grab_rect);
- event_mgrs = eina_list_remove(event_mgrs, event_mgr);
- free(event_mgr);
-}
-
-static void
-_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
- Eext_Object_Event *obj_event = data;
- Eina_List *l;
- Eext_Event_Callback *callback;
-
- l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
- if (!l) return;
-
- event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
-
- EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
- obj_event->callbacks = NULL;
-
- if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
- else free(obj_event);
-
- _eext_event_mgr_del(event_mgr);
-}
-
-static int
-_eext_layer_sort_cb(const void *data1, const void *data2)
-{
- const Eext_Object_Event *obj_event = data1;
- const Eext_Object_Event *obj_event2 = data2;
-
- //1. Layer Compare
- int layer1 = evas_object_layer_get(obj_event->obj);
- int layer2 = evas_object_layer_get(obj_event2->obj);
-
- return (layer1 < layer2) ? -1 : 1;
-}
-
-static Evas_Object *
-_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
-{
- Evas_Object *temp;
- Evas_Object *parent;
- Eina_List *l, *l_next;
- Eext_Object_Event *obj_event;
- Eina_List *_candidates = *candidates;
- Eina_Bool found = EINA_FALSE;
-
- //Get the top parent lists
- EINA_LIST_FOREACH(_candidates, l, obj_event)
- {
- temp = obj_event->obj;
- parent = obj_event->obj;
- while (temp)
- {
- parent = temp;
- temp = evas_object_smart_parent_get(temp);
- }
- obj_event->parent = parent;
- }
-
- //Leave only parent candidates.
- parent = evas_object_top_get(e);
-
- while (parent)
- {
- EINA_LIST_FOREACH(_candidates, l, obj_event)
- {
- if (parent == obj_event->parent)
- {
- found = EINA_TRUE;
- obj_event->parent = NULL;
- }
- }
- if (found) break;
- parent = evas_object_below_get(parent);
- }
-
- //Redundant parents (no candidates)
- EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
- {
- if (!obj_event->parent) continue;
- _candidates = eina_list_remove_list(_candidates, l);
- }
-
- *candidates = _candidates;
- return parent;
-}
-
-static Eext_Object_Event *
-_eext_find_event_target(Eina_List *candidates, Evas_Object *parent)
-{
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l;
- Evas_Object *obj;
- Eina_List *members = evas_object_smart_members_get(parent);
- if (members)
- {
- EINA_LIST_REVERSE_FOREACH(members, l, obj)
- {
- obj_event = _eext_find_event_target(candidates, obj);
- //got you!
- if (obj_event)
- {
- eina_list_free(members);
- return obj_event;
- }
- }
- eina_list_free(members);
- }
-
- EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
- {
- //got you!
- if (parent == obj_event->obj) return obj_event;
- }
-
- return NULL;
-}
-
-static Eext_Object_Event *
-_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr)
-{
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l, *l_next;
- Eina_List *candidates = NULL;
- Evas_Object *parent;
- int top_layer;
- Eina_Bool invisible;
-
- //1. filter the invisible objs
- EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
- {
- parent = obj_event->obj;
- invisible = EINA_FALSE;
-
- while (parent)
- {
- if (!evas_object_visible_get(parent))
- {
- invisible = EINA_TRUE;
- break;
- }
- parent = evas_object_smart_parent_get(parent);
- }
- if (invisible) continue;
- candidates = eina_list_append(candidates, obj_event);
- }
- if (!candidates) return NULL; //no visible objects.
- if (eina_list_count(candidates) == 1) goto found;
-
- //2.1. sort by layer order
- candidates = eina_list_sort(candidates, eina_list_count(candidates),
- _eext_layer_sort_cb);
-
- //2.2. leave the only top layer
- obj_event = eina_list_data_get(eina_list_last(candidates));
- top_layer = evas_object_layer_get(obj_event->obj);
-
- EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
- {
- if (evas_object_layer_get(obj_event->obj) < top_layer)
- candidates = eina_list_remove_list(candidates, l);
- }
- if (eina_list_count(candidates) == 1) goto found;
-
- //3. find the top parent candidate.
- parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
- if (eina_list_count(candidates) == 1) goto found;
-
- //4. find the target in this parent tree.
- obj_event = _eext_find_event_target(candidates, parent);
- eina_list_free(candidates);
- return obj_event;
-
-found:
- obj_event = eina_list_data_get(candidates);
- eina_list_free(candidates);
- return obj_event;
-}
-
-static void
-_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
- void *event_info)
-{
- Evas_Event_Key_Down *ev = event_info;
- Eext_Event_Mgr *event_mgr = data;
- Eext_Object_Event *obj_event;
- Eext_Event_Callback *callback;
- Eext_Callback_Type type;
- Eina_List *l;
-
- obj_event = _eext_top_obj_event_find(event_mgr);
- if (!obj_event) return;
-
- if (!strcmp(ev->keyname, EEXT_KEY_STOP) ||
- !strcmp(ev->keyname, EEXT_KEY_STOP2) ||
- !strcmp(ev->keyname, EEXT_KEY_STOP3))
- type = EEXT_CALLBACK_BACK;
- else if (!strcmp(ev->keyname, EEXT_KEY_SEND) ||
- !strcmp(ev->keyname, EEXT_KEY_SEND2) ||
- !strcmp(ev->keyname, EEXT_KEY_SEND3))
- type = EEXT_CALLBACK_MORE;
- else return;
-
- obj_event->on_callback = EINA_TRUE;
- EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
- {
- if (callback->type != type) continue;
- callback->func(callback->data, obj_event->obj, (void*) type);
- if (obj_event->delete_me) break;
- }
- if (obj_event->delete_me) free(obj_event);
- else obj_event->on_callback = EINA_FALSE;
-}
-
-static void
-_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
-{
- Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
-
- evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
- _eext_key_grab_rect_key_up_cb, event_mgr);
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE))
- ERR("Failed to grab END KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE))
- ERR("Failed to grab END KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE))
- ERR("Failed to grab END KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE))
- ERR("Failed to grab MORE KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE))
- ERR("Failed to grab MORE KEY\n");
-
- if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE))
- ERR("Failed to grab MORE KEY\n");
-
- event_mgr->key_grab_rect = key_grab_rect;
-}
-
-static Eext_Event_Mgr *
-_eext_event_mgr_new(Evas *e)
-{
- Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
- if (!event_mgr)
- {
- ERR("Failed to allocate event manager");
- return NULL;
- }
- event_mgr->e = e;
- _eext_key_grab_obj_create(event_mgr);
-
- return event_mgr;
-}
-
-EAPI void *
-eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
-{
- Eext_Object_Event *obj_event;
- Eext_Event_Mgr *event_mgr;
- Eina_List *l;
- Eext_Event_Callback *callback;
- void *data;
-
- //Check the validation
- event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
- obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
- if (!event_mgr || !obj_event)
- {
- WRN("This object(%p) hasn't been registered before", obj);
- return NULL;
- }
-
- //Remove the callback data
- EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
- {
- if ((callback->func == func) && (callback->type == type)) break;
- }
-
- if (!callback)
- {
- WRN("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
- return NULL;
- }
-
- data = callback->data;
- obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
- free(callback);
-
- //This object is not managed anymore.
- if (!obj_event->callbacks)
- {
- evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
- evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
- Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
- obj_event);
- if (l)
- event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
- l);
- if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
- else free(obj_event);
-
- evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
- }
-
- _eext_event_mgr_del(event_mgr);
-
- return data;
-}
-
-EAPI void
-eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
-{
- Eext_Event_Mgr *event_mgr;
- Evas *e;
- Eext_Object_Event *obj_event = NULL;
- Eina_List *l;
- Eext_Event_Callback *callback;
- Eina_Bool new_event_mgr = EINA_TRUE;
-
- //Check the registered event manager for this Evas.
- e = evas_object_evas_get(obj);
-
- EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
- {
- if (event_mgr->e == e)
- {
- new_event_mgr = EINA_FALSE;
- break;
- }
- }
-
- //New Evas comes. Create new event manager for this Evas.
- if (new_event_mgr)
- {
- if (!(event_mgr = _eext_event_mgr_new(e))) return;
- event_mgrs = eina_list_append(event_mgrs, event_mgr);
- }
-
- obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
- //New Object Event. Probably user adds eext_object_event_callback first time.
- if (!obj_event)
- {
- obj_event = calloc(1, sizeof(Eext_Object_Event));
- if (!obj_event)
- {
- ERR("Failed to allocate object event");
- return;
- }
- evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
- evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
- _eext_object_del_cb,
- obj_event);
- event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
- obj_event);
- obj_event->obj = obj;
- }
-
- //Append this callback.
- callback = calloc(1, sizeof(Eext_Event_Callback));
- if (!callback)
- {
- ERR("Failed to allocate event callback");
- return;
- }
- callback->type = type;
- callback->func = func;
- callback->data = data;
-
- obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
-}