diff --git a/src/lib/elementary/efl_ui_collection.eo b/src/lib/elementary/efl_ui_collection.eo index ecd0eb1e94..9fad710f65 100644 --- a/src/lib/elementary/efl_ui_collection.eo +++ b/src/lib/elementary/efl_ui_collection.eo @@ -6,6 +6,10 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base implements Efl.Ui.Multi_Selectable, Efl.Ui.Focus.Manager_Sub, Efl.Ui.Widget_Focus_Manager + composite + Efl.Ui.Scrollable_Interactive, + Efl.Ui.Scrollbar, + Efl.Ui.Focus.Manager { [[This widget displays a list of items in an arrangement controlled by an external @.position_manager object. By using different @.position_manager objects this widget can show unidimensional lists or @@ -95,10 +99,5 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base implements item,clicked : Efl.Ui.Item; [[A $clicked event occurred over an item.]] item,clicked,any : Efl.Ui.Item; [[A $clicked,any event occurred over an item.]] } - composite { - Efl.Ui.Scrollable_Interactive; - Efl.Ui.Scrollbar; - Efl.Ui.Focus.Manager; - } } diff --git a/src/lib/elementary/efl_ui_image_zoomable.eo b/src/lib/elementary/efl_ui_image_zoomable.eo index 4669a4f4a4..62ae9bc591 100644 --- a/src/lib/elementary/efl_ui_image_zoomable.eo +++ b/src/lib/elementary/efl_ui_image_zoomable.eo @@ -5,6 +5,7 @@ struct @extern Elm.Photocam.Progress; [[Photocam progress information.]] class @beta Efl.Ui.Image_Zoomable extends Efl.Ui.Image implements Efl.Ui.Zoom, Efl.Ui.Scrollable_Interactive, Efl.Ui.Scrollbar + composite Efl.Ui.Scrollable_Interactive, Efl.Ui.Scrollbar { [[Elementary Image Zoomable class]] methods { @@ -84,8 +85,4 @@ class @beta Efl.Ui.Image_Zoomable extends Efl.Ui.Image implements Efl.Ui.Zoom, download,done: void; [[Called when photocam download finished]] download,error: Elm.Photocam.Error; [[Called when photocam download failed]] } - composite { - Efl.Ui.Scrollable_Interactive; - Efl.Ui.Scrollbar; - } } diff --git a/src/lib/elementary/efl_ui_list_view.eo b/src/lib/elementary/efl_ui_list_view.eo index f1490b3b26..5c49394ec4 100644 --- a/src/lib/elementary/efl_ui_list_view.eo +++ b/src/lib/elementary/efl_ui_list_view.eo @@ -10,6 +10,8 @@ struct @beta Efl.Ui.List_View_Item_Event class @beta Efl.Ui.List_View extends Efl.Ui.Layout_Base implements Efl.Ui.Scrollable_Interactive, Efl.Ui.Scrollbar, Efl.Access.Widget.Action, Efl.Access.Selection, Efl.Ui.Focus.Composition, Efl.Ui.Focus.Manager_Sub, Efl.Ui.Container_Selectable, Efl.Ui.List_View_Model, Efl.Ui.Widget_Focus_Manager + composite + Efl.Ui.Scrollable_Interactive, Efl.Ui.Scrollbar { methods { @property homogeneous { @@ -90,8 +92,4 @@ class @beta Efl.Ui.List_View extends Efl.Ui.Layout_Base implements Efl.Ui.Scroll Efl.Access.Selection.all_children_select; Efl.Access.Selection.access_selection_clear; } - composite { - Efl.Ui.Scrollable_Interactive; - Efl.Ui.Scrollbar; - } } diff --git a/src/lib/elementary/efl_ui_panel.eo b/src/lib/elementary/efl_ui_panel.eo index 0cde869b3e..24182af750 100644 --- a/src/lib/elementary/efl_ui_panel.eo +++ b/src/lib/elementary/efl_ui_panel.eo @@ -18,6 +18,7 @@ struct @beta Efl.Ui.Panel_Scroll_Info class @beta Efl.Ui.Panel extends Efl.Ui.Layout_Base implements Efl.Ui.Focus.Layer, Efl.Ui.Scrollable_Interactive, Efl.Content, Efl.Access.Widget.Action + composite Efl.Ui.Scrollable_Interactive { [[Elementary panel class]] methods { @@ -93,7 +94,4 @@ class @beta Efl.Ui.Panel extends Efl.Ui.Layout_Base events { toggled: void; [[Called when the hidden state was toggled]] } - composite { - Efl.Ui.Scrollable_Interactive; - } } diff --git a/src/lib/elementary/efl_ui_radio_box.eo b/src/lib/elementary/efl_ui_radio_box.eo index aa2d91c835..54bd92e3df 100644 --- a/src/lib/elementary/efl_ui_radio_box.eo +++ b/src/lib/elementary/efl_ui_radio_box.eo @@ -1,4 +1,5 @@ class @beta Efl.Ui.Radio_Box extends Efl.Ui.Box implements Efl.Ui.Radio_Group + composite Efl.Ui.Radio_Group { [[A standard @Efl.Ui.Box container which automatically handles grouping of any @Efl.Ui.Radio widget added to it. @@ -19,7 +20,4 @@ class @beta Efl.Ui.Radio_Box extends Efl.Ui.Box implements Efl.Ui.Radio_Group Efl.Pack_Linear.pack_unpack_at; Efl.Object.constructor; } - composite { - Efl.Ui.Radio_Group; - } } diff --git a/src/lib/elementary/efl_ui_scroller.eo b/src/lib/elementary/efl_ui_scroller.eo index 36f42c16b0..7a2bb90306 100644 --- a/src/lib/elementary/efl_ui_scroller.eo +++ b/src/lib/elementary/efl_ui_scroller.eo @@ -4,6 +4,9 @@ class @beta Efl.Ui.Scroller extends Efl.Ui.Layout_Base implements Efl.Ui.Focus.Manager_Sub, Efl.Ui.Widget_Focus_Manager, Efl.Content + composite + Efl.Ui.Scrollable_Interactive, + Efl.Ui.Scrollbar { [[Efl ui scroller class]] implements { @@ -19,8 +22,4 @@ class @beta Efl.Ui.Scroller extends Efl.Ui.Layout_Base implements Efl.Ui.Widget_Focus_Manager.focus_manager_create; Efl.Ui.Scrollable_Interactive.match_content { set; } } - composite { - Efl.Ui.Scrollable_Interactive; - Efl.Ui.Scrollbar; - } } diff --git a/src/lib/elementary/efl_ui_tab_bar.eo b/src/lib/elementary/efl_ui_tab_bar.eo index 1d27afe62e..b4aabe1197 100644 --- a/src/lib/elementary/efl_ui_tab_bar.eo +++ b/src/lib/elementary/efl_ui_tab_bar.eo @@ -1,4 +1,6 @@ -class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_Selectable, Efl.Pack_Linear +class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base + implements Efl.Ui.Single_Selectable, Efl.Pack_Linear + composite Efl.Pack_Linear, Efl.Pack { [[Tab Bar class]] methods { @@ -23,9 +25,4 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base implements Efl.Ui.Single_S Efl.Container.content_count; Efl.Container.content_iterate; } - composite { - Efl.Pack_Linear; - Efl.Pack; - Efl.Pack_Linear; - } } diff --git a/src/lib/elementary/efl_ui_tags.eo b/src/lib/elementary/efl_ui_tags.eo index 6f8c739f06..96f1fb0eb8 100644 --- a/src/lib/elementary/efl_ui_tags.eo +++ b/src/lib/elementary/efl_ui_tags.eo @@ -1,4 +1,6 @@ -class @beta Efl.Ui.Tags extends Efl.Ui.Layout_Base implements Efl.Text, Efl.Ui.Format +class @beta Efl.Ui.Tags extends Efl.Ui.Layout_Base + implements Efl.Text, Efl.Ui.Format + composite Efl.Text { [[A widget displaying a list of tags. The user can remove tags by clicking on each tag "close" button and add new tags by typing text in the text @@ -61,7 +63,4 @@ class @beta Efl.Ui.Tags extends Efl.Ui.Layout_Base implements Efl.Text, Efl.Ui.F /* FIXME: Not future-proof */ expand,state,changed: int; [[Called when expanded state changed]] } - composite { - Efl.Text; - } } diff --git a/src/lib/elementary/efl_ui_text.eo b/src/lib/elementary/efl_ui_text.eo index a8cee69e40..691c0271bd 100644 --- a/src/lib/elementary/efl_ui_text.eo +++ b/src/lib/elementary/efl_ui_text.eo @@ -4,6 +4,8 @@ import elm_general; class @beta Efl.Ui.Text extends Efl.Ui.Layout_Base implements Efl.Input.Clickable, Efl.Access.Text, Efl.Access.Editable.Text, Efl.File, Efl.Ui.Text_Selectable, Efl.Text_Interactive, Efl.Text_Markup + composite + Efl.Text_Interactive, Efl.Text_Markup { [[A flexible text widget which can be static (as a label) or editable by the user (as a text entry). It provides all sorts of editing facilities @@ -374,8 +376,4 @@ class @beta Efl.Ui.Text extends Efl.Ui.Layout_Base implements Efl.Input.Clickabl anchor,up: Elm.Entry_Anchor_Info; [[called on anchor up]] cursor,changed,manual: void; [[Called on manual cursor change]] } - composite { - Efl.Text_Interactive; - Efl.Text_Markup; - } } diff --git a/src/lib/elementary/efl_ui_video.eo b/src/lib/elementary/efl_ui_video.eo index d6b42f9abb..c00326ef30 100644 --- a/src/lib/elementary/efl_ui_video.eo +++ b/src/lib/elementary/efl_ui_video.eo @@ -1,4 +1,6 @@ -class @beta Efl.Ui.Video extends Efl.Ui.Layout_Base implements Efl.File, Efl.Player, Efl.Access.Widget.Action +class @beta Efl.Ui.Video extends Efl.Ui.Layout_Base + implements Efl.File, Efl.Player, Efl.Access.Widget.Action + composite Efl.Player { [[Efl UI video class]] methods { @@ -50,7 +52,4 @@ class @beta Efl.Ui.Video extends Efl.Ui.Layout_Base implements Efl.File, Efl.Pla Efl.Player.stop; Efl.Player.play { get; set; } } - composite { - Efl.Player; - } } diff --git a/src/lib/elementary/efl_ui_widget_focus_manager.eo b/src/lib/elementary/efl_ui_widget_focus_manager.eo index e5cc1a2691..d12a4a0c79 100644 --- a/src/lib/elementary/efl_ui_widget_focus_manager.eo +++ b/src/lib/elementary/efl_ui_widget_focus_manager.eo @@ -1,4 +1,7 @@ -mixin Efl.Ui.Widget_Focus_Manager requires Efl.Ui.Widget extends Efl.Ui.Focus.Manager +mixin Efl.Ui.Widget_Focus_Manager + requires Efl.Ui.Widget + extends Efl.Ui.Focus.Manager + composite Efl.Ui.Focus.Manager { [[Helper mixin for widgets which also can act as focus managers. @@ -23,7 +26,4 @@ mixin Efl.Ui.Widget_Focus_Manager requires Efl.Ui.Widget extends Efl.Ui.Focus.Ma Efl.Object.destructor; Efl.Ui.Widget.focus_state_apply; } - composite { - Efl.Ui.Focus.Manager; - } } diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 42c309dfb6..94859d9277 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo @@ -139,6 +139,7 @@ class Efl.Ui.Win extends Efl.Ui.Widget implements Efl.Canvas.Scene, Efl.Access.W Efl.Content, Efl.Input.State, Efl.Input.Interface, Efl.Screen, Efl.Text, Efl.Config, Efl.Ui.Widget_Focus_Manager, Efl.Ui.Focus.Manager_Window_Root + composite Efl.Config { [[Efl UI window class. @@ -895,7 +896,4 @@ class Efl.Ui.Win extends Efl.Ui.Widget implements Efl.Canvas.Scene, Efl.Access.W pause: void; [[Called when the window is not going be displayed for some time]] resume: void; [[Called before a window is rendered after a pause event]] } - composite { - Efl.Config; - } } diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 04a16c2502..975c2a880b 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1958,43 +1958,6 @@ parse_parts(Eo_Lexer *ls) check_match(ls, '}', '{', line, col); } -static void -parse_composite(Eo_Lexer *ls) -{ - int line, col; - if (ls->klass->type == EOLIAN_CLASS_INTERFACE) - eo_lexer_syntax_error(ls, "composite section not allowed in interfaces"); - eo_lexer_get(ls); - line = ls->line_number, col = ls->column; - check_next(ls, '{'); - while (ls->t.token != '}') - { - Eina_Strbuf *buf = eina_strbuf_new(); - eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), buf); - eo_lexer_context_push(ls); - parse_name(ls, buf); - const char *nm = eina_strbuf_string_get(buf); - char *fnm = database_class_to_filename(nm); - if (!eina_hash_find(ls->state->filenames_eo, fnm)) - { - free(fnm); - char ebuf[PATH_MAX]; - eo_lexer_context_restore(ls); - snprintf(ebuf, sizeof(ebuf), "unknown interface '%s'", nm); - eo_lexer_syntax_error(ls, ebuf); - return; - } - /* do not introduce a dependency */ - database_defer(ls->state, fnm, EINA_FALSE); - free(fnm); - ls->klass->composite = eina_list_append(ls->klass->composite, - eina_stringshare_add(nm)); - eo_lexer_dtor_pop(ls); - check_next(ls, ';'); - } - check_match(ls, '}', '{', line, col); -} - static void parse_implements(Eo_Lexer *ls, Eina_Bool iface) { @@ -2065,7 +2028,6 @@ parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) has_data = EINA_FALSE, has_methods = EINA_FALSE, has_parts = EINA_FALSE, - has_composite = EINA_FALSE, has_implements = EINA_FALSE, has_constructors = EINA_FALSE, has_events = EINA_FALSE; @@ -2112,10 +2074,6 @@ parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) CASE_LOCK(ls, parts, "parts definition") parse_parts(ls); break; - case KW_composite: - CASE_LOCK(ls, composite, "composite definition") - parse_composite(ls); - break; case KW_implements: CASE_LOCK(ls, implements, "implements definition") parse_implements(ls, type == EOLIAN_CLASS_INTERFACE); @@ -2200,6 +2158,7 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf) const char *required; char *fnm; + eina_strbuf_reset(buf); eo_lexer_context_push(ls); parse_name(ls, buf); required = eina_strbuf_string_get(buf); @@ -2212,6 +2171,31 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf) free(fnm); } +static void +_composite_add(Eo_Lexer *ls, Eina_Strbuf *buf) +{ + eina_strbuf_reset(buf); + eo_lexer_context_push(ls); + parse_name(ls, buf); + const char *nm = eina_strbuf_string_get(buf); + char *fnm = database_class_to_filename(nm); + if (!eina_hash_find(ls->state->filenames_eo, fnm)) + { + free(fnm); + char ebuf[PATH_MAX]; + eo_lexer_context_restore(ls); + snprintf(ebuf, sizeof(ebuf), "unknown interface '%s'", nm); + eo_lexer_syntax_error(ls, ebuf); + return; + } + /* do not introduce a dependency */ + database_defer(ls->state, fnm, EINA_FALSE); + free(fnm); + ls->klass->composite = eina_list_append(ls->klass->composite, + eina_stringshare_add(nm)); + eo_lexer_context_pop(ls); +} + static void parse_class(Eo_Lexer *ls, Eolian_Class_Type type) { @@ -2312,6 +2296,17 @@ tags_done: _inherit_dep(ls, ibuf, EINA_FALSE); while (test_next(ls, ',')); } + + if (ls->t.kw == KW_composite) + { + if (type == EOLIAN_CLASS_INTERFACE) + eo_lexer_syntax_error(ls, "composite not allowed in interfaces"); + eo_lexer_get(ls); + do + _composite_add(ls, ibuf); + while (test_next(ls, ',')); + } + eo_lexer_dtor_pop(ls); } inherit_done: diff --git a/src/tests/eolian/data/unimpl.eo b/src/tests/eolian/data/unimpl.eo index a1420e07c6..e08699a231 100644 --- a/src/tests/eolian/data/unimpl.eo +++ b/src/tests/eolian/data/unimpl.eo @@ -1,7 +1,4 @@ -class Unimpl implements Iface { - composite { - Iface; - } +class Unimpl implements Iface composite Iface { implements { Iface.foo; }