Browse Source

Modal mouse event fix. Jucer development.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
2bb19e2a4d
22 changed files with 477 additions and 142 deletions
  1. +12
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_ComboBox.h
  2. +6
    -0
      extras/Jucer (experimental)/Source/model/Component Types/jucer_ComponentTypeManager.cpp
  3. +62
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_ComponentTypeManager.h
  4. +7
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_GroupComponent.h
  5. +12
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_Label.h
  6. +16
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_Slider.h
  7. +7
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_TabbedComponent.h
  8. +12
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_TextButton.h
  9. +17
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_TextEditor.h
  10. +10
    -1
      extras/Jucer (experimental)/Source/model/Component Types/jucer_ToggleButton.h
  11. +3
    -2
      extras/Jucer (experimental)/Source/model/jucer_ComponentDocument.cpp
  12. +2
    -0
      extras/Jucer (experimental)/Source/model/jucer_ComponentDocument.h
  13. +1
    -0
      extras/Jucer (experimental)/Source/ui/Component Editor/jucer_ComponentEditor.cpp
  14. +107
    -36
      extras/Jucer (experimental)/Source/utility/jucer_ColourEditorComponent.h
  15. +20
    -0
      extras/Jucer (experimental)/Source/utility/jucer_StoredSettings.cpp
  16. +2
    -0
      extras/Jucer (experimental)/Source/utility/jucer_StoredSettings.h
  17. +43
    -0
      extras/Jucer (experimental)/Source/utility/jucer_ValueRemapperSource.h
  18. +80
    -56
      juce_amalgamated.cpp
  19. +18
    -9
      juce_amalgamated.h
  20. +1
    -1
      src/core/juce_StandardHeader.h
  21. +38
    -28
      src/gui/components/mouse/juce_MouseInputSource.cpp
  22. +1
    -1
      src/gui/graphics/geometry/juce_RectangleList.h

+ 12
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_ComboBox.h View File

@@ -34,7 +34,15 @@
class ComboBoxHandler : public ComponentTypeHelper<ComboBox>
{
public:
ComboBoxHandler() : ComponentTypeHelper<ComboBox> ("ComboBox", "COMBOBOX", "comboBox") {}
ComboBoxHandler() : ComponentTypeHelper<ComboBox> ("ComboBox", "COMBOBOX", "comboBox")
{
addEditableColour (ComboBox::backgroundColourId, "Background", "backgroundColour");
addEditableColour (ComboBox::textColourId, "Text", "textColour");
addEditableColour (ComboBox::outlineColourId, "Outline", "outlineColour");
addEditableColour (ComboBox::buttonColourId, "Button", "buttonColour");
addEditableColour (ComboBox::arrowColourId, "Arrow", "arrowColour");
}
~ComboBoxHandler() {}
Component* createComponent() { return new ComboBox (String::empty); }
@@ -50,6 +58,9 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
addEditableColourProperties (document, state, props);
}
};


+ 6
- 0
extras/Jucer (experimental)/Source/model/Component Types/jucer_ComponentTypeManager.cpp View File

@@ -175,6 +175,12 @@ void ComponentTypeHandler::updateComponent (ComponentDocument& document, Compone
comp->setBounds (pos.resolve (document));
comp->setName (state [ComponentDocument::compNameProperty]);
comp->setExplicitFocusOrder (state [ComponentDocument::compFocusOrderProperty]);
SettableTooltipClient* tooltipClient = dynamic_cast <SettableTooltipClient*> (comp);
if (tooltipClient != 0)
tooltipClient->setTooltip (state [ComponentDocument::compTooltipProperty]);
}
void ComponentTypeHandler::initialiseNewItem (ComponentDocument& document, ValueTree& state)


+ 62
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_ComponentTypeManager.h View File

@@ -28,6 +28,7 @@
#include "../../jucer_Headers.h"
#include "../jucer_ComponentDocument.h"
#include "../../utility/jucer_ColourEditorComponent.h"
//==============================================================================
@@ -92,6 +93,7 @@ template <class ComponentClass>
class ComponentTypeHelper : public ComponentTypeHandler
{
public:
//==============================================================================
ComponentTypeHelper (const String& name_, const String& xmlTag_, const String& memberNameRoot_)
: ComponentTypeHandler (name_, xmlTag_, memberNameRoot_)
{
@@ -105,6 +107,7 @@ public:
ComponentClass* const c = dynamic_cast <ComponentClass*> (comp);
jassert (c != 0);
updateComponentColours (state, c);
update (document, c, state);
}
@@ -123,9 +126,67 @@ public:
ComponentTypeHandler::createPropertyEditors (document, state, props);
createProperties (document, state, props);
}
};
protected:
//==============================================================================
void addTooltipProperty (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
props.add (new TextPropertyComponent (getValue (ComponentDocument::compTooltipProperty, state, document),
"Tooltip", 4096, false));
}
void addFocusOrderProperty (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
props.add (new TextPropertyComponent (Value (new IntegerValueSource (getValue (ComponentDocument::compFocusOrderProperty,
state, document))),
"Focus Order", 10, false));
}
//==============================================================================
struct EditableColour
{
int colourId;
String name, propertyName;
PropertyComponent* createProperty (ComponentTypeHelper& type, ComponentDocument& document, ValueTree& state)
{
return new ColourPropertyComponent (document, name, type.getValue (propertyName, state, document),
LookAndFeel::getDefaultLookAndFeel().findColour (colourId), true);
}
void updateComponent (const ValueTree& state, Component* component)
{
const String colour (state [propertyName].toString());
if (colour.isNotEmpty())
component->setColour (colourId, Colour::fromString (colour));
else
component->removeColour (colourId);
}
};
Array <EditableColour> editableColours;
void addEditableColour (int colourId, const String& displayName, const String& propertyName)
{
EditableColour ec;
ec.colourId = colourId;
ec.name = displayName;
ec.propertyName = propertyName;
editableColours.add (ec);
}
void addEditableColourProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
for (int i = 0; i < editableColours.size(); ++i)
props.add (editableColours.getReference(i).createProperty (*this, document, state));
}
void updateComponentColours (const ValueTree& state, Component* component)
{
for (int i = 0; i < editableColours.size(); ++i)
editableColours.getReference(i).updateComponent (state, component);
}
};
#endif // __JUCER_COMPONENTTYPEMANAGER_H_734EBF1__

+ 7
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_GroupComponent.h View File

@@ -34,7 +34,12 @@
class GroupComponentHandler : public ComponentTypeHelper<GroupComponent>
{
public:
GroupComponentHandler() : ComponentTypeHelper<GroupComponent> ("GroupComponent", "GROUPCOMPONENT", "group") {}
GroupComponentHandler() : ComponentTypeHelper<GroupComponent> ("GroupComponent", "GROUPCOMPONENT", "group")
{
addEditableColour (GroupComponent::outlineColourId, "Outline", "outlineColour");
addEditableColour (GroupComponent::textColourId, "Text Colour", "textColour");
}
~GroupComponentHandler() {}
Component* createComponent() { return new GroupComponent (String::empty, String::empty); }
@@ -50,6 +55,7 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addEditableColourProperties (document, state, props);
}
};


+ 12
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_Label.h View File

@@ -34,7 +34,13 @@
class LabelHandler : public ComponentTypeHelper<Label>
{
public:
LabelHandler() : ComponentTypeHelper<Label> ("Label", "LABEL", "label") {}
LabelHandler() : ComponentTypeHelper<Label> ("Label", "LABEL", "label")
{
addEditableColour (Label::backgroundColourId, "Background", "backgroundColour");
addEditableColour (Label::textColourId, "Text Colour", "textColour");
addEditableColour (Label::outlineColourId, "Outline Colour", "outlineColour");
}
~LabelHandler() {}
Component* createComponent() { return new Label (String::empty, String::empty); }
@@ -52,8 +58,13 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
props.add (new TextPropertyComponent (getValue ("text", state, document), "Text", 16384, true));
props.getLast()->setTooltip ("The label's text.");
addEditableColourProperties (document, state, props);
}
};


+ 16
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_Slider.h View File

@@ -34,7 +34,19 @@
class SliderHandler : public ComponentTypeHelper<Slider>
{
public:
SliderHandler() : ComponentTypeHelper<Slider> ("Slider", "SLIDER", "slider") {}
SliderHandler() : ComponentTypeHelper<Slider> ("Slider", "SLIDER", "slider")
{
addEditableColour (Slider::backgroundColourId, "Background", "backgroundColour");
addEditableColour (Slider::thumbColourId, "Thumb", "thumbColour");
addEditableColour (Slider::trackColourId, "Track", "trackColour");
addEditableColour (Slider::rotarySliderFillColourId, "Rotary Fill", "rotaryFillColour");
addEditableColour (Slider::rotarySliderOutlineColourId, "Rotary Outline", "rotaryOutlineColour");
addEditableColour (Slider::textBoxTextColourId, "Text", "textColour");
addEditableColour (Slider::textBoxBackgroundColourId, "Text Background", "textBackgroundColour");
addEditableColour (Slider::textBoxHighlightColourId, "Text Highlight", "textHighlightColour");
addEditableColour (Slider::textBoxOutlineColourId, "Textbox Outline", "textboxOutlineColour");
}
~SliderHandler() {}
Component* createComponent() { return new Slider (String::empty); }
@@ -50,6 +62,9 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
addEditableColourProperties (document, state, props);
}
};


+ 7
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_TabbedComponent.h View File

@@ -34,7 +34,12 @@
class TabbedComponentHandler : public ComponentTypeHelper<TabbedComponent>
{
public:
TabbedComponentHandler() : ComponentTypeHelper<TabbedComponent> ("TabbedComponent", "TABBEDCOMPONENT", "tabbedComponent") {}
TabbedComponentHandler() : ComponentTypeHelper<TabbedComponent> ("TabbedComponent", "TABBEDCOMPONENT", "tabbedComponent")
{
addEditableColour (TabbedComponent::backgroundColourId, "Background", "backgroundColour");
addEditableColour (TabbedComponent::outlineColourId, "Outline", "outlineColour");
}
~TabbedComponentHandler() {}
Component* createComponent() { return new TabbedComponent (TabbedButtonBar::TabsAtTop); }
@@ -50,6 +55,7 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addEditableColourProperties (document, state, props);
}
};


+ 12
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_TextButton.h View File

@@ -34,7 +34,12 @@
class TextButtonHandler : public ComponentTypeHelper<TextButton>
{
public:
TextButtonHandler() : ComponentTypeHelper<TextButton> ("TextButton", "TEXTBUTTON", "textButton") {}
TextButtonHandler() : ComponentTypeHelper<TextButton> ("TextButton", "TEXTBUTTON", "textButton")
{
addEditableColour (TextButton::buttonColourId, "Background", "backgroundColour");
addEditableColour (TextButton::textColourOffId, "Text Colour", "textColour");
}
~TextButtonHandler() {}
Component* createComponent() { return new TextButton (String::empty); }
@@ -52,9 +57,15 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
props.add (new TextPropertyComponent (getValue ("text", state, document), "Button Text", 1024, false));
props.getLast()->setTooltip ("The button's text.");
addEditableColourProperties (document, state, props);
}
};
#endif

+ 17
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_TextEditor.h View File

@@ -34,7 +34,18 @@
class TextEditorHandler : public ComponentTypeHelper<TextEditor>
{
public:
TextEditorHandler() : ComponentTypeHelper<TextEditor> ("TextEditor", "TEXTEDITOR", "textEditor") {}
TextEditorHandler() : ComponentTypeHelper<TextEditor> ("TextEditor", "TEXTEDITOR", "textEditor")
{
addEditableColour (TextEditor::backgroundColourId, "Background", "backgroundColour");
addEditableColour (TextEditor::textColourId, "Text", "textColour");
addEditableColour (TextEditor::highlightColourId, "Highlight", "highlightColour");
addEditableColour (TextEditor::highlightedTextColourId, "Highlighted Text", "highlightedTextColour");
addEditableColour (TextEditor::caretColourId, "Caret", "caretColour");
addEditableColour (TextEditor::outlineColourId, "Outline", "outlineColour");
addEditableColour (TextEditor::focusedOutlineColourId, "Outline (focused)", "focusedOutlineColour");
addEditableColour (TextEditor::shadowColourId, "Shadow", "shadowColour");
}
~TextEditorHandler() {}
Component* createComponent() { return new TextEditor(); }
@@ -52,8 +63,13 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
props.add (new TextPropertyComponent (getValue ("text", state, document), "Text", 16384, true));
props.getLast()->setTooltip ("The editor's initial content.");
addEditableColourProperties (document, state, props);
}
};


+ 10
- 1
extras/Jucer (experimental)/Source/model/Component Types/jucer_ToggleButton.h View File

@@ -34,7 +34,11 @@
class ToggleButtonHandler : public ComponentTypeHelper<ToggleButton>
{
public:
ToggleButtonHandler() : ComponentTypeHelper<ToggleButton> ("ToggleButton", "TOGGLEBUTTON", "toggleButton") {}
ToggleButtonHandler() : ComponentTypeHelper<ToggleButton> ("ToggleButton", "TOGGLEBUTTON", "toggleButton")
{
addEditableColour (ToggleButton::textColourId, "Text Colour", "textColour");
}
~ToggleButtonHandler() {}
Component* createComponent() { return new ToggleButton (String::empty); }
@@ -52,8 +56,13 @@ public:
void createProperties (ComponentDocument& document, ValueTree& state, Array <PropertyComponent*>& props)
{
addTooltipProperty (document, state, props);
addFocusOrderProperty (document, state, props);
props.add (new TextPropertyComponent (getValue ("text", state, document), "Button Text", 1024, false));
props.getLast()->setTooltip ("The button's text.");
addEditableColourProperties (document, state, props);
}
};


+ 3
- 2
extras/Jucer (experimental)/Source/model/jucer_ComponentDocument.cpp View File

@@ -42,6 +42,8 @@ const char* const ComponentDocument::idProperty = "id";
const char* const ComponentDocument::compBoundsProperty = "position";
const char* const ComponentDocument::memberNameProperty = "memberName";
const char* const ComponentDocument::compNameProperty = "name";
const char* const ComponentDocument::compTooltipProperty = "tooltip";
const char* const ComponentDocument::compFocusOrderProperty = "focusOrder";
const char* const ComponentDocument::markerNameProperty = "name";
const char* const ComponentDocument::markerPosProperty = "position";
@@ -178,8 +180,7 @@ void ComponentDocument::writeMetadata (OutputStream& out)
if (xml != 0)
xml->writeToStream (out, String::empty, false, false);
out << newLine
<< metadataTagEnd << newLine;
out << newLine << metadataTagEnd;
}
bool ComponentDocument::save()


+ 2
- 0
extras/Jucer (experimental)/Source/model/jucer_ComponentDocument.h View File

@@ -160,6 +160,8 @@ public:
static const char* const compBoundsProperty;
static const char* const memberNameProperty;
static const char* const compNameProperty;
static const char* const compTooltipProperty;
static const char* const compFocusOrderProperty;
static const char* const markerNameProperty;
static const char* const markerPosProperty;


+ 1
- 0
extras/Jucer (experimental)/Source/ui/Component Editor/jucer_ComponentEditor.cpp View File

@@ -292,6 +292,7 @@ public:
private:
ComponentDocument document;
ComponentEditorCanvas::SelectedItems selected;
TooltipWindow tooltipWindow;
};
void ComponentEditor::test()


+ 107
- 36
extras/Jucer (experimental)/Source/utility/jucer_ColourEditorComponent.h View File

@@ -33,22 +33,28 @@
a colour selector when you click it.
*/
class ColourEditorComponent : public Component,
public ChangeListener
public ChangeListener,
public Value::Listener
{
public:
ColourEditorComponent (const bool canResetToDefault_)
: canResetToDefault (canResetToDefault_)
ColourEditorComponent (ComponentDocument& document_, const Value& colourValue_,
const Colour& defaultColour_, const bool canResetToDefault_)
: document (document_), colourValue (colourValue_), defaultColour (defaultColour_),
canResetToDefault (canResetToDefault_)
{
colourValue.addListener (this);
}
~ColourEditorComponent()
{
colourValue.removeListener (this);
}
void paint (Graphics& g)
{
g.fillAll (Colours::grey);
const Colour colour (getColour());
g.fillAll (Colours::grey);
g.fillCheckerBoard (2, 2, getWidth() - 4, getHeight() - 4,
10, 10,
Colour (0xffdddddd).overlaidWith (colour),
@@ -61,43 +67,85 @@ public:
Justification::centred, 1);
}
virtual void setColour (const Colour& newColour) = 0;
virtual void resetToDefault() = 0;
virtual const Colour getColour() const = 0;
const Colour getColour() const
{
if (colourValue.toString().isEmpty())
return defaultColour;
return Colour::fromString (colourValue.toString());
}
void setColour (const Colour& newColour)
{
if (getColour() != newColour)
{
if (newColour == defaultColour && canResetToDefault)
colourValue = var();
else
colourValue = newColour.toDisplayString (true);
}
}
void resetToDefault()
{
setColour (defaultColour);
}
void refresh()
{
const Colour col (getColour());
if (col != colour)
if (col != lastColour)
{
colour = col;
lastColour = col;
repaint();
}
}
void mouseDown (const MouseEvent& e)
{
ColourSelectorComp colourSelector (this, canResetToDefault);
SafePointer<Component> deletionChecker (this);
{
ColourSelectorComp colourSelector (this, canResetToDefault);
PopupMenu m;
m.addCustomItem (1234, &colourSelector, 300, 400, false);
m.showAt (this);
if (deletionChecker == 0)
return;
}
const Colour newColour (getColour());
document.getUndoManager()->undoCurrentTransactionOnly();
setColour (newColour);
}
PopupMenu m;
m.addCustomItem (1234, &colourSelector, 300, 400, false);
m.showAt (this);
void valueChanged (Value&)
{
refresh();
}
void changeListenerCallback (void* source)
{
const ColourSelector* const cs = (const ColourSelector*) source;
ColourSelector* cs = static_cast <ColourSelector*> (source);
if (cs->getCurrentColour() != getColour())
{
document.getUndoManager()->undoCurrentTransactionOnly();
setColour (cs->getCurrentColour());
}
}
juce_UseDebuggingNewOperator
private:
Colour colour;
bool canResetToDefault;
ComponentDocument& document;
Value colourValue;
Colour lastColour;
const Colour defaultColour;
const bool canResetToDefault;
class ColourSelectorComp : public Component,
public ButtonListener
@@ -106,36 +154,35 @@ private:
ColourSelectorComp (ColourEditorComponent* owner_,
const bool canResetToDefault)
: owner (owner_),
defaultButton (0)
defaultButton ("Reset to Default")
{
addAndMakeVisible (selector = new ColourSelectorWithSwatches());
selector->setName ("Colour");
selector->setCurrentColour (owner->getColour());
selector->addChangeListener (owner);
addAndMakeVisible (&selector);
selector.setName ("Colour");
selector.setCurrentColour (owner->getColour());
selector.addChangeListener (owner);
if (canResetToDefault)
{
addAndMakeVisible (defaultButton = new TextButton ("Reset to Default"));
defaultButton->addButtonListener (this);
addAndMakeVisible (&defaultButton);
defaultButton.addButtonListener (this);
}
}
~ColourSelectorComp()
{
deleteAllChildren();
}
void resized()
{
if (defaultButton != 0)
if (defaultButton.isVisible())
{
selector->setBounds (0, 0, getWidth(), getHeight() - 30);
defaultButton->changeWidthToFitText (22);
defaultButton->setTopLeftPosition (10, getHeight() - 26);
selector.setBounds (0, 0, getWidth(), getHeight() - 30);
defaultButton.changeWidthToFitText (22);
defaultButton.setTopLeftPosition (10, getHeight() - 26);
}
else
{
selector->setBounds (0, 0, getWidth(), getHeight());
selector.setBounds (0, 0, getWidth(), getHeight());
}
}
@@ -143,7 +190,7 @@ private:
{
owner->resetToDefault();
owner->refresh();
selector->setCurrentColour (owner->getColour());
selector.setCurrentColour (owner->getColour());
}
private:
@@ -154,10 +201,6 @@ private:
{
}
~ColourSelectorWithSwatches()
{
}
int getNumSwatches() const
{
return StoredSettings::getInstance()->swatchColours.size();
@@ -175,10 +218,38 @@ private:
};
ColourEditorComponent* owner;
ColourSelectorWithSwatches* selector;
TextButton* defaultButton;
ColourSelectorWithSwatches selector;
TextButton defaultButton;
};
};
//==============================================================================
class ColourPropertyComponent : public PropertyComponent
{
public:
//==============================================================================
ColourPropertyComponent (ComponentDocument& document, const String& name, const Value& colour,
const Colour& defaultColour, bool canResetToDefault)
: PropertyComponent (name),
colourEditor (document, colour, defaultColour, canResetToDefault)
{
addAndMakeVisible (&colourEditor);
}
~ColourPropertyComponent()
{
}
void resized()
{
colourEditor.setBounds (getLookAndFeel().getPropertyComponentContentPosition (*this));
}
void refresh() {}
protected:
ColourEditorComponent colourEditor;
};
#endif // __JUCER_COLOUREDITORCOMPONENT_JUCEHEADER__

+ 20
- 0
extras/Jucer (experimental)/Source/utility/jucer_StoredSettings.cpp View File

@@ -78,6 +78,26 @@ void StoredSettings::flush()
// recent files...
recentFiles.restoreFromString (props->getValue ("recentFiles"));
recentFiles.removeNonExistentFiles();
// swatch colours...
swatchColours.clear();
#define COL(col) Colours::col,
const Colour colours[] =
{
#include "jucer_Colours.h"
Colours::transparentBlack
};
#undef COL
for (int i = 0; i < numSwatchColours; ++i)
{
Colour defaultCol (colours [2 + i]);
swatchColours.add (Colour (props->getValue ("swatchColour" + String (i),
hexString8Digits (defaultCol.getARGB())).getHexValue32()));
}
}
const File StoredSettings::getLastProject() const


+ 2
- 0
extras/Jucer (experimental)/Source/utility/jucer_StoredSettings.h View File

@@ -53,6 +53,8 @@ public:
const File getLastKnownJuceFolder() const;
void setLastKnownJuceFolder (const File& file);
Array <Colour> swatchColours;
//==============================================================================
juce_UseDebuggingNewOperator


+ 43
- 0
extras/Jucer (experimental)/Source/utility/jucer_ValueRemapperSource.h View File

@@ -108,5 +108,48 @@ protected:
const ValueRemapperSource& operator= (const ValueRemapperSource&);
};
//==============================================================================
/**
*/
class IntegerValueSource : public Value::ValueSource,
public Value::Listener
{
public:
IntegerValueSource (const Value& sourceValue_)
: sourceValue (sourceValue_)
{
sourceValue.addListener (this);
}
~IntegerValueSource() {}
const var getValue() const
{
return (int) sourceValue.getValue();
}
void setValue (const var& newValue)
{
const var newVal ((int) newValue);
if (newVal != sourceValue)
sourceValue = newVal;
}
void valueChanged (Value&)
{
sendChangeMessage (true);
}
//==============================================================================
juce_UseDebuggingNewOperator
protected:
Value sourceValue;
IntegerValueSource (const IntegerValueSource&);
const IntegerValueSource& operator= (const IntegerValueSource&);
};
#endif // __JUCER_VALUEREMAPPERSOURCE_JUCEHEADER__

+ 80
- 56
juce_amalgamated.cpp View File

@@ -174,11 +174,11 @@
#endif

#ifndef JUCE_ASIO
#define JUCE_ASIO 1
#define JUCE_ASIO 0
#endif

#ifndef JUCE_WASAPI
#define JUCE_WASAPI 1
#define JUCE_WASAPI 0
#endif

#ifndef JUCE_DIRECTSOUND
@@ -190,11 +190,11 @@
#endif

#ifndef JUCE_JACK
#define JUCE_JACK 1
#define JUCE_JACK 0
#endif

#if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC))
#define JUCE_QUICKTIME 1
#define JUCE_QUICKTIME 0
#endif

#if (JUCE_IPHONE || JUCE_LINUX) && JUCE_QUICKTIME
@@ -214,15 +214,15 @@
#endif

#if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC)
#define JUCE_USE_CDBURNER 1
#define JUCE_USE_CDBURNER 0
#endif

#ifndef JUCE_USE_CDREADER
#define JUCE_USE_CDREADER 1
#define JUCE_USE_CDREADER 0
#endif

#if (JUCE_QUICKTIME || JUCE_WINDOWS) && ! defined (JUCE_USE_CAMERA)
#define JUCE_USE_CAMERA 1
#define JUCE_USE_CAMERA 0
#endif

#ifndef JUCE_ENABLE_REPAINT_DEBUGGING
@@ -44260,6 +44260,11 @@ void CodeEditorComponent::loadContent (const String& newContent)
scrollToLine (0);
}

bool CodeEditorComponent::isTextInputActive() const
{
return true;
}

void CodeEditorComponent::codeDocumentChanged (const CodeDocument::Position& affectedTextStart,
const CodeDocument::Position& affectedTextEnd)
{
@@ -51628,6 +51633,11 @@ bool TextEditor::isReadOnly() const
return readOnly || ! isEnabled();
}

bool TextEditor::isTextInputActive() const
{
return ! isReadOnly();
}

void TextEditor::setReturnKeyStartsNewLine (const bool shouldStartNewLine)
{
returnKeyStartsNewLine = shouldStartNewLine;
@@ -69646,7 +69656,8 @@ public:

MouseInputSourceInternal (MouseInputSource& source_, const int index_, const bool isMouseDevice_)
: index (index_), isMouseDevice (isMouseDevice_), source (source_), lastPeer (0), lastTime (0),
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (0)
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (0),
mouseEventCounter (0)
{
zerostruct (mouseDowns);
}
@@ -69742,42 +69753,47 @@ public:
comp->internalMouseWheel (source, comp->globalPositionToRelative (screenPos), time, x, y);
}

void setButtons (const Point<int>& screenPos, const int64 time, const ModifierKeys& newButtonState)
// (returns true if the button change caused a modal event loop)
bool setButtons (const Point<int>& screenPos, const int64 time, const ModifierKeys& newButtonState)
{
if (buttonState != newButtonState)
if (buttonState == newButtonState)
return false;

// (ignore secondary clicks when there's already a button down)
if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown())
{
// (ignore secondary clicks when there's already a button down)
if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown())
{
buttonState = newButtonState;
return;
}
buttonState = newButtonState;
return false;
}

if (buttonState.isAnyMouseButtonDown())
{
Component* const current = getComponentUnderMouse();
const int lastCounter = mouseEventCounter;

if (current != 0)
sendMouseUp (current, screenPos + unboundedMouseOffset, time);
if (buttonState.isAnyMouseButtonDown())
{
Component* const current = getComponentUnderMouse();

enableUnboundedMouseMovement (false, false);
}
if (current != 0)
sendMouseUp (current, screenPos + unboundedMouseOffset, time);

buttonState = newButtonState;
enableUnboundedMouseMovement (false, false);
}

if (buttonState.isAnyMouseButtonDown())
{
Desktop::getInstance().incrementMouseClickCounter();
buttonState = newButtonState;

Component* const current = getComponentUnderMouse();
if (buttonState.isAnyMouseButtonDown())
{
Desktop::getInstance().incrementMouseClickCounter();

if (current != 0)
{
registerMouseDown (screenPos, time, current);
sendMouseDown (current, screenPos, time);
}
Component* const current = getComponentUnderMouse();

if (current != 0)
{
registerMouseDown (screenPos, time, current);
sendMouseDown (current, screenPos, time);
}
}

return lastCounter != mouseEventCounter;
}

void setComponentUnderMouse (Component* const newComponent, const Point<int>& screenPos, const int64 time)
@@ -69855,6 +69871,7 @@ public:
{
jassert (newPeer != 0);
lastTime = time;
++mouseEventCounter;
const Point<int> screenPos (newPeer->relativePositionToGlobal (positionWithinPeer));

if (isDragging() && newMods.isAnyMouseButtonDown())
@@ -69868,11 +69885,12 @@ public:
ComponentPeer* peer = getPeer();
if (peer != 0)
{
setButtons (screenPos, time, newMods);
if (setButtons (screenPos, time, newMods))
return; // some modal events have been dispatched, so the current event is now out-of-date

peer = getPeer();
if (peer != 0)
setScreenPos (peer->relativePositionToGlobal (positionWithinPeer), time, false);
setScreenPos (screenPos, time, false);
}
}
}
@@ -69881,6 +69899,7 @@ public:
{
jassert (peer != 0);
lastTime = time;
++mouseEventCounter;
const Point<int> screenPos (peer->relativePositionToGlobal (positionWithinPeer));

setPeer (peer, screenPos, time);
@@ -70036,6 +70055,7 @@ private:
Point<int> unboundedMouseOffset;
bool isUnboundedMouseModeOn, isCursorVisibleUntilOffscreen;
void* currentCursorHandle;
int mouseEventCounter;

struct RecentMouseDown
{
@@ -75919,7 +75939,11 @@ TextInputTarget* ComponentPeer::findCurrentTextInputTarget()
{
Component* const c = Component::getCurrentlyFocusedComponent();
if (component->isParentOf (c))
return dynamic_cast <TextInputTarget*> (c);
{
TextInputTarget* const ti = dynamic_cast <TextInputTarget*> (c);
if (ti != 0 && ti->isTextInputActive())
return ti;
}

return 0;
}
@@ -233523,10 +233547,10 @@ public:
return true;
}

bool write (AudioSampleBuffer& outputChannels, const int numSamples)
bool write (AudioSampleBuffer& outputChannelBuffer, const int numSamples)
{
jassert (numChannelsRunning <= outputChannels.getNumChannels());
float** const data = outputChannels.getArrayOfChannels();
jassert (numChannelsRunning <= outputChannelBuffer.getNumChannels());
float** const data = outputChannelBuffer.getArrayOfChannels();

if (isInterleaved)
{
@@ -233564,10 +233588,10 @@ public:
return true;
}

bool read (AudioSampleBuffer& inputChannels, const int numSamples)
bool read (AudioSampleBuffer& inputChannelBuffer, const int numSamples)
{
jassert (numChannelsRunning <= inputChannels.getNumChannels());
float** const data = inputChannels.getArrayOfChannels();
jassert (numChannelsRunning <= inputChannelBuffer.getNumChannels());
float** const data = inputChannelBuffer.getArrayOfChannels();

if (isInterleaved)
{
@@ -233642,8 +233666,8 @@ public:
outputDevice (0),
inputDevice (0),
numCallbacks (0),
inputChannels (1, 1),
outputChannels (1, 1)
inputChannelBuffer (1, 1),
outputChannelBuffer (1, 1)
{
initialiseRatesAndChannels();
}
@@ -233664,8 +233688,8 @@ public:
sampleRate = sampleRate_;
bufferSize = bufferSize_;

inputChannels.setSize (jmax ((int) minChansIn, inputChannels.getHighestBit()) + 1, bufferSize);
inputChannels.clear();
inputChannelBuffer.setSize (jmax ((int) minChansIn, inputChannels.getHighestBit()) + 1, bufferSize);
inputChannelBuffer.clear();
inputChannelDataForCallback.clear();
currentInputChans.clear();

@@ -233675,14 +233699,14 @@ public:
{
if (inputChannels[i])
{
inputChannelDataForCallback.add (inputChannels.getSampleData (i));
inputChannelDataForCallback.add (inputChannelBuffer.getSampleData (i));
currentInputChans.setBit (i);
}
}
}

outputChannels.setSize (jmax ((int) minChansOut, outputChannels.getHighestBit()) + 1, bufferSize);
outputChannels.clear();
outputChannelBuffer.setSize (jmax ((int) minChansOut, outputChannels.getHighestBit()) + 1, bufferSize);
outputChannelBuffer.clear();
outputChannelDataForCallback.clear();
currentOutputChans.clear();

@@ -233692,7 +233716,7 @@ public:
{
if (outputChannels[i])
{
outputChannelDataForCallback.add (outputChannels.getSampleData (i));
outputChannelDataForCallback.add (outputChannelBuffer.getSampleData (i));
currentOutputChans.setBit (i);
}
}
@@ -233784,8 +233808,8 @@ public:
deleteAndZero (inputDevice);
deleteAndZero (outputDevice);

inputChannels.setSize (1, 1);
outputChannels.setSize (1, 1);
inputChannelBuffer.setSize (1, 1);
outputChannelBuffer.setSize (1, 1);

numCallbacks = 0;
}
@@ -233802,7 +233826,7 @@ public:
{
if (inputDevice != 0)
{
if (! inputDevice->read (inputChannels, bufferSize))
if (! inputDevice->read (inputChannelBuffer, bufferSize))
{
DBG ("ALSA: read failure");
break;
@@ -233826,7 +233850,7 @@ public:
}
else
{
for (int i = 0; i < totalNumOutputChannels; ++i)
for (int i = 0; i < outputChannelDataForCallback.size(); ++i)
zeromem (outputChannelDataForCallback[i], sizeof (float) * bufferSize);
}
}
@@ -233840,7 +233864,7 @@ public:

failed (snd_pcm_avail_update (outputDevice->handle));

if (! outputDevice->write (outputChannelData, bufferSize))
if (! outputDevice->write (outputChannelBuffer, bufferSize))
{
DBG ("ALSA: write failure");
break;
@@ -233880,7 +233904,7 @@ private:

CriticalSection callbackLock;

AudioSampleBuffer inputChannels, outputChannels;
AudioSampleBuffer inputChannelBuffer, outputChannelBuffer;
Array<float*> inputChannelDataForCallback, outputChannelDataForCallback;

unsigned int minChansOut, maxChansOut;


+ 18
- 9
juce_amalgamated.h View File

@@ -43,7 +43,7 @@

#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 0
#define JUCE_BUILDNUMBER 1

#define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8) + JUCE_BUILDNUMBER)

@@ -195,11 +195,11 @@
#endif

#ifndef JUCE_ASIO
#define JUCE_ASIO 1
#define JUCE_ASIO 0
#endif

#ifndef JUCE_WASAPI
#define JUCE_WASAPI 1
#define JUCE_WASAPI 0
#endif

#ifndef JUCE_DIRECTSOUND
@@ -211,11 +211,11 @@
#endif

#ifndef JUCE_JACK
#define JUCE_JACK 1
#define JUCE_JACK 0
#endif

#if ! (defined (JUCE_QUICKTIME) || JUCE_LINUX || JUCE_IPHONE || (JUCE_WINDOWS && ! JUCE_MSVC))
#define JUCE_QUICKTIME 1
#define JUCE_QUICKTIME 0
#endif

#if (JUCE_IPHONE || JUCE_LINUX) && JUCE_QUICKTIME
@@ -235,15 +235,15 @@
#endif

#if (! defined (JUCE_USE_CDBURNER)) && ! (JUCE_WINDOWS && ! JUCE_MSVC)
#define JUCE_USE_CDBURNER 1
#define JUCE_USE_CDBURNER 0
#endif

#ifndef JUCE_USE_CDREADER
#define JUCE_USE_CDREADER 1
#define JUCE_USE_CDREADER 0
#endif

#if (JUCE_QUICKTIME || JUCE_WINDOWS) && ! defined (JUCE_USE_CAMERA)
#define JUCE_USE_CAMERA 1
#define JUCE_USE_CAMERA 0
#endif

#ifndef JUCE_ENABLE_REPAINT_DEBUGGING
@@ -3594,6 +3594,11 @@ public:
: static_cast <ObjectClass*> (0);
}

inline ObjectClass** getRawDataPointer() throw()
{
return data.elements;
}

int indexOf (const ObjectClass* const objectToLookFor) const throw()
{
const ScopedLockType lock (getLock());
@@ -12411,7 +12416,7 @@ public:

int getNumRectangles() const throw() { return rects.size(); }

const Rectangle<int> getRectangle (const int index) const throw();
const Rectangle<int> getRectangle (int index) const throw();

void clear();

@@ -16719,6 +16724,8 @@ public:

virtual ~TextInputTarget() {}

virtual bool isTextInputActive() const = 0;

virtual const Range<int> getHighlightedRegion() const = 0;

virtual void setHighlightedRegion (const Range<int>& newRange) = 0;
@@ -16907,6 +16914,7 @@ public:
void resized();
void enablementChanged();
void colourChanged();
bool isTextInputActive() const;

juce_UseDebuggingNewOperator

@@ -21226,6 +21234,7 @@ public:
void handleAsyncUpdate();
void codeDocumentChanged (const CodeDocument::Position& affectedTextStart,
const CodeDocument::Position& affectedTextEnd);
bool isTextInputActive() const;

juce_UseDebuggingNewOperator



+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -33,7 +33,7 @@
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 0
#define JUCE_BUILDNUMBER 1
/** Current Juce version number.


+ 38
- 28
src/gui/components/mouse/juce_MouseInputSource.cpp View File

@@ -42,7 +42,8 @@ public:
//==============================================================================
MouseInputSourceInternal (MouseInputSource& source_, const int index_, const bool isMouseDevice_)
: index (index_), isMouseDevice (isMouseDevice_), source (source_), lastPeer (0), lastTime (0),
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (0)
isUnboundedMouseModeOn (false), isCursorVisibleUntilOffscreen (false), currentCursorHandle (0),
mouseEventCounter (0)
{
zerostruct (mouseDowns);
}
@@ -141,42 +142,47 @@ public:
}
//==============================================================================
void setButtons (const Point<int>& screenPos, const int64 time, const ModifierKeys& newButtonState)
// (returns true if the button change caused a modal event loop)
bool setButtons (const Point<int>& screenPos, const int64 time, const ModifierKeys& newButtonState)
{
if (buttonState != newButtonState)
if (buttonState == newButtonState)
return false;
// (ignore secondary clicks when there's already a button down)
if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown())
{
// (ignore secondary clicks when there's already a button down)
if (buttonState.isAnyMouseButtonDown() == newButtonState.isAnyMouseButtonDown())
{
buttonState = newButtonState;
return;
}
buttonState = newButtonState;
return false;
}
if (buttonState.isAnyMouseButtonDown())
{
Component* const current = getComponentUnderMouse();
const int lastCounter = mouseEventCounter;
if (current != 0)
sendMouseUp (current, screenPos + unboundedMouseOffset, time);
if (buttonState.isAnyMouseButtonDown())
{
Component* const current = getComponentUnderMouse();
enableUnboundedMouseMovement (false, false);
}
if (current != 0)
sendMouseUp (current, screenPos + unboundedMouseOffset, time);
buttonState = newButtonState;
enableUnboundedMouseMovement (false, false);
}
if (buttonState.isAnyMouseButtonDown())
{
Desktop::getInstance().incrementMouseClickCounter();
buttonState = newButtonState;
Component* const current = getComponentUnderMouse();
if (buttonState.isAnyMouseButtonDown())
{
Desktop::getInstance().incrementMouseClickCounter();
if (current != 0)
{
registerMouseDown (screenPos, time, current);
sendMouseDown (current, screenPos, time);
}
Component* const current = getComponentUnderMouse();
if (current != 0)
{
registerMouseDown (screenPos, time, current);
sendMouseDown (current, screenPos, time);
}
}
return lastCounter != mouseEventCounter;
}
void setComponentUnderMouse (Component* const newComponent, const Point<int>& screenPos, const int64 time)
@@ -255,6 +261,7 @@ public:
{
jassert (newPeer != 0);
lastTime = time;
++mouseEventCounter;
const Point<int> screenPos (newPeer->relativePositionToGlobal (positionWithinPeer));
if (isDragging() && newMods.isAnyMouseButtonDown())
@@ -268,11 +275,12 @@ public:
ComponentPeer* peer = getPeer();
if (peer != 0)
{
setButtons (screenPos, time, newMods);
if (setButtons (screenPos, time, newMods))
return; // some modal events have been dispatched, so the current event is now out-of-date
peer = getPeer();
if (peer != 0)
setScreenPos (peer->relativePositionToGlobal (positionWithinPeer), time, false);
setScreenPos (screenPos, time, false);
}
}
}
@@ -281,6 +289,7 @@ public:
{
jassert (peer != 0);
lastTime = time;
++mouseEventCounter;
const Point<int> screenPos (peer->relativePositionToGlobal (positionWithinPeer));
setPeer (peer, screenPos, time);
@@ -441,6 +450,7 @@ private:
Point<int> unboundedMouseOffset;
bool isUnboundedMouseModeOn, isCursorVisibleUntilOffscreen;
void* currentCursorHandle;
int mouseEventCounter;
struct RecentMouseDown
{


+ 1
- 1
src/gui/graphics/geometry/juce_RectangleList.h View File

@@ -71,7 +71,7 @@ public:
@returns the rectangle at the index, or an empty rectangle if the
index is out-of-range.
*/
const Rectangle<int> getRectangle (const int index) const throw();
const Rectangle<int> getRectangle (int index) const throw();
//==============================================================================


Loading…
Cancel
Save