diff --git a/src/lib/elementary/elc_ctxpopup.c b/src/lib/elementary/elc_ctxpopup.c index 0faeec6ed4..803f7d7645 100644 --- a/src/lib/elementary/elc_ctxpopup.c +++ b/src/lib/elementary/elc_ctxpopup.c @@ -307,7 +307,7 @@ _base_geometry_calc(Evas_Object *obj, { Evas_Coord length[2]; - if (!sd->horizontal) + if (sd->orient == EFL_ORIENT_VERTICAL) { length[0] = pos.y - hover_area.y; length[1] = (hover_area.y + hover_area.h) - pos.y; @@ -1129,6 +1129,8 @@ _elm_ctxpopup_evas_object_smart_add(Eo *obj, Elm_Ctxpopup_Data *priv) priv->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN; priv->auto_hide = EINA_TRUE; + priv->orient = EFL_ORIENT_VERTICAL; + priv->box = elm_box_add(obj); evas_object_size_hint_weight_set (priv->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -1238,24 +1240,18 @@ _elm_ctxpopup_clear(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd) sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN; } -EOLIAN static void -_elm_ctxpopup_horizontal_set(Eo *obj, Elm_Ctxpopup_Data *sd, Eina_Bool horizontal) +EAPI void +elm_ctxpopup_horizontal_set(Evas_Object *obj, Eina_Bool horizontal) { - sd->horizontal = !!horizontal; - - if (!sd->list) return; - - elm_list_horizontal_set(sd->list, sd->horizontal); - - sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN; - - if (sd->visible) elm_layout_sizing_eval(obj); + efl_orientation_set(obj, horizontal ? EFL_ORIENT_HORIZONTAL : EFL_ORIENT_VERTICAL); } -EOLIAN static Eina_Bool -_elm_ctxpopup_horizontal_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd) +EAPI Eina_Bool +elm_ctxpopup_horizontal_get(Evas_Object *obj) { - return sd->horizontal; + ELM_CTXPOPUP_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE); + + return sd->orient == EFL_ORIENT_HORIZONTAL ? EINA_TRUE : EINA_FALSE; } static void @@ -1434,7 +1430,8 @@ _elm_ctxpopup_item_init(Eo *eo_item, elm_object_style_set(sd->list, "ctxpopup"); else elm_object_style_set(sd->list, elm_object_style_get(obj)); elm_list_mode_set(sd->list, ELM_LIST_EXPAND); - elm_list_horizontal_set(sd->list, sd->horizontal); + //TODO: use orient interface API on list when implemented + elm_list_horizontal_set(sd->list, sd->orient == EFL_ORIENT_VERTICAL ? EINA_FALSE : EINA_TRUE); evas_object_event_callback_add (sd->list, EVAS_CALLBACK_RESIZE, _list_resize_cb, obj); elm_layout_content_set(obj, "default", sd->list); @@ -1447,6 +1444,25 @@ _elm_ctxpopup_item_init(Eo *eo_item, sd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN; } +EOLIAN static Efl_Orient +_elm_ctxpopup_efl_orientation_orientation_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *pd) +{ + return pd->orient; +} + +EOLIAN static void +_elm_ctxpopup_efl_orientation_orientation_set(Eo *obj, Elm_Ctxpopup_Data *pd, Efl_Orient orient) +{ + if (pd->orient == orient) return; + if (pd->orient != EFL_ORIENT_HORIZONTAL && pd->orient != EFL_ORIENT_VERTICAL) return; + + pd->orient = orient; + //TODO: use orient API on list when its implemented + elm_list_horizontal_set(pd->list, pd->orient == EFL_ORIENT_HORIZONTAL ? EINA_TRUE : EINA_FALSE); + pd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN; + if (pd->visible) elm_layout_sizing_eval(obj); +} + EOLIAN static const Elm_Atspi_Action* _elm_ctxpopup_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd EINA_UNUSED) { diff --git a/src/lib/elementary/elc_ctxpopup_legacy.h b/src/lib/elementary/elc_ctxpopup_legacy.h index cf3ad28371..a9837992d9 100644 --- a/src/lib/elementary/elc_ctxpopup_legacy.h +++ b/src/lib/elementary/elc_ctxpopup_legacy.h @@ -8,5 +8,26 @@ */ EAPI Evas_Object *elm_ctxpopup_add(Evas_Object *parent); +/** + * @brief Change the ctxpopup's orientation to horizontal or vertical. + * + * @param obj Elm Ctxpopup object + * @param horizontal @c EINA_TRUE for horizontal mode, @c EINA_FALSE for vertical. + * + * @ingroup Elm_Ctxpopup + */ +EAPI void elm_ctxpopup_horizontal_set(Evas_Object *obj, Eina_Bool horizontal); + +/** + * @brief Get the value of current ctxpopup object's orientation. + * + * @param obj Elm Ctxpopup object + * return @c EINA_TRUE for horizontal mode, @c EINA_FALSE for vertical. + * See also @ref elm_ctxpopup_horizontal_set + * + * @ingroup Elm_Ctxpopup + */ +EAPI Eina_Bool elm_ctxpopup_horizontal_get(Evas_Object *obj); + #include "elm_ctxpopup_item.eo.legacy.h" #include "elm_ctxpopup.eo.legacy.h" diff --git a/src/lib/elementary/elm_ctxpopup.eo b/src/lib/elementary/elm_ctxpopup.eo index 7bc2f3a9b5..33447a2e8e 100644 --- a/src/lib/elementary/elm_ctxpopup.eo +++ b/src/lib/elementary/elm_ctxpopup.eo @@ -8,24 +8,10 @@ enum Elm.Ctxpopup.Direction unknown [[Ctxpopup does not determine it's direction yet.]] } -class Elm.Ctxpopup (Elm.Layout, Elm.Interface_Atspi_Widget_Action) +class Elm.Ctxpopup (Elm.Layout, Elm.Interface_Atspi_Widget_Action, Efl.Orientation) { eo_prefix: elm_obj_ctxpopup; methods { - @property horizontal { - set { - [[Change the ctxpopup's orientation to horizontal or vertical.]] - } - get { - [[Get the value of current ctxpopup object's orientation. - - See also @.horizontal.set. - ]] - } - values { - horizontal: bool; [[$true for horizontal mode, $false for vertical.]] - } - } @property auto_hide_disabled { set { [[Set ctxpopup auto hide mode triggered by ctxpopup policy. @@ -234,6 +220,7 @@ class Elm.Ctxpopup (Elm.Layout, Elm.Interface_Atspi_Widget_Action) Elm.Layout.sizing_eval; Elm.Interface_Atspi_Widget_Action.elm_actions.get; Elm.Interface_Atspi_Accessible.state_set.get; + Efl.Orientation.orientation; } events { dismissed; diff --git a/src/lib/elementary/elm_widget_ctxpopup.h b/src/lib/elementary/elm_widget_ctxpopup.h index 12bd9ae395..25af380781 100644 --- a/src/lib/elementary/elm_widget_ctxpopup.h +++ b/src/lib/elementary/elm_widget_ctxpopup.h @@ -53,9 +53,9 @@ struct _Elm_Ctxpopup_Data Elm_Ctxpopup_Direction dir; Elm_Ctxpopup_Direction dir_priority[4]; + Efl_Orient orient; Eina_Bool list_visible : 1; - Eina_Bool horizontal : 1; Eina_Bool finished : 1; Eina_Bool emitted : 1; Eina_Bool visible : 1;