@@ -49,25 +49,4 @@ namespace BinaryData | |||
// If you provide the name of one of the binary resource variables above, this function will | |||
// return the corresponding data and its size (or a null pointer if the name isn't found). | |||
const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw(); | |||
//============================================================================== | |||
// This class acts as an ImageProvider that will access the BinaryData images | |||
class ImageProvider : public juce::ComponentBuilder::ImageProvider | |||
{ | |||
public: | |||
ImageProvider() noexcept {} | |||
juce::Image getImageForIdentifier (const juce::var& imageIdentifier) | |||
{ | |||
int dataSize = 0; | |||
const char* const data = getNamedResource (imageIdentifier.toString().toUTF8(), dataSize); | |||
if (data != nullptr) | |||
return juce::ImageCache::getFromMemory (data, dataSize); | |||
return juce::Image(); | |||
} | |||
juce::var getIdentifierForImage (const juce::Image&) { return juce::var(); } | |||
}; | |||
} |
@@ -193,34 +193,8 @@ bool ResourceFile::write (const File& cppFile, OutputStream& cpp, OutputStream& | |||
header << " // If you provide the name of one of the binary resource variables above, this function will" << newLine | |||
<< " // return the corresponding data and its size (or a null pointer if the name isn't found)." << newLine | |||
<< " const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw();" << newLine; | |||
if (containsAnyImages) | |||
{ | |||
header << newLine | |||
<< " //==============================================================================" << newLine | |||
<< " // This class acts as an ImageProvider that will access the BinaryData images" << newLine | |||
<< " class ImageProvider : public juce::ComponentBuilder::ImageProvider" << newLine | |||
<< " {" << newLine | |||
<< " public:" << newLine | |||
<< " ImageProvider() noexcept {}" << newLine | |||
<< newLine | |||
<< " juce::Image getImageForIdentifier (const juce::var& imageIdentifier)" << newLine | |||
<< " {" << newLine | |||
<< " int dataSize = 0;" << newLine | |||
<< " const char* const data = getNamedResource (imageIdentifier.toString().toUTF8(), dataSize);" << newLine | |||
<< newLine | |||
<< " if (data != nullptr)" << newLine | |||
<< " return juce::ImageCache::getFromMemory (data, dataSize);" << newLine | |||
<< newLine | |||
<< " return juce::Image();" << newLine | |||
<< " }" << newLine | |||
<< newLine | |||
<< " juce::var getIdentifierForImage (const juce::Image&) { return juce::var(); }" << newLine | |||
<< " };" << newLine; | |||
} | |||
header << "}" << newLine; | |||
<< " const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw();" << newLine | |||
<< "}" << newLine; | |||
return true; | |||
} | |||
@@ -94,8 +94,8 @@ void Project::updateProjectSettings() | |||
void Project::setMissingDefaultValues() | |||
{ | |||
if (! projectRoot.hasProperty (ComponentBuilder::idProperty)) | |||
projectRoot.setProperty (ComponentBuilder::idProperty, createAlphaNumericUID(), nullptr); | |||
if (! projectRoot.hasProperty (Ids::ID)) | |||
projectRoot.setProperty (Ids::ID, createAlphaNumericUID(), nullptr); | |||
// Create main file group if missing | |||
if (! projectRoot.getChildWithName (Tags::projectMainGroup).isValid()) | |||
@@ -431,8 +431,8 @@ Project::Item::Item (const Item& other) | |||
Project::Item Project::Item::createCopy() { Item i (*this); i.state = i.state.createCopy(); return i; } | |||
String Project::Item::getID() const { return state [ComponentBuilder::idProperty]; } | |||
void Project::Item::setID (const String& newID) { state.setProperty (ComponentBuilder::idProperty, newID, nullptr); } | |||
String Project::Item::getID() const { return state [Ids::ID]; } | |||
void Project::Item::setID (const String& newID) { state.setProperty (Ids::ID, newID, nullptr); } | |||
String Project::Item::getImageFileID() const { return "id:" + getID(); } | |||
@@ -458,7 +458,7 @@ bool Project::Item::isImageFile() const { return isFile() && getFile().hasFi | |||
Project::Item Project::Item::findItemWithID (const String& targetId) const | |||
{ | |||
if (state [ComponentBuilder::idProperty] == targetId) | |||
if (state [Ids::ID] == targetId) | |||
return *this; | |||
if (isGroup()) | |||
@@ -603,7 +603,7 @@ File Project::Item::determineGroupFolder() const | |||
void Project::Item::initialiseMissingProperties() | |||
{ | |||
if (! state.hasProperty (ComponentBuilder::idProperty)) | |||
if (! state.hasProperty (Ids::ID)) | |||
setID (createAlphaNumericUID()); | |||
if (isFile()) | |||
@@ -841,7 +841,7 @@ bool Project::isModuleEnabled (const String& moduleID) const | |||
ValueTree modules (projectRoot.getChildWithName (Tags::modulesGroup)); | |||
for (int i = 0; i < modules.getNumChildren(); ++i) | |||
if (modules.getChild(i) [ComponentBuilder::idProperty] == moduleID) | |||
if (modules.getChild(i) [Ids::ID] == moduleID) | |||
return true; | |||
return false; | |||
@@ -849,13 +849,13 @@ bool Project::isModuleEnabled (const String& moduleID) const | |||
Value Project::shouldShowAllModuleFilesInProject (const String& moduleID) | |||
{ | |||
return getModulesNode().getChildWithProperty (ComponentBuilder::idProperty, moduleID) | |||
return getModulesNode().getChildWithProperty (Ids::ID, moduleID) | |||
.getPropertyAsValue (Ids::showAllCode, getUndoManagerFor (getModulesNode())); | |||
} | |||
Value Project::shouldCopyModuleFilesLocally (const String& moduleID) | |||
{ | |||
return getModulesNode().getChildWithProperty (ComponentBuilder::idProperty, moduleID) | |||
return getModulesNode().getChildWithProperty (Ids::ID, moduleID) | |||
.getPropertyAsValue (Ids::useLocalCopy, getUndoManagerFor (getModulesNode())); | |||
} | |||
@@ -864,7 +864,7 @@ void Project::addModule (const String& moduleID, bool shouldCopyFilesLocally) | |||
if (! isModuleEnabled (moduleID)) | |||
{ | |||
ValueTree module (Tags::module); | |||
module.setProperty (ComponentBuilder::idProperty, moduleID, nullptr); | |||
module.setProperty (Ids::ID, moduleID, nullptr); | |||
ValueTree modules (getModulesNode()); | |||
modules.addChild (module, -1, getUndoManagerFor (modules)); | |||
@@ -881,7 +881,7 @@ void Project::removeModule (const String& moduleID) | |||
ValueTree modules (getModulesNode()); | |||
for (int i = 0; i < modules.getNumChildren(); ++i) | |||
if (modules.getChild(i) [ComponentBuilder::idProperty] == moduleID) | |||
if (modules.getChild(i) [Ids::ID] == moduleID) | |||
modules.removeChild (i, getUndoManagerFor (modules)); | |||
} | |||
@@ -899,7 +899,7 @@ int Project::getNumModules() const | |||
String Project::getModuleID (int index) const | |||
{ | |||
return projectRoot.getChildWithName (Tags::modulesGroup).getChild (index) [ComponentBuilder::idProperty].toString(); | |||
return projectRoot.getChildWithName (Tags::modulesGroup).getChild (index) [Ids::ID].toString(); | |||
} | |||
//============================================================================== | |||
@@ -58,7 +58,7 @@ public: | |||
String getTitle() const; | |||
Value getProjectNameValue() { return getMainGroup().getNameValue(); } | |||
String getProjectFilenameRoot() { return File::createLegalFileName (getDocumentTitle()); } | |||
String getProjectUID() const { return projectRoot [ComponentBuilder::idProperty]; } | |||
String getProjectUID() const { return projectRoot [Ids::ID]; } | |||
//============================================================================== | |||
template <class FileType> | |||
@@ -126,6 +126,7 @@ namespace Ids | |||
DECLARE_ID (androidKeyAliasPass); | |||
DECLARE_ID (font); | |||
DECLARE_ID (colour); | |||
const Identifier ID ("id"); | |||
const Identifier class_ ("class"); | |||
#undef DECLARE_ID | |||
@@ -25,25 +25,4 @@ namespace BinaryData | |||
// If you provide the name of one of the binary resource variables above, this function will | |||
// return the corresponding data and its size (or a null pointer if the name isn't found). | |||
const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw(); | |||
//============================================================================== | |||
// This class acts as an ImageProvider that will access the BinaryData images | |||
class ImageProvider : public juce::ComponentBuilder::ImageProvider | |||
{ | |||
public: | |||
ImageProvider() noexcept {} | |||
juce::Image getImageForIdentifier (const juce::var& imageIdentifier) | |||
{ | |||
int dataSize = 0; | |||
const char* const data = getNamedResource (imageIdentifier.toString().toUTF8(), dataSize); | |||
if (data != nullptr) | |||
return juce::ImageCache::getFromMemory (data, dataSize); | |||
return juce::Image(); | |||
} | |||
juce::var getIdentifierForImage (const juce::Image&) { return juce::var(); } | |||
}; | |||
} |
@@ -22,25 +22,4 @@ namespace BinaryData | |||
// If you provide the name of one of the binary resource variables above, this function will | |||
// return the corresponding data and its size (or a null pointer if the name isn't found). | |||
const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw(); | |||
//============================================================================== | |||
// This class acts as an ImageProvider that will access the BinaryData images | |||
class ImageProvider : public juce::ComponentBuilder::ImageProvider | |||
{ | |||
public: | |||
ImageProvider() noexcept {} | |||
juce::Image getImageForIdentifier (const juce::var& imageIdentifier) | |||
{ | |||
int dataSize = 0; | |||
const char* const data = getNamedResource (imageIdentifier.toString().toUTF8(), dataSize); | |||
if (data != nullptr) | |||
return juce::ImageCache::getFromMemory (data, dataSize); | |||
return juce::Image(); | |||
} | |||
juce::var getIdentifierForImage (const juce::Image&) { return juce::var(); } | |||
}; | |||
} |
@@ -457,7 +457,7 @@ public: | |||
void resized() | |||
{ | |||
if (child != nullptr) | |||
child->setBounds (0, 0, getWidth(), getHeight()); | |||
child->setBounds (getLocalBounds()); | |||
} | |||
var getObject() { return child->getJavascriptObject(); } | |||
@@ -663,29 +663,3 @@ Button::RepeatTimer& Button::getRepeatTimer() | |||
return *repeatTimer; | |||
} | |||
const Identifier Button::Ids::text ("text"); | |||
const Identifier Button::Ids::radioGroup ("radioGroup"); | |||
const Identifier Button::Ids::connectedLeft ("connectedLeft"); | |||
const Identifier Button::Ids::connectedRight ("connectedRight"); | |||
const Identifier Button::Ids::connectedTop ("connectedTop"); | |||
const Identifier Button::Ids::connectedBottom ("connectedBottom"); | |||
void Button::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setButtonText (state [Ids::text].toString()); | |||
setRadioGroupId (state [Ids::radioGroup]); | |||
setConnectedEdges (getConnectedFlags (state)); | |||
} | |||
int Button::getConnectedFlags (const ValueTree& state) | |||
{ | |||
int connected = 0; | |||
if (state [Button::Ids::connectedLeft]) connected |= Button::ConnectedOnLeft; | |||
if (state [Button::Ids::connectedRight]) connected |= Button::ConnectedOnRight; | |||
if (state [Button::Ids::connectedTop]) connected |= Button::ConnectedOnTop; | |||
if (state [Button::Ids::connectedBottom]) connected |= Button::ConnectedOnBottom; | |||
return connected; | |||
} |
@@ -30,7 +30,6 @@ | |||
#include "../keyboard/juce_KeyListener.h" | |||
#include "../commands/juce_ApplicationCommandManager.h" | |||
#include "../windows/juce_TooltipWindow.h" | |||
#include "../layout/juce_ComponentBuilder.h" | |||
//============================================================================== | |||
@@ -368,16 +367,6 @@ public: | |||
void setState (const ButtonState newState); | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier text, radioGroup, | |||
connectedLeft, connectedRight, connectedTop, connectedBottom; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
static int getConnectedFlags (const ValueTree& state); | |||
//============================================================================== | |||
// These are deprecated - please use addListener() and removeListener() instead! | |||
JUCE_DEPRECATED (void addButtonListener (Listener*)); | |||
@@ -108,15 +108,3 @@ void HyperlinkButton::paintButton (Graphics& g, | |||
justification.getOnlyHorizontalFlags() | Justification::verticallyCentred, | |||
true); | |||
} | |||
const Identifier HyperlinkButton::Ids::tagType ("HYPERLINKBUTTON"); | |||
const Identifier HyperlinkButton::Ids::text ("text"); | |||
const Identifier HyperlinkButton::Ids::url ("url"); | |||
void HyperlinkButton::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setButtonText (state [Ids::text].toString()); | |||
setURL (URL (state [Ids::url].toString())); | |||
} |
@@ -93,14 +93,6 @@ public: | |||
*/ | |||
void changeWidthToFitText(); | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, text, url; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
protected: | |||
//============================================================================== | |||
/** @internal */ | |||
@@ -188,56 +188,3 @@ bool ImageButton::hitTest (int x, int y) | |||
&& alphaThreshold < im.getPixelAt (((x - imageBounds.getX()) * im.getWidth()) / imageBounds.getWidth(), | |||
((y - imageBounds.getY()) * im.getHeight()) / imageBounds.getHeight()).getAlpha()); | |||
} | |||
const Identifier ImageButton::Ids::tagType ("IMAGEBUTTON"); | |||
const Identifier ImageButton::Ids::upImage ("upImage"); | |||
const Identifier ImageButton::Ids::overImage ("overImage"); | |||
const Identifier ImageButton::Ids::downImage ("downImage"); | |||
const Identifier ImageButton::Ids::upOverlay ("upOverlay"); | |||
const Identifier ImageButton::Ids::overOverlay ("overOverlay"); | |||
const Identifier ImageButton::Ids::downOverlay ("downOverlay"); | |||
const Identifier ImageButton::Ids::upOpacity ("upOpacity"); | |||
const Identifier ImageButton::Ids::overOpacity ("overOpacity"); | |||
const Identifier ImageButton::Ids::downOpacity ("downOpacity"); | |||
namespace ImageButtonHelpers | |||
{ | |||
static Colour getColourFromVar (const var& col) | |||
{ | |||
return col.isString() ? Colour::fromString (col.toString()) | |||
: Colours::transparentBlack; | |||
} | |||
static float getOpacityFromVar (const var& v) | |||
{ | |||
return v.isVoid() ? 1.0f : static_cast<float> (v); | |||
} | |||
} | |||
void ImageButton::refreshFromValueTree (const ValueTree& state, ComponentBuilder& builder) | |||
{ | |||
Button::refreshFromValueTree (state, builder); | |||
const var upImageIdentifier (state [Ids::upImage]), | |||
overImageIdentifier (state [Ids::overImage]), | |||
downImageIdentifier (state [Ids::downImage]); | |||
ComponentBuilder::ImageProvider* const imageProvider = builder.getImageProvider(); | |||
jassert (imageProvider != nullptr || upImageIdentifier.isVoid()); | |||
Image newUpImage, newOverImage, newDownImage; | |||
if (imageProvider != nullptr) | |||
{ | |||
newUpImage = imageProvider->getImageForIdentifier (upImageIdentifier); | |||
newOverImage = imageProvider->getImageForIdentifier (overImageIdentifier); | |||
newDownImage = imageProvider->getImageForIdentifier (downImageIdentifier); | |||
} | |||
using namespace ImageButtonHelpers; | |||
setImages (false, true, true, | |||
newUpImage, getOpacityFromVar (state[Ids::upOpacity]), getColourFromVar (state[Ids::upOverlay]), | |||
newOverImage, getOpacityFromVar (state[Ids::overOpacity]), getColourFromVar (state[Ids::overOverlay]), | |||
newDownImage, getOpacityFromVar (state[Ids::downOpacity]), getColourFromVar (state[Ids::downOverlay])); | |||
} |
@@ -127,16 +127,6 @@ public: | |||
*/ | |||
Image getDownImage() const; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, upImage, overImage, downImage, | |||
upOverlay, overOverlay, downOverlay, | |||
upOpacity, overOpacity, downOpacity; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
protected: | |||
//============================================================================== | |||
/** @internal */ | |||
@@ -67,5 +67,3 @@ void TextButton::changeWidthToFitText (const int newHeight) | |||
setSize (getFont().getStringWidth (getButtonText()) + getHeight(), | |||
getHeight()); | |||
} | |||
const Identifier TextButton::Ids::tagType ("TEXTBUTTON"); |
@@ -89,12 +89,6 @@ public: | |||
*/ | |||
virtual Font getFont(); | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType; | |||
}; | |||
protected: | |||
/** @internal */ | |||
void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown); | |||
@@ -102,7 +96,6 @@ protected: | |||
void colourChanged(); | |||
private: | |||
//============================================================================== | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextButton); | |||
}; | |||
@@ -23,6 +23,12 @@ | |||
============================================================================== | |||
*/ | |||
ToggleButton::ToggleButton() | |||
: Button (String::empty) | |||
{ | |||
setClickingTogglesState (true); | |||
} | |||
ToggleButton::ToggleButton (const String& buttonText) | |||
: Button (buttonText) | |||
{ | |||
@@ -33,13 +39,9 @@ ToggleButton::~ToggleButton() | |||
{ | |||
} | |||
void ToggleButton::paintButton (Graphics& g, | |||
bool isMouseOverButton, | |||
bool isButtonDown) | |||
void ToggleButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) | |||
{ | |||
getLookAndFeel().drawToggleButton (g, *this, | |||
isMouseOverButton, | |||
isButtonDown); | |||
getLookAndFeel().drawToggleButton (g, *this, isMouseOverButton, isButtonDown); | |||
} | |||
void ToggleButton::changeWidthToFitText() | |||
@@ -51,5 +53,3 @@ void ToggleButton::colourChanged() | |||
{ | |||
repaint(); | |||
} | |||
const Identifier ToggleButton::Ids::tagType ("TOGGLEBUTTON"); |
@@ -42,20 +42,22 @@ class JUCE_API ToggleButton : public Button | |||
{ | |||
public: | |||
//============================================================================== | |||
/** Creates a ToggleButton. */ | |||
ToggleButton(); | |||
/** Creates a ToggleButton. | |||
@param buttonText the text to put in the button (the component's name is also | |||
initially set to this string, but these can be changed later | |||
using the setName() and setButtonText() methods) | |||
*/ | |||
explicit ToggleButton (const String& buttonText = String::empty); | |||
explicit ToggleButton (const String& buttonText); | |||
/** Destructor. */ | |||
~ToggleButton(); | |||
//============================================================================== | |||
/** Resizes the button to fit neatly around its current text. | |||
The button's height won't be affected, only its width. | |||
*/ | |||
void changeWidthToFitText(); | |||
@@ -73,23 +75,14 @@ public: | |||
textColourId = 0x1006501 /**< The colour to use for the button's text. */ | |||
}; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType; | |||
}; | |||
protected: | |||
//============================================================================== | |||
/** @internal */ | |||
void paintButton (Graphics& g, | |||
bool isMouseOverButton, | |||
bool isButtonDown); | |||
void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown); | |||
/** @internal */ | |||
void colourChanged(); | |||
private: | |||
//============================================================================== | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToggleButton); | |||
}; | |||
@@ -154,7 +154,6 @@ namespace ComponentBuilderHelpers | |||
//============================================================================= | |||
const Identifier ComponentBuilder::idProperty ("id"); | |||
const Identifier ComponentBuilder::positionID ("position"); | |||
ComponentBuilder::ComponentBuilder() | |||
: imageProvider (nullptr) | |||
@@ -242,18 +241,6 @@ ComponentBuilder::TypeHandler* ComponentBuilder::getHandler (const int index) co | |||
void ComponentBuilder::registerStandardComponentTypes() | |||
{ | |||
Drawable::registerDrawableTypeHandlers (*this); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <ComboBox>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <Slider>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <Label>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <Slider>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <TextEditor>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <GroupComponent>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <TextButton>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <ToggleButton>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <ImageButton>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <ImageComponent>()); | |||
registerTypeHandler (new ComponentBuilderHelpers::StandardTypeHandler <HyperlinkButton>()); | |||
} | |||
void ComponentBuilder::setImageProvider (ImageProvider* newImageProvider) noexcept | |||
@@ -321,12 +308,11 @@ void ComponentBuilder::updateChildComponents (Component& parent, const ValueTree | |||
OwnedArray<Component> existingComponents; | |||
existingComponents.ensureStorageAllocated (numExistingChildComps); | |||
int i; | |||
for (i = 0; i < numExistingChildComps; ++i) | |||
for (int i = 0; i < numExistingChildComps; ++i) | |||
existingComponents.add (parent.getChildComponent (i)); | |||
const int newNumChildren = children.getNumChildren(); | |||
for (i = 0; i < newNumChildren; ++i) | |||
for (int i = 0; i < newNumChildren; ++i) | |||
{ | |||
const ValueTree childState (children.getChild (i)); | |||
Component* c = removeComponentWithID (existingComponents, getStateId (childState)); | |||
@@ -362,80 +348,3 @@ static void updateMarkers (MarkerList* const list, const ValueTree& state) | |||
if (list != nullptr) | |||
MarkerList::ValueTreeWrapper (state).applyTo (*list); | |||
} | |||
void ComponentBuilder::initialiseRecursively (Component& comp, const ValueTree& state) | |||
{ | |||
refreshBasicComponentProperties (comp, state); | |||
updateMarkers (comp.getMarkers (true), state.getChildWithName ("MARKERS_X")); | |||
updateMarkers (comp.getMarkers (false), state.getChildWithName ("MARKERS_Y")); | |||
const ValueTree childList (state.getChildWithName ("COMPONENTS")); | |||
if (childList.isValid()) | |||
{ | |||
updateChildComponents (comp, childList); | |||
for (int i = 0; i < childList.getNumChildren(); ++i) | |||
{ | |||
const ValueTree childState (childList.getChild(i)); | |||
Component* const c = ComponentBuilderHelpers::findComponentWithID (comp, ComponentBuilderHelpers::getStateId (childState)); | |||
if (c != nullptr) | |||
{ | |||
ComponentBuilder::TypeHandler* const type = getHandlerForState (childState); | |||
if (type != nullptr) | |||
type->updateComponentFromState (c, childState); | |||
else | |||
initialiseRecursively (*c, childState); | |||
} | |||
} | |||
} | |||
} | |||
void ComponentBuilder::initialiseFromValueTree (Component& comp, | |||
const ValueTree& state, | |||
ImageProvider* const imageProvider) | |||
{ | |||
ComponentBuilder builder; | |||
builder.setImageProvider (imageProvider); | |||
builder.registerStandardComponentTypes(); | |||
builder.initialiseRecursively (comp, state); | |||
} | |||
RelativeRectangle ComponentBuilder::getComponentBounds (const ValueTree& state) | |||
{ | |||
try | |||
{ | |||
return RelativeRectangle (state [positionID].toString()); | |||
} | |||
catch (Expression::ParseError&) | |||
{} | |||
return RelativeRectangle(); | |||
} | |||
void ComponentBuilder::refreshBasicComponentProperties (Component& comp, const ValueTree& state) | |||
{ | |||
static const Identifier focusOrderID ("focusOrder"); | |||
static const Identifier tooltipID ("tooltip"); | |||
static const Identifier nameID ("name"); | |||
comp.setName (state [nameID].toString()); | |||
if (state.hasProperty (positionID)) | |||
getComponentBounds (state).applyToComponent (comp); | |||
comp.setExplicitFocusOrder (state [focusOrderID]); | |||
const var tip (state [tooltipID]); | |||
if (! tip.isVoid()) | |||
{ | |||
SettableTooltipClient* tooltipClient = dynamic_cast <SettableTooltipClient*> (&comp); | |||
if (tooltipClient != nullptr) | |||
tooltipClient->setTooltip (tip.toString()); | |||
} | |||
ComponentBuilderHelpers::updateComponentColours (comp, state.getChildWithName ("COLOURS")); | |||
} |
@@ -227,18 +227,6 @@ public: | |||
*/ | |||
static const Identifier idProperty; | |||
/** | |||
*/ | |||
static void initialiseFromValueTree (Component& component, | |||
const ValueTree& state, | |||
ImageProvider* imageProvider); | |||
//============================================================================= | |||
/** @internal */ | |||
static void refreshBasicComponentProperties (Component&, const ValueTree&); | |||
/** @internal */ | |||
static RelativeRectangle getComponentBounds (const ValueTree&); | |||
private: | |||
//============================================================================= | |||
OwnedArray <TypeHandler> types; | |||
@@ -254,9 +242,6 @@ private: | |||
void valueTreeChildOrderChanged (ValueTree&); | |||
void valueTreeParentChanged (ValueTree&); | |||
static const Identifier positionID; | |||
void initialiseRecursively (Component&, const ValueTree&); | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentBuilder); | |||
}; | |||
@@ -78,15 +78,3 @@ void GroupComponent::colourChanged() | |||
{ | |||
repaint(); | |||
} | |||
const Identifier GroupComponent::Ids::tagType ("GROUPCOMPONENT"); | |||
const Identifier GroupComponent::Ids::text ("text"); | |||
const Identifier GroupComponent::Ids::justification ("justification"); | |||
void GroupComponent::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setText (state [Ids::text].toString()); | |||
setTextLabelPosition (static_cast <int> (state [Ids::justification])); | |||
} |
@@ -85,14 +85,6 @@ public: | |||
textColourId = 0x1005410 /**< The colour to use to draw the text label. */ | |||
}; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, text, justification; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
//============================================================================== | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
@@ -424,16 +424,3 @@ bool Viewport::keyPressed (const KeyPress& key) | |||
return false; | |||
} | |||
//============================================================================== | |||
const Identifier Viewport::Ids::showScrollBarV ("showScrollBarV"); | |||
const Identifier Viewport::Ids::showScrollBarH ("showScrollBarH"); | |||
const Identifier Viewport::Ids::scrollBarWidth ("scrollBarWidth"); | |||
void Viewport::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setScrollBarsShown (state [Ids::showScrollBarV], state [Ids::showScrollBarH]); | |||
setScrollBarThickness (state [Ids::scrollBarWidth]); | |||
} |
@@ -236,14 +236,6 @@ public: | |||
ScrollBar* getHorizontalScrollBar() noexcept { return &horizontalScrollBar; } | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier showScrollBarV, showScrollBarH, scrollBarWidth; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
//============================================================================== | |||
/** @internal */ | |||
void resized(); | |||
@@ -596,39 +596,3 @@ void ComboBox::handleAsyncUpdate() | |||
Component::BailOutChecker checker (this); | |||
listeners.callChecked (checker, &ComboBoxListener::comboBoxChanged, this); // (can't use ComboBox::Listener due to idiotic VC2005 bug) | |||
} | |||
const Identifier ComboBox::Ids::tagType ("COMBOBOX"); | |||
const Identifier ComboBox::Ids::items ("items"); | |||
const Identifier ComboBox::Ids::editable ("editable"); | |||
const Identifier ComboBox::Ids::textJustification ("textJustification"); | |||
const Identifier ComboBox::Ids::unselectedText ("unselectedText"); | |||
const Identifier ComboBox::Ids::noItemsText ("noItemsText"); | |||
void ComboBox::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
{ | |||
StringArray items; | |||
items.addLines (state [Ids::items].toString()); | |||
items.removeEmptyStrings (true); | |||
StringArray existingItems; | |||
for (int i = 0; i < getNumItems(); ++i) | |||
existingItems.add (getItemText (i)); | |||
if (existingItems != items) | |||
{ | |||
clear(); | |||
for (int i = 0; i < items.size(); ++i) | |||
addItem (items[i], i + 1); | |||
} | |||
} | |||
setEditableText (state [Ids::editable]); | |||
setJustificationType ((int) state [Ids::textJustification]); | |||
setTextWhenNothingSelected (state [Ids::unselectedText].toString()); | |||
setTextWhenNoChoicesAvailable (state [Ids::noItemsText].toString()); | |||
} |
@@ -338,14 +338,6 @@ public: | |||
arrowColourId = 0x1000e00, /**< The colour for the arrow shape that pops up the menu */ | |||
}; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, items, editable, textJustification, unselectedText, noItemsText; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
//============================================================================== | |||
/** @internal */ | |||
void labelTextChanged (Label*); | |||
@@ -76,28 +76,3 @@ void ImageComponent::paint (Graphics& g) | |||
g.setOpacity (1.0f); | |||
g.drawImageWithin (image, 0, 0, getWidth(), getHeight(), placement, false); | |||
} | |||
const Identifier ImageComponent::Ids::tagType ("IMAGECOMPONENT"); | |||
const Identifier ImageComponent::Ids::image ("image"); | |||
const Identifier ImageComponent::Ids::placement ("placement"); | |||
void ImageComponent::refreshFromValueTree (const ValueTree& state, ComponentBuilder& builder) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
Image newImage; | |||
const var imageIdentifier (state [Ids::image]); | |||
ComponentBuilder::ImageProvider* const imageProvider = builder.getImageProvider(); | |||
jassert (imageProvider != nullptr || imageIdentifier.isVoid()); | |||
if (imageProvider != nullptr) | |||
newImage = imageProvider->getImageForIdentifier (imageIdentifier); | |||
setImage (newImage, getPlacement (state)); | |||
} | |||
RectanglePlacement ImageComponent::getPlacement (const ValueTree& state) | |||
{ | |||
return RectanglePlacement (static_cast <int> (state [Ids::placement])); | |||
} |
@@ -67,15 +67,6 @@ public: | |||
/** Returns the current image placement. */ | |||
const RectanglePlacement getImagePlacement() const; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, image, placement; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
static RectanglePlacement getPlacement (const ValueTree& state); | |||
//============================================================================== | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
@@ -448,22 +448,3 @@ void Label::textEditorFocusLost (TextEditor& ed) | |||
{ | |||
textEditorTextChanged (ed); | |||
} | |||
const Identifier Label::Ids::tagType ("LABEL"); | |||
const Identifier Label::Ids::text ("text"); | |||
const Identifier Label::Ids::font ("font"); | |||
const Identifier Label::Ids::editMode ("editMode"); | |||
const Identifier Label::Ids::justification ("justification"); | |||
const Identifier Label::Ids::focusLossDiscardsChanges ("focusLossDiscardsChanges"); | |||
void Label::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setText (state [Ids::text].toString(), false); | |||
setFont (Font::fromString (state [Ids::font])); | |||
const int editMode = static_cast <int> (state [Ids::editMode]); | |||
setEditable (editMode == 2, editMode == 3, static_cast <bool> (state [Ids::focusLossDiscardsChanges])); | |||
setJustificationType (static_cast <int> (state [Ids::justification])); | |||
} |
@@ -253,14 +253,6 @@ public: | |||
/** Returns true if the editor is currently focused and active. */ | |||
bool isBeingEdited() const noexcept; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, text, font, editMode, justification, focusLossDiscardsChanges; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
protected: | |||
//============================================================================== | |||
/** Creates the TextEditor component that will be used when the user has clicked on the label. | |||
@@ -928,19 +928,6 @@ void ListBox::startDragAndDrop (const MouseEvent& e, const var& dragDescription, | |||
} | |||
} | |||
//============================================================================== | |||
const Identifier ListBox::Ids::rowHeight ("rowHeight"); | |||
const Identifier ListBox::Ids::borderThickness ("borderThickness"); | |||
void ListBox::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setRowHeight (state.getProperty (Ids::rowHeight, defaultListRowHeight)); | |||
setOutlineThickness (state.getProperty (Ids::borderThickness, 0)); | |||
} | |||
//============================================================================== | |||
Component* ListBoxModel::refreshComponentForRow (int, bool, Component* existingComponentToUpdate) | |||
{ | |||
@@ -525,14 +525,6 @@ public: | |||
*/ | |||
Viewport* getViewport() const noexcept; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier rowHeight, borderThickness; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
//============================================================================== | |||
/** @internal */ | |||
bool keyPressed (const KeyPress&); | |||
@@ -1566,33 +1566,3 @@ void Slider::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel | |||
void SliderListener::sliderDragStarted (Slider*) {} // (can't write Slider::Listener due to idiotic VC2005 bug) | |||
void SliderListener::sliderDragEnded (Slider*) {} | |||
//============================================================================== | |||
const Identifier Slider::Ids::tagType ("SLIDER"); | |||
const Identifier Slider::Ids::min ("min"); | |||
const Identifier Slider::Ids::max ("max"); | |||
const Identifier Slider::Ids::interval ("interval"); | |||
const Identifier Slider::Ids::type ("type"); | |||
const Identifier Slider::Ids::editable ("editable"); | |||
const Identifier Slider::Ids::textBoxPos ("textBoxPos"); | |||
const Identifier Slider::Ids::textBoxWidth ("textBoxWidth"); | |||
const Identifier Slider::Ids::textBoxHeight ("textBoxHeight"); | |||
const Identifier Slider::Ids::skew ("skew"); | |||
void Slider::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setRange (static_cast <double> (state [Ids::min]), | |||
static_cast <double> (state [Ids::max]), | |||
static_cast <double> (state [Ids::interval])); | |||
setSliderStyle ((SliderStyle) static_cast <int> (state [Ids::type])); | |||
setTextBoxStyle ((TextEntryBoxPosition) static_cast <int> (state [Ids::textBoxPos]), | |||
! static_cast <bool> (state [Ids::editable]), | |||
static_cast <int> (state [Ids::textBoxWidth]), | |||
static_cast <int> (state [Ids::textBoxHeight])); | |||
setSkewFactor (static_cast <double> (state [Ids::skew])); | |||
} |
@@ -780,15 +780,6 @@ public: | |||
textBoxOutlineColourId = 0x1001700 /**< The colour to use for a border around the text-editor box. */ | |||
}; | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, min, max, interval, type, editable, | |||
textBoxPos, textBoxWidth, textBoxHeight, skew; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
protected: | |||
//============================================================================== | |||
/** @internal */ | |||
@@ -2611,32 +2611,3 @@ void TextEditor::Listener::textEditorTextChanged (TextEditor&) {} | |||
void TextEditor::Listener::textEditorReturnKeyPressed (TextEditor&) {} | |||
void TextEditor::Listener::textEditorEscapeKeyPressed (TextEditor&) {} | |||
void TextEditor::Listener::textEditorFocusLost (TextEditor&) {} | |||
//============================================================================== | |||
const Identifier TextEditor::Ids::tagType ("TEXTEDITOR"); | |||
const Identifier TextEditor::Ids::text ("text"); | |||
const Identifier TextEditor::Ids::font ("font"); | |||
const Identifier TextEditor::Ids::mode ("mode"); | |||
const Identifier TextEditor::Ids::readOnly ("readOnly"); | |||
const Identifier TextEditor::Ids::scrollbarsShown ("scrollbarsShown"); | |||
const Identifier TextEditor::Ids::caretVisible ("caretVisible"); | |||
const Identifier TextEditor::Ids::popupMenuEnabled ("popupMenuEnabled"); | |||
void TextEditor::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) | |||
{ | |||
ComponentBuilder::refreshBasicComponentProperties (*this, state); | |||
setReadOnly (state [Ids::readOnly]); | |||
setScrollbarsShown (state [Ids::scrollbarsShown]); | |||
setCaretVisible (state [Ids::caretVisible]); | |||
setPopupMenuEnabled (state [Ids::popupMenuEnabled]); | |||
const int mode = state [Ids::mode]; | |||
setMultiLine (mode > 1, true); | |||
setReturnKeyStartsNewLine (mode != 3); | |||
const Font font (Font::fromString (state [Ids::font])); | |||
if (getFont() != font) | |||
applyFontToAllText (font); | |||
setText (state [Ids::text].toString()); | |||
} |
@@ -534,15 +534,6 @@ public: | |||
*/ | |||
virtual void performPopupMenuAction (int menuItemID); | |||
//============================================================================== | |||
struct Ids | |||
{ | |||
static const Identifier tagType, text, font, mode, readOnly, scrollbarsShown, | |||
caretVisible, popupMenuEnabled; | |||
}; | |||
void refreshFromValueTree (const ValueTree&, ComponentBuilder&); | |||
//============================================================================== | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
@@ -501,7 +501,7 @@ void ResizableWindow::updateLastPos() | |||
void ResizableWindow::parentSizeChanged() | |||
{ | |||
if (isFullScreen() && getParentComponent() != nullptr) | |||
setBounds (0, 0, getParentWidth(), getParentHeight()); | |||
setBounds (getParentComponent()->getLocalBounds()); | |||
} | |||
//============================================================================== | |||