|  | /*
  ==============================================================================
   This file is part of the JUCE library.
   Copyright (c) 2020 - Raw Material Software Limited
   JUCE is an open source library subject to commercial or open-source
   licensing.
   By using JUCE, you agree to the terms of both the JUCE 6 End-User License
   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
   End User License Agreement: www.juce.com/juce-6-licence
   Privacy Policy: www.juce.com/juce-privacy-policy
   Or: You may also use this code under the terms of the GPL v3 (see
   www.gnu.org/licenses).
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
   DISCLAIMED.
  ==============================================================================
*/
#pragma once
#include "../../Application/jucer_Application.h"
//==============================================================================
class UserAvatarComponent  : public Component,
                             public SettableTooltipClient,
                             public ChangeBroadcaster,
                             private LicenseController::LicenseStateListener
{
public:
    UserAvatarComponent (bool isInteractive)
        : interactive (isInteractive)
    {
        ProjucerApplication::getApp().getLicenseController().addListener (this);
        lookAndFeelChanged();
    }
    ~UserAvatarComponent() override
    {
        ProjucerApplication::getApp().getLicenseController().removeListener (this);
    }
    void paint (Graphics& g) override
    {
        auto bounds = getLocalBounds();
        if (! isGPL)
        {
            bounds = bounds.removeFromRight (bounds.getHeight());
            Path ellipse;
            ellipse.addEllipse (bounds.toFloat());
            g.reduceClipRegion (ellipse);
        }
        g.drawImage (currentAvatar, bounds.toFloat(), RectanglePlacement::fillDestination);
    }
    void mouseUp (const MouseEvent&) override
    {
        if (interactive)
        {
            PopupMenu menu;
            menu.addCommandItem (ProjucerApplication::getApp().commandManager.get(), CommandIDs::loginLogout);
            menu.showMenuAsync (PopupMenu::Options().withTargetComponent (this));
        }
    }
    bool isDisplaingGPLLogo() const noexcept  { return isGPL; }
private:
    //==============================================================================
    static Image createGPLAvatarImage()
    {
        if (auto logo = Drawable::createFromImageData (BinaryData::gpl_logo_svg, BinaryData::gpl_logo_svgSize))
        {
            auto bounds = logo->getDrawableBounds();
            Image image (Image::ARGB, roundToInt (bounds.getWidth()), roundToInt (bounds.getHeight()), true);
            Graphics g (image);
            logo->draw (g, 1.0f);
            return image;
        }
        jassertfalse;
        return {};
    }
    Image createStandardAvatarImage()
    {
        Image image (Image::ARGB, 250, 250, true);
        Graphics g (image);
        g.setColour (findColour (defaultButtonBackgroundColourId));
        g.fillAll();
        g.setColour (findColour (defaultIconColourId));
        auto path = getIcons().user;
        g.fillPath (path, RectanglePlacement (RectanglePlacement::centred)
                            .getTransformToFit (path.getBounds(), image.getBounds().reduced (image.getHeight() / 5).toFloat()));
        return image;
    }
    //==============================================================================
    void licenseStateChanged() override
    {
        auto state = ProjucerApplication::getApp().getLicenseController().getCurrentState();
        isGPL = ProjucerApplication::getApp().getLicenseController().getCurrentState().isGPL();
        if (interactive)
        {
            auto formattedUserString = [state]() -> String
            {
                if (state.isSignedIn())
                    return (state.isGPL() ? "" : (state.username + " - ")) + state.getLicenseTypeString();
                return "Not logged in";
            }();
            setTooltip (formattedUserString);
        }
        currentAvatar = isGPL ? gplAvatarImage
                              : state.isSignedIn() ? standardAvatarImage : signedOutAvatarImage;
        repaint();
        sendChangeMessage();
    }
    void lookAndFeelChanged() override
    {
        standardAvatarImage = createStandardAvatarImage();
        signedOutAvatarImage = createStandardAvatarImage();
        if (interactive)
            signedOutAvatarImage.multiplyAllAlphas (0.4f);
        licenseStateChanged();
        repaint();
    }
    //==============================================================================
    Image standardAvatarImage, signedOutAvatarImage, gplAvatarImage { createGPLAvatarImage() }, currentAvatar;
    bool isGPL = false, interactive = false;
};
 |