/* ============================================================================== This file is part of the JUCE 6 technical preview. Copyright (c) 2017 - ROLI Ltd. You may use this code under the terms of the GPL v3 (see www.gnu.org/licenses). For this technical preview, this file is not subject to commercial licensing. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { Colour LookAndFeel_V4::ColourScheme::getUIColour (UIColour index) const noexcept { if (isPositiveAndBelow (index, numColours)) return palette[index]; jassertfalse; return {}; } void LookAndFeel_V4::ColourScheme::setUIColour (UIColour index, Colour newColour) noexcept { if (isPositiveAndBelow (index, numColours)) palette[index] = newColour; else jassertfalse; } bool LookAndFeel_V4::ColourScheme::operator== (const ColourScheme& other) const noexcept { for (auto i = 0; i < numColours; ++i) if (palette[i] != other.palette[i]) return false; return true; } bool LookAndFeel_V4::ColourScheme::operator!= (const ColourScheme& other) const noexcept { return ! operator== (other); } //============================================================================== LookAndFeel_V4::LookAndFeel_V4() : currentColourScheme (getDarkColourScheme()) { initialiseColours(); } LookAndFeel_V4::LookAndFeel_V4 (ColourScheme scheme) : currentColourScheme (scheme) { initialiseColours(); } LookAndFeel_V4::~LookAndFeel_V4() {} //============================================================================== void LookAndFeel_V4::setColourScheme (ColourScheme newColourScheme) { currentColourScheme = newColourScheme; initialiseColours(); } LookAndFeel_V4::ColourScheme LookAndFeel_V4::getDarkColourScheme() { return { 0xff323e44, 0xff263238, 0xff323e44, 0xff8e989b, 0xffffffff, 0xff42a2c8, 0xffffffff, 0xff181f22, 0xffffffff }; } LookAndFeel_V4::ColourScheme LookAndFeel_V4::getMidnightColourScheme() { return { 0xff2f2f3a, 0xff191926, 0xffd0d0d0, 0xff66667c, 0xc8ffffff, 0xffd8d8d8, 0xffffffff, 0xff606073, 0xff000000 }; } LookAndFeel_V4::ColourScheme LookAndFeel_V4::getGreyColourScheme() { return { 0xff505050, 0xff424242, 0xff606060, 0xffa6a6a6, 0xffffffff, 0xff21ba90, 0xff000000, 0xffffffff, 0xffffffff }; } LookAndFeel_V4::ColourScheme LookAndFeel_V4::getLightColourScheme() { return { 0xffefefef, 0xffffffff, 0xffffffff, 0xffdddddd, 0xff000000, 0xffa9a9a9, 0xffffffff, 0xff42a2c8, 0xff000000 }; } //============================================================================== class LookAndFeel_V4_DocumentWindowButton : public Button { public: LookAndFeel_V4_DocumentWindowButton (const String& name, Colour c, const Path& normal, const Path& toggled) : Button (name), colour (c), normalShape (normal), toggledShape (toggled) { } void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override { auto background = Colours::grey; if (auto* rw = findParentComponentOfClass()) if (auto lf = dynamic_cast (&rw->getLookAndFeel())) background = lf->getCurrentColourScheme().getUIColour (LookAndFeel_V4::ColourScheme::widgetBackground); g.fillAll (background); g.setColour ((! isEnabled() || shouldDrawButtonAsDown) ? colour.withAlpha (0.6f) : colour); if (shouldDrawButtonAsHighlighted) { g.fillAll(); g.setColour (background); } auto& p = getToggleState() ? toggledShape : normalShape; auto reducedRect = Justification (Justification::centred) .appliedToRectangle (Rectangle (getHeight(), getHeight()), getLocalBounds()) .toFloat() .reduced (getHeight() * 0.3f); g.fillPath (p, p.getTransformToScaleToFit (reducedRect, true)); } private: Colour colour; Path normalShape, toggledShape; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LookAndFeel_V4_DocumentWindowButton) }; Button* LookAndFeel_V4::createDocumentWindowButton (int buttonType) { Path shape; auto crossThickness = 0.15f; if (buttonType == DocumentWindow::closeButton) { shape.addLineSegment ({ 0.0f, 0.0f, 1.0f, 1.0f }, crossThickness); shape.addLineSegment ({ 1.0f, 0.0f, 0.0f, 1.0f }, crossThickness); return new LookAndFeel_V4_DocumentWindowButton ("close", Colour (0xff9A131D), shape, shape); } if (buttonType == DocumentWindow::minimiseButton) { shape.addLineSegment ({ 0.0f, 0.5f, 1.0f, 0.5f }, crossThickness); return new LookAndFeel_V4_DocumentWindowButton ("minimise", Colour (0xffaa8811), shape, shape); } if (buttonType == DocumentWindow::maximiseButton) { shape.addLineSegment ({ 0.5f, 0.0f, 0.5f, 1.0f }, crossThickness); shape.addLineSegment ({ 0.0f, 0.5f, 1.0f, 0.5f }, crossThickness); Path fullscreenShape; fullscreenShape.startNewSubPath (45.0f, 100.0f); fullscreenShape.lineTo (0.0f, 100.0f); fullscreenShape.lineTo (0.0f, 0.0f); fullscreenShape.lineTo (100.0f, 0.0f); fullscreenShape.lineTo (100.0f, 45.0f); fullscreenShape.addRectangle (45.0f, 45.0f, 100.0f, 100.0f); PathStrokeType (30.0f).createStrokedPath (fullscreenShape, fullscreenShape); return new LookAndFeel_V4_DocumentWindowButton ("maximise", Colour (0xff0A830A), shape, fullscreenShape); } jassertfalse; return nullptr; } void LookAndFeel_V4::positionDocumentWindowButtons (DocumentWindow&, int titleBarX, int titleBarY, int titleBarW, int titleBarH, Button* minimiseButton, Button* maximiseButton, Button* closeButton, bool positionTitleBarButtonsOnLeft) { titleBarH = jmin (titleBarH, titleBarH - titleBarY); auto buttonW = static_cast (titleBarH * 1.2); auto x = positionTitleBarButtonsOnLeft ? titleBarX : titleBarX + titleBarW - buttonW; if (closeButton != nullptr) { closeButton->setBounds (x, titleBarY, buttonW, titleBarH); x += positionTitleBarButtonsOnLeft ? buttonW : -buttonW; } if (positionTitleBarButtonsOnLeft) std::swap (minimiseButton, maximiseButton); if (maximiseButton != nullptr) { maximiseButton->setBounds (x, titleBarY, buttonW, titleBarH); x += positionTitleBarButtonsOnLeft ? buttonW : -buttonW; } if (minimiseButton != nullptr) minimiseButton->setBounds (x, titleBarY, buttonW, titleBarH); } void LookAndFeel_V4::drawDocumentWindowTitleBar (DocumentWindow& window, Graphics& g, int w, int h, int titleSpaceX, int titleSpaceW, const Image* icon, bool drawTitleTextOnLeft) { if (w * h == 0) return; auto isActive = window.isActiveWindow(); g.setColour (getCurrentColourScheme().getUIColour (ColourScheme::widgetBackground)); g.fillAll(); Font font (h * 0.65f, Font::plain); g.setFont (font); auto textW = font.getStringWidth (window.getName()); auto iconW = 0; auto iconH = 0; if (icon != nullptr) { iconH = static_cast (font.getHeight()); iconW = icon->getWidth() * iconH / icon->getHeight() + 4; } textW = jmin (titleSpaceW, textW + iconW); auto textX = drawTitleTextOnLeft ? titleSpaceX : jmax (titleSpaceX, (w - textW) / 2); if (textX + textW > titleSpaceX + titleSpaceW) textX = titleSpaceX + titleSpaceW - textW; if (icon != nullptr) { g.setOpacity (isActive ? 1.0f : 0.6f); g.drawImageWithin (*icon, textX, (h - iconH) / 2, iconW, iconH, RectanglePlacement::centred, false); textX += iconW; textW -= iconW; } if (window.isColourSpecified (DocumentWindow::textColourId) || isColourSpecified (DocumentWindow::textColourId)) g.setColour (window.findColour (DocumentWindow::textColourId)); else g.setColour (getCurrentColourScheme().getUIColour (ColourScheme::defaultText)); g.drawText (window.getName(), textX, 0, textW, h, Justification::centredLeft, true); } //============================================================================== Font LookAndFeel_V4::getTextButtonFont (TextButton&, int buttonHeight) { return { jmin (16.0f, buttonHeight * 0.6f) }; } void LookAndFeel_V4::drawButtonBackground (Graphics& g, Button& button, const Colour& backgroundColour, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) { auto cornerSize = 6.0f; auto bounds = button.getLocalBounds().toFloat().reduced (0.5f, 0.5f); auto baseColour = backgroundColour.withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f) .withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f); if (shouldDrawButtonAsDown || shouldDrawButtonAsHighlighted) baseColour = baseColour.contrasting (shouldDrawButtonAsDown ? 0.2f : 0.05f); g.setColour (baseColour); auto flatOnLeft = button.isConnectedOnLeft(); auto flatOnRight = button.isConnectedOnRight(); auto flatOnTop = button.isConnectedOnTop(); auto flatOnBottom = button.isConnectedOnBottom(); if (flatOnLeft || flatOnRight || flatOnTop || flatOnBottom) { Path path; path.addRoundedRectangle (bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), cornerSize, cornerSize, ! (flatOnLeft || flatOnTop), ! (flatOnRight || flatOnTop), ! (flatOnLeft || flatOnBottom), ! (flatOnRight || flatOnBottom)); g.fillPath (path); g.setColour (button.findColour (ComboBox::outlineColourId)); g.strokePath (path, PathStrokeType (1.0f)); } else { g.fillRoundedRectangle (bounds, cornerSize); g.setColour (button.findColour (ComboBox::outlineColourId)); g.drawRoundedRectangle (bounds, cornerSize, 1.0f); } } void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) { auto fontSize = jmin (15.0f, button.getHeight() * 0.75f); auto tickWidth = fontSize * 1.1f; drawTickBox (g, button, 4.0f, (button.getHeight() - tickWidth) * 0.5f, tickWidth, tickWidth, button.getToggleState(), button.isEnabled(), shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown); g.setColour (button.findColour (ToggleButton::textColourId)); g.setFont (fontSize); if (! button.isEnabled()) g.setOpacity (0.5f); g.drawFittedText (button.getButtonText(), button.getLocalBounds().withTrimmedLeft (roundToInt (tickWidth) + 10) .withTrimmedRight (2), Justification::centredLeft, 10); } void LookAndFeel_V4::drawTickBox (Graphics& g, Component& component, float x, float y, float w, float h, const bool ticked, const bool isEnabled, const bool shouldDrawButtonAsHighlighted, const bool shouldDrawButtonAsDown) { ignoreUnused (isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown); Rectangle tickBounds (x, y, w, h); g.setColour (component.findColour (ToggleButton::tickDisabledColourId)); g.drawRoundedRectangle (tickBounds, 4.0f, 1.0f); if (ticked) { g.setColour (component.findColour (ToggleButton::tickColourId)); auto tick = getTickShape (0.75f); g.fillPath (tick, tick.getTransformToScaleToFit (tickBounds.reduced (4, 5).toFloat(), false)); } } void LookAndFeel_V4::changeToggleButtonWidthToFitText (ToggleButton& button) { auto fontSize = jmin (15.0f, button.getHeight() * 0.75f); auto tickWidth = fontSize * 1.1f; Font font (fontSize); button.setSize (font.getStringWidth (button.getButtonText()) + roundToInt (tickWidth) + 14, button.getHeight()); } //============================================================================== AlertWindow* LookAndFeel_V4::createAlertWindow (const String& title, const String& message, const String& button1, const String& button2, const String& button3, AlertWindow::AlertIconType iconType, int numButtons, Component* associatedComponent) { auto boundsOffset = 50; auto* aw = LookAndFeel_V2::createAlertWindow (title, message, button1, button2, button3, iconType, numButtons, associatedComponent); auto bounds = aw->getBounds(); bounds = bounds.withSizeKeepingCentre (bounds.getWidth() + boundsOffset, bounds.getHeight() + boundsOffset); aw->setBounds (bounds); for (auto* child : aw->getChildren()) if (auto* button = dynamic_cast (child)) button->setBounds (button->getBounds() + Point (25, 40)); return aw; } void LookAndFeel_V4::drawAlertBox (Graphics& g, AlertWindow& alert, const Rectangle& textArea, TextLayout& textLayout) { auto cornerSize = 4.0f; g.setColour (alert.findColour (AlertWindow::outlineColourId)); g.drawRoundedRectangle (alert.getLocalBounds().toFloat(), cornerSize, 2.0f); auto bounds = alert.getLocalBounds().reduced (1); g.reduceClipRegion (bounds); g.setColour (alert.findColour (AlertWindow::backgroundColourId)); g.fillRoundedRectangle (bounds.toFloat(), cornerSize); auto iconSpaceUsed = 0; auto iconWidth = 80; auto iconSize = jmin (iconWidth + 50, bounds.getHeight() + 20); if (alert.containsAnyExtraComponents() || alert.getNumButtons() > 2) iconSize = jmin (iconSize, textArea.getHeight() + 50); Rectangle iconRect (iconSize / -10, iconSize / -10, iconSize, iconSize); if (alert.getAlertType() != AlertWindow::NoIcon) { Path icon; char character; uint32 colour; if (alert.getAlertType() == AlertWindow::WarningIcon) { character = '!'; icon.addTriangle (iconRect.getX() + iconRect.getWidth() * 0.5f, (float) iconRect.getY(), static_cast (iconRect.getRight()), static_cast (iconRect.getBottom()), static_cast (iconRect.getX()), static_cast (iconRect.getBottom())); icon = icon.createPathWithRoundedCorners (5.0f); colour = 0x66ff2a00; } else { colour = Colour (0xff00b0b9).withAlpha (0.4f).getARGB(); character = alert.getAlertType() == AlertWindow::InfoIcon ? 'i' : '?'; icon.addEllipse (iconRect.toFloat()); } GlyphArrangement ga; ga.addFittedText ({ iconRect.getHeight() * 0.9f, Font::bold }, String::charToString ((juce_wchar) (uint8) character), static_cast (iconRect.getX()), static_cast (iconRect.getY()), static_cast (iconRect.getWidth()), static_cast (iconRect.getHeight()), Justification::centred, false); ga.createPath (icon); icon.setUsingNonZeroWinding (false); g.setColour (Colour (colour)); g.fillPath (icon); iconSpaceUsed = iconWidth; } g.setColour (alert.findColour (AlertWindow::textColourId)); Rectangle alertBounds (bounds.getX() + iconSpaceUsed, 30, bounds.getWidth(), bounds.getHeight() - getAlertWindowButtonHeight() - 20); textLayout.draw (g, alertBounds.toFloat()); } int LookAndFeel_V4::getAlertWindowButtonHeight() { return 40; } Font LookAndFeel_V4::getAlertWindowTitleFont() { return { 18.0f, Font::bold }; } Font LookAndFeel_V4::getAlertWindowMessageFont() { return { 16.0f }; } Font LookAndFeel_V4::getAlertWindowFont() { return { 14.0f }; } //============================================================================== void LookAndFeel_V4::drawProgressBar (Graphics& g, ProgressBar& progressBar, int width, int height, double progress, const String& textToShow) { if (width == height) drawCircularProgressBar (g, progressBar, textToShow); else drawLinearProgressBar (g, progressBar, width, height, progress, textToShow); } void LookAndFeel_V4::drawLinearProgressBar (Graphics& g, ProgressBar& progressBar, int width, int height, double progress, const String& textToShow) { auto background = progressBar.findColour (ProgressBar::backgroundColourId); auto foreground = progressBar.findColour (ProgressBar::foregroundColourId); auto barBounds = progressBar.getLocalBounds().toFloat(); g.setColour (background); g.fillRoundedRectangle (barBounds, progressBar.getHeight() * 0.5f); if (progress >= 0.0f && progress <= 1.0f) { Path p; p.addRoundedRectangle (barBounds, progressBar.getHeight() * 0.5f); g.reduceClipRegion (p); barBounds.setWidth (barBounds.getWidth() * (float) progress); g.setColour (foreground); g.fillRoundedRectangle (barBounds, progressBar.getHeight() * 0.5f); } else { // spinning bar.. g.setColour (background); auto stripeWidth = height * 2; auto position = static_cast (Time::getMillisecondCounter() / 15) % stripeWidth; Path p; for (auto x = static_cast (-position); x < width + stripeWidth; x += stripeWidth) p.addQuadrilateral (x, 0.0f, x + stripeWidth * 0.5f, 0.0f, x, static_cast (height), x - stripeWidth * 0.5f, static_cast (height)); Image im (Image::ARGB, width, height, true); { Graphics g2 (im); g2.setColour (foreground); g2.fillRoundedRectangle (barBounds, progressBar.getHeight() * 0.5f); } g.setTiledImageFill (im, 0, 0, 0.85f); g.fillPath (p); } if (textToShow.isNotEmpty()) { g.setColour (Colour::contrasting (background, foreground)); g.setFont (height * 0.6f); g.drawText (textToShow, 0, 0, width, height, Justification::centred, false); } } void LookAndFeel_V4::drawCircularProgressBar (Graphics& g, ProgressBar& progressBar, const String& progressText) { auto background = progressBar.findColour (ProgressBar::backgroundColourId); auto foreground = progressBar.findColour (ProgressBar::foregroundColourId); auto barBounds = progressBar.getLocalBounds().reduced (2, 2).toFloat(); auto rotationInDegrees = static_cast ((Time::getMillisecondCounter() / 10) % 360); auto normalisedRotation = rotationInDegrees / 360.0f; auto rotationOffset = 22.5f; auto maxRotation = 315.0f; auto startInDegrees = rotationInDegrees; auto endInDegrees = startInDegrees + rotationOffset; if (normalisedRotation >= 0.25f && normalisedRotation < 0.5f) { auto rescaledRotation = (normalisedRotation * 4.0f) - 1.0f; endInDegrees = startInDegrees + rotationOffset + (maxRotation * rescaledRotation); } else if (normalisedRotation >= 0.5f && normalisedRotation <= 1.0f) { endInDegrees = startInDegrees + rotationOffset + maxRotation; auto rescaledRotation = 1.0f - ((normalisedRotation * 2.0f) - 1.0f); startInDegrees = endInDegrees - rotationOffset - (maxRotation * rescaledRotation); } g.setColour (background); Path arcPath2; arcPath2.addCentredArc (barBounds.getCentreX(), barBounds.getCentreY(), barBounds.getWidth() * 0.5f, barBounds.getHeight() * 0.5f, 0.0f, 0.0f, MathConstants::twoPi, true); g.strokePath (arcPath2, PathStrokeType (4.0f)); g.setColour (foreground); Path arcPath; arcPath.addCentredArc (barBounds.getCentreX(), barBounds.getCentreY(), barBounds.getWidth() * 0.5f, barBounds.getHeight() * 0.5f, 0.0f, degreesToRadians (startInDegrees), degreesToRadians (endInDegrees), true); arcPath.applyTransform (AffineTransform::rotation (normalisedRotation * MathConstants::pi * 2.25f, barBounds.getCentreX(), barBounds.getCentreY())); g.strokePath (arcPath, PathStrokeType (4.0f)); if (progressText.isNotEmpty()) { g.setColour (progressBar.findColour (TextButton::textColourOffId)); g.setFont ({ 12.0f, Font::italic }); g.drawText (progressText, barBounds, Justification::centred, false); } } //============================================================================== int LookAndFeel_V4::getDefaultScrollbarWidth() { return 8; } void LookAndFeel_V4::drawScrollbar (Graphics& g, ScrollBar& scrollbar, int x, int y, int width, int height, bool isScrollbarVertical, int thumbStartPosition, int thumbSize, bool isMouseOver, bool isMouseDown) { ignoreUnused (isMouseDown); Rectangle thumbBounds; if (isScrollbarVertical) thumbBounds = { x, thumbStartPosition, width, thumbSize }; else thumbBounds = { thumbStartPosition, y, thumbSize, height }; auto c = scrollbar.findColour (ScrollBar::ColourIds::thumbColourId); g.setColour (isMouseOver ? c.brighter (0.25f) : c); g.fillRoundedRectangle (thumbBounds.reduced (1).toFloat(), 4.0f); } //============================================================================== Path LookAndFeel_V4::getTickShape (float height) { static const unsigned char pathData[] = { 110,109,32,210,202,64,126,183,148,64,108,39,244,247,64,245,76,124,64,108,178,131,27,65,246,76,252,64,108,175,242,4,65,246,76,252, 64,108,236,5,68,65,0,0,160,180,108,240,150,90,65,21,136,52,63,108,48,59,16,65,0,0,32,65,108,32,210,202,64,126,183,148,64, 99,101,0,0 }; Path path; path.loadPathFromData (pathData, sizeof (pathData)); path.scaleToFit (0, 0, height * 2.0f, height, true); return path; } Path LookAndFeel_V4::getCrossShape (float height) { static const unsigned char pathData[] = { 110,109,51,51,255,66,0,0,0,0,108,205,204,13,67,51,51,99,65,108,0,0,170,66,205,204,141,66,108,51,179,13,67,52,51,255,66,108,0,0,255, 66,205,204,13,67,108,205,204,141,66,0,0,170,66,108,52,51,99,65,51,179,13,67,108,0,0,0,0,51,51,255,66,108,205,204,98,66, 204,204,141,66,108,0,0,0,0,51,51,99,65,108,51,51, 99,65,0,0,0,0,108,205,204,141,66,205,204,98,66,108,51,51,255,66,0,0,0,0,99,101,0,0 }; Path path; path.loadPathFromData (pathData, sizeof (pathData)); path.scaleToFit (0, 0, height * 2.0f, height, true); return path; } //============================================================================== void LookAndFeel_V4::fillTextEditorBackground (Graphics& g, int width, int height, TextEditor& textEditor) { if (dynamic_cast (textEditor.getParentComponent()) != nullptr) { g.setColour (textEditor.findColour (TextEditor::backgroundColourId)); g.fillRect (0, 0, width, height); g.setColour (textEditor.findColour (TextEditor::outlineColourId)); g.drawHorizontalLine (height - 1, 0.0f, static_cast (width)); } else { LookAndFeel_V2::fillTextEditorBackground (g, width, height, textEditor); } } void LookAndFeel_V4::drawTextEditorOutline (Graphics& g, int width, int height, TextEditor& textEditor) { if (dynamic_cast (textEditor.getParentComponent()) == nullptr) { if (textEditor.isEnabled()) { if (textEditor.hasKeyboardFocus (true) && ! textEditor.isReadOnly()) { g.setColour (textEditor.findColour (TextEditor::focusedOutlineColourId)); g.drawRect (0, 0, width, height, 2); } else { g.setColour (textEditor.findColour (TextEditor::outlineColourId)); g.drawRect (0, 0, width, height); } } } } //============================================================================== Button* LookAndFeel_V4::createFileBrowserGoUpButton() { auto* goUpButton = new DrawableButton ("up", DrawableButton::ImageOnButtonBackground); Path arrowPath; arrowPath.addArrow ({ 50.0f, 100.0f, 50.0f, 0.0f }, 40.0f, 100.0f, 50.0f); DrawablePath arrowImage; arrowImage.setFill (goUpButton->findColour (TextButton::textColourOffId)); arrowImage.setPath (arrowPath); goUpButton->setImages (&arrowImage); return goUpButton; } void LookAndFeel_V4::layoutFileBrowserComponent (FileBrowserComponent& browserComp, DirectoryContentsDisplayComponent* fileListComponent, FilePreviewComponent* previewComp, ComboBox* currentPathBox, TextEditor* filenameBox, Button* goUpButton) { auto sectionHeight = 22; auto buttonWidth = 50; auto b = browserComp.getLocalBounds().reduced (20, 5); auto topSlice = b.removeFromTop (sectionHeight); auto bottomSlice = b.removeFromBottom (sectionHeight); currentPathBox->setBounds (topSlice.removeFromLeft (topSlice.getWidth() - buttonWidth)); topSlice.removeFromLeft (6); goUpButton->setBounds (topSlice); bottomSlice.removeFromLeft (20); filenameBox->setBounds (bottomSlice); if (previewComp != nullptr) previewComp->setBounds (b.removeFromRight (b.getWidth() / 3)); if (auto* listAsComp = dynamic_cast (fileListComponent)) listAsComp->setBounds (b.reduced (0, 10)); } void LookAndFeel_V4::drawFileBrowserRow (Graphics& g, int width, int height, const File& file, const String& filename, Image* icon, const String& fileSizeDescription, const String& fileTimeDescription, bool isDirectory, bool isItemSelected, int itemIndex, DirectoryContentsDisplayComponent& dcc) { LookAndFeel_V2::drawFileBrowserRow (g, width, height, file, filename, icon, fileSizeDescription, fileTimeDescription, isDirectory, isItemSelected, itemIndex, dcc); } //============================================================================== void LookAndFeel_V4::drawPopupMenuItem (Graphics& g, const Rectangle& area, const bool isSeparator, const bool isActive, const bool isHighlighted, const bool isTicked, const bool hasSubMenu, const String& text, const String& shortcutKeyText, const Drawable* icon, const Colour* const textColourToUse) { if (isSeparator) { auto r = area.reduced (5, 0); r.removeFromTop (roundToInt ((r.getHeight() * 0.5f) - 0.5f)); g.setColour (findColour (PopupMenu::textColourId).withAlpha (0.3f)); g.fillRect (r.removeFromTop (1)); } else { auto textColour = (textColourToUse == nullptr ? findColour (PopupMenu::textColourId) : *textColourToUse); auto r = area.reduced (1); if (isHighlighted && isActive) { g.setColour (findColour (PopupMenu::highlightedBackgroundColourId)); g.fillRect (r); g.setColour (findColour (PopupMenu::highlightedTextColourId)); } else { g.setColour (textColour.withMultipliedAlpha (isActive ? 1.0f : 0.5f)); } r.reduce (jmin (5, area.getWidth() / 20), 0); auto font = getPopupMenuFont(); auto maxFontHeight = r.getHeight() / 1.3f; if (font.getHeight() > maxFontHeight) font.setHeight (maxFontHeight); g.setFont (font); auto iconArea = r.removeFromLeft (roundToInt (maxFontHeight)).toFloat(); if (icon != nullptr) { icon->drawWithin (g, iconArea, RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, 1.0f); r.removeFromLeft (roundToInt (maxFontHeight * 0.5f)); } else if (isTicked) { auto tick = getTickShape (1.0f); g.fillPath (tick, tick.getTransformToScaleToFit (iconArea.reduced (iconArea.getWidth() / 5, 0).toFloat(), true)); } if (hasSubMenu) { auto arrowH = 0.6f * getPopupMenuFont().getAscent(); auto x = static_cast (r.removeFromRight ((int) arrowH).getX()); auto halfH = static_cast (r.getCentreY()); Path path; path.startNewSubPath (x, halfH - arrowH * 0.5f); path.lineTo (x + arrowH * 0.6f, halfH); path.lineTo (x, halfH + arrowH * 0.5f); g.strokePath (path, PathStrokeType (2.0f)); } r.removeFromRight (3); g.drawFittedText (text, r, Justification::centredLeft, 1); if (shortcutKeyText.isNotEmpty()) { auto f2 = font; f2.setHeight (f2.getHeight() * 0.75f); f2.setHorizontalScale (0.95f); g.setFont (f2); g.drawText (shortcutKeyText, r, Justification::centredRight, true); } } } void LookAndFeel_V4::getIdealPopupMenuItemSize (const String& text, const bool isSeparator, int standardMenuItemHeight, int& idealWidth, int& idealHeight) { if (isSeparator) { idealWidth = 50; idealHeight = standardMenuItemHeight > 0 ? standardMenuItemHeight / 10 : 10; } else { auto font = getPopupMenuFont(); if (standardMenuItemHeight > 0 && font.getHeight() > standardMenuItemHeight / 1.3f) font.setHeight (standardMenuItemHeight / 1.3f); idealHeight = standardMenuItemHeight > 0 ? standardMenuItemHeight : roundToInt (font.getHeight() * 1.3f); idealWidth = font.getStringWidth (text) + idealHeight * 2; } } void LookAndFeel_V4::drawMenuBarBackground (Graphics& g, int width, int height, bool, MenuBarComponent& menuBar) { auto colour = menuBar.findColour (TextButton::buttonColourId).withAlpha (0.4f); Rectangle r (width, height); g.setColour (colour.contrasting (0.15f)); g.fillRect (r.removeFromTop (1)); g.fillRect (r.removeFromBottom (1)); g.setGradientFill (ColourGradient::vertical (colour, 0, colour.darker (0.2f), (float) height)); g.fillRect (r); } void LookAndFeel_V4::drawMenuBarItem (Graphics& g, int width, int height, int itemIndex, const String& itemText, bool isMouseOverItem, bool isMenuOpen, bool /*isMouseOverBar*/, MenuBarComponent& menuBar) { if (! menuBar.isEnabled()) { g.setColour (menuBar.findColour (TextButton::textColourOffId) .withMultipliedAlpha (0.5f)); } else if (isMenuOpen || isMouseOverItem) { g.fillAll (menuBar.findColour (TextButton::buttonOnColourId)); g.setColour (menuBar.findColour (TextButton::textColourOnId)); } else { g.setColour (menuBar.findColour (TextButton::textColourOffId)); } g.setFont (getMenuBarFont (menuBar, itemIndex, itemText)); g.drawFittedText (itemText, 0, 0, width, height, Justification::centred, 1); } //============================================================================== void LookAndFeel_V4::drawComboBox (Graphics& g, int width, int height, bool, int, int, int, int, ComboBox& box) { auto cornerSize = box.findParentComponentOfClass() != nullptr ? 0.0f : 3.0f; Rectangle boxBounds (0, 0, width, height); g.setColour (box.findColour (ComboBox::backgroundColourId)); g.fillRoundedRectangle (boxBounds.toFloat(), cornerSize); g.setColour (box.findColour (ComboBox::outlineColourId)); g.drawRoundedRectangle (boxBounds.toFloat().reduced (0.5f, 0.5f), cornerSize, 1.0f); Rectangle arrowZone (width - 30, 0, 20, height); Path path; path.startNewSubPath (arrowZone.getX() + 3.0f, arrowZone.getCentreY() - 2.0f); path.lineTo (static_cast (arrowZone.getCentreX()), arrowZone.getCentreY() + 3.0f); path.lineTo (arrowZone.getRight() - 3.0f, arrowZone.getCentreY() - 2.0f); g.setColour (box.findColour (ComboBox::arrowColourId).withAlpha ((box.isEnabled() ? 0.9f : 0.2f))); g.strokePath (path, PathStrokeType (2.0f)); } Font LookAndFeel_V4::getComboBoxFont (ComboBox& box) { return { jmin (16.0f, box.getHeight() * 0.85f) }; } void LookAndFeel_V4::positionComboBoxText (ComboBox& box, Label& label) { label.setBounds (1, 1, box.getWidth() - 30, box.getHeight() - 2); label.setFont (getComboBoxFont (box)); } //============================================================================== int LookAndFeel_V4::getSliderThumbRadius (Slider& slider) { return jmin (12, slider.isHorizontal() ? static_cast (slider.getHeight() * 0.5f) : static_cast (slider.getWidth() * 0.5f)); } void LookAndFeel_V4::drawLinearSlider (Graphics& g, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const Slider::SliderStyle style, Slider& slider) { if (slider.isBar()) { g.setColour (slider.findColour (Slider::trackColourId)); g.fillRect (slider.isHorizontal() ? Rectangle (static_cast (x), y + 0.5f, sliderPos - x, height - 1.0f) : Rectangle (x + 0.5f, sliderPos, width - 1.0f, y + (height - sliderPos))); } else { auto isTwoVal = (style == Slider::SliderStyle::TwoValueVertical || style == Slider::SliderStyle::TwoValueHorizontal); auto isThreeVal = (style == Slider::SliderStyle::ThreeValueVertical || style == Slider::SliderStyle::ThreeValueHorizontal); auto trackWidth = jmin (6.0f, slider.isHorizontal() ? height * 0.25f : width * 0.25f); Point startPoint (slider.isHorizontal() ? x : x + width * 0.5f, slider.isHorizontal() ? y + height * 0.5f : height + y); Point endPoint (slider.isHorizontal() ? width + x : startPoint.x, slider.isHorizontal() ? startPoint.y : y); Path backgroundTrack; backgroundTrack.startNewSubPath (startPoint); backgroundTrack.lineTo (endPoint); g.setColour (slider.findColour (Slider::backgroundColourId)); g.strokePath (backgroundTrack, { trackWidth, PathStrokeType::curved, PathStrokeType::rounded }); Path valueTrack; Point minPoint, maxPoint, thumbPoint; if (isTwoVal || isThreeVal) { minPoint = { slider.isHorizontal() ? minSliderPos : width * 0.5f, slider.isHorizontal() ? height * 0.5f : minSliderPos }; if (isThreeVal) thumbPoint = { slider.isHorizontal() ? sliderPos : width * 0.5f, slider.isHorizontal() ? height * 0.5f : sliderPos }; maxPoint = { slider.isHorizontal() ? maxSliderPos : width * 0.5f, slider.isHorizontal() ? height * 0.5f : maxSliderPos }; } else { auto kx = slider.isHorizontal() ? sliderPos : (x + width * 0.5f); auto ky = slider.isHorizontal() ? (y + height * 0.5f) : sliderPos; minPoint = startPoint; maxPoint = { kx, ky }; } auto thumbWidth = getSliderThumbRadius (slider); valueTrack.startNewSubPath (minPoint); valueTrack.lineTo (isThreeVal ? thumbPoint : maxPoint); g.setColour (slider.findColour (Slider::trackColourId)); g.strokePath (valueTrack, { trackWidth, PathStrokeType::curved, PathStrokeType::rounded }); if (! isTwoVal) { g.setColour (slider.findColour (Slider::thumbColourId)); g.fillEllipse (Rectangle (static_cast (thumbWidth), static_cast (thumbWidth)).withCentre (isThreeVal ? thumbPoint : maxPoint)); } if (isTwoVal || isThreeVal) { auto sr = jmin (trackWidth, (slider.isHorizontal() ? height : width) * 0.4f); auto pointerColour = slider.findColour (Slider::thumbColourId); if (slider.isHorizontal()) { drawPointer (g, minSliderPos - sr, jmax (0.0f, y + height * 0.5f - trackWidth * 2.0f), trackWidth * 2.0f, pointerColour, 2); drawPointer (g, maxSliderPos - trackWidth, jmin (y + height - trackWidth * 2.0f, y + height * 0.5f), trackWidth * 2.0f, pointerColour, 4); } else { drawPointer (g, jmax (0.0f, x + width * 0.5f - trackWidth * 2.0f), minSliderPos - trackWidth, trackWidth * 2.0f, pointerColour, 1); drawPointer (g, jmin (x + width - trackWidth * 2.0f, x + width * 0.5f), maxSliderPos - sr, trackWidth * 2.0f, pointerColour, 3); } } } } void LookAndFeel_V4::drawRotarySlider (Graphics& g, int x, int y, int width, int height, float sliderPos, const float rotaryStartAngle, const float rotaryEndAngle, Slider& slider) { auto outline = slider.findColour (Slider::rotarySliderOutlineColourId); auto fill = slider.findColour (Slider::rotarySliderFillColourId); auto bounds = Rectangle (x, y, width, height).toFloat().reduced (10); auto radius = jmin (bounds.getWidth(), bounds.getHeight()) / 2.0f; auto toAngle = rotaryStartAngle + sliderPos * (rotaryEndAngle - rotaryStartAngle); auto lineW = jmin (8.0f, radius * 0.5f); auto arcRadius = radius - lineW * 0.5f; Path backgroundArc; backgroundArc.addCentredArc (bounds.getCentreX(), bounds.getCentreY(), arcRadius, arcRadius, 0.0f, rotaryStartAngle, rotaryEndAngle, true); g.setColour (outline); g.strokePath (backgroundArc, PathStrokeType (lineW, PathStrokeType::curved, PathStrokeType::rounded)); if (slider.isEnabled()) { Path valueArc; valueArc.addCentredArc (bounds.getCentreX(), bounds.getCentreY(), arcRadius, arcRadius, 0.0f, rotaryStartAngle, toAngle, true); g.setColour (fill); g.strokePath (valueArc, PathStrokeType (lineW, PathStrokeType::curved, PathStrokeType::rounded)); } auto thumbWidth = lineW * 2.0f; Point thumbPoint (bounds.getCentreX() + arcRadius * std::cos (toAngle - MathConstants::halfPi), bounds.getCentreY() + arcRadius * std::sin (toAngle - MathConstants::halfPi)); g.setColour (slider.findColour (Slider::thumbColourId)); g.fillEllipse (Rectangle (thumbWidth, thumbWidth).withCentre (thumbPoint)); } void LookAndFeel_V4::drawPointer (Graphics& g, const float x, const float y, const float diameter, const Colour& colour, const int direction) noexcept { Path p; p.startNewSubPath (x + diameter * 0.5f, y); p.lineTo (x + diameter, y + diameter * 0.6f); p.lineTo (x + diameter, y + diameter); p.lineTo (x, y + diameter); p.lineTo (x, y + diameter * 0.6f); p.closeSubPath(); p.applyTransform (AffineTransform::rotation (direction * MathConstants::halfPi, x + diameter * 0.5f, y + diameter * 0.5f)); g.setColour (colour); g.fillPath (p); } Label* LookAndFeel_V4::createSliderTextBox (Slider& slider) { auto* l = LookAndFeel_V2::createSliderTextBox (slider); if (getCurrentColourScheme() == LookAndFeel_V4::getGreyColourScheme() && (slider.getSliderStyle() == Slider::LinearBar || slider.getSliderStyle() == Slider::LinearBarVertical)) { l->setColour (Label::textColourId, Colours::black.withAlpha (0.7f)); } return l; } //============================================================================== void LookAndFeel_V4::drawTooltip (Graphics& g, const String& text, int width, int height) { Rectangle bounds (width, height); auto cornerSize = 5.0f; g.setColour (findColour (TooltipWindow::backgroundColourId)); g.fillRoundedRectangle (bounds.toFloat(), cornerSize); g.setColour (findColour (TooltipWindow::outlineColourId)); g.drawRoundedRectangle (bounds.toFloat().reduced (0.5f, 0.5f), cornerSize, 1.0f); LookAndFeelHelpers::layoutTooltipText (text, findColour (TooltipWindow::textColourId)) .draw (g, { static_cast (width), static_cast (height) }); } //============================================================================== void LookAndFeel_V4::drawConcertinaPanelHeader (Graphics& g, const Rectangle& area, bool isMouseOver, bool /*isMouseDown*/, ConcertinaPanel& concertina, Component& panel) { auto bounds = area.toFloat().reduced (0.5f); auto cornerSize = 4.0f; auto isTopPanel = (concertina.getPanel (0) == &panel); Path p; p.addRoundedRectangle (bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), cornerSize, cornerSize, isTopPanel, isTopPanel, false, false); g.setGradientFill (ColourGradient::vertical (Colours::white.withAlpha (isMouseOver ? 0.4f : 0.2f), static_cast (area.getY()), Colours::darkgrey.withAlpha (0.1f), static_cast (area.getBottom()))); g.fillPath (p); } //============================================================================== void LookAndFeel_V4::drawLevelMeter (Graphics& g, int width, int height, float level) { auto outerCornerSize = 3.0f; auto outerBorderWidth = 2.0f; auto totalBlocks = 7; auto spacingFraction = 0.03f; g.setColour (findColour (ResizableWindow::backgroundColourId)); g.fillRoundedRectangle (0.0f, 0.0f, static_cast (width), static_cast (height), outerCornerSize); auto doubleOuterBorderWidth = 2.0f * outerBorderWidth; auto numBlocks = roundToInt (totalBlocks * level); auto blockWidth = (width - doubleOuterBorderWidth) / static_cast (totalBlocks); auto blockHeight = height - doubleOuterBorderWidth; auto blockRectWidth = (1.0f - 2.0f * spacingFraction) * blockWidth; auto blockRectSpacing = spacingFraction * blockWidth; auto blockCornerSize = 0.1f * blockWidth; auto c = findColour (Slider::thumbColourId); for (auto i = 0; i < totalBlocks; ++i) { if (i >= numBlocks) g.setColour (c.withAlpha (0.5f)); else g.setColour (i < totalBlocks - 1 ? c : Colours::red); g.fillRoundedRectangle (outerBorderWidth + (i * blockWidth) + blockRectSpacing, outerBorderWidth, blockRectWidth, blockHeight, blockCornerSize); } } //============================================================================== void LookAndFeel_V4::paintToolbarBackground (Graphics& g, int w, int h, Toolbar& toolbar) { auto background = toolbar.findColour (Toolbar::backgroundColourId); g.setGradientFill ({ background, 0.0f, 0.0f, background.darker (0.2f), toolbar.isVertical() ? w - 1.0f : 0.0f, toolbar.isVertical() ? 0.0f : h - 1.0f, false }); g.fillAll(); } void LookAndFeel_V4::paintToolbarButtonLabel (Graphics& g, int x, int y, int width, int height, const String& text, ToolbarItemComponent& component) { auto baseTextColour = component.findParentComponentOfClass() != nullptr ? component.findColour (PopupMenu::textColourId) : component.findColour (Toolbar::labelTextColourId); g.setColour (baseTextColour.withAlpha (component.isEnabled() ? 1.0f : 0.25f)); auto fontHeight = jmin (14.0f, height * 0.85f); g.setFont (fontHeight); g.drawFittedText (text, x, y, width, height, Justification::centred, jmax (1, height / (int) fontHeight)); } //============================================================================== void LookAndFeel_V4::drawPropertyPanelSectionHeader (Graphics& g, const String& name, bool isOpen, int width, int height) { auto buttonSize = height * 0.75f; auto buttonIndent = (height - buttonSize) * 0.5f; drawTreeviewPlusMinusBox (g, { buttonIndent, buttonIndent, buttonSize, buttonSize }, findColour (ResizableWindow::backgroundColourId), isOpen, false); auto textX = static_cast ((buttonIndent * 2.0f + buttonSize + 2.0f)); g.setColour (findColour (PropertyComponent::labelTextColourId)); g.setFont ({ height * 0.7f, Font::bold }); g.drawText (name, textX, 0, width - textX - 4, height, Justification::centredLeft, true); } void LookAndFeel_V4::drawPropertyComponentBackground (Graphics& g, int width, int height, PropertyComponent& component) { g.setColour (component.findColour (PropertyComponent::backgroundColourId)); g.fillRect (0, 0, width, height - 1); } void LookAndFeel_V4::drawPropertyComponentLabel (Graphics& g, int width, int height, PropertyComponent& component) { ignoreUnused (width); auto indent = getPropertyComponentIndent (component); g.setColour (component.findColour (PropertyComponent::labelTextColourId) .withMultipliedAlpha (component.isEnabled() ? 1.0f : 0.6f)); g.setFont (jmin (height, 24) * 0.65f); auto r = getPropertyComponentContentPosition (component); g.drawFittedText (component.getName(), indent, r.getY(), r.getX() - 5, r.getHeight(), Justification::centredLeft, 2); } int LookAndFeel_V4::getPropertyComponentIndent (PropertyComponent& component) { return jmin (10, component.getWidth() / 10); } Rectangle LookAndFeel_V4::getPropertyComponentContentPosition (PropertyComponent& component) { auto textW = jmin (200, component.getWidth() / 2); return { textW, 0, component.getWidth() - textW, component.getHeight() - 1 }; } //============================================================================== void LookAndFeel_V4::drawCallOutBoxBackground (CallOutBox& box, Graphics& g, const Path& path, Image& cachedImage) { if (cachedImage.isNull()) { cachedImage = { Image::ARGB, box.getWidth(), box.getHeight(), true }; Graphics g2 (cachedImage); DropShadow (Colours::black.withAlpha (0.7f), 8, { 0, 2 }).drawForPath (g2, path); } g.setColour (Colours::black); g.drawImageAt (cachedImage, 0, 0); g.setColour (currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).withAlpha (0.8f)); g.fillPath (path); g.setColour (currentColourScheme.getUIColour (ColourScheme::UIColour::outline).withAlpha (0.8f)); g.strokePath (path, PathStrokeType (2.0f)); } //============================================================================== void LookAndFeel_V4::drawStretchableLayoutResizerBar (Graphics& g, int /*w*/, int /*h*/, bool /*isVerticalBar*/, bool isMouseOver, bool isMouseDragging) { if (isMouseOver || isMouseDragging) g.fillAll (currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.5f)); } //============================================================================== void LookAndFeel_V4::initialiseColours() { const uint32 transparent = 0x00000000; const uint32 coloursToUse[] = { TextButton::buttonColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), TextButton::buttonOnColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), TextButton::textColourOnId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), TextButton::textColourOffId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ToggleButton::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ToggleButton::tickColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ToggleButton::tickDisabledColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).withAlpha (0.5f).getARGB(), TextEditor::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), TextEditor::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), TextEditor::highlightColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.4f).getARGB(), TextEditor::highlightedTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), TextEditor::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), TextEditor::focusedOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), TextEditor::shadowColourId, transparent, CaretComponent::caretColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), Label::backgroundColourId, transparent, Label::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), Label::outlineColourId, transparent, Label::textWhenEditingColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ScrollBar::backgroundColourId, transparent, ScrollBar::thumbColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), ScrollBar::trackColourId, transparent, TreeView::linesColourId, transparent, TreeView::backgroundColourId, transparent, TreeView::dragAndDropIndicatorColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), TreeView::selectedItemBackgroundColourId, transparent, TreeView::oddItemsColourId, transparent, TreeView::evenItemsColourId, transparent, PopupMenu::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuBackground).getARGB(), PopupMenu::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), PopupMenu::headerTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), PopupMenu::highlightedTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), PopupMenu::highlightedBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), ComboBox::buttonColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ComboBox::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ComboBox::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ComboBox::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), ComboBox::arrowColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), ComboBox::focusedOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), PropertyComponent::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), PropertyComponent::labelTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), TextPropertyComponent::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), TextPropertyComponent::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), TextPropertyComponent::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), BooleanPropertyComponent::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), BooleanPropertyComponent::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ListBox::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), ListBox::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ListBox::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), Slider::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), Slider::thumbColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), Slider::trackColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), Slider::rotarySliderFillColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), Slider::rotarySliderOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), Slider::textBoxTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), Slider::textBoxBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).withAlpha (0.0f).getARGB(), Slider::textBoxHighlightColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.4f).getARGB(), Slider::textBoxOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ResizableWindow::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::windowBackground).getARGB(), DocumentWindow::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), AlertWindow::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), AlertWindow::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), AlertWindow::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), ProgressBar::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), ProgressBar::foregroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), TooltipWindow::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), TooltipWindow::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), TooltipWindow::outlineColourId, transparent, TabbedComponent::backgroundColourId, transparent, TabbedComponent::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), TabbedButtonBar::tabOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).withAlpha (0.5f).getARGB(), TabbedButtonBar::frontOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), Toolbar::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).withAlpha (0.4f).getARGB(), Toolbar::separatorColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), Toolbar::buttonMouseOverBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).contrasting (0.2f).getARGB(), Toolbar::buttonMouseDownBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).contrasting (0.5f).getARGB(), Toolbar::labelTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), Toolbar::editingModeOutlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), DrawableButton::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), DrawableButton::textColourOnId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), DrawableButton::backgroundColourId, transparent, DrawableButton::backgroundOnColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), HyperlinkButton::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).interpolatedWith (Colours::blue, 0.4f).getARGB(), GroupComponent::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), GroupComponent::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), BubbleComponent::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), BubbleComponent::outlineColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), DirectoryContentsDisplayComponent::highlightColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).getARGB(), DirectoryContentsDisplayComponent::textColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), DirectoryContentsDisplayComponent::highlightedTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedText).getARGB(), 0x1000440, /*LassoComponent::lassoFillColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), 0x1000441, /*LassoComponent::lassoOutlineColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(), 0x1005000, /*MidiKeyboardComponent::whiteNoteColourId*/ 0xffffffff, 0x1005001, /*MidiKeyboardComponent::blackNoteColourId*/ 0xff000000, 0x1005002, /*MidiKeyboardComponent::keySeparatorLineColourId*/ 0x66000000, 0x1005003, /*MidiKeyboardComponent::mouseOverKeyOverlayColourId*/ 0x80ffff00, 0x1005004, /*MidiKeyboardComponent::keyDownOverlayColourId*/ 0xffb6b600, 0x1005005, /*MidiKeyboardComponent::textLabelColourId*/ 0xff000000, 0x1005006, /*MidiKeyboardComponent::upDownButtonBackgroundColourId*/ 0xffd3d3d3, 0x1005007, /*MidiKeyboardComponent::upDownButtonArrowColourId*/ 0xff000000, 0x1005008, /*MidiKeyboardComponent::shadowColourId*/ 0x4c000000, 0x1004500, /*CodeEditorComponent::backgroundColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), 0x1004502, /*CodeEditorComponent::highlightColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.4f).getARGB(), 0x1004503, /*CodeEditorComponent::defaultTextColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), 0x1004504, /*CodeEditorComponent::lineNumberBackgroundId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::highlightedFill).withAlpha (0.5f).getARGB(), 0x1004505, /*CodeEditorComponent::lineNumberTextId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), 0x1007000, /*ColourSelector::backgroundColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), 0x1007001, /*ColourSelector::labelTextColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), 0x100ad00, /*KeyMappingEditorComponent::backgroundColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), 0x100ad01, /*KeyMappingEditorComponent::textColourId*/ currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), FileSearchPathListComponent::backgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuBackground).getARGB(), FileChooserDialogBox::titleTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), SidePanel::backgroundColour, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(), SidePanel::titleTextColour, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultText).getARGB(), SidePanel::shadowBaseColour, currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).darker().getARGB(), SidePanel::dismissButtonNormalColour, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(), SidePanel::dismissButtonOverColour, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).darker().getARGB(), SidePanel::dismissButtonDownColour, currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).brighter().getARGB(), FileBrowserComponent::currentPathBoxBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuBackground).getARGB(), FileBrowserComponent::currentPathBoxTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), FileBrowserComponent::currentPathBoxArrowColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), FileBrowserComponent::filenameBoxBackgroundColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuBackground).getARGB(), FileBrowserComponent::filenameBoxTextColourId, currentColourScheme.getUIColour (ColourScheme::UIColour::menuText).getARGB(), }; for (int i = 0; i < numElementsInArray (coloursToUse); i += 2) setColour ((int) coloursToUse [i], Colour ((uint32) coloursToUse [i + 1])); } } // namespace juce