summaryrefslogtreecommitdiff
path: root/src/lib/elementary/efl_ui_widget.eo
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/elementary/efl_ui_widget.eo')
-rw-r--r--src/lib/elementary/efl_ui_widget.eo600
1 files changed, 600 insertions, 0 deletions
diff --git a/src/lib/elementary/efl_ui_widget.eo b/src/lib/elementary/efl_ui_widget.eo
new file mode 100644
index 0000000000..b0b5610170
--- /dev/null
+++ b/src/lib/elementary/efl_ui_widget.eo
@@ -0,0 +1,600 @@
+function Efl.Ui.Scrollable_On_Show_Region {
+ [[Function pointer for on show region hook]]
+ params {
+ @in obj: Efl.Canvas.Object; [[Canvas object]]
+ @in region: Eina.Rect; [[Showed region]]
+ }
+};
+
+struct Efl.Ui.Widget_Focus_State {
+ [[All relevant fields needed for the current state of focus registeration]]
+ manager : Efl.Ui.Focus.Manager; [[The manager where the widget is registered in]]
+ parent : Efl.Ui.Focus.Object; [[The parent the widget is using as logical parent]]
+ logical : bool; [[$true if this is registered as logical currently]]
+}
+
+abstract Efl.Ui.Widget (Efl.Canvas.Group, Efl.Access.Object,
+ Efl.Access.Component, Efl.Part, Efl.Ui.Focus.Object,
+ Efl.Ui.Base, Efl.Ui.Cursor, Efl.Ui.Translatable,
+ Efl.Selection, Efl.Ui.Dnd)
+{
+ [[Efl UI widget abstract class]]
+ legacy_prefix: elm_widget;
+ //eo_prefix: efl_ui_widget;
+ event_prefix: efl_ui_widget;
+ data: Efl_Ui_Widget_Data;
+ methods {
+ @property resize_object @protected {
+ [[This is the internal canvas object managed by a widget.
+
+ This property is protected as it is meant for widget implementations
+ only, to set and access the internal canvas object. Do use this
+ function unless you're implementing a widget.
+ ]]
+ set {
+ [[Sets the new resize object for this widget.]]
+ }
+ values {
+ sobj: Efl.Canvas.Object @nullable;
+ [[A canvas object (often a @Efl.Canvas.Layout object).]]
+ }
+ }
+ @property disabled {
+ [[Whether the widget is enabled (accepts and reacts to user inputs).
+
+ Each widget may handle the disabled state differently, but overall
+ disabled widgets shall not respond to any input events. This is
+ $false by default, meaning the widget is enabled.
+ ]]
+ set {
+ [[Enables or disables this widget.
+
+ Disabling a widget will disable all its children recursively,
+ but only this widget will be marked as disabled internally.
+ ]]
+ }
+ get {
+ [[Returns whether the widget is disabled.
+
+ This will return $true if any widget in the parent hierarchy
+ is disabled. Re-enabling that parent may in turn change the
+ disabled state of this widget.
+ ]]
+ }
+ values {
+ disabled: bool(false); [[$true if the widget is disabled.]]
+ }
+ }
+ @property style {
+ [[The widget style to use.
+
+ Styles define different look and feel for widgets, and may provide
+ different parts for layout-based widgets. Styles vary from widget
+ to widget and may be defined by other themes by means of extensions
+ and overlays.
+
+ The style can only be set before @Efl.Object.finalize, which means
+ at construction time of the object (inside $efl_add in C).
+ ]]
+ set @protected {
+ [[Can only be called during construction, before finalize.]]
+ return: Efl.Ui.Theme.Apply(0);
+ [[Whether the style was successfully applied or not, see
+ the values of @Efl.Ui.Theme.Apply for more information.]]
+ }
+ get {
+ [[Returns the current style of a widget.]]
+ }
+ values {
+ style: string;
+ [[Name of the style to use. Refer to each widget's documentation
+ for the available style names, or to the themes in use.]]
+ }
+ }
+ widget_event @protected {
+ [[Virtual function handling input events on the widget.
+
+ This method should return $true if the event has been processed.
+ Only key down, key up and pointer wheel events will be propagated
+ through this function.
+
+ It is common for the event to be also marked as processed as in
+ @Efl.Input.Event.processed, if this operation was successful. This
+ makes sure other widgets will not also process this input event.
+ ]]
+ params {
+ @cref eo_event: Efl.Event;
+ [[EO event struct with an Efl.Input.Event as info.]]
+ @in source: Efl.Canvas.Object;
+ [[Source object where the event originated. Often same as this.]]
+ }
+ return: bool; [[$true on success, $false otherwise]]
+ legacy: null;
+ }
+ // FIXME: focus_allow? can_focus? focusable?
+ @property focus_allow {
+ [[The ability for a widget to be focused.
+
+ Unfocusable objects do nothing when programmatically focused. The
+ nearest focusable parent object the one really getting focus. Also,
+ when they receive mouse input, they will get the event, but not take
+ away the focus from where it was previously.
+
+ Note: Objects which are meant to be interacted with by input events
+ are created able to be focused, by default. All the others are not.
+
+ This property's default value depends on the widget (eg. a box is
+ not focusable, but a button is).
+ ]]
+ set {
+ legacy: elm_widget_can_focus_set;
+ }
+ get {
+ legacy: elm_widget_can_focus_get;
+ }
+ values {
+ can_focus: bool; [[Whether the object is focusable.]]
+ }
+ }
+ @property widget_parent @protected {
+ [[The internal parent of this widget.
+
+ @Efl.Ui.Widget objects have a parent hierarchy that may differ slightly
+ from their @Efl.Object or @Efl.Canvas.Object hierarchy. This is
+ meant for internal handling.
+
+ See also @.widget_top.
+ ]]
+ set {}
+ get {
+ legacy: elm_widget_parent_get; /* internal in legacy */
+ }
+ values {
+ parent: Efl.Ui.Widget @nullable; [[Widget parent object]]
+ }
+ }
+ @property widget_top {
+ [[Root widget in the widget hierarchy.
+
+ This returns the top widget, in terms of widget hierarchy. This is
+ usually a window (@Efl.Ui.Win). This function walks the list of
+ @.widget_parent.
+
+ If this widget has no parent (in terms of widget hierarchy) this
+ will return $null.
+
+ Note: This may not be a display manager window in case of nested
+ canvases. If a "real" window is required, then you might want to
+ verify that the returned object is a $Efl.Ui.Win_Inlined, and then
+ get $Efl.Ui.Win_Inlined.inlined_parent to find an object in the
+ master window.
+
+ See also @.widget_parent.
+ ]]
+ get {
+ legacy: elm_widget_top_get; /* internal in legacy */
+ }
+ values {
+ top: Efl.Ui.Widget; [[Top widget, usually a window.]]
+ }
+ }
+
+ /* Accessibility */
+ @property access_info {
+ [[Accessibility information.
+
+ This is a replacement string to be read by the accessibility
+ text-to-speech engine, if accessibility is enabled by configuration.
+ This will take precedence over the default text for this object,
+ which means for instance that the label of a button won't be read
+ out loud, instead $txt will be read out.
+ ]]
+ values {
+ txt: string @nullable; [[Accessibility text description.]]
+ }
+ }
+ on_access_activate @protected @beta {
+ [[Hook function called when widget is activated through accessibility.
+
+ This meant to be overridden by subclasses to support accessibility.
+ This is an unstable API.
+ ]]
+ params {
+ @in act: Efl.Ui.Activate; [[Type of activation.]]
+ }
+ return: bool; [[$true on success, $false otherwise]]
+ legacy: null; /* FIXME: legacy API does extra work */
+ }
+ on_access_update @protected @beta {
+ [[Hook function called when accessibility is changed on the widget.
+
+ This meant to be overridden by subclasses to support accessibility.
+ This is an unstable API.
+ ]]
+ params {
+ @in enable: bool; [[$true if accessibility is enabled.]]
+ }
+ legacy: null; /* FIXME: legacy API does extra work */
+ }
+
+ /* Internal hooks. */
+ widget_sub_object_add @protected {
+ [[Virtual function handling sub objects being added.
+
+ Sub objects can be any canvas object, not necessarily widgets.
+
+ See also @.widget_parent.
+ ]]
+ params {
+ @in sub_obj: Efl.Canvas.Object;
+ [[Sub object to be added. Not necessarily a widget itself.]]
+ }
+ return: bool; [[Indicates if the operation succeeded.]]
+ legacy: elm_widget_sub_object_add;
+ }
+ widget_sub_object_del @protected {
+ [[Virtual function handling sub objects being removed.
+
+ Sub objects can be any canvas object, not necessarily widgets.
+
+ See also @.widget_parent.
+ ]]
+ params {
+ @in sub_obj: Efl.Canvas.Object;
+ [[Sub object to be removed. Should be a child of this widget.]]
+ }
+ return: bool; [[Indicates if the operation succeeded.]]
+ legacy: elm_widget_sub_object_del;
+ }
+ @property orientation_mode {
+ [[Whether the widget's automatic orientation is enabled or not.
+
+ Orientation mode is used for widgets to change their style or send
+ signals based on the canvas rotation (i.e. the window orientation).
+ If the orientation mode is enabled, the widget will emit signals
+ such as "elm,state,orient,N" where $N is one of 0, 90, 180, 270,
+ depending on the window orientation. Such signals may be handled by
+ the theme in order to provide a different look for the widget based
+ on the canvas orientation.
+
+ By default orientation mode is enabled.
+
+ See also @.on_orientation_update.
+ ]]
+ values {
+ mode: Efl.Ui.Widget_Orientation_Mode(Efl.Ui.Widget_Orientation_Mode.default);
+ [[How window orientation should affect this widget.]]
+ }
+ }
+ on_orientation_update @protected {
+ [[Virtual function handling canvas orientation changes.
+
+ This method will be called recursively from the top widget (the
+ window) to all the children objects whenever the window rotation
+ is changed. The given $rotation will be one of 0, 90, 180, 270 or
+ the special value -1 if @.orientation_mode is $disabled.
+
+ If @.orientation_mode is $default, the widget implementation will
+ emit the signal "elm,state,orient,$R" will be emitted (where $R is
+ the rotation angle in degrees).
+
+ Note: This function may be called even if the orientation has not
+ actually changed, like when a widget needs to be reconfigured.
+
+ See also @.orientation_mode.
+ ]]
+ params {
+ rotation: int; [[Orientation in degrees: 0, 90, 180, 270 or -1 if
+ @.orientation_mode is $disabled.]]
+ }
+ }
+ on_disabled_update @protected {
+ [[Virtual function called when the widget becomes disabled.
+
+ This may be triggered even if this widget is not disabled, as the
+ parent widget could be disabled and propagate its state.
+ ]]
+ params {
+ disabled: bool; [[The new value of @.disabled.]]
+ }
+ return: bool; [[Indicates if the operation succeeded.]]
+ }
+ theme_apply @protected {
+ [[Virtual function called when the widget needs to re-apply its theme.
+
+ This may be called when the object is first created, or whenever
+ the widget is modified in any way that may require a reload of the
+ theme. This may include but is not limited to scale, theme, or
+ mirrored mode changes.
+
+ Note: even widgets not based on layouts may override this method
+ to handle widget updates (scale, mirrored mode, etc...).
+ ]]
+ return: Efl.Ui.Theme.Apply; [[Indicates success, and if the current
+ theme or default theme was used.]]
+ }
+
+ /* Scroll API. */
+ @property on_show_region_hook @protected {
+ [[Hook function called when the @.show_region is changed.
+
+ See also @.show_region.
+ ]]
+ set {}
+ values {
+ func: Efl.Ui.Scrollable_On_Show_Region @nullable; [[Region hook function]]
+ }
+ }
+ @property show_region @protected {
+ [[Region inside the widget to show.
+
+ See also @.on_show_region_hook.
+ ]]
+ set {
+ [[Request parent scrollers to pan around so that this region
+ of the widget becomes visible.
+
+ If $force is $true this will trigger scroller changes and
+ the @.on_show_region_hook to be called even if the region is
+ unchanged.
+ ]]
+ values {
+ region: Eina.Rect; [[The region to show.]]
+ force: bool; [[Set to $true to force show even if unchanged.]]
+ }
+ }
+ get {
+ [[Returns the current region to show.]]
+ values {
+ region: Eina.Rect; [[The region to show.]]
+ }
+ }
+ }
+
+ /* FIXME: Scroll API. Not sure how those APIs should be exposed with
+ * the new scrollable API. */
+ scroll_hold_push {
+ [[Push scroll hold]]
+ }
+ scroll_hold_pop {
+ [[Pop scroller hold]]
+ }
+ scroll_freeze_push {
+ [[Push scroller freeze]]
+ }
+ scroll_freeze_pop {
+ [[Pop scroller freeze]]
+ }
+
+ /* Region of interest */
+ @property interest_region @protected {
+ [[Region of interest inside this widget, that should be given
+ priority to be visible inside a scroller.
+
+ When this widget or one of its subwidgets is given focus, this
+ region should be shown, which means any parent scroller should
+ attempt to display the given area of this widget. For instance, an
+ entry given focus should scroll to show the text cursor if that
+ cursor moves. In this example, this region defines the relative
+ geometry of the cursor within the widget.
+
+ Note: The region is relative to the top-left corner of the widget,
+ i.e. X,Y start from 0,0 to indicate the top-left corner of the
+ widget. W,H must be greater or equal to 1 for this region to be
+ taken into account, otherwise it is ignored.
+
+ See also @.interest_region_mode
+ ]]
+ get {
+ legacy: elm_widget_focus_region_get;
+ }
+ values {
+ region: Eina.Rect;
+ [[The relative region to show. If width or height is <= 0 it
+ will be ignored, and no action will be taken.]]
+ }
+ }
+ @property interest_region_mode {
+ [[Defines how @.show_region should be calculated.
+
+ It is up to the implementation of @.show_region.get to take this
+ value into account (or ignore it).
+ ]]
+ get {
+ legacy: elm_widget_focus_region_show_mode_get;
+ }
+ set {
+ legacy: elm_widget_focus_region_show_mode_set;
+ }
+ values {
+ mode: Efl.Ui.Interest_Region_Mode;
+ [[Whether to show a specific item or the widget as a whole.]]
+ }
+ }
+
+ /* Focus highlight (visual focus rectangle) properties */
+ @property focus_highlight_geometry @protected {
+ [[The rectangle region to be highlighted on focus.
+
+ This is a rectangle region where the focus highlight should be
+ displayed.
+ ]]
+ get {
+ [[This is a read-only property.]]
+ }
+ values {
+ region: Eina.Rect; [[The rectangle area.]]
+ }
+ }
+ @property focus_highlight_enabled {
+ [[Whether focus highlight is enabled or not.
+
+ As of EFL 1.21 focus highlight properties apply to a single window,
+ not a single widget. As a consequence, calls to this function may
+ be forwarded to the parent window. Future versions of EFL may
+ implement widget-specific focus highlight properties.
+
+ See also @.widget_top.
+ See also @.focus_highlight_style.
+ See also @.focus_highlight_animate.
+ ]]
+ set {
+ [[Set the enabled status for the focus highlight in a window.
+
+ This function will enable or disable the focus highlight,
+ regardless of the global setting for it.
+ ]]
+ }
+ get {
+ [[Get the enabled value of the focus highlight for this window.]]
+ }
+ values {
+ enabled: bool; [[The enabled value for the highlight.]]
+ }
+ }
+ @property focus_highlight_style {
+ [[Control the widget focus highlight style.
+
+ If $style is $null, the default will be used.
+
+ As of EFL 1.21 focus highlight properties apply to a single window,
+ not a single widget. As a consequence, calls to this function may
+ be forwarded to the parent window. Future versions of EFL may
+ implement widget-specific focus highlight properties.
+
+ See also @.widget_top.
+ See also @.focus_highlight_enabled.
+ See also @.focus_highlight_animate.
+ ]]
+ set {
+ /* FIXME: This is async... success here means nothing. */
+ return: bool; [[$true on success, $false otherwise.]]
+ }
+ get {
+ }
+ values {
+ style: string @nullable; [[The name of the focus highlight style.]]
+ }
+ }
+ @property focus_highlight_animate {
+ [[Whether focus highlight should animate or not.
+
+ As of EFL 1.21 focus highlight properties apply to a single window,
+ not a single widget. As a consequence, calls to this function may
+ be forwarded to the parent window. Future versions of EFL may
+ implement widget-specific focus highlight properties.
+
+ See also @.widget_top.
+ See also @.focus_highlight_style.
+ See also @.focus_highlight_enabled.
+ ]]
+ set {
+ [[Set the animate status for the focus highlight for this window.
+
+ This function will enable or disable the animation of focus
+ highlight.
+ ]]
+ }
+ get {
+ [[Get the animate value of the focus highlight for this window.]]
+ }
+ values {
+ animate: bool; [[The enabled value for the highlight animation.]]
+ }
+ }
+ @property focus_move_policy @beta {
+ [[The widget's focus move policy.]]
+ values {
+ policy: Efl.Ui.Focus.Move_Policy; [[Focus move policy]]
+ }
+ }
+ @property focus_move_policy_automatic @beta {
+ [[Control the widget's focus_move_policy mode setting.
+
+ @since 1.18]]
+ values {
+ automatic: bool; [[$true to follow system focus move policy change,
+ $false otherwise]]
+ }
+ }
+
+ /* FIXME: No more items in EO API */
+ @property focused_item @beta {
+ get {
+ [[Get the focused widget item.]]
+ return: Elm.Widget.Item; [[Focused item]]
+ }
+ }
+
+ /* Focus Manager API */
+ focus_state_apply @protected {
+ [[Register focus with the given configuration.
+
+ The implementation can feel free to change the logical flag as it
+ wants, but other than that it should strictly keep the configuration.
+
+ The implementation in elm.widget updates the current state into what
+ is passed as configured state, respecting manager changes,
+ registeration and unregistration based on if it should be registered
+ or unregistered.
+
+ A manager field that is $null means that the widget should not or was
+ not registered.
+ ]]
+ params {
+ @in current_state : Efl.Ui.Widget_Focus_State;
+ [[The focus manager to register with.]]
+ @inout configured_state : Efl.Ui.Widget_Focus_State;
+ [[The evalulated Focus state that should be used.]]
+ @in redirect : Efl.Ui.Widget;
+ [[A redirect that will be set by the elm.widget implementation.]]
+ }
+ return: bool; [[Returns whether the widget is registered or not.]]
+ }
+ }
+ parts {
+ shadow: Efl.Ui.Widget_Part_Shadow;
+ background: Efl.Ui.Widget_Part_Bg;
+ }
+ implements {
+ class.constructor;
+ Efl.Object.constructor;
+ Efl.Object.finalize;
+ Efl.Object.destructor;
+ Efl.Object.provider_find;
+ Efl.Object.debug_name_override;
+ Efl.Gfx.Color.color { set; }
+ Efl.Gfx.Entity.visible { set; }
+ Efl.Gfx.Entity.position { set; }
+ Efl.Gfx.Entity.size { set; }
+ Efl.Gfx.Entity.scale { set; get; }
+ Efl.Canvas.Object.clip { set; }
+ Efl.Canvas.Object.no_render { set; }
+ Efl.Canvas.Object.is_frame_object { set; }
+ Efl.Canvas.Group.group_calculate;
+ Efl.Canvas.Group.group_member_del;
+ Efl.Canvas.Group.group_member_add;
+ Efl.Access.Object.i18n_name { get; }
+ Efl.Access.Object.state_set { get; }
+ Efl.Access.Object.access_children { get; }
+ Efl.Access.Object.attributes { get; }
+ Efl.Access.Component.focus_grab;
+ Efl.Ui.Focus.Object.focus_manager { get; }
+ Efl.Ui.Focus.Object.focus_parent { get; }
+ Efl.Ui.Focus.Object.focus_geometry { get; }
+ Efl.Ui.Focus.Object.focus { set; }
+ Efl.Ui.Base.mirrored { get; set; }
+ Efl.Ui.Base.mirrored_automatic { get; set; }
+ Efl.Ui.Cursor.cursor { get; set; }
+ Efl.Ui.Cursor.cursor_style { get; set; }
+ Efl.Ui.Cursor.cursor_theme_search_enabled { get; set; }
+ Efl.Ui.Focus.Object.on_focus_update;
+ Efl.Ui.Translatable.translation_update; [[This implements the calls to $gettext() and $text_set().]]
+ Efl.Part.part_get; [[Returns @Efl.Ui.Widget_Part.]]
+ }
+ events {
+ moved: Efl.Object; [[Called when widget moved]]
+ language,changed: void; [[Called when widget language changed]]
+ access,changed: void; [[Called when accessibility changed]]
+ }
+}