summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWooHyun Jung <wh0705.jung@samsung.com>2017-11-06 16:28:29 +0900
committerWooHyun Jung <wh0705.jung@samsung.com>2017-11-06 16:28:29 +0900
commit68b366c83175458a67c0655519a44d1ea1a48419 (patch)
tree55496edccf8b4d34ba938842685ca47061d26d89
parenta386597ad92a1022ba41f94afdb28bdf9136d551 (diff)
downloadefl-68b366c83175458a67c0655519a44d1ea1a48419.tar.gz
efl_ui_calendar: apply efl_ui_focus_composition
-rw-r--r--src/Makefile_Elementary.am1
-rw-r--r--src/lib/elementary/efl_ui_calendar.c81
-rw-r--r--src/lib/elementary/efl_ui_calendar_item.eo14
3 files changed, 96 insertions, 0 deletions
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index 56f110194c..ea0e6bcf55 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -6,6 +6,7 @@ elm_public_eolian_files = \
lib/elementary/efl_ui_bg.eo \
lib/elementary/efl_ui_button.eo \
lib/elementary/efl_ui_calendar.eo \
+ lib/elementary/efl_ui_calendar_item.eo \
lib/elementary/efl_ui_check.eo \
lib/elementary/efl_ui_flip.eo \
lib/elementary/efl_ui_frame.eo \
diff --git a/src/lib/elementary/efl_ui_calendar.c b/src/lib/elementary/efl_ui_calendar.c
index 605f8274ff..a76688d569 100644
--- a/src/lib/elementary/efl_ui_calendar.c
+++ b/src/lib/elementary/efl_ui_calendar.c
@@ -4,10 +4,12 @@
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
+#define EFL_UI_FOCUS_COMPOSITION_PROTECTED
#include <Elementary.h>
#include "elm_priv.h"
#include "efl_ui_calendar_private.h"
+#include "efl_ui_calendar_item.eo.h"
#define MY_CLASS EFL_UI_CALENDAR_CLASS
@@ -294,6 +296,28 @@ _access_calendar_register(Evas_Object *obj)
}
static void
+_flush_calendar_composite_elements(Evas_Object *obj, Efl_Ui_Calendar_Data *sd)
+{
+ Eina_List *items = NULL;
+ int max_day = _maxdays_get(&sd->shown_date, 0);
+
+#define EXTEND(v) \
+ if (v) items = eina_list_append(items, v); \
+
+ EXTEND(sd->month_access);
+ EXTEND(sd->dec_btn_month);
+ EXTEND(sd->inc_btn_month);
+ EXTEND(sd->year_access);
+
+#undef EXTEND
+
+ for (int i = sd->first_day_it; i <= max_day; ++i)
+ items = eina_list_append(items, sd->items[i]);
+
+ efl_ui_focus_composition_elements_set(obj, items);
+}
+
+static void
_populate(Evas_Object *obj)
{
int maxdays, prev_month_maxdays, day, mon, yr, i;
@@ -381,6 +405,8 @@ _populate(Evas_Object *obj)
elm_layout_thaw(obj);
edje_object_message_signal_process(elm_layout_edje_get(obj));
+
+ _flush_calendar_composite_elements(obj, sd);
}
static void
@@ -986,6 +1012,13 @@ _efl_ui_calendar_constructor_internal(Eo *obj, Efl_Ui_Calendar_Data *priv)
if ((_elm_config->access_mode != ELM_ACCESS_MODE_OFF))
_access_calendar_spinner_register(obj);
+ // Items for composition
+ for (int i = 0; i < 42; ++i)
+ {
+ priv->items[i] = efl_add(EFL_UI_CALENDAR_ITEM_CLASS, obj,
+ efl_ui_calendar_item_day_number_set(efl_added, i));
+ }
+
return obj;
}
@@ -1239,3 +1272,51 @@ ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(efl_ui_calendar, Efl_Ui_Calendar_Data)
ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_calendar)
#include "efl_ui_calendar.eo.c"
+
+typedef struct {
+ int v;
+ Evas_Object *part;
+} Efl_Ui_Calendar_Item_Data;
+
+EOLIAN static void
+_efl_ui_calendar_item_day_number_set(Eo *obj, Efl_Ui_Calendar_Item_Data *pd, int i)
+{
+ char pname[14];
+ Evas_Object *po;
+
+ pd->v = i;
+ snprintf(pname, sizeof(pname), "cit_%i.access", i);
+
+ po = (Evas_Object *)edje_object_part_object_get
+ (elm_layout_edje_get(efl_parent_get(obj)), pname);
+
+ if (_elm_config->access_mode != ELM_ACCESS_MODE_ON)
+ pd->part = po;
+ else
+ pd->part = evas_object_data_get(po, "_part_access_obj");
+
+ EINA_SAFETY_ON_NULL_RETURN(pd->part);
+}
+
+EOLIAN static int
+_efl_ui_calendar_item_day_number_get(Eo *obj EINA_UNUSED, Efl_Ui_Calendar_Item_Data *pd)
+{
+ return pd->v;
+}
+
+EOLIAN static void
+_efl_ui_calendar_item_efl_ui_focus_object_focus_set(Eo *obj, Efl_Ui_Calendar_Item_Data *pd, Eina_Bool focus)
+{
+ efl_ui_focus_object_focus_set(efl_super(obj, EFL_UI_CALENDAR_ITEM_CLASS), focus);
+
+ _update_focused_it(efl_parent_get(obj), pd->v);
+ evas_object_focus_set(pd->part, efl_ui_focus_object_focus_get(obj));
+}
+
+EOLIAN static Eina_Rect
+_efl_ui_calendar_item_efl_ui_focus_object_focus_geometry_get(Eo *obj EINA_UNUSED, Efl_Ui_Calendar_Item_Data *pd)
+{
+ return efl_gfx_geometry_get(pd->part);
+}
+
+#include "efl_ui_calendar_item.eo.c"
diff --git a/src/lib/elementary/efl_ui_calendar_item.eo b/src/lib/elementary/efl_ui_calendar_item.eo
new file mode 100644
index 0000000000..4a4fd78907
--- /dev/null
+++ b/src/lib/elementary/efl_ui_calendar_item.eo
@@ -0,0 +1,14 @@
+class Efl.Ui.Calendar.Item (Efl.Object, Efl.Ui.Focus.Object)
+{
+ methods {
+ @property day_number {
+ values {
+ i : int;
+ }
+ }
+ }
+ implements {
+ Efl.Ui.Focus.Object.focus {set;}
+ Efl.Ui.Focus.Object.focus_geometry {get;}
+ }
+}