|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- #include "../JuceDemoHeader.h"
-
- // these classes are C++11-only
- #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS
-
- struct DemoFlexPanel : public juce::Component
- {
- DemoFlexPanel (juce::Colour col, FlexItem& item) : flexItem (item), colour (col)
- {
- int x = 70;
- int y = 3;
-
- setupTextEditor (flexOrderEditor, { x, y, 20, 18 }, "0", [this] { flexItem.order = (int) flexOrderEditor.getText().getFloatValue(); });
- addLabel ("order", flexOrderEditor);
- y += 20;
-
- setupTextEditor (flexGrowEditor, { x, y, 20, 18 }, "0", [this] { flexItem.flexGrow = flexGrowEditor.getText().getFloatValue(); });
- addLabel ("flex-grow", flexGrowEditor);
- y += 20;
-
- setupTextEditor (flexShrinkEditor, { x, y, 20, 18 }, "1", [this] { flexItem.flexShrink = flexShrinkEditor.getText().getFloatValue(); });
- addLabel ("flex-shrink", flexShrinkEditor);
- y += 20;
-
- setupTextEditor (flexBasisEditor, { x, y, 33, 18 }, "100", [this] { flexItem.flexBasis = flexBasisEditor.getText().getFloatValue(); });
- addLabel ("flex-basis", flexBasisEditor);
- y += 20;
-
- alignSelfCombo.addItem ("auto", 1);
- alignSelfCombo.addItem ("flex-start", 2);
- alignSelfCombo.addItem ("flex-end", 3);
- alignSelfCombo.addItem ("center", 4);
- alignSelfCombo.addItem ("stretch", 5);
-
- alignSelfCombo.setBounds (x, y, 90, 18);
- alignSelfCombo.onChange = [this] { updateAssignSelf(); };
- alignSelfCombo.setSelectedId (5);
- alignSelfCombo.setColour (ComboBox::outlineColourId, Colours::transparentBlack);
- addAndMakeVisible (alignSelfCombo);
- addLabel ("align-self", alignSelfCombo);
- }
-
- void setupTextEditor (TextEditor& te, Rectangle<int> b, StringRef initialText, std::function<void()> updateFn)
- {
- te.setBounds (b);
- te.setText (initialText);
-
- te.onTextChange = [this, updateFn]
- {
- updateFn();
- refreshLayout();
- };
-
- addAndMakeVisible (te);
- }
-
- void addLabel (const String& name, Component& target)
- {
- auto label = new Label (name, name);
- label->attachToComponent (&target, true);
- labels.add (label);
- addAndMakeVisible (label);
- }
-
- void updateAssignSelf()
- {
- switch (alignSelfCombo.getSelectedId())
- {
- case 1: flexItem.alignSelf = FlexItem::AlignSelf::autoAlign; break;
- case 2: flexItem.alignSelf = FlexItem::AlignSelf::flexStart; break;
- case 3: flexItem.alignSelf = FlexItem::AlignSelf::flexEnd; break;
- case 4: flexItem.alignSelf = FlexItem::AlignSelf::center; break;
- case 5: flexItem.alignSelf = FlexItem::AlignSelf::stretch; break;
- }
-
- refreshLayout();
- }
-
- void refreshLayout()
- {
- if (auto parent = getParentComponent())
- parent->resized();
- }
-
- void paint (Graphics& g) override
- {
- auto r = getLocalBounds();
-
- g.setColour (colour);
- g.fillRect (r);
-
- g.setColour (Colours::black);
- g.drawFittedText ("w: " + String (r.getWidth()) + newLine + "h: " + String (r.getHeight()),
- r.reduced (4), Justification::bottomRight, 2);
- }
-
- void lookAndFeelChanged() override
- {
- flexOrderEditor.applyFontToAllText (flexOrderEditor.getFont());
- flexGrowEditor.applyFontToAllText (flexGrowEditor.getFont());
- flexShrinkEditor.applyFontToAllText (flexShrinkEditor.getFont());
- flexBasisEditor.applyFontToAllText (flexBasisEditor.getFont());
- }
-
- FlexItem& flexItem;
-
- TextEditor flexOrderEditor, flexGrowEditor, flexShrinkEditor, flexBasisEditor;
- ComboBox alignSelfCombo;
-
- juce::Colour colour;
- OwnedArray<Label> labels;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DemoFlexPanel)
-
- };
-
- //==============================================================================
- struct FlexBoxDemo : public juce::Component
- {
- FlexBoxDemo()
- {
- setupPropertiesPanel();
- setupFlexBoxItems();
- }
-
- void resized() override
- {
- flexBox.performLayout (getFlexBoxBounds());
- }
-
- Rectangle<float> getFlexBoxBounds() const
- {
- return getLocalBounds().withTrimmedLeft (300)
- .reduced (10)
- .toFloat();
- }
-
- void paint (Graphics& g) override
- {
- g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground,
- Colours::lightgrey));
- g.setColour (Colours::white);
- g.fillRect (getFlexBoxBounds());
- }
-
- void setupPropertiesPanel()
- {
- auto directionGroup = addControl (new GroupComponent ("direction", "flex-direction"));
- directionGroup->setBounds (10, 30, 140, 110);
-
- int i = 0;
- int groupID = 1234;
- int leftMargin = 15;
- int topMargin = 45;
-
- createToggleButton ("row", groupID, leftMargin, topMargin + i++ * 22, true, [this] { flexBox.flexDirection = FlexBox::Direction::row; }).setToggleState (true, dontSendNotification);
- createToggleButton ("row-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.flexDirection = FlexBox::Direction::rowReverse; });
- createToggleButton ("column", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.flexDirection = FlexBox::Direction::column; });
- createToggleButton ("column-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.flexDirection = FlexBox::Direction::columnReverse; });
-
- auto wrapGroup = addControl (new GroupComponent ("wrap", "flex-wrap"));
- wrapGroup->setBounds (160, 30, 140, 110);
-
- i = 0;
- ++groupID;
- leftMargin = 165;
-
- createToggleButton ("nowrap", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.flexWrap = FlexBox::Wrap::noWrap; });
- createToggleButton ("wrap", groupID, leftMargin, topMargin + i++ * 22, true, [this] { flexBox.flexWrap = FlexBox::Wrap::wrap; });
- createToggleButton ("wrap-reverse", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.flexWrap = FlexBox::Wrap::wrapReverse; });
-
- auto justifyGroup = addControl (new GroupComponent ("justify", "justify-content"));
- justifyGroup->setBounds (10, 150, 140, 140);
-
- i = 0;
- ++groupID;
- leftMargin = 15;
- topMargin = 165;
-
- createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, true, [this] { flexBox.justifyContent = FlexBox::JustifyContent::flexStart; });
- createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.justifyContent = FlexBox::JustifyContent::flexEnd; });
- createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.justifyContent = FlexBox::JustifyContent::center; });
- createToggleButton ("space-between", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.justifyContent = FlexBox::JustifyContent::spaceBetween; });
- createToggleButton ("space-around", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.justifyContent = FlexBox::JustifyContent::spaceAround; });
-
- auto alignGroup = addControl (new GroupComponent ("align", "align-items"));
- alignGroup->setBounds (160, 150, 140, 140);
-
- i = 0;
- ++groupID;
- leftMargin = 165;
- topMargin = 165;
-
- createToggleButton ("stretch", groupID, leftMargin, topMargin + i++ * 22, true, [this] { flexBox.alignItems = FlexBox::AlignItems::stretch; });
- createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignItems = FlexBox::AlignItems::flexStart; });
- createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignItems = FlexBox::AlignItems::flexEnd; });
- createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignItems = FlexBox::AlignItems::center; });
-
- auto alignContentGroup = addControl (new GroupComponent ("content", "align-content"));
- alignContentGroup->setBounds (10, 300, 140, 160);
-
- i = 0;
- ++groupID;
- leftMargin = 15;
- topMargin = 315;
-
- createToggleButton ("stretch", groupID, leftMargin, topMargin + i++ * 22, true, [this] { flexBox.alignContent = FlexBox::AlignContent::stretch; });
- createToggleButton ("flex-start", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignContent = FlexBox::AlignContent::flexStart; });
- createToggleButton ("flex-end", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignContent = FlexBox::AlignContent::flexEnd; });
- createToggleButton ("center", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignContent = FlexBox::AlignContent::center; });
- createToggleButton ("space-between", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignContent = FlexBox::AlignContent::spaceBetween; });
- createToggleButton ("space-around", groupID, leftMargin, topMargin + i++ * 22, false, [this] { flexBox.alignContent = FlexBox::AlignContent::spaceAround; });
- }
-
- void setupFlexBoxItems()
- {
- addItem (Colours::orange);
- addItem (Colours::aqua);
- addItem (Colours::lightcoral);
- addItem (Colours::aquamarine);
- addItem (Colours::forestgreen);
- }
-
- void addItem (Colour colour)
- {
- flexBox.items.add (FlexItem (100, 150)
- .withMargin (10)
- .withWidth (200));
-
- auto& flexItem = flexBox.items.getReference (flexBox.items.size() - 1);
-
- auto panel = panels.add (new DemoFlexPanel (colour, flexItem));
- flexItem.associatedComponent = panel;
- addAndMakeVisible (panel);
- }
-
- ToggleButton& createToggleButton (StringRef text, int groupID, int x, int y, bool toggleOn, std::function<void()> fn)
- {
- auto* tb = buttons.add (new ToggleButton());
- tb->setButtonText (text);
- tb->setRadioGroupId (groupID);
- tb->setToggleState (toggleOn, dontSendNotification);
-
- tb->onClick = [this, fn]
- {
- fn();
- resized();
- };
-
- tb->setBounds (x, y, 130, 22);
- addAndMakeVisible (tb);
- return *tb;
- }
-
- template <typename ComponentType>
- ComponentType* addControl (ComponentType* newControlComp)
- {
- controls.add (newControlComp);
- addAndMakeVisible (newControlComp);
- return newControlComp;
- }
-
- FlexBox flexBox;
-
- OwnedArray<DemoFlexPanel> panels;
- OwnedArray<Component> controls;
- OwnedArray<ToggleButton> buttons;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlexBoxDemo)
- };
-
-
- // This static object will register this demo type in a global list of demos..
- static JuceDemoType<FlexBoxDemo> demo ("10 Components: FlexBox");
-
- #endif
|