76 std::vector<Component*> components;
81 auto removePredicate = [parentComponent] (
const Component*
comp)
86 components.erase (std::remove_if (std::begin (components), std::end (components), std::move (removePredicate)),
87 std::end (components));
97struct KeyboardFocusTraverserTests :
public UnitTest
99 KeyboardFocusTraverserTests()
103 void runTest()
override
105 ScopedJuceInitialiser_GUI libraryInitialiser;
106 const MessageManagerLock mml;
108 beginTest (
"No child wants keyboard focus");
112 expect (traverser.getDefaultComponent (&
parent) ==
nullptr);
113 expect (traverser.getAllComponents (&
parent).empty());
116 beginTest (
"Single child wants keyboard focus");
120 parent.children[5].setWantsKeyboardFocus (
true);
122 auto* defaultComponent = traverser.getDefaultComponent (&
parent);
124 expect (defaultComponent == &
parent.children[5]);
125 expect (defaultComponent->getWantsKeyboardFocus());
127 expect (traverser.getNextComponent (defaultComponent) ==
nullptr);
128 expect (traverser.getPreviousComponent (defaultComponent) ==
nullptr);
129 expect (traverser.getAllComponents (&
parent).size() == 1);
132 beginTest (
"Multiple children want keyboard focus");
136 Component* focusChildren[]
146 for (
auto* focusChild : focusChildren)
147 focusChild->setWantsKeyboardFocus (
true);
149 auto allComponents = traverser.getAllComponents (&
parent);
151 for (
auto* focusChild : focusChildren)
152 expect (std::find (allComponents.cbegin(), allComponents.cend(), focusChild) != allComponents.cend());
154 auto* componentToTest = traverser.getDefaultComponent (&
parent);
158 expect (componentToTest->getWantsKeyboardFocus());
159 expect (std::find (std::begin (focusChildren), std::end (focusChildren), componentToTest) != std::end (focusChildren));
161 componentToTest = traverser.getNextComponent (componentToTest);
163 if (componentToTest ==
nullptr)
168 for (
auto* focusChild : focusChildren)
169 focusChild->setExplicitFocusOrder (focusOrder++);
171 componentToTest = traverser.getDefaultComponent (&
parent);
173 for (
auto* focusChild : focusChildren)
175 expect (componentToTest == focusChild);
176 expect (componentToTest->getWantsKeyboardFocus());
178 componentToTest = traverser.getNextComponent (componentToTest);
182 beginTest (
"Single nested child wants keyboard focus");
185 Component grandparent;
187 grandparent.addAndMakeVisible (
parent);
189 auto& focusChild =
parent.children[5];
191 focusChild.setWantsKeyboardFocus (
true);
193 expect (traverser.getDefaultComponent (&grandparent) == &focusChild);
194 expect (traverser.getDefaultComponent (&
parent) == &focusChild);
195 expect (traverser.getNextComponent (&focusChild) ==
nullptr);
196 expect (traverser.getPreviousComponent (&focusChild) ==
nullptr);
197 expect (traverser.getAllComponents (&
parent).size() == 1);
200 beginTest (
"Multiple nested children want keyboard focus");
203 Component grandparent;
205 grandparent.addAndMakeVisible (
parent);
207 Component* focusChildren[]
214 for (
auto* focusChild : focusChildren)
215 focusChild->setWantsKeyboardFocus (
true);
217 auto allComponents = traverser.getAllComponents (&
parent);
219 expect (std::equal (allComponents.cbegin(), allComponents.cend(), focusChildren,
220 [] (
const Component* c1,
const Component*
c2) { return c1 == c2; }));
222 const auto front = *focusChildren;
223 const auto back = *std::prev (std::end (focusChildren));
225 expect (traverser.getDefaultComponent (&grandparent) == front);
226 expect (traverser.getDefaultComponent (&
parent) == front);
227 expect (traverser.getNextComponent (front) == *std::next (std::begin (focusChildren)));
228 expect (traverser.getPreviousComponent (back) == *std::prev (std::end (focusChildren), 2));
230 std::array<Component, 3> otherParents;
232 for (
auto&
p : otherParents)
234 grandparent.addAndMakeVisible (
p);
235 p.setWantsKeyboardFocus (
true);
238 expect (traverser.getDefaultComponent (&grandparent) == front);
239 expect (traverser.getDefaultComponent (&
parent) == front);
240 expect (traverser.getNextComponent (back) == &otherParents.front());
241 expect (traverser.getNextComponent (&otherParents.back()) ==
nullptr);
242 expect (traverser.getAllComponents (&grandparent).size() ==
numElementsInArray (focusChildren) + otherParents.size());
245 for (
auto* focusChild : focusChildren)
246 focusChild->setWantsKeyboardFocus (
false);
248 expect (traverser.getDefaultComponent (&grandparent) == &otherParents.front());
249 expect (traverser.getDefaultComponent (&
parent) ==
nullptr);
250 expect (traverser.getAllComponents (&grandparent).size() == otherParents.size());
251 expect (traverser.getAllComponents (&
parent).empty());
256 struct TestComponent :
public Component
260 for (
auto& child : children)
261 addAndMakeVisible (child);
264 std::array<Component, 10> children;
267 KeyboardFocusTraverser traverser;
270static KeyboardFocusTraverserTests keyboardFocusTraverserTests;
Definition juce_Component.h:36
bool isKeyboardFocusContainer() const noexcept
Definition juce_Component.cpp:2875
bool isParentOf(const Component *possibleChild) const noexcept
Definition juce_Component.cpp:1677
Component * findKeyboardFocusContainer() const
Definition juce_Component.cpp:2899
Component * getPreviousComponent(Component *current) override
Definition juce_KeyboardFocusTraverser.cpp:59
std::vector< Component * > getAllComponents(Component *parentComponent) override
Definition juce_KeyboardFocusTraverser.cpp:74
Component * getNextComponent(Component *current) override
Definition juce_KeyboardFocusTraverser.cpp:53
Component * getDefaultComponent(Component *parentComponent) override
Definition juce_KeyboardFocusTraverser.cpp:65
Definition juce_UnitTest.h:70
static void c2(register WDL_FFT_COMPLEX *a)
Definition fft.c:270
static uintptr_t parent
Definition pugl.h:1644
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
NavigationDirection
Definition juce_FocusTraverser.cpp:77
@ backwards
Definition juce_FocusTraverser.cpp:77
@ forwards
Definition juce_FocusTraverser.cpp:77
static Component * navigateFocus(Component *current, Component *focusContainer, NavigationDirection direction, FocusContainerFn isFocusContainer)
Definition juce_FocusTraverser.cpp:80
static void findAllComponents(Component *parent, std::vector< Component * > &components, FocusContainerFn isFocusContainer)
Definition juce_FocusTraverser.cpp:38
Definition juce_KeyboardFocusTraverser.cpp:31
static bool isKeyboardFocusable(const Component *comp, const Component *container)
Definition juce_KeyboardFocusTraverser.cpp:32
static Component * traverse(Component *current, Component *container, FocusHelpers::NavigationDirection direction)
Definition juce_KeyboardFocusTraverser.cpp:37
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
constexpr int numElementsInArray(Type(&)[N]) noexcept
Definition juce_MathsFunctions.h:344
GUI::ui_handle_t gui
Definition main.cpp:50
uch * p
Definition crypt.c:594