mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Introjucer: nicer scrollbars.
This commit is contained in:
parent
55dc84bc69
commit
396a5d9178
3 changed files with 120 additions and 62 deletions
|
|
@ -187,6 +187,9 @@ void AppearanceSettings::applyToLookAndFeel (LookAndFeel& lf) const
|
|||
lf.setColour (AppearanceColours::colours[i].colourID, col);
|
||||
}
|
||||
}
|
||||
|
||||
lf.setColour (ScrollBar::thumbColourId,
|
||||
getScrollbarColourForBackground (lf.findColour (mainBackgroundColourId)));
|
||||
}
|
||||
|
||||
void AppearanceSettings::applyToCodeEditor (CodeEditorComponent& editor) const
|
||||
|
|
@ -201,6 +204,9 @@ void AppearanceSettings::applyToCodeEditor (CodeEditorComponent& editor) const
|
|||
|
||||
editor.setColourScheme (cs);
|
||||
editor.setFont (getCodeFont());
|
||||
|
||||
editor.setColour (ScrollBar::thumbColourId,
|
||||
getScrollbarColourForBackground (editor.findColour (CodeEditorComponent::backgroundColourId)));
|
||||
}
|
||||
|
||||
Font AppearanceSettings::getCodeFont() const
|
||||
|
|
@ -255,6 +261,11 @@ bool AppearanceSettings::getColour (const String& name, Colour& result) const
|
|||
return false;
|
||||
}
|
||||
|
||||
Colour AppearanceSettings::getScrollbarColourForBackground (const Colour& background)
|
||||
{
|
||||
return background.contrasting().withAlpha (0.13f);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
struct AppearanceEditor
|
||||
{
|
||||
|
|
@ -469,3 +480,97 @@ Rectangle<int> IntrojucerLookAndFeel::getPropertyComponentContentPosition (Prope
|
|||
|
||||
return LookAndFeel::getPropertyComponentContentPosition (component);
|
||||
}
|
||||
|
||||
int IntrojucerLookAndFeel::getTabButtonOverlap (int tabDepth) { return -1; }
|
||||
int IntrojucerLookAndFeel::getTabButtonSpaceAroundImage() { return 1; }
|
||||
int IntrojucerLookAndFeel::getTabButtonBestWidth (TabBarButton& button, int tabDepth) { return 120; }
|
||||
|
||||
void IntrojucerLookAndFeel::createTabTextLayout (const TabBarButton& button, const Rectangle<int>& textArea, GlyphArrangement& textLayout)
|
||||
{
|
||||
Font font (textArea.getHeight() * 0.5f);
|
||||
font.setUnderline (button.hasKeyboardFocus (false));
|
||||
|
||||
textLayout.addFittedText (font, button.getButtonText().trim(),
|
||||
(float) textArea.getX(), (float) textArea.getY(), (float) textArea.getWidth(), (float) textArea.getHeight(),
|
||||
Justification::centred, 1);
|
||||
}
|
||||
|
||||
Colour IntrojucerLookAndFeel::getTabBackgroundColour (TabBarButton& button)
|
||||
{
|
||||
Colour normalBkg (button.getTabBackgroundColour());
|
||||
Colour bkg (normalBkg.contrasting (0.15f));
|
||||
if (button.isFrontTab())
|
||||
bkg = bkg.overlaidWith (Colours::yellow.withAlpha (0.5f));
|
||||
|
||||
return bkg;
|
||||
}
|
||||
|
||||
void IntrojucerLookAndFeel::drawTabButton (TabBarButton& button, Graphics& g, bool isMouseOver, bool isMouseDown)
|
||||
{
|
||||
const Rectangle<int> activeArea (button.getActiveArea());
|
||||
|
||||
Colour bkg (getTabBackgroundColour (button));
|
||||
|
||||
g.setGradientFill (ColourGradient (bkg.brighter (0.1f), 0, (float) activeArea.getY(),
|
||||
bkg.darker (0.1f), 0, (float) activeArea.getBottom(), false));
|
||||
g.fillRect (activeArea);
|
||||
|
||||
g.setColour (button.getTabBackgroundColour().darker (0.3f));
|
||||
g.drawRect (activeArea);
|
||||
|
||||
GlyphArrangement textLayout;
|
||||
createTabTextLayout (button, button.getTextArea(), textLayout);
|
||||
|
||||
const float alpha = button.isEnabled() ? ((isMouseOver || isMouseDown) ? 1.0f : 0.8f) : 0.3f;
|
||||
g.setColour (bkg.contrasting().withMultipliedAlpha (alpha));
|
||||
textLayout.draw (g);
|
||||
}
|
||||
|
||||
Rectangle<int> IntrojucerLookAndFeel::getTabButtonExtraComponentBounds (const TabBarButton& button, Rectangle<int>& textArea, Component& comp)
|
||||
{
|
||||
GlyphArrangement textLayout;
|
||||
createTabTextLayout (button, textArea, textLayout);
|
||||
const int textWidth = (int) textLayout.getBoundingBox (0, -1, false).getWidth();
|
||||
const int extraSpace = jmax (0, textArea.getWidth() - (textWidth + comp.getWidth())) / 2;
|
||||
|
||||
textArea.removeFromRight (extraSpace);
|
||||
textArea.removeFromLeft (extraSpace);
|
||||
return textArea.removeFromRight (comp.getWidth());
|
||||
}
|
||||
|
||||
void IntrojucerLookAndFeel::drawStretchableLayoutResizerBar (Graphics& g, int /*w*/, int /*h*/, bool /*isVerticalBar*/, bool isMouseOver, bool isMouseDragging)
|
||||
{
|
||||
if (isMouseOver || isMouseDragging)
|
||||
g.fillAll (Colours::yellow.withAlpha (0.4f));
|
||||
}
|
||||
|
||||
void IntrojucerLookAndFeel::drawScrollbar (Graphics& g, ScrollBar& scrollbar, int x, int y, int width, int height,
|
||||
bool isScrollbarVertical, int thumbStartPosition, int thumbSize,
|
||||
bool isMouseOver, bool isMouseDown)
|
||||
{
|
||||
Path thumbPath;
|
||||
|
||||
if (thumbSize > 0)
|
||||
{
|
||||
const float thumbIndent = jmin (width, height) * 0.25f;
|
||||
const float thumbIndentx2 = thumbIndent * 2.0f;
|
||||
|
||||
if (isScrollbarVertical)
|
||||
thumbPath.addRoundedRectangle (x + thumbIndent, thumbStartPosition + thumbIndent,
|
||||
width - thumbIndentx2, thumbSize - thumbIndentx2, (width - thumbIndentx2) * 0.5f);
|
||||
else
|
||||
thumbPath.addRoundedRectangle (thumbStartPosition + thumbIndent, y + thumbIndent,
|
||||
thumbSize - thumbIndentx2, height - thumbIndentx2, (height - thumbIndentx2) * 0.5f);
|
||||
}
|
||||
|
||||
Colour thumbCol (scrollbar.findColour (ScrollBar::thumbColourId, true));
|
||||
|
||||
if (isMouseOver || isMouseDown)
|
||||
thumbCol = thumbCol.withMultipliedAlpha (2.0f);
|
||||
|
||||
g.setColour (thumbCol);
|
||||
g.fillPath (thumbPath);
|
||||
|
||||
g.setColour (thumbCol.contrasting ((isMouseOver || isMouseDown) ? 0.2f : 0.1f));
|
||||
g.strokePath (thumbPath, PathStrokeType (1.0f));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ public:
|
|||
bool readFromXML (const XmlElement&);
|
||||
bool writeToFile (const File& file) const;
|
||||
|
||||
void updateColourScheme();
|
||||
void applyToCodeEditor (CodeEditorComponent& editor) const;
|
||||
|
||||
StringArray getColourNames() const;
|
||||
|
|
@ -52,6 +53,8 @@ public:
|
|||
void refreshPresetSchemeList();
|
||||
void selectPresetScheme (int index);
|
||||
|
||||
static Colour getScrollbarColourForBackground (const Colour& background);
|
||||
|
||||
static Component* createEditorWindow();
|
||||
|
||||
private:
|
||||
|
|
@ -60,7 +63,6 @@ private:
|
|||
Array<File> presetSchemeFiles;
|
||||
|
||||
void applyToLookAndFeel (LookAndFeel&) const;
|
||||
void updateColourScheme();
|
||||
|
||||
void valueTreePropertyChanged (ValueTree&, const Identifier&) { updateColourScheme(); }
|
||||
void valueTreeChildAdded (ValueTree&, ValueTree&) { updateColourScheme(); }
|
||||
|
|
@ -78,74 +80,24 @@ class IntrojucerLookAndFeel : public LookAndFeel
|
|||
public:
|
||||
IntrojucerLookAndFeel();
|
||||
|
||||
int getTabButtonOverlap (int tabDepth) { return -1; }
|
||||
int getTabButtonSpaceAroundImage() { return 1; }
|
||||
int getTabButtonBestWidth (TabBarButton& button, int tabDepth) { return 120; }
|
||||
int getTabButtonOverlap (int tabDepth);
|
||||
int getTabButtonSpaceAroundImage();
|
||||
int getTabButtonBestWidth (TabBarButton& button, int tabDepth);
|
||||
|
||||
void createTabTextLayout (const TabBarButton& button, const Rectangle<int>& textArea, GlyphArrangement& textLayout)
|
||||
{
|
||||
Font font (textArea.getHeight() * 0.5f);
|
||||
font.setUnderline (button.hasKeyboardFocus (false));
|
||||
|
||||
textLayout.addFittedText (font, button.getButtonText().trim(),
|
||||
(float) textArea.getX(), (float) textArea.getY(), (float) textArea.getWidth(), (float) textArea.getHeight(),
|
||||
Justification::centred, 1);
|
||||
}
|
||||
|
||||
static Colour getTabBackgroundColour (TabBarButton& button)
|
||||
{
|
||||
Colour normalBkg (button.getTabBackgroundColour());
|
||||
Colour bkg (normalBkg.contrasting (0.15f));
|
||||
if (button.isFrontTab())
|
||||
bkg = bkg.overlaidWith (Colours::yellow.withAlpha (0.5f));
|
||||
|
||||
return bkg;
|
||||
}
|
||||
|
||||
void drawTabButton (TabBarButton& button, Graphics& g, bool isMouseOver, bool isMouseDown)
|
||||
{
|
||||
const Rectangle<int> activeArea (button.getActiveArea());
|
||||
|
||||
Colour bkg (getTabBackgroundColour (button));
|
||||
|
||||
g.setGradientFill (ColourGradient (bkg.brighter (0.1f), 0, (float) activeArea.getY(),
|
||||
bkg.darker (0.1f), 0, (float) activeArea.getBottom(), false));
|
||||
g.fillRect (activeArea);
|
||||
|
||||
g.setColour (button.getTabBackgroundColour().darker (0.3f));
|
||||
g.drawRect (activeArea);
|
||||
|
||||
GlyphArrangement textLayout;
|
||||
createTabTextLayout (button, button.getTextArea(), textLayout);
|
||||
|
||||
const float alpha = button.isEnabled() ? ((isMouseOver || isMouseDown) ? 1.0f : 0.8f) : 0.3f;
|
||||
g.setColour (bkg.contrasting().withMultipliedAlpha (alpha));
|
||||
textLayout.draw (g);
|
||||
}
|
||||
|
||||
Rectangle<int> getTabButtonExtraComponentBounds (const TabBarButton& button, Rectangle<int>& textArea, Component& comp)
|
||||
{
|
||||
GlyphArrangement textLayout;
|
||||
createTabTextLayout (button, textArea, textLayout);
|
||||
const int textWidth = (int) textLayout.getBoundingBox (0, -1, false).getWidth();
|
||||
const int extraSpace = jmax (0, textArea.getWidth() - (textWidth + comp.getWidth())) / 2;
|
||||
|
||||
textArea.removeFromRight (extraSpace);
|
||||
textArea.removeFromLeft (extraSpace);
|
||||
return textArea.removeFromRight (comp.getWidth());
|
||||
}
|
||||
static Colour getTabBackgroundColour (TabBarButton& button);
|
||||
void createTabTextLayout (const TabBarButton& button, const Rectangle<int>& textArea, GlyphArrangement& textLayout);
|
||||
void drawTabButton (TabBarButton& button, Graphics& g, bool isMouseOver, bool isMouseDown);
|
||||
|
||||
Rectangle<int> getTabButtonExtraComponentBounds (const TabBarButton& button, Rectangle<int>& textArea, Component& comp);
|
||||
void drawTabAreaBehindFrontButton (TabbedButtonBar&, Graphics&, int, int) {}
|
||||
|
||||
void drawStretchableLayoutResizerBar (Graphics& g, int /*w*/, int /*h*/, bool /*isVerticalBar*/, bool isMouseOver, bool isMouseDragging)
|
||||
{
|
||||
if (isMouseOver || isMouseDragging)
|
||||
g.fillAll (Colours::yellow.withAlpha (0.4f));
|
||||
}
|
||||
|
||||
void drawStretchableLayoutResizerBar (Graphics& g, int /*w*/, int /*h*/, bool /*isVerticalBar*/, bool isMouseOver, bool isMouseDragging);
|
||||
Rectangle<int> getPropertyComponentContentPosition (PropertyComponent&);
|
||||
|
||||
bool areScrollbarButtonsVisible() { return false; }
|
||||
|
||||
void drawScrollbar (Graphics& g, ScrollBar& scrollbar, int x, int y, int width, int height, bool isScrollbarVertical,
|
||||
int thumbStartPosition, int thumbSize, bool /*isMouseOver*/, bool /*isMouseDown*/);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ void StoredSettings::reload()
|
|||
if (xml != nullptr)
|
||||
appearance.readFromXML (*xml);
|
||||
|
||||
appearance.updateColourScheme();
|
||||
loadSwatchColours();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue