summaryrefslogtreecommitdiff
path: root/src/lib/elementary/efl_ui_item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/elementary/efl_ui_item.c')
-rw-r--r--src/lib/elementary/efl_ui_item.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/src/lib/elementary/efl_ui_item.c b/src/lib/elementary/efl_ui_item.c
new file mode 100644
index 0000000000..5eed4b2c7b
--- /dev/null
+++ b/src/lib/elementary/efl_ui_item.c
@@ -0,0 +1,260 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#define EFL_ACCESS_PROTECTED
+#define EFL_UI_WIDGET_PART_BG_PROTECTED
+
+#include <Elementary.h>
+
+#include "elm_priv.h"
+#include "efl_ui_item_private.h"
+
+#define MY_CLASS EFL_UI_ITEM_CLASS
+#define MY_CLASS_PFX efl_ui_item
+
+#define MY_CLASS_NAME "Efl.Ui.Item"
+
+static void
+_item_select(Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ if (pd->selected &&
+ (*(pd->select_mode) != EFL_UI_SELECT_SINGLE_ALWAYS))
+ return;
+ if (*(pd->select_mode) == EFL_UI_SELECT_NONE) return;
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ pd->selected = EINA_TRUE;
+ edje_object_signal_emit(wd->resize_obj, "efl,state,selected", "efl");
+ efl_event_callback_call(obj, EFL_UI_EVENT_SELECTED, NULL);
+}
+
+static void
+_item_unselect(Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ if (!pd->selected) return;
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ pd->selected = EINA_FALSE;
+ edje_object_signal_emit(wd->resize_obj, "efl,state,unselected", "efl");
+ efl_event_callback_call(obj, EFL_UI_EVENT_UNSELECTED, NULL);
+}
+
+/* Mouse Controls */
+static Eina_Bool
+_item_longpressed(void *data)
+{
+ Efl_Ui_Item *item = data;
+ EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd, ECORE_CALLBACK_CANCEL);
+
+ pd->longpress_timer = NULL;
+
+ efl_event_callback_call(item, EFL_UI_EVENT_LONGPRESSED, NULL);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_item_mouse_down(void *data,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = event_info;
+ Eo *item = data;
+ EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
+ if (wd->disabled) return;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+ edje_object_signal_emit(wd->resize_obj, "efl,state,pressed", "efl");
+
+ pd->longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _item_longpressed, item);
+ efl_event_callback_call(item, EFL_UI_EVENT_PRESSED, NULL);
+}
+
+static void
+_item_mouse_up(void *data,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ Eo *item = data;
+ EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
+ if (wd->disabled) return;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ {
+ //FIXME: should we send this message to fallback?
+ edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
+ //efl_event_callback_call(item, EFL_UI_EVENT_UNPRESSED, NULL);
+ return;
+ }
+
+ if (pd->longpress_timer)
+ {
+ ecore_timer_del(pd->longpress_timer);
+ pd->longpress_timer = NULL;
+ }
+
+ edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
+ efl_event_callback_call(item, EFL_UI_EVENT_UNPRESSED, NULL);
+
+ if ((*(pd->select_mode) != EFL_UI_SELECT_SINGLE_ALWAYS) && (pd->selected))
+ _item_unselect(item, pd);
+ else if (*(pd->select_mode) != EFL_UI_SELECT_NONE)
+ _item_select(item, pd);
+}
+
+static void
+_item_mouse_move(void *data EINA_UNUSED,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = event_info;
+ Eo *item = data;
+ EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
+ if (wd->disabled) return;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ {
+ edje_object_signal_emit(wd->resize_obj, "efl,state,unpressed", "efl");
+ return;
+ }
+}
+
+static void
+_item_mouse_in(void *data EINA_UNUSED,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Event_Mouse_In *ev = event_info;
+ Eo *item = data;
+ EFL_UI_ITEM_DATA_GET_OR_RETURN(item, pd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(item, wd);
+ if (wd->disabled) return;
+
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+}
+
+static void
+_item_mouse_callback_add(Eo *obj, void *data)
+{
+ evas_object_event_callback_add
+ (obj, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down, data);
+ evas_object_event_callback_add
+ (obj, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up, data);
+ evas_object_event_callback_add
+ (obj, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move, data);
+ evas_object_event_callback_add
+ (obj, EVAS_CALLBACK_MOUSE_IN, _item_mouse_in, data);
+}
+
+static void
+_item_mouse_callback_del(Eo *obj, void *data)
+{
+ evas_object_event_callback_del_full
+ (obj, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down, data);
+ evas_object_event_callback_del_full
+ (obj, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up, data);
+ evas_object_event_callback_del_full
+ (obj, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move, data);
+ evas_object_event_callback_del_full
+ (obj, EVAS_CALLBACK_MOUSE_IN, _item_mouse_in, data);
+}
+/* Mouse Controls ends */
+
+static void
+_sizing_eval(Evas_Object *obj, Efl_Ui_Item_Data *pd)
+{
+ Evas_Coord minh = -1, minw = -1;
+ Evas_Coord rest_w = 0, rest_h = 0;
+ ELM_WIDGET_DATA_GET_OR_RETURN(pd->obj, wd);
+
+ edje_object_size_min_restricted_calc(wd->resize_obj, &minw, &minh,
+ rest_w, rest_h);
+ evas_object_size_hint_min_set(obj, minw, minh);
+
+ pd->needs_size_calc = EINA_FALSE;
+}
+
+static void
+_efl_ui_item_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ if (pd->needs_size_calc) return;
+ pd->needs_size_calc = EINA_TRUE;
+
+ efl_canvas_group_change(obj);
+}
+
+EOLIAN static void
+_efl_ui_item_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ if (pd->needs_size_calc)
+ {
+ _sizing_eval(obj, pd);
+ pd->needs_size_calc = EINA_FALSE;
+ }
+}
+
+EOLIAN static Eo *
+_efl_ui_item_efl_object_constructor(Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ pd->obj = obj;
+ obj = efl_constructor(efl_super(obj, MY_CLASS));
+
+ return obj;
+}
+
+EOLIAN static Efl_Object *
+_efl_ui_item_efl_object_finalize(Eo *obj, Efl_Ui_Item_Data *pd EINA_UNUSED)
+{
+ Eo *eo;
+ eo = efl_finalize(efl_super(obj, MY_CLASS));
+ ELM_WIDGET_DATA_GET_OR_RETURN(eo, wd, eo);
+
+ _item_mouse_callback_add(wd->resize_obj, eo);
+ return eo;
+}
+
+EOLIAN static void
+_efl_ui_item_efl_object_destructor(Eo *obj, Efl_Ui_Item_Data *pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ _item_mouse_callback_del(wd->resize_obj, obj);
+ efl_destructor(efl_super(obj, MY_CLASS));
+}
+
+EOLIAN static int
+_efl_ui_item_index_get(const Eo *obj, Efl_Ui_Item_Data *pd)
+{
+ return efl_pack_index_get(pd->parent, obj);
+}
+
+EOLIAN static void
+_efl_ui_item_selected_set(Eo *obj, Efl_Ui_Item_Data *pd, Eina_Bool select)
+{
+ Eina_Bool selected = !!select;
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+ if (wd->disabled) return;
+
+ if (selected) _item_select(obj, pd);
+ else _item_unselect(obj, pd);
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_item_selected_get(const Eo *obj EINA_UNUSED, Efl_Ui_Item_Data *pd)
+{
+ return pd->selected;
+}
+
+/* Internal EO APIs and hidden overrides */
+
+#define EFL_UI_ITEM_EXTRA_OPS \
+ ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_item)
+
+#include "efl_ui_item.eo.c"