|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_STRETCHABLEOBJECTRESIZER_H_INCLUDED
- #define JUCE_STRETCHABLEOBJECTRESIZER_H_INCLUDED
-
-
- //==============================================================================
- /**
- A utility class for fitting a set of objects whose sizes can vary between
- a minimum and maximum size, into a space.
-
- This is a trickier algorithm than it would first seem, so I've put it in this
- class to allow it to be shared by various bits of code.
-
- To use it, create one of these objects, call addItem() to add the list of items
- you need, then call resizeToFit(), which will change all their sizes. You can
- then retrieve the new sizes with getItemSize() and getNumItems().
-
- It's currently used by the TableHeaderComponent for stretching out the table
- headings to fill the table's width.
- */
- class StretchableObjectResizer
- {
- public:
- //==============================================================================
- /** Creates an empty object resizer. */
- StretchableObjectResizer();
-
- /** Destructor. */
- ~StretchableObjectResizer();
-
- //==============================================================================
- /** Adds an item to the list.
-
- The order parameter lets you specify groups of items that are resized first when some
- space needs to be found. Those items with an order of 0 will be the first ones to be
- resized, and if that doesn't provide enough space to meet the requirements, the algorithm
- will then try resizing the items with an order of 1, then 2, and so on.
- */
- void addItem (double currentSize,
- double minSize,
- double maxSize,
- int order = 0);
-
- /** Resizes all the items to fit this amount of space.
-
- This will attempt to fit them in without exceeding each item's miniumum and
- maximum sizes. In cases where none of the items can be expanded or enlarged any
- further, the final size may be greater or less than the size passed in.
-
- After calling this method, you can retrieve the new sizes with the getItemSize()
- method.
- */
- void resizeToFit (double targetSize);
-
- /** Returns the number of items that have been added. */
- int getNumItems() const noexcept { return items.size(); }
-
- /** Returns the size of one of the items. */
- double getItemSize (int index) const noexcept;
-
-
- private:
- //==============================================================================
- struct Item
- {
- double size;
- double minSize;
- double maxSize;
- int order;
- };
-
- Array<Item> items;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StretchableObjectResizer)
- };
-
-
- #endif // JUCE_STRETCHABLEOBJECTRESIZER_H_INCLUDED
|