|
- /*
- ==============================================================================
-
- This file is part of the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2004-12 by Raw Material Software Ltd.
-
- ------------------------------------------------------------------------------
-
- JUCE can be redistributed and/or modified under the terms of the GNU General
- Public License (Version 2), as published by the Free Software Foundation.
- A copy of the license is included in the JUCE distribution, or can be found
- online 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.rawmaterialsoftware.com/juce for more information.
-
- ==============================================================================
- */
-
- #include "../JuceDemoHeader.h"
-
-
- //==============================================================================
- class FontsDemo : public Component,
- private ListBoxModel,
- private Slider::Listener,
- private Button::Listener,
- private ComboBox::Listener
- {
- public:
- FontsDemo()
- : heightLabel (String::empty, "Height:"),
- kerningLabel (String::empty, "Kerning:"),
- scaleLabel (String::empty, "Scale:"),
- styleLabel ("Style"),
- boldToggle ("Bold"),
- italicToggle ("Italic")
- {
- setOpaque (true);
-
- addAndMakeVisible (listBox);
- addAndMakeVisible (demoTextBox);
- addAndMakeVisible (heightSlider);
- addAndMakeVisible (heightLabel);
- addAndMakeVisible (kerningLabel);
- addAndMakeVisible (kerningSlider);
- addAndMakeVisible (scaleLabel);
- addAndMakeVisible (scaleSlider);
- addAndMakeVisible (boldToggle);
- addAndMakeVisible (italicToggle);
- addAndMakeVisible (styleBox);
-
- kerningLabel.attachToComponent (&kerningSlider, true);
- heightLabel.attachToComponent (&heightSlider, true);
- scaleLabel.attachToComponent (&scaleSlider, true);
- styleLabel.attachToComponent (&styleBox, true);
-
- heightSlider.addListener (this);
- kerningSlider.addListener (this);
- scaleSlider.addListener (this);
- boldToggle.addListener (this);
- italicToggle.addListener (this);
- styleBox.addListener (this);
-
- Font::findFonts (fonts); // Generate the list of fonts
-
- listBox.setRowHeight (20);
- listBox.setModel (this); // Tell the listbox where to get its data model
-
- heightSlider.setRange (3.0, 150.0, 0.01);
- scaleSlider.setRange (0.2, 3.0, 0.01);
- kerningSlider.setRange (-2.0, 2.0, 0.01);
-
- scaleSlider.setValue (1.0); // Set some initial values for the sliders.
- heightSlider.setValue (20.0);
- kerningSlider.setValue (0);
-
- // set up the layout and resizer bars..
- verticalLayout.setItemLayout (0, -0.2, -0.8, -0.35); // width of the font list must be
- // between 20% and 80%, preferably 50%
- verticalLayout.setItemLayout (1, 8, 8, 8); // the vertical divider drag-bar thing is always 8 pixels wide
- verticalLayout.setItemLayout (2, 150, -1.0, -0.65); // the components on the right must be
- // at least 150 pixels wide, preferably 50% of the total width
-
- verticalDividerBar = new StretchableLayoutResizerBar (&verticalLayout, 1, true);
- addAndMakeVisible (verticalDividerBar);
-
- // ..and pick a random font to select intially
- listBox.selectRow (Random::getSystemRandom().nextInt (fonts.size()));
-
- demoTextBox.setMultiLine (true);
- demoTextBox.setReturnKeyStartsNewLine (true);
- demoTextBox.setText ("Aa Bb Cc Dd Ee Ff Gg Hh Ii\n"
- "Jj Kk Ll Mm Nn Oo Pp Qq Rr\n"
- "Ss Tt Uu Vv Ww Xx Yy Zz\n"
- "0123456789\n\n"
- "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt "
- "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco "
- "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in "
- "voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
- "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
-
- demoTextBox.setCaretPosition (0);
- }
-
- //==============================================================================
- void paint (Graphics& g)
- {
- fillTiledBackground (g);
- }
-
- void resized()
- {
- Rectangle<int> r (getLocalBounds().reduced (5));
-
- // lay out the list box and vertical divider..
- Component* vcomps[] = { &listBox, verticalDividerBar, nullptr };
-
- verticalLayout.layOutComponents (vcomps, 3,
- r.getX(), r.getY(), r.getWidth(), r.getHeight(),
- false, // lay out side-by-side
- true); // resize the components' heights as well as widths
-
-
- r.removeFromLeft (verticalDividerBar->getRight());
-
- styleBox.setBounds (r.removeFromBottom (26));
- r.removeFromBottom (8);
-
- const int labelWidth = 60;
-
- Rectangle<int> row (r.removeFromBottom (30));
- row.removeFromLeft (labelWidth);
- boldToggle.setBounds (row.removeFromLeft (row.getWidth() / 2));
- italicToggle.setBounds (row);
-
- r.removeFromBottom (8);
- scaleSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
- r.removeFromBottom (8);
- kerningSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
- r.removeFromBottom (8);
- heightSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
- r.removeFromBottom (8);
- demoTextBox.setBounds (r);
- }
-
- void sliderValueChanged (Slider* sliderThatWasMoved)
- {
- if (sliderThatWasMoved == &heightSlider) refreshPreviewBoxFont();
- else if (sliderThatWasMoved == &kerningSlider) refreshPreviewBoxFont();
- else if (sliderThatWasMoved == &scaleSlider) refreshPreviewBoxFont();
- }
-
- void buttonClicked (Button* buttonThatWasClicked)
- {
- if (buttonThatWasClicked == &boldToggle) refreshPreviewBoxFont();
- else if (buttonThatWasClicked == &italicToggle) refreshPreviewBoxFont();
- }
-
- // The following methods implement the ListBoxModel virtual methods:
- int getNumRows()
- {
- return fonts.size();
- }
-
- void paintListBoxItem (int rowNumber, Graphics& g,
- int width, int height, bool rowIsSelected)
- {
- if (rowIsSelected)
- g.fillAll (Colours::lightblue);
-
- Font font (fonts [rowNumber]);
-
- AttributedString s;
- s.setWordWrap (AttributedString::none);
- s.setJustification (Justification::centredLeft);
- s.append (font.getTypefaceName(), font.withPointHeight (height * 0.7f), Colours::black);
- s.append (" " + font.getTypefaceName(), Font (height * 0.5f, Font::italic), Colours::grey);
-
- s.draw (g, Rectangle<int> (width, height).expanded (-4, 50).toFloat());
- }
-
- void selectedRowsChanged (int /*lastRowselected*/)
- {
- refreshPreviewBoxFont();
- }
-
- private:
- Array<Font> fonts;
- StringArray currentStyleList;
-
- ListBox listBox;
- TextEditor demoTextBox;
- Label heightLabel, kerningLabel, scaleLabel, styleLabel;
- Slider heightSlider, kerningSlider, scaleSlider;
- ToggleButton boldToggle, italicToggle;
- ComboBox styleBox;
-
- StretchableLayoutManager verticalLayout;
- ScopedPointer<StretchableLayoutResizerBar> verticalDividerBar;
-
- void refreshPreviewBoxFont()
- {
- const bool bold = boldToggle.getToggleState();
- const bool italic = italicToggle.getToggleState();
- const bool useStyle = ! (bold || italic);
-
- Font font (fonts [listBox.getSelectedRow()]);
-
- font = font.withPointHeight ((float) heightSlider.getValue())
- .withExtraKerningFactor ((float) kerningSlider.getValue())
- .withHorizontalScale ((float) scaleSlider.getValue());
-
- if (bold) font = font.boldened();
- if (italic) font = font.italicised();
-
- updateStylesList (font);
-
- styleBox.setEnabled (useStyle);
-
- if (useStyle)
- font = font.withTypefaceStyle (styleBox.getText());
-
- demoTextBox.applyFontToAllText (font);
- }
-
- void updateStylesList (const Font& newFont)
- {
- const StringArray newStyles (newFont.getAvailableStyles());
-
- if (newStyles != currentStyleList)
- {
- currentStyleList = newStyles;
-
- styleBox.clear();
- styleBox.addItemList (newStyles, 1);
- styleBox.setSelectedItemIndex (0);
- }
- }
-
- void comboBoxChanged (ComboBox* box) override
- {
- if (box == &styleBox)
- refreshPreviewBoxFont();
- }
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FontsDemo)
- };
-
-
- // This static object will register this demo type in a global list of demos..
- static JuceDemoType<FontsDemo> demo ("20 Graphics: Fonts");
|