/** \ingroup gui
 * \class QgsColorRampButton
 * A cross platform button subclass for selecting color ramps. Will open color ramp dialogs when clicked.
 * Offers live updates to button from color ramp dialog. An attached drop down menu allows for access to
 * saved color ramps, as well as option to invert the current color ramp and create new ramps.
 * \note Added in version 3.0
 */

class QgsColorRampButton : QToolButton
{
%TypeHeaderCode
#include <qgscolorrampbutton.h>
%End

  public:

    /** Construct a new color ramp button.
     * @param parent The parent QWidget for the dialog
     * @param dialogTitle The title to show in the color ramp dialog
     */
    QgsColorRampButton( QWidget *parent = nullptr, const QString& dialogTitle = QString() );

    virtual ~QgsColorRampButton();

    virtual QSize sizeHint() const;

    /** Return a copy of the current color ramp.
     * @see setColorRamp()
     */
    QgsColorRamp* colorRamp() const /Factory/;

    /** Set the title for the color ramp dialog window.
     * @param title Title for the color ramp dialog
     * @see colorRampDialogTitle
     */
    void setColorRampDialogTitle( const QString& title );

    /** Returns the title for the color ramp dialog window.
     * @returns title for the color ramp dialog
     * @see setColorRampDialogTitle
     */
    QString colorRampDialogTitle() const;

    /** Returns whether the button accepts live updates from QgsColorRampDialog.
     * @returns true if the button will be accepted immediately when the dialog's color ramp changes
     * @see setAcceptLiveUpdates
     */
    bool acceptLiveUpdates() const;

    /** Sets whether the button accepts live updates from QgsColorRampDialog. Live updates may cause changes
     * that are not undoable on QColorRampDialog cancel.
     * @param accept set to true to enable live updates
     * @see acceptLiveUpdates
     */
    void setAcceptLiveUpdates( const bool accept );

    /** Sets whether the drop down menu should be shown for the button. The default behaviour is to
     * show the menu.
     * @param showMenu set to false to hide the drop down menu
     * @see showMenu
     */
    void setShowMenu( const bool showMenu );

    /** Returns whether the drop down menu is shown for the button.
     * @returns true if drop down menu is shown
     * @see setShowMenu
     */
    bool showMenu() const;

    /** Sets the default color ramp for the button, which is shown in the button's drop down menu for the
     * "default color ramp" option.
     * @param colorramp default color ramp for the button. Set to a null pointer to disable the default color
     * ramp option. The ramp will be cloned and ownership is not transferred.
     * @see defaultColorRamp
     */
    void setDefaultColorRamp( QgsColorRamp* colorramp );

    /** Returns a copy of the default color ramp for the button, which is shown in the button's drop down menu for the
     * "default color ramp" option.
     * @returns default color ramp for the button. Returns a null pointer if the default color ramp
     * option is disabled.
     * @see setDefaultColorRamp
     */
    QgsColorRamp* defaultColorRamp() const /Factory/;

    /** Sets whether a random colors option is shown in the button's drop down menu.
     * @param showNull set to true to show a null option
     * @see showRandom()
     */
    void setShowRandomColorRamp( bool showRandom );

    /** Returns whether random colors option is shown in the button's drop down menu.
     * @see setShowRandom()
     */
    bool showRandomColorRamp() const;

    /** Returns true if the current color is null.
     * @see setShowNull()
     * @see showNull()
     */
    bool isRandomColorRamp() const;

    /** Sets whether a set to null (clear) option is shown in the button's drop down menu.
     * @param showNull set to true to show a null option
     * @see showNull()
     * @see isNull()
     */
    void setShowNull( bool showNull );

    /** Returns whether the set to null (clear) option is shown in the button's drop down menu.
     * @see setShowNull()
     * @see isNull()
     */
    bool showNull() const;

    /** Returns true if the current color is null.
     * @see setShowNull()
     * @see showNull()
     */
    bool isNull() const;

    /** Sets the context string for the color ramp button. The context string is passed to all color ramp
     * preview icons shown in the button's drop down menu, to (eventually) allow them to customise their display colors
     * based on the context.
     * @param context context string for the color dialog button's color ramp preview icons
     * @see context
     */
    void setContext( const QString& context );

    /** Returns the context string for the color ramp button. The context string is passed to all color ramp
     * preview icons shown in the button's drop down menu, to (eventually) allow them to customise their display colors
     * based on the context.
     * @returns context context string for the color dialog button's color ramp preview icons
     * @see setContext
     */
    QString context() const;

    /** Sets whether the color ramp button only shows gradient type ramps
     * @param gradientonly set to true to show only gradient type ramps
     * @see showGradientOnly
     */
    void setShowGradientOnly( bool gradientonly );

    /** Returns true if the color ramp button only shows gradient type ramps
     * @see setShowGradientOnly
     */
    bool showGradientOnly() const;

    /** Sets the name of the current color ramp when it's available in the style manager
     * @param name Name of the saved color ramp
     * @see colorRampName
     */
    void setColorRampName( QString name );

    /** Returns the name of the current color ramp when it's available in the style manager
     * @see setColorRampName
     */
    QString colorRampName() const;

  public slots:

    /** Sets the current color ramp for the button. Will emit a colorRampChanged() signal if the color ramp is different
     * to the previous color ramp.
     * @param colorramp New color ramp for the button. The ramp will be cloned and ownership is not transferred.
     * @see setRandomColorRamp, setColorRampFromName, colorRamp
     */
    void setColorRamp( QgsColorRamp* colorramp );

    /** Sets the current color ramp for the button to random colors. Will emit a colorRampChanged() signal
     * if the color ramp is different to the previous color ramp.
     * @see setColorRamp, setColorRampFromName, colorRamp
     */
    void setRandomColorRamp();

    /** Sets the current color ramp for the button using a saved color ramp name. Will emit a colorRampChanged() signal
     * if the color ramp is different to the previous color ramp.
     * @param name Name of saved color ramp
     * @see setColorRamp, setRandomColorRamp, colorRamp
     */
    void setColorRampFromName( const QString& name = QString() );

    /** Sets the background pixmap for the button based upon current color ramp.
     * @param colorramp Color ramp for button background. If no color ramp is specified, the button's current
     * color ramp will be used
     */
    void setButtonBackground( QgsColorRamp* colorramp = nullptr );

    /** Sets color ramp to the button's default color ramp, if set.
     * @see setDefaultColorRamp
     * @see defaultColorRamp
     * @see setToNull()
     */
    void setToDefaultColorRamp();

    /** Sets color ramp to null.
     * @see setToDefaultColorRamp()
     */
    void setToNull();

  signals:

    /** Emitted whenever a new color ramp is set for the button. The color ramp is always valid.
     * In case the new color ramp is the same, no signal is emitted to avoid infinite loops.
     */
    void colorRampChanged();

  protected:

    bool event( QEvent *e );
    void changeEvent( QEvent* e );
    void showEvent( QShowEvent* e );
    void resizeEvent( QResizeEvent *event );

    /**
     * Reimplemented to detect right mouse button clicks on the color ramp button
     */
    void mousePressEvent( QMouseEvent* e );

};