diff --git a/extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h b/extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h index bbfa309908..99a1953a31 100644 --- a/extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h +++ b/extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h @@ -54,9 +54,14 @@ public: e->setAttribute ("fontname", l->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::getDefaultFont()).toString()); e->setAttribute ("fontsize", roundToInt (l->getFont().getHeight() * 100.0) / 100.0); + e->setAttribute ("kerning", roundToInt (l->getFont().getExtraKerningFactor() * 1000.0) / 1000.0); e->setAttribute ("bold", l->getFont().isBold()); e->setAttribute ("italic", l->getFont().isItalic()); e->setAttribute ("justification", l->getJustificationType().getFlags()); + if (l->getFont().getTypefaceStyle() != "Regular") + { + e->setAttribute ("typefaceStyle", l->getFont().getTypefaceStyle()); + } return e; } @@ -74,6 +79,11 @@ public: font.setHeight ((float) xml.getDoubleAttribute ("fontsize", 15.0)); font.setBold (xml.getBoolAttribute ("bold", false)); font.setItalic (xml.getBoolAttribute ("italic", false)); + font.setExtraKerningFactor ((float) xml.getDoubleAttribute ("kerning", 0.0)); + auto fontStyle = xml.getStringAttribute ("typefaceStyle"); + if (! fontStyle.isEmpty()) + font.setTypefaceStyle (fontStyle); + l->setFont (font); l->getProperties().set ("typefaceName", xml.getStringAttribute ("fontname", FontPropertyComponent::getDefaultFont())); @@ -162,12 +172,12 @@ public: ComponentTypeHandler::getEditableProperties (component, document, props); Label* const l = dynamic_cast (component); - props.add (new LabelTextProperty (l, document)); - + props.add (new LabelTextProperty (l, document)); props.add (new LabelJustificationProperty (l, document)); - props.add (new FontNameProperty (l, document)); - props.add (new FontSizeProperty (l, document)); - props.add (new FontStyleProperty (l, document)); + props.add (new FontNameProperty (l, document)); + props.add (new FontStyleProperty (l, document)); + props.add (new FontSizeProperty (l, document)); + props.add (new FontKerningProperty (l, document)); addColourProperties (component, document, props); @@ -567,10 +577,7 @@ private: { document.addChangeListener (this); - choices.add ("normal"); - choices.add ("bold"); - choices.add ("italic"); - choices.add ("bold + italic"); + updateStylesList (label->getFont()); } ~FontStyleProperty() @@ -578,12 +585,44 @@ private: document.removeChangeListener (this); } + void updateStylesList (const Font& newFont) + { + if (getNumChildComponents() > 0) + { + if (auto cb = dynamic_cast (getChildComponent (0))) + cb->clear(); + + getChildComponent (0)->setVisible (false); + removeAllChildren(); + } + + choices.clear(); + + choices.add ("Regular"); + choices.add ("Bold"); + choices.add ("Italic"); + choices.add ("Bold Italic"); + + choices.mergeArray (newFont.getAvailableStyles()); + refresh(); + } + void setIndex (int newIndex) { Font f (label->getFont()); - f.setBold (newIndex == 1 || newIndex == 3); - f.setItalic (newIndex == 2 || newIndex == 3); + if (f.getAvailableStyles().contains (choices[newIndex])) + { + f.setBold (false); + f.setItalic (false); + f.setTypefaceStyle (choices[newIndex]); + } + else + { + f.setTypefaceStyle ("Regular"); + f.setBold (newIndex == 1 || newIndex == 3); + f.setItalic (newIndex == 2 || newIndex == 3); + } document.perform (new FontStyleChangeAction (label, *document.getComponentLayout(), f), "Change Label font style"); @@ -591,17 +630,28 @@ private: int getIndex() const { - if (label->getFont().isBold() && label->getFont().isItalic()) - return 3; - else if (label->getFont().isBold()) - return 1; - else if (label->getFont().isItalic()) - return 2; + auto f = label->getFont(); - return 0; + const auto typefaceIndex = choices.indexOf (f.getTypefaceStyle()); + if (typefaceIndex == -1) + { + if (f.isBold() && f.isItalic()) + return 3; + else if (f.isBold()) + return 1; + else if (f.isItalic()) + return 2; + + return 0; + } + + return typefaceIndex; } - void changeListenerCallback (ChangeBroadcaster*) { refresh(); } + void changeListenerCallback (ChangeBroadcaster*) + { + updateStylesList (label->getFont()); + } private: Label* const label; @@ -636,4 +686,78 @@ private: Font newState, oldState; }; }; + + //============================================================================== + class FontKerningProperty : public SliderPropertyComponent, + public ChangeListener + { + public: + FontKerningProperty (Label* const label_, JucerDocument& doc) + : SliderPropertyComponent ("kerning", -0.5, 0.5, 0.001), + label (label_), + document (doc) + { + document.addChangeListener (this); + } + + ~FontKerningProperty() + { + document.removeChangeListener (this); + } + + void setValue (double newValue) + { + document.getUndoManager().undoCurrentTransactionOnly(); + + document.perform (new FontKerningChangeAction (label, *document.getComponentLayout(), (float) newValue), + "Change Label font kerning"); + } + + double getValue() const + { + return label->getFont().getExtraKerningFactor(); + } + + void changeListenerCallback (ChangeBroadcaster*) + { + refresh(); + } + + private: + Label* const label; + JucerDocument& document; + + class FontKerningChangeAction : public ComponentUndoableAction