- clean working copy for leaving SVN
This commit is contained in:
+214
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_COLOURPROPERTYCOMPONENT_JUCEHEADER__
|
||||
#define __JUCER_COLOURPROPERTYCOMPONENT_JUCEHEADER__
|
||||
|
||||
#include "../../Application/jucer_Application.h"
|
||||
|
||||
|
||||
class JucerColourPropertyComponent : public PropertyComponent
|
||||
{
|
||||
public:
|
||||
JucerColourPropertyComponent (const String& name,
|
||||
const bool canReset)
|
||||
: PropertyComponent (name)
|
||||
{
|
||||
colourPropEditor = new ColourPropEditorComponent (this, canReset);
|
||||
addAndMakeVisible (colourPropEditor);
|
||||
}
|
||||
|
||||
virtual void setColour (Colour newColour) = 0;
|
||||
virtual Colour getColour() const = 0;
|
||||
virtual void resetToDefault() = 0;
|
||||
|
||||
void refresh()
|
||||
{
|
||||
((ColourPropEditorComponent*) getChildComponent (0))->refresh();
|
||||
}
|
||||
|
||||
class ColourEditorComponent : public Component,
|
||||
public ChangeListener
|
||||
{
|
||||
public:
|
||||
ColourEditorComponent (const bool canReset)
|
||||
: canResetToDefault (canReset)
|
||||
{
|
||||
}
|
||||
|
||||
void paint (Graphics& g)
|
||||
{
|
||||
g.fillAll (Colours::grey);
|
||||
|
||||
g.fillCheckerBoard (getLocalBounds().reduced (2, 2),
|
||||
10, 10,
|
||||
Colour (0xffdddddd).overlaidWith (colour),
|
||||
Colour (0xffffffff).overlaidWith (colour));
|
||||
|
||||
g.setColour (Colours::white.overlaidWith (colour).contrasting());
|
||||
g.setFont (Font (getHeight() * 0.6f, Font::bold));
|
||||
g.drawFittedText (colour.toDisplayString (true),
|
||||
2, 1, getWidth() - 4, getHeight() - 1,
|
||||
Justification::centred, 1);
|
||||
}
|
||||
|
||||
virtual void setColour (Colour newColour) = 0;
|
||||
virtual void resetToDefault() = 0;
|
||||
virtual Colour getColour() const = 0;
|
||||
|
||||
void refresh()
|
||||
{
|
||||
const Colour col (getColour());
|
||||
|
||||
if (col != colour)
|
||||
{
|
||||
colour = col;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
void mouseDown (const MouseEvent&)
|
||||
{
|
||||
CallOutBox::launchAsynchronously (new ColourSelectorComp (this, canResetToDefault),
|
||||
getScreenBounds(), nullptr);
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster* source)
|
||||
{
|
||||
const ColourSelector* const cs = (const ColourSelector*) source;
|
||||
|
||||
if (cs->getCurrentColour() != getColour())
|
||||
setColour (cs->getCurrentColour());
|
||||
}
|
||||
|
||||
class ColourSelectorComp : public Component,
|
||||
public ButtonListener
|
||||
{
|
||||
public:
|
||||
ColourSelectorComp (ColourEditorComponent* owner_,
|
||||
const bool canReset)
|
||||
: owner (owner_),
|
||||
defaultButton ("Reset to Default")
|
||||
{
|
||||
addAndMakeVisible (selector);
|
||||
selector.setName ("Colour");
|
||||
selector.setCurrentColour (owner->getColour());
|
||||
selector.addChangeListener (owner);
|
||||
|
||||
if (canReset)
|
||||
{
|
||||
addAndMakeVisible (defaultButton);
|
||||
defaultButton.addListener (this);
|
||||
}
|
||||
|
||||
setSize (300, 400);
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
if (defaultButton.isVisible())
|
||||
{
|
||||
selector.setBounds (0, 0, getWidth(), getHeight() - 30);
|
||||
defaultButton.changeWidthToFitText (22);
|
||||
defaultButton.setTopLeftPosition (10, getHeight() - 26);
|
||||
}
|
||||
else
|
||||
{
|
||||
selector.setBounds (getLocalBounds());
|
||||
}
|
||||
}
|
||||
|
||||
void buttonClicked (Button*)
|
||||
{
|
||||
owner->resetToDefault();
|
||||
owner->refresh();
|
||||
selector.setCurrentColour (owner->getColour());
|
||||
}
|
||||
|
||||
private:
|
||||
class ColourSelectorWithSwatches : public ColourSelector
|
||||
{
|
||||
public:
|
||||
ColourSelectorWithSwatches()
|
||||
{
|
||||
}
|
||||
|
||||
int getNumSwatches() const override
|
||||
{
|
||||
return getAppSettings().swatchColours.size();
|
||||
}
|
||||
|
||||
Colour getSwatchColour (int index) const override
|
||||
{
|
||||
return getAppSettings().swatchColours [index];
|
||||
}
|
||||
|
||||
void setSwatchColour (int index, const Colour& newColour) const override
|
||||
{
|
||||
getAppSettings().swatchColours.set (index, newColour);
|
||||
}
|
||||
};
|
||||
|
||||
ColourEditorComponent* owner;
|
||||
ColourSelectorWithSwatches selector;
|
||||
TextButton defaultButton;
|
||||
};
|
||||
|
||||
private:
|
||||
Colour colour;
|
||||
bool canResetToDefault;
|
||||
};
|
||||
|
||||
class ColourPropEditorComponent : public ColourEditorComponent
|
||||
{
|
||||
JucerColourPropertyComponent* const owner;
|
||||
|
||||
public:
|
||||
ColourPropEditorComponent (JucerColourPropertyComponent* const owner_,
|
||||
const bool canReset)
|
||||
: ColourEditorComponent (canReset),
|
||||
owner (owner_)
|
||||
{}
|
||||
|
||||
void setColour (Colour newColour) override
|
||||
{
|
||||
owner->setColour (newColour);
|
||||
}
|
||||
|
||||
Colour getColour() const override
|
||||
{
|
||||
return owner->getColour();
|
||||
}
|
||||
|
||||
void resetToDefault()
|
||||
{
|
||||
owner->resetToDefault();
|
||||
}
|
||||
};
|
||||
|
||||
ScopedPointer<ColourPropEditorComponent> colourPropEditor;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_COLOURPROPERTYCOMPONENT_JUCEHEADER__
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_COMPONENTBOOLEANPROPERTY_JUCEHEADER__
|
||||
#define __JUCER_COMPONENTBOOLEANPROPERTY_JUCEHEADER__
|
||||
|
||||
|
||||
template <class ComponentType>
|
||||
class ComponentBooleanProperty : public BooleanPropertyComponent,
|
||||
private ChangeListener
|
||||
{
|
||||
public:
|
||||
ComponentBooleanProperty (const String& name,
|
||||
const String& onText_,
|
||||
const String& offText_,
|
||||
ComponentType* comp,
|
||||
JucerDocument& doc)
|
||||
: BooleanPropertyComponent (name, onText_, offText_),
|
||||
component (comp),
|
||||
document (doc)
|
||||
{
|
||||
document.addChangeListener (this);
|
||||
}
|
||||
|
||||
~ComponentBooleanProperty()
|
||||
{
|
||||
document.removeChangeListener (this);
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
protected:
|
||||
ComponentType* component;
|
||||
JucerDocument& document;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_COMPONENTBOOLEANPROPERTY_JUCEHEADER__
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_COMPONENTCHOICEPROPERTY_JUCEHEADER__
|
||||
#define __JUCER_COMPONENTCHOICEPROPERTY_JUCEHEADER__
|
||||
|
||||
|
||||
template <class ComponentType>
|
||||
class ComponentChoiceProperty : public ChoicePropertyComponent,
|
||||
private ChangeListener
|
||||
{
|
||||
public:
|
||||
ComponentChoiceProperty (const String& name,
|
||||
ComponentType* comp,
|
||||
JucerDocument& doc)
|
||||
: ChoicePropertyComponent (name),
|
||||
component (comp),
|
||||
document (doc)
|
||||
{
|
||||
document.addChangeListener (this);
|
||||
}
|
||||
|
||||
~ComponentChoiceProperty()
|
||||
{
|
||||
document.removeChangeListener (this);
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
protected:
|
||||
ComponentType* component;
|
||||
JucerDocument& document;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_COMPONENTCHOICEPROPERTY_JUCEHEADER__
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_COMPONENTCOLOURPROPERTY_JUCEHEADER__
|
||||
#define __JUCER_COMPONENTCOLOURPROPERTY_JUCEHEADER__
|
||||
|
||||
#include "jucer_ColourPropertyComponent.h"
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
*/
|
||||
template <class ComponentType>
|
||||
class ComponentColourProperty : public JucerColourPropertyComponent,
|
||||
private ChangeListener
|
||||
{
|
||||
public:
|
||||
ComponentColourProperty (const String& name,
|
||||
ComponentType* comp,
|
||||
JucerDocument& doc,
|
||||
const bool canResetToDefault)
|
||||
: JucerColourPropertyComponent (name, canResetToDefault),
|
||||
component (comp),
|
||||
document (doc)
|
||||
{
|
||||
document.addChangeListener (this);
|
||||
}
|
||||
|
||||
~ComponentColourProperty()
|
||||
{
|
||||
document.removeChangeListener (this);
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
protected:
|
||||
ComponentType* component;
|
||||
JucerDocument& document;
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
*/
|
||||
class ComponentColourIdProperty : public ComponentColourProperty <Component>
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
ComponentColourIdProperty (Component* const comp,
|
||||
JucerDocument& doc,
|
||||
const int colourId_,
|
||||
const String& name,
|
||||
const bool canResetToDefault)
|
||||
: ComponentColourProperty <Component> (name, comp, doc, canResetToDefault),
|
||||
colourId (colourId_)
|
||||
{
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
Colour getColour() const
|
||||
{
|
||||
return component->findColour (colourId);
|
||||
}
|
||||
|
||||
void setColour (Colour newColour)
|
||||
{
|
||||
if (component->findColour (colourId) != newColour)
|
||||
{
|
||||
document.getUndoManager().undoCurrentTransactionOnly();
|
||||
|
||||
document.perform (new ColourChangeAction (component,
|
||||
*document.getComponentLayout(),
|
||||
colourId,
|
||||
newColour,
|
||||
false),
|
||||
"Change colour");
|
||||
}
|
||||
}
|
||||
|
||||
void resetToDefault()
|
||||
{
|
||||
document.getUndoManager().undoCurrentTransactionOnly();
|
||||
|
||||
document.perform (new ColourChangeAction (component,
|
||||
*document.getComponentLayout(),
|
||||
colourId,
|
||||
Colours::black,
|
||||
true),
|
||||
"Reset colour");
|
||||
}
|
||||
|
||||
private:
|
||||
const int colourId;
|
||||
|
||||
class ColourChangeAction : public ComponentUndoableAction <Component>
|
||||
{
|
||||
public:
|
||||
ColourChangeAction (Component* const comp,
|
||||
ComponentLayout& l,
|
||||
const int colourId_,
|
||||
Colour newColour_,
|
||||
const bool newColourIsDefault)
|
||||
: ComponentUndoableAction<Component> (comp, l),
|
||||
colourId (colourId_),
|
||||
newColour (newColour_),
|
||||
isDefault (newColourIsDefault)
|
||||
{
|
||||
}
|
||||
|
||||
bool perform()
|
||||
{
|
||||
showCorrectTab();
|
||||
|
||||
wasSpecified = getComponent()->isColourSpecified (colourId);
|
||||
oldColour = getComponent()->findColour (colourId);
|
||||
|
||||
if (isDefault)
|
||||
getComponent()->removeColour (colourId);
|
||||
else
|
||||
getComponent()->setColour (colourId, newColour);
|
||||
|
||||
changed();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool undo()
|
||||
{
|
||||
showCorrectTab();
|
||||
|
||||
if (wasSpecified)
|
||||
getComponent()->setColour (colourId, oldColour);
|
||||
else
|
||||
getComponent()->removeColour (colourId);
|
||||
|
||||
if (TextEditor* const te = dynamic_cast <TextEditor*> (getComponent()))
|
||||
te->applyFontToAllText (te->getFont());
|
||||
|
||||
changed();
|
||||
return true;
|
||||
}
|
||||
|
||||
int colourId;
|
||||
Colour newColour, oldColour;
|
||||
bool isDefault, wasSpecified;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_COMPONENTCOLOURPROPERTY_JUCEHEADER__
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_COMPONENTTEXTPROPERTY_JUCEHEADER__
|
||||
#define __JUCER_COMPONENTTEXTPROPERTY_JUCEHEADER__
|
||||
|
||||
|
||||
template <class ComponentType>
|
||||
class ComponentTextProperty : public TextPropertyComponent,
|
||||
private ChangeListener
|
||||
{
|
||||
public:
|
||||
ComponentTextProperty (const String& name,
|
||||
const int maxNumChars_,
|
||||
const bool isMultiLine_,
|
||||
ComponentType* const comp,
|
||||
JucerDocument& doc)
|
||||
: TextPropertyComponent (name, maxNumChars_, isMultiLine_),
|
||||
component (comp),
|
||||
document (doc)
|
||||
{
|
||||
document.addChangeListener (this);
|
||||
}
|
||||
|
||||
~ComponentTextProperty()
|
||||
{
|
||||
document.removeChangeListener (this);
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
protected:
|
||||
ComponentType* component;
|
||||
JucerDocument& document;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_COMPONENTTEXTPROPERTY_JUCEHEADER__
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_FILEPROPERTYCOMPONENT_JUCEHEADER__
|
||||
#define __JUCER_FILEPROPERTYCOMPONENT_JUCEHEADER__
|
||||
|
||||
|
||||
class FilePropertyComponent : public PropertyComponent,
|
||||
public FilenameComponentListener
|
||||
{
|
||||
public:
|
||||
FilePropertyComponent (const String& name,
|
||||
const bool isDirectory,
|
||||
const bool allowEditingOfFilename,
|
||||
const String& fileBrowserWildcard = "*")
|
||||
: PropertyComponent (name),
|
||||
filenameComp (name, File::nonexistent, allowEditingOfFilename,
|
||||
isDirectory, false, fileBrowserWildcard,
|
||||
String::empty, String::empty)
|
||||
{
|
||||
addAndMakeVisible (filenameComp);
|
||||
filenameComp.addListener (this);
|
||||
}
|
||||
|
||||
virtual void setFile (const File& newFile) = 0;
|
||||
virtual File getFile() const = 0;
|
||||
|
||||
void refresh()
|
||||
{
|
||||
filenameComp.setCurrentFile (getFile(), false);
|
||||
}
|
||||
|
||||
void filenameComponentChanged (FilenameComponent*)
|
||||
{
|
||||
if (getFile() != filenameComp.getCurrentFile())
|
||||
setFile (filenameComp.getCurrentFile());
|
||||
}
|
||||
|
||||
private:
|
||||
FilenameComponent filenameComp;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_FILEPROPERTYCOMPONENT_JUCEHEADER__
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_FONTPROPERTYCOMPONENT_JUCEHEADER__
|
||||
#define __JUCER_FONTPROPERTYCOMPONENT_JUCEHEADER__
|
||||
|
||||
|
||||
class FontPropertyComponent : public ChoicePropertyComponent
|
||||
{
|
||||
public:
|
||||
FontPropertyComponent (const String& name)
|
||||
: ChoicePropertyComponent (name)
|
||||
{
|
||||
choices.add (getDefaultFont());
|
||||
choices.add (getDefaultSans());
|
||||
choices.add (getDefaultSerif());
|
||||
choices.add (getDefaultMono());
|
||||
choices.add (String::empty);
|
||||
|
||||
static StringArray fontNames;
|
||||
|
||||
if (fontNames.size() == 0)
|
||||
{
|
||||
Array<Font> fonts;
|
||||
Font::findFonts (fonts);
|
||||
|
||||
for (int i = 0; i < fonts.size(); ++i)
|
||||
fontNames.add (fonts[i].getTypefaceName());
|
||||
}
|
||||
|
||||
choices.addArray (fontNames);
|
||||
}
|
||||
|
||||
static String getDefaultFont() { return "Default font"; }
|
||||
static String getDefaultSans() { return "Default sans-serif font"; }
|
||||
static String getDefaultSerif() { return "Default serif font"; }
|
||||
static String getDefaultMono() { return "Default monospaced font"; }
|
||||
|
||||
//==============================================================================
|
||||
virtual void setTypefaceName (const String& newFontName) = 0;
|
||||
virtual String getTypefaceName() const = 0;
|
||||
|
||||
//==============================================================================
|
||||
void setIndex (int newIndex)
|
||||
{
|
||||
String type (choices [newIndex]);
|
||||
|
||||
if (type.isEmpty())
|
||||
type = getDefaultFont();
|
||||
|
||||
if (getTypefaceName() != type)
|
||||
setTypefaceName (type);
|
||||
}
|
||||
|
||||
int getIndex() const
|
||||
{
|
||||
return choices.indexOf (getTypefaceName());
|
||||
}
|
||||
|
||||
static Font applyNameToFont (const String& typefaceName, const Font& font)
|
||||
{
|
||||
if (typefaceName == getDefaultFont()) return Font (font.getHeight(), font.getStyleFlags());
|
||||
if (typefaceName == getDefaultSans()) return Font (Font::getDefaultSansSerifFontName(), font.getHeight(), font.getStyleFlags());
|
||||
if (typefaceName == getDefaultSerif()) return Font (Font::getDefaultSerifFontName(), font.getHeight(), font.getStyleFlags());
|
||||
if (typefaceName == getDefaultMono()) return Font (Font::getDefaultMonospacedFontName(), font.getHeight(), font.getStyleFlags());
|
||||
|
||||
return Font (typefaceName, font.getHeight(), font.getStyleFlags());
|
||||
}
|
||||
|
||||
static String getTypefaceNameCode (const String& typefaceName)
|
||||
{
|
||||
if (typefaceName == getDefaultFont()) return String::empty;
|
||||
if (typefaceName == getDefaultSans()) return "Font::getDefaultSansSerifFontName(), ";
|
||||
if (typefaceName == getDefaultSerif()) return "Font::getDefaultSerifFontName(), ";
|
||||
if (typefaceName == getDefaultMono()) return "Font::getDefaultMonospacedFontName(), ";
|
||||
|
||||
return "\"" + typefaceName + "\", ";
|
||||
}
|
||||
|
||||
static String getFontStyleCode (const Font& font)
|
||||
{
|
||||
if (font.isBold() && font.isItalic()) return "Font::bold | Font::italic";
|
||||
if (font.isBold()) return "Font::bold";
|
||||
if (font.isItalic()) return "Font::italic";
|
||||
|
||||
return "Font::plain";
|
||||
}
|
||||
|
||||
static String getCompleteFontCode (const Font& font, const String& typefaceName)
|
||||
{
|
||||
return "Font ("
|
||||
+ getTypefaceNameCode (typefaceName)
|
||||
+ CodeHelpers::floatLiteral (font.getHeight(), 2)
|
||||
+ ", "
|
||||
+ getFontStyleCode (font)
|
||||
+ ")";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_FONTPROPERTYCOMPONENT_JUCEHEADER__
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_JUSTIFICATIONPROPERTY_JUCEHEADER__
|
||||
#define __JUCER_JUSTIFICATIONPROPERTY_JUCEHEADER__
|
||||
|
||||
|
||||
class JustificationProperty : public ChoicePropertyComponent
|
||||
{
|
||||
public:
|
||||
JustificationProperty (const String& name, const bool onlyHorizontalOptions)
|
||||
: ChoicePropertyComponent (name)
|
||||
{
|
||||
if (onlyHorizontalOptions)
|
||||
{
|
||||
choices.add ("centre");
|
||||
choices.add ("left");
|
||||
choices.add ("right");
|
||||
}
|
||||
else
|
||||
{
|
||||
choices.add ("centred");
|
||||
choices.add ("centred left");
|
||||
choices.add ("centred right");
|
||||
choices.add ("centred top");
|
||||
choices.add ("centred bottom");
|
||||
choices.add ("top left");
|
||||
choices.add ("top right");
|
||||
choices.add ("bottom left");
|
||||
choices.add ("bottom right");
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
virtual void setJustification (Justification newJustification) = 0;
|
||||
virtual Justification getJustification() const = 0;
|
||||
|
||||
//==============================================================================
|
||||
void setIndex (int newIndex)
|
||||
{
|
||||
const int types[] = { Justification::centred,
|
||||
Justification::centredLeft,
|
||||
Justification::centredRight,
|
||||
Justification::centredTop,
|
||||
Justification::centredBottom,
|
||||
Justification::topLeft,
|
||||
Justification::topRight,
|
||||
Justification::bottomLeft,
|
||||
Justification::bottomRight };
|
||||
|
||||
if (((unsigned int) newIndex) < (unsigned int) numElementsInArray (types)
|
||||
&& types [newIndex] != getJustification().getFlags())
|
||||
{
|
||||
setJustification (Justification (types [newIndex]));
|
||||
}
|
||||
}
|
||||
|
||||
int getIndex() const
|
||||
{
|
||||
const int types[] = { Justification::centred,
|
||||
Justification::centredLeft,
|
||||
Justification::centredRight,
|
||||
Justification::centredTop,
|
||||
Justification::centredBottom,
|
||||
Justification::topLeft,
|
||||
Justification::topRight,
|
||||
Justification::bottomLeft,
|
||||
Justification::bottomRight };
|
||||
|
||||
const int rawFlags = getJustification().getFlags();
|
||||
|
||||
for (int i = numElementsInArray (types); --i >= 0;)
|
||||
if (types[i] == rawFlags)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_JUSTIFICATIONPROPERTY_JUCEHEADER__
|
||||
+455
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
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 __JUCER_POSITIONPROPERTYBASE_JUCEHEADER__
|
||||
#define __JUCER_POSITIONPROPERTYBASE_JUCEHEADER__
|
||||
|
||||
#include "../ui/jucer_PaintRoutineEditor.h"
|
||||
#include "../ui/jucer_ComponentLayoutEditor.h"
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Base class for a property that edits the x, y, w, or h of a PositionedRectangle.
|
||||
*/
|
||||
class PositionPropertyBase : public PropertyComponent,
|
||||
protected ChangeListener,
|
||||
private ButtonListener
|
||||
{
|
||||
public:
|
||||
enum ComponentPositionDimension
|
||||
{
|
||||
componentX = 0,
|
||||
componentY = 1,
|
||||
componentWidth = 2,
|
||||
componentHeight = 3
|
||||
};
|
||||
|
||||
PositionPropertyBase (Component* comp,
|
||||
const String& name,
|
||||
ComponentPositionDimension dimension_,
|
||||
const bool includeAnchorOptions_,
|
||||
const bool allowRelativeOptions_,
|
||||
ComponentLayout* layout_)
|
||||
: PropertyComponent (name),
|
||||
layout (layout_),
|
||||
button ("mode"),
|
||||
component (comp),
|
||||
dimension (dimension_),
|
||||
includeAnchorOptions (includeAnchorOptions_),
|
||||
allowRelativeOptions (allowRelativeOptions_)
|
||||
{
|
||||
addAndMakeVisible (button);
|
||||
button.addListener (this);
|
||||
button.setTriggeredOnMouseDown (true);
|
||||
button.setConnectedEdges (TextButton::ConnectedOnLeft | TextButton::ConnectedOnRight);
|
||||
|
||||
addAndMakeVisible (textEditor = new PositionPropLabel (*this));
|
||||
}
|
||||
|
||||
String getText() const
|
||||
{
|
||||
RelativePositionedRectangle rpr (getPosition());
|
||||
PositionedRectangle& p = rpr.rect;
|
||||
String s;
|
||||
|
||||
switch (dimension)
|
||||
{
|
||||
case componentX:
|
||||
if (p.getPositionModeX() == PositionedRectangle::proportionOfParentSize)
|
||||
s << valueToString (p.getX() * 100.0) << '%';
|
||||
else
|
||||
s << valueToString (p.getX());
|
||||
break;
|
||||
|
||||
case componentY:
|
||||
if (p.getPositionModeY() == PositionedRectangle::proportionOfParentSize)
|
||||
s << valueToString (p.getY() * 100.0) << '%';
|
||||
else
|
||||
s << valueToString (p.getY());
|
||||
break;
|
||||
|
||||
case componentWidth:
|
||||
if (p.getWidthMode() == PositionedRectangle::proportionalSize)
|
||||
s << valueToString (p.getWidth() * 100.0) << '%';
|
||||
else
|
||||
s << valueToString (p.getWidth());
|
||||
break;
|
||||
|
||||
case componentHeight:
|
||||
if (p.getHeightMode() == PositionedRectangle::proportionalSize)
|
||||
s << valueToString (p.getHeight() * 100.0) << '%';
|
||||
else
|
||||
s << valueToString (p.getHeight());
|
||||
break;
|
||||
|
||||
default:
|
||||
jassertfalse;
|
||||
break;
|
||||
};
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
static String valueToString (const double n)
|
||||
{
|
||||
return String (roundToInt (n * 1000.0) / 1000.0);
|
||||
}
|
||||
|
||||
void setText (const String& newText)
|
||||
{
|
||||
RelativePositionedRectangle rpr (getPosition());
|
||||
PositionedRectangle p (rpr.rect);
|
||||
const double value = newText.getDoubleValue();
|
||||
|
||||
switch (dimension)
|
||||
{
|
||||
case componentX:
|
||||
if (p.getPositionModeX() == PositionedRectangle::proportionOfParentSize)
|
||||
p.setX (value / 100.0);
|
||||
else
|
||||
p.setX (value);
|
||||
break;
|
||||
|
||||
case componentY:
|
||||
if (p.getPositionModeY() == PositionedRectangle::proportionOfParentSize)
|
||||
p.setY (value / 100.0);
|
||||
else
|
||||
p.setY (value);
|
||||
break;
|
||||
|
||||
case componentWidth:
|
||||
if (p.getWidthMode() == PositionedRectangle::proportionalSize)
|
||||
p.setWidth (value / 100.0);
|
||||
else
|
||||
p.setWidth (value);
|
||||
break;
|
||||
|
||||
case componentHeight:
|
||||
if (p.getHeightMode() == PositionedRectangle::proportionalSize)
|
||||
p.setHeight (value / 100.0);
|
||||
else
|
||||
p.setHeight (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
jassertfalse;
|
||||
break;
|
||||
};
|
||||
|
||||
if (p != rpr.rect)
|
||||
{
|
||||
rpr.rect = p;
|
||||
setPosition (rpr);
|
||||
}
|
||||
}
|
||||
|
||||
void changeListenerCallback (ChangeBroadcaster*)
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
bool showMenu (ComponentLayout* compLayout)
|
||||
{
|
||||
RelativePositionedRectangle rpr (getPosition());
|
||||
PositionedRectangle p (rpr.rect);
|
||||
|
||||
PositionedRectangle::AnchorPoint xAnchor = p.getAnchorPointX();
|
||||
PositionedRectangle::AnchorPoint yAnchor = p.getAnchorPointY();
|
||||
PositionedRectangle::PositionMode xMode = p.getPositionModeX();
|
||||
PositionedRectangle::PositionMode yMode = p.getPositionModeY();
|
||||
PositionedRectangle::SizeMode sizeW = p.getWidthMode();
|
||||
PositionedRectangle::SizeMode sizeH = p.getHeightMode();
|
||||
|
||||
String relCompName ("parent");
|
||||
|
||||
if (Component* const relComp = compLayout != nullptr ? compLayout->getComponentRelativePosTarget (component, (int) dimension)
|
||||
: nullptr)
|
||||
relCompName = compLayout->getComponentMemberVariableName (relComp);
|
||||
|
||||
jassert (relCompName.isNotEmpty());
|
||||
|
||||
PopupMenu m;
|
||||
|
||||
if (dimension == componentX || dimension == componentY)
|
||||
{
|
||||
const PositionedRectangle::PositionMode posMode = (dimension == componentX) ? xMode : yMode;
|
||||
|
||||
m.addItem (10, ((dimension == componentX) ? "Absolute distance from left of "
|
||||
: "Absolute distance from top of ") + relCompName,
|
||||
true, posMode == PositionedRectangle::absoluteFromParentTopLeft);
|
||||
|
||||
m.addItem (11, ((dimension == componentX) ? "Absolute distance from right of "
|
||||
: "Absolute distance from bottom of ") + relCompName,
|
||||
true, posMode == PositionedRectangle::absoluteFromParentBottomRight);
|
||||
|
||||
m.addItem (12, "Absolute distance from centre of " + relCompName,
|
||||
true, posMode == PositionedRectangle::absoluteFromParentCentre);
|
||||
|
||||
m.addItem (13, ((dimension == componentX) ? "Percentage of width of "
|
||||
: "Percentage of height of ") + relCompName,
|
||||
true, posMode == PositionedRectangle::proportionOfParentSize);
|
||||
|
||||
m.addSeparator();
|
||||
|
||||
if (includeAnchorOptions)
|
||||
{
|
||||
const PositionedRectangle::AnchorPoint anchor = (dimension == componentX) ? xAnchor : yAnchor;
|
||||
|
||||
m.addItem (14, (dimension == componentX) ? "Anchored at left of component"
|
||||
: "Anchored at top of component",
|
||||
true, anchor == PositionedRectangle::anchorAtLeftOrTop);
|
||||
|
||||
m.addItem (15, "Anchored at centre of component", true, anchor == PositionedRectangle::anchorAtCentre);
|
||||
|
||||
m.addItem (16, (dimension == componentX) ? "Anchored at right of component"
|
||||
: "Anchored at bottom of component",
|
||||
true, anchor == PositionedRectangle::anchorAtRightOrBottom);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const PositionedRectangle::SizeMode sizeMode = (dimension == componentWidth) ? sizeW : sizeH;
|
||||
|
||||
m.addItem (20, (dimension == componentWidth) ? "Absolute width"
|
||||
: "Absolute height",
|
||||
true, sizeMode == PositionedRectangle::absoluteSize);
|
||||
|
||||
m.addItem (21, ((dimension == componentWidth) ? "Percentage of width of "
|
||||
: "Percentage of height of ") + relCompName,
|
||||
true, sizeMode == PositionedRectangle::proportionalSize);
|
||||
|
||||
m.addItem (22, ((dimension == componentWidth) ? "Subtracted from width of "
|
||||
: "Subtracted from height of ") + relCompName,
|
||||
true, sizeMode == PositionedRectangle::parentSizeMinusAbsolute);
|
||||
}
|
||||
|
||||
|
||||
if (allowRelativeOptions && compLayout != nullptr)
|
||||
{
|
||||
m.addSeparator();
|
||||
m.addSubMenu ("Relative to", compLayout->getRelativeTargetMenu (component, (int) dimension));
|
||||
}
|
||||
|
||||
WeakReference<Component> ref (this);
|
||||
|
||||
const int menuResult = m.showAt (&button);
|
||||
|
||||
if (menuResult == 0 || ref == nullptr)
|
||||
return false;
|
||||
|
||||
switch (menuResult)
|
||||
{
|
||||
case 10:
|
||||
if (dimension == componentX)
|
||||
xMode = PositionedRectangle::absoluteFromParentTopLeft;
|
||||
else
|
||||
yMode = PositionedRectangle::absoluteFromParentTopLeft;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
if (dimension == componentX)
|
||||
xMode = PositionedRectangle::absoluteFromParentBottomRight;
|
||||
else
|
||||
yMode = PositionedRectangle::absoluteFromParentBottomRight;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
if (dimension == componentX)
|
||||
xMode = PositionedRectangle::absoluteFromParentCentre;
|
||||
else
|
||||
yMode = PositionedRectangle::absoluteFromParentCentre;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
if (dimension == componentX)
|
||||
xMode = PositionedRectangle::proportionOfParentSize;
|
||||
else
|
||||
yMode = PositionedRectangle::proportionOfParentSize;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
if (dimension == componentX)
|
||||
xAnchor = PositionedRectangle::anchorAtLeftOrTop;
|
||||
else
|
||||
yAnchor = PositionedRectangle::anchorAtLeftOrTop;
|
||||
break;
|
||||
|
||||
case 15:
|
||||
if (dimension == componentX)
|
||||
xAnchor = PositionedRectangle::anchorAtCentre;
|
||||
else
|
||||
yAnchor = PositionedRectangle::anchorAtCentre;
|
||||
break;
|
||||
|
||||
case 16:
|
||||
if (dimension == componentX)
|
||||
xAnchor = PositionedRectangle::anchorAtRightOrBottom;
|
||||
else
|
||||
yAnchor = PositionedRectangle::anchorAtRightOrBottom;
|
||||
break;
|
||||
|
||||
case 20:
|
||||
if (dimension == componentWidth)
|
||||
sizeW = PositionedRectangle::absoluteSize;
|
||||
else
|
||||
sizeH = PositionedRectangle::absoluteSize;
|
||||
break;
|
||||
|
||||
case 21:
|
||||
if (dimension == componentWidth)
|
||||
sizeW = PositionedRectangle::proportionalSize;
|
||||
else
|
||||
sizeH = PositionedRectangle::proportionalSize;
|
||||
break;
|
||||
|
||||
case 22:
|
||||
if (dimension == componentWidth)
|
||||
sizeW = PositionedRectangle::parentSizeMinusAbsolute;
|
||||
else
|
||||
sizeH = PositionedRectangle::parentSizeMinusAbsolute;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (allowRelativeOptions && compLayout != nullptr)
|
||||
compLayout->processRelativeTargetMenuResult (component, (int) dimension, menuResult);
|
||||
break;
|
||||
}
|
||||
|
||||
Rectangle<int> parentArea;
|
||||
|
||||
if (component->findParentComponentOfClass<ComponentLayoutEditor>() != 0)
|
||||
parentArea.setSize (component->getParentWidth(), component->getParentHeight());
|
||||
else if (dynamic_cast <PaintRoutineEditor*> (component->getParentComponent()) != 0)
|
||||
parentArea = dynamic_cast <PaintRoutineEditor*> (component->getParentComponent())->getComponentArea();
|
||||
else
|
||||
jassertfalse;
|
||||
|
||||
int x, xw, y, yh, w, h;
|
||||
rpr.getRelativeTargetBounds (parentArea, compLayout, x, xw, y, yh, w, h);
|
||||
|
||||
PositionedRectangle xyRect (p);
|
||||
PositionedRectangle whRect (p);
|
||||
|
||||
xyRect.setModes (xAnchor, xMode, yAnchor, yMode, sizeW, sizeH,
|
||||
Rectangle<int> (x, y, xw, yh));
|
||||
|
||||
whRect.setModes (xAnchor, xMode, yAnchor, yMode, sizeW, sizeH,
|
||||
Rectangle<int> (x, y, w, h));
|
||||
|
||||
p.setModes (xAnchor, xMode, yAnchor, yMode, sizeW, sizeH,
|
||||
Rectangle<int> (x, y, xw, yh));
|
||||
|
||||
p.setX (xyRect.getX());
|
||||
p.setY (xyRect.getY());
|
||||
p.setWidth (whRect.getWidth());
|
||||
p.setHeight (whRect.getHeight());
|
||||
|
||||
if (p != rpr.rect)
|
||||
{
|
||||
rpr.rect = p;
|
||||
setPosition (rpr);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
const Rectangle<int> r (getLookAndFeel().getPropertyComponentContentPosition (*this));
|
||||
|
||||
button.changeWidthToFitText (r.getHeight());
|
||||
button.setTopRightPosition (r.getRight(), r.getY());
|
||||
|
||||
textEditor->setBounds (r.getX(), r.getY(), button.getX() - r.getX(), r.getHeight());
|
||||
}
|
||||
|
||||
void refresh()
|
||||
{
|
||||
textEditor->setText (getText(), dontSendNotification);
|
||||
}
|
||||
|
||||
void buttonClicked (Button*)
|
||||
{
|
||||
if (showMenu (layout))
|
||||
refresh(); // (to clear the text editor if it's got focus)
|
||||
}
|
||||
|
||||
void textWasEdited()
|
||||
{
|
||||
const String newText (textEditor->getText());
|
||||
if (getText() != newText)
|
||||
setText (newText);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
virtual void setPosition (const RelativePositionedRectangle& newPos) = 0;
|
||||
|
||||
virtual RelativePositionedRectangle getPosition() const = 0;
|
||||
|
||||
protected:
|
||||
class PositionPropLabel : public Label
|
||||
{
|
||||
PositionPropertyBase& owner;
|
||||
|
||||
public:
|
||||
PositionPropLabel (PositionPropertyBase& owner_)
|
||||
: Label (String::empty, String::empty),
|
||||
owner (owner_)
|
||||
{
|
||||
setEditable (true, true, false);
|
||||
|
||||
setColour (backgroundColourId, Colours::white);
|
||||
setColour (textColourId, Colours::black);
|
||||
setColour (outlineColourId, findColour (ComboBox::outlineColourId));
|
||||
|
||||
setColour (TextEditor::textColourId, Colours::black);
|
||||
setColour (TextEditor::backgroundColourId, Colours::white);
|
||||
setColour (TextEditor::outlineColourId, findColour (ComboBox::outlineColourId));
|
||||
}
|
||||
|
||||
TextEditor* createEditorComponent()
|
||||
{
|
||||
TextEditor* ed = Label::createEditorComponent();
|
||||
ed->setInputRestrictions (14, "0123456789.-%");
|
||||
|
||||
return ed;
|
||||
}
|
||||
|
||||
void textWasEdited()
|
||||
{
|
||||
owner.textWasEdited();
|
||||
}
|
||||
};
|
||||
|
||||
ComponentLayout* layout;
|
||||
ScopedPointer<PositionPropLabel> textEditor;
|
||||
TextButton button;
|
||||
|
||||
Component* component;
|
||||
ComponentPositionDimension dimension;
|
||||
const bool includeAnchorOptions, allowRelativeOptions;
|
||||
};
|
||||
|
||||
|
||||
#endif // __JUCER_POSITIONPROPERTYBASE_JUCEHEADER__
|
||||
Reference in New Issue
Block a user