Browse Source

Added a getPropertyPanelSectionHeaderHeight() method to PropertyComponent::LookAndFeelMethods

tags/2021-05-28
ed 8 years ago
parent
commit
3eaeb3795e
4 changed files with 54 additions and 54 deletions
  1. +5
    -0
      modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
  2. +1
    -0
      modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
  3. +1
    -0
      modules/juce_gui_basics/properties/juce_PropertyComponent.h
  4. +47
    -54
      modules/juce_gui_basics/properties/juce_PropertyPanel.cpp

+ 5
- 0
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp View File

@@ -2490,6 +2490,11 @@ Rectangle<int> LookAndFeel_V2::getPropertyComponentContentPosition (PropertyComp
return Rectangle<int> (textW, 1, component.getWidth() - textW - 1, component.getHeight() - 3); return Rectangle<int> (textW, 1, component.getWidth() - textW - 1, component.getHeight() - 3);
} }
int LookAndFeel_V2::getPropertyPanelSectionHeaderHeight (const String& sectionTitle)
{
return sectionTitle.isEmpty() ? 0 : 22;
}
//============================================================================== //==============================================================================
void LookAndFeel_V2::drawCallOutBoxBackground (CallOutBox& box, Graphics& g, void LookAndFeel_V2::drawCallOutBoxBackground (CallOutBox& box, Graphics& g,
const Path& path, Image& cachedImage) const Path& path, Image& cachedImage)


+ 1
- 0
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h View File

@@ -313,6 +313,7 @@ public:
void drawPropertyComponentBackground (Graphics&, int width, int height, PropertyComponent&) override; void drawPropertyComponentBackground (Graphics&, int width, int height, PropertyComponent&) override;
void drawPropertyComponentLabel (Graphics&, int width, int height, PropertyComponent&) override; void drawPropertyComponentLabel (Graphics&, int width, int height, PropertyComponent&) override;
Rectangle<int> getPropertyComponentContentPosition (PropertyComponent&) override; Rectangle<int> getPropertyComponentContentPosition (PropertyComponent&) override;
int getPropertyPanelSectionHeaderHeight (const String& sectionTitle) override;
//============================================================================== //==============================================================================
void drawCallOutBoxBackground (CallOutBox&, Graphics&, const Path& path, Image& cachedImage) override; void drawCallOutBoxBackground (CallOutBox&, Graphics&, const Path& path, Image& cachedImage) override;


+ 1
- 0
modules/juce_gui_basics/properties/juce_PropertyComponent.h View File

@@ -127,6 +127,7 @@ public:
virtual void drawPropertyComponentBackground (Graphics&, int width, int height, PropertyComponent&) = 0; virtual void drawPropertyComponentBackground (Graphics&, int width, int height, PropertyComponent&) = 0;
virtual void drawPropertyComponentLabel (Graphics&, int width, int height, PropertyComponent&) = 0; virtual void drawPropertyComponentLabel (Graphics&, int width, int height, PropertyComponent&) = 0;
virtual Rectangle<int> getPropertyComponentContentPosition (PropertyComponent&) = 0; virtual Rectangle<int> getPropertyComponentContentPosition (PropertyComponent&) = 0;
virtual int getPropertyPanelSectionHeaderHeight (const String& sectionTitle) = 0;
}; };
protected: protected:


+ 47
- 54
modules/juce_gui_basics/properties/juce_PropertyPanel.cpp View File

@@ -31,17 +31,17 @@ struct PropertyPanel::SectionComponent : public Component
{ {
SectionComponent (const String& sectionTitle, SectionComponent (const String& sectionTitle,
const Array<PropertyComponent*>& newProperties, const Array<PropertyComponent*>& newProperties,
const bool sectionIsOpen)
bool sectionIsOpen)
: Component (sectionTitle), : Component (sectionTitle),
titleHeight (sectionTitle.isNotEmpty() ? 22 : 0),
titleHeight (getLookAndFeel().getPropertyPanelSectionHeaderHeight (sectionTitle)),
isOpen (sectionIsOpen) isOpen (sectionIsOpen)
{ {
propertyComps.addArray (newProperties); propertyComps.addArray (newProperties);
for (int i = propertyComps.size(); --i >= 0;)
for (auto* propertyComponent : propertyComps)
{ {
addAndMakeVisible (propertyComps.getUnchecked(i));
propertyComps.getUnchecked(i)->refresh();
addAndMakeVisible (propertyComponent);
propertyComponent->refresh();
} }
} }
@@ -58,45 +58,44 @@ struct PropertyPanel::SectionComponent : public Component
void resized() override void resized() override
{ {
int y = titleHeight;
auto y = titleHeight;
for (int i = 0; i < propertyComps.size(); ++i)
for (auto* propertyComponent : propertyComps)
{ {
PropertyComponent* const pec = propertyComps.getUnchecked (i);
pec->setBounds (1, y, getWidth() - 2, pec->getPreferredHeight());
y = pec->getBottom();
propertyComponent->setBounds (1, y, getWidth() - 2, propertyComponent->getPreferredHeight());
y = propertyComponent->getBottom();
} }
} }
int getPreferredHeight() const int getPreferredHeight() const
{ {
int y = titleHeight;
auto y = titleHeight;
if (isOpen) if (isOpen)
for (int i = propertyComps.size(); --i >= 0;)
y += propertyComps.getUnchecked(i)->getPreferredHeight();
for (auto* propertyComponent : propertyComps)
y += propertyComponent->getPreferredHeight();
return y; return y;
} }
void setOpen (const bool open)
void setOpen (bool open)
{ {
if (isOpen != open) if (isOpen != open)
{ {
isOpen = open; isOpen = open;
for (int i = propertyComps.size(); --i >= 0;)
propertyComps.getUnchecked(i)->setVisible (open);
for (auto* propertyComponent : propertyComps)
propertyComponent->setVisible (open);
if (PropertyPanel* const pp = findParentComponentOfClass<PropertyPanel>())
pp->resized();
if (auto* propertyPanel = findParentComponentOfClass<PropertyPanel>())
propertyPanel->resized();
} }
} }
void refreshAll() const void refreshAll() const
{ {
for (int i = propertyComps.size(); --i >= 0;)
propertyComps.getUnchecked (i)->refresh();
for (auto* propertyComponent : propertyComps)
propertyComponent->refresh();
} }
void mouseUp (const MouseEvent& e) override void mouseUp (const MouseEvent& e) override
@@ -114,7 +113,7 @@ struct PropertyPanel::SectionComponent : public Component
} }
OwnedArray<PropertyComponent> propertyComps; OwnedArray<PropertyComponent> propertyComps;
const int titleHeight;
int titleHeight;
bool isOpen; bool isOpen;
JUCE_DECLARE_NON_COPYABLE (SectionComponent) JUCE_DECLARE_NON_COPYABLE (SectionComponent)
@@ -129,12 +128,10 @@ struct PropertyPanel::PropertyHolderComponent : public Component
void updateLayout (int width) void updateLayout (int width)
{ {
int y = 0;
auto y = 0;
for (int i = 0; i < sections.size(); ++i)
for (auto* section : sections)
{ {
SectionComponent* const section = sections.getUnchecked(i);
section->setBounds (0, y, width, section->getPreferredHeight()); section->setBounds (0, y, width, section->getPreferredHeight());
y = section->getBottom(); y = section->getBottom();
} }
@@ -145,8 +142,8 @@ struct PropertyPanel::PropertyHolderComponent : public Component
void refreshAll() const void refreshAll() const
{ {
for (int i = 0; i < sections.size(); ++i)
sections.getUnchecked(i)->refreshAll();
for (auto* section : sections)
section->refreshAll();
} }
void insertSection (int indexToInsertAt, SectionComponent* newSection) void insertSection (int indexToInsertAt, SectionComponent* newSection)
@@ -155,12 +152,11 @@ struct PropertyPanel::PropertyHolderComponent : public Component
addAndMakeVisible (newSection, 0); addAndMakeVisible (newSection, 0);
} }
SectionComponent* getSectionWithNonEmptyName (const int targetIndex) const noexcept
SectionComponent* getSectionWithNonEmptyName (int targetIndex) const noexcept
{ {
for (int index = 0, i = 0; i < sections.size(); ++i)
auto index = 0;
for (auto* section : sections)
{ {
SectionComponent* const section = sections.getUnchecked (i);
if (section->getName().isNotEmpty()) if (section->getName().isNotEmpty())
if (index++ == targetIndex) if (index++ == targetIndex)
return section; return section;
@@ -249,8 +245,8 @@ void PropertyPanel::addProperties (const Array<PropertyComponent*>& newPropertie
void PropertyPanel::addSection (const String& sectionTitle, void PropertyPanel::addSection (const String& sectionTitle,
const Array<PropertyComponent*>& newProperties, const Array<PropertyComponent*>& newProperties,
const bool shouldBeOpen,
const int indexToInsertAt)
bool shouldBeOpen,
int indexToInsertAt)
{ {
jassert (sectionTitle.isNotEmpty()); jassert (sectionTitle.isNotEmpty());
@@ -263,10 +259,10 @@ void PropertyPanel::addSection (const String& sectionTitle,
void PropertyPanel::updatePropHolderLayout() const void PropertyPanel::updatePropHolderLayout() const
{ {
const int maxWidth = viewport.getMaximumVisibleWidth();
auto maxWidth = viewport.getMaximumVisibleWidth();
propertyHolderComponent->updateLayout (maxWidth); propertyHolderComponent->updateLayout (maxWidth);
const int newMaxWidth = viewport.getMaximumVisibleWidth();
auto newMaxWidth = viewport.getMaximumVisibleWidth();
if (maxWidth != newMaxWidth) if (maxWidth != newMaxWidth)
{ {
// need to do this twice because of scrollbars changing the size, etc. // need to do this twice because of scrollbars changing the size, etc.
@@ -284,10 +280,8 @@ StringArray PropertyPanel::getSectionNames() const
{ {
StringArray s; StringArray s;
for (int i = 0; i < propertyHolderComponent->sections.size(); ++i)
for (auto* section : propertyHolderComponent->sections)
{ {
SectionComponent* const section = propertyHolderComponent->sections.getUnchecked(i);
if (section->getName().isNotEmpty()) if (section->getName().isNotEmpty())
s.add (section->getName()); s.add (section->getName());
} }
@@ -295,29 +289,29 @@ StringArray PropertyPanel::getSectionNames() const
return s; return s;
} }
bool PropertyPanel::isSectionOpen (const int sectionIndex) const
bool PropertyPanel::isSectionOpen (int sectionIndex) const
{ {
if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
if (auto* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
return s->isOpen; return s->isOpen;
return false; return false;
} }
void PropertyPanel::setSectionOpen (const int sectionIndex, const bool shouldBeOpen)
void PropertyPanel::setSectionOpen (int sectionIndex, bool shouldBeOpen)
{ {
if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
if (auto* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
s->setOpen (shouldBeOpen); s->setOpen (shouldBeOpen);
} }
void PropertyPanel::setSectionEnabled (const int sectionIndex, const bool shouldBeEnabled)
void PropertyPanel::setSectionEnabled (int sectionIndex, bool shouldBeEnabled)
{ {
if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
if (auto* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
s->setEnabled (shouldBeEnabled); s->setEnabled (shouldBeEnabled);
} }
void PropertyPanel::removeSection (int sectionIndex) void PropertyPanel::removeSection (int sectionIndex)
{ {
if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
if (auto* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex))
{ {
propertyHolderComponent->sections.removeObject (s); propertyHolderComponent->sections.removeObject (s);
updatePropHolderLayout(); updatePropHolderLayout();
@@ -327,19 +321,18 @@ void PropertyPanel::removeSection (int sectionIndex)
//============================================================================== //==============================================================================
XmlElement* PropertyPanel::getOpennessState() const XmlElement* PropertyPanel::getOpennessState() const
{ {
XmlElement* const xml = new XmlElement ("PROPERTYPANELSTATE");
auto* xml = new XmlElement ("PROPERTYPANELSTATE");
xml->setAttribute ("scrollPos", viewport.getViewPositionY()); xml->setAttribute ("scrollPos", viewport.getViewPositionY());
const StringArray sections (getSectionNames());
for (int i = 0; i < sections.size(); ++i)
auto sections = getSectionNames();
for (auto s : sections)
{ {
if (sections[i].isNotEmpty())
if (s.isNotEmpty())
{ {
XmlElement* const e = xml->createNewChildElement ("SECTION");
e->setAttribute ("name", sections[i]);
e->setAttribute ("open", isSectionOpen (i) ? 1 : 0);
auto* e = xml->createNewChildElement ("SECTION");
e->setAttribute ("name", s);
e->setAttribute ("open", isSectionOpen (sections.indexOf (s)) ? 1 : 0);
} }
} }
@@ -350,7 +343,7 @@ void PropertyPanel::restoreOpennessState (const XmlElement& xml)
{ {
if (xml.hasTagName ("PROPERTYPANELSTATE")) if (xml.hasTagName ("PROPERTYPANELSTATE"))
{ {
const StringArray sections (getSectionNames());
auto sections = getSectionNames();
forEachXmlChildElementWithTagName (xml, e, "SECTION") forEachXmlChildElementWithTagName (xml, e, "SECTION")
{ {


Loading…
Cancel
Save