diff --git a/haxe/ui/components/Button.hx b/haxe/ui/components/Button.hx index 8bbb17a86..780068539 100644 --- a/haxe/ui/components/Button.hx +++ b/haxe/ui/components/Button.hx @@ -8,6 +8,7 @@ import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.constants.Priority; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.ItemRenderer; import haxe.ui.core.Screen; @@ -65,7 +66,7 @@ import haxe.ui.util.Variant; @:dox(icon = "ui-button.png") @:composite(ButtonEvents, ButtonBuilder, ButtonLayout) -class Button extends InteractiveComponent { +class Button extends InteractiveComponent implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Styles //*********************************************************************************************************** diff --git a/haxe/ui/components/CheckBox.hx b/haxe/ui/components/CheckBox.hx index 2fb4d72c9..8b1a0c68d 100644 --- a/haxe/ui/components/CheckBox.hx +++ b/haxe/ui/components/CheckBox.hx @@ -4,6 +4,7 @@ import haxe.ui.actions.ActionType; import haxe.ui.behaviours.DataBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.events.ActionEvent; import haxe.ui.events.Events; @@ -17,7 +18,7 @@ import haxe.ui.styles.Style; * A basic checkbox component. */ @:composite(Events, CheckBoxBuilder, CheckBoxLayout) -class CheckBox extends InteractiveComponent { +class CheckBox extends InteractiveComponent implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Public API //*********************************************************************************************************** diff --git a/haxe/ui/components/NumberStepper.hx b/haxe/ui/components/NumberStepper.hx index 76e9b57ef..37220eb75 100644 --- a/haxe/ui/components/NumberStepper.hx +++ b/haxe/ui/components/NumberStepper.hx @@ -7,6 +7,7 @@ import haxe.ui.components.Button; import haxe.ui.components.TextField; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.events.ActionEvent; import haxe.ui.events.FocusEvent; @@ -24,7 +25,7 @@ import haxe.ui.util.Timer; * visual arrow buttons, arrow keys or just by typing in the stepper's text field. */ @:composite(Events, Builder) -class NumberStepper extends InteractiveComponent { +class NumberStepper extends InteractiveComponent implements ICompositeInteractiveComponent { /** * The actual value of the number stepper. diff --git a/haxe/ui/components/OptionStepper.hx b/haxe/ui/components/OptionStepper.hx index 37e9398ea..9ecea5625 100644 --- a/haxe/ui/components/OptionStepper.hx +++ b/haxe/ui/components/OptionStepper.hx @@ -7,6 +7,7 @@ import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.components.Label; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IDataComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.data.DataSource; @@ -23,7 +24,7 @@ import haxe.ui.util.Variant; * A stepper that allows the user to switch between items using the visual arrow buttons/arrow keys. */ @:composite(Events, Builder, Layout) -class OptionStepper extends InteractiveComponent implements IDataComponent { +class OptionStepper extends InteractiveComponent implements IDataComponent implements ICompositeInteractiveComponent { /** * The index of the currently selected option. diff --git a/haxe/ui/components/Range.hx b/haxe/ui/components/Range.hx index 9453ea6ba..6c71ebca4 100644 --- a/haxe/ui/components/Range.hx +++ b/haxe/ui/components/Range.hx @@ -5,6 +5,7 @@ import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.behaviours.InvalidatingBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IDirectionalComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.Screen; @@ -19,7 +20,7 @@ import haxe.ui.util.Variant; * A range bar component, that starts from `min` and ends at `max`, defaults to 0-100. */ @:composite(RangeBuilder) -class Range extends InteractiveComponent implements IDirectionalComponent { +class Range extends InteractiveComponent implements IDirectionalComponent implements ICompositeInteractiveComponent { /** * Creates a new range bar. diff --git a/haxe/ui/components/Scroll.hx b/haxe/ui/components/Scroll.hx index 1e94780d4..a6a92c23a 100644 --- a/haxe/ui/components/Scroll.hx +++ b/haxe/ui/components/Scroll.hx @@ -1,21 +1,22 @@ package haxe.ui.components; -import haxe.ui.events.Events; -import haxe.ui.events.ScrollEvent; -import haxe.ui.util.Variant; import haxe.ui.behaviours.DataBehaviour; import haxe.ui.behaviours.DefaultBehaviour; +import haxe.ui.behaviours.LayoutBehaviour; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IDirectionalComponent; import haxe.ui.core.InteractiveComponent; -import haxe.ui.behaviours.LayoutBehaviour; +import haxe.ui.events.Events; import haxe.ui.events.MouseEvent; +import haxe.ui.events.ScrollEvent; import haxe.ui.events.UIEvent; import haxe.ui.geom.Point; +import haxe.ui.util.Variant; /** * A scrollbar component, like the ones you see in a browser. */ -class Scroll extends InteractiveComponent implements IDirectionalComponent { +class Scroll extends InteractiveComponent implements IDirectionalComponent implements ICompositeInteractiveComponent { /** * Creates a new scrollbar. diff --git a/haxe/ui/components/Slider.hx b/haxe/ui/components/Slider.hx index 0512b687d..a702a54e5 100644 --- a/haxe/ui/components/Slider.hx +++ b/haxe/ui/components/Slider.hx @@ -7,24 +7,25 @@ import haxe.ui.behaviours.DataBehaviour; import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IDirectionalComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.Screen; import haxe.ui.events.ActionEvent; import haxe.ui.events.DragEvent; +import haxe.ui.events.DragEvent; import haxe.ui.events.Events; import haxe.ui.events.MouseEvent; import haxe.ui.events.UIEvent; import haxe.ui.geom.Point; import haxe.ui.util.MathUtil; import haxe.ui.util.Variant; -import haxe.ui.events.DragEvent; /** * A slider component, containing a thumb and a track to move the thumb along. */ @:composite(SliderBuilder) -class Slider extends InteractiveComponent implements IDirectionalComponent { +class Slider extends InteractiveComponent implements IDirectionalComponent implements ICompositeInteractiveComponent { /** * Creates a new Slider. diff --git a/haxe/ui/components/Switch.hx b/haxe/ui/components/Switch.hx index aba14d1fb..527ebcf25 100644 --- a/haxe/ui/components/Switch.hx +++ b/haxe/ui/components/Switch.hx @@ -4,6 +4,7 @@ import haxe.ui.behaviours.DataBehaviour; import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IValueComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.events.UIEvent; @@ -15,7 +16,7 @@ import haxe.ui.util.Variant; * A switch component that can be used to toggle between two states. */ @:composite(Builder, HorizontalLayout) -class Switch extends Component implements IValueComponent { +class Switch extends Component implements IValueComponent implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Public API //*********************************************************************************************************** diff --git a/haxe/ui/components/TabBar.hx b/haxe/ui/components/TabBar.hx index a4480633e..3f0b1a28b 100644 --- a/haxe/ui/components/TabBar.hx +++ b/haxe/ui/components/TabBar.hx @@ -8,6 +8,7 @@ import haxe.ui.containers.Box; import haxe.ui.containers.HBox; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.events.Events; import haxe.ui.events.MouseEvent; import haxe.ui.events.UIEvent; @@ -17,7 +18,7 @@ import haxe.ui.styles.Style; import haxe.ui.util.Variant; @:composite(Builder, Events, TabBarLayout) -class TabBar extends Component { +class TabBar extends Component implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Public API //*********************************************************************************************************** diff --git a/haxe/ui/components/TextArea.hx b/haxe/ui/components/TextArea.hx index c19682cc2..e9c7fbc5f 100644 --- a/haxe/ui/components/TextArea.hx +++ b/haxe/ui/components/TextArea.hx @@ -5,6 +5,7 @@ import haxe.ui.behaviours.DataBehaviour; import haxe.ui.behaviours.DefaultBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.TextInput; import haxe.ui.data.ArrayDataSource; @@ -21,7 +22,7 @@ import haxe.ui.util.Variant; import haxe.ui.validation.InvalidationFlags; @:composite(Events, TextAreaBuilder, TextAreaLayout) -class TextArea extends InteractiveComponent implements IFocusable { +class TextArea extends InteractiveComponent implements IFocusable implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Styles //*********************************************************************************************************** diff --git a/haxe/ui/components/TextField.hx b/haxe/ui/components/TextField.hx index 020157f47..276f07419 100644 --- a/haxe/ui/components/TextField.hx +++ b/haxe/ui/components/TextField.hx @@ -4,6 +4,7 @@ import haxe.ui.behaviours.DataBehaviour; import haxe.ui.behaviours.ValueBehaviour; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.Platform; import haxe.ui.events.Events; @@ -21,7 +22,7 @@ import haxe.ui.util.Variant; * A single line text input box. for multiline text input use `TextArea`. */ @:composite(Events, Builder, TextFieldLayout) -class TextField extends InteractiveComponent { +class TextField extends InteractiveComponent implements ICompositeInteractiveComponent { //*********************************************************************************************************** // Public API //*********************************************************************************************************** diff --git a/haxe/ui/components/pickers/ItemPicker.hx b/haxe/ui/components/pickers/ItemPicker.hx index 7736b4585..bf75e27b7 100644 --- a/haxe/ui/components/pickers/ItemPicker.hx +++ b/haxe/ui/components/pickers/ItemPicker.hx @@ -6,6 +6,7 @@ import haxe.ui.containers.HBox; import haxe.ui.core.BasicItemRenderer; import haxe.ui.core.Component; import haxe.ui.core.CompositeBuilder; +import haxe.ui.core.ICompositeInteractiveComponent; import haxe.ui.core.IDataComponent; import haxe.ui.core.InteractiveComponent; import haxe.ui.core.ItemRenderer; @@ -18,7 +19,7 @@ import haxe.ui.geom.Size; import haxe.ui.layouts.DefaultLayout; @:composite(ItemPickerBuilder, Layout) -class ItemPicker extends InteractiveComponent implements IDataComponent { +class ItemPicker extends InteractiveComponent implements IDataComponent implements ICompositeInteractiveComponent { public var selectionType = "dropPanel"; public var panelPosition = "auto"; public var panelOrigin = "auto"; diff --git a/haxe/ui/core/Component.hx b/haxe/ui/core/Component.hx index eb6e349bb..015274653 100644 --- a/haxe/ui/core/Component.hx +++ b/haxe/ui/core/Component.hx @@ -817,19 +817,27 @@ class Component extends ComponentImpl match = false; } + // bit of a special case here: if we are looking for interactive components + // we DONT want to include all the interactives that are built out of other + // interactives, for example, as number stepper has buttons and a textfield, + // none of which we want when looking for interactives, we would expect just + // the number stepper + var continueRecursion = true; + if ((child is ICompositeInteractiveComponent) && type == cast InteractiveComponent) { + continueRecursion = false; + } + if (match == true) { r.push(cast child); - var childArray = child.findComponents(styleName, type, maxDepth); - for (c in childArray) { // r.concat caused issues here on hxcpp - r.push(c); - } - } else { + } + + if (continueRecursion) { var childArray = child.findComponents(styleName, type, maxDepth); for (c in childArray) { // r.concat caused issues here on hxcpp r.push(c); } } - } + } return r; } diff --git a/haxe/ui/core/ICompositeInteractiveComponent.hx b/haxe/ui/core/ICompositeInteractiveComponent.hx new file mode 100644 index 000000000..49cb36e33 --- /dev/null +++ b/haxe/ui/core/ICompositeInteractiveComponent.hx @@ -0,0 +1,10 @@ +package haxe.ui.core; + +// Lets haxeui know that this interactive components is built out of other +// sub interactive components. This is useful to know for things like +// findComponents(InteractiveComponent) where you DO NOT want to find +// all of the sub interactive components, you just want the top level +// interactive component +interface ICompositeInteractiveComponent { + +} \ No newline at end of file