- clean working copy for leaving SVN
This commit is contained in:
@@ -0,0 +1,258 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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");
|
||||
Reference in New Issue
Block a user