/**
* \file
*
* \author Mattia Basaglia
*
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
#ifndef COLOR_WIDGETS_COLOR_PALETTE_WIDGET_HPP
#define COLOR_WIDGETS_COLOR_PALETTE_WIDGET_HPP
#include
#include
#include "color_palette_model.hpp"
#include "swatch.hpp"
namespace color_widgets {
/**
* \brief A widget to use and modify palettes
*/
class QCP_EXPORT ColorPaletteWidget : public QWidget
{
Q_OBJECT
/**
* \brief Model used to store the palettes
*/
Q_PROPERTY(ColorPaletteModel* model READ model WRITE setModel NOTIFY modelChanged)
/**
* \brief Size of a single color in the swatch widget
*/
Q_PROPERTY(QSize colorSize READ colorSize WRITE setColorSize NOTIFY colorSizeChanged)
/**
* \brief Policy for colorSize
**/
Q_PROPERTY(color_widgets::Swatch::ColorSizePolicy colorSizePolicy READ colorSizePolicy WRITE setColorSizePolicy NOTIFY colorSizePolicyChanged)
/**
* \brief Border around the colors
*/
Q_PROPERTY(QPen border READ border WRITE setBorder NOTIFY borderChanged)
/**
* \brief Forces the Swatch to display that many rows of colors
*
* If there are too few elements, the widget will display less than this
* many rows.
*
* A value of0 means that the number of rows is automatic.
*
* \note Conflicts with forcedColumns
*/
Q_PROPERTY(int forcedRows READ forcedRows WRITE setForcedRows NOTIFY forcedRowsChanged)
/**
* \brief Forces the Swatch to display that many columns of colors
*
* If there are too few elements, the widget will display less than this
* many columns.
*
* A value of 0 means that the number of columns is automatic.
*
* \note Conflicts with forcedRows
*/
Q_PROPERTY(int forcedColumns READ forcedColumns WRITE setForcedColumns NOTIFY forcedColumnsChanged)
/**
* \brief Whether the palettes can be modified via user interaction
*/
Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly NOTIFY readOnlyChanged)
/**
* \brief Currently selected color
*/
Q_PROPERTY(QColor currentColor READ currentColor WRITE setCurrentColor NOTIFY currentColorChanged)
/**
* \brief Currently selected model row
*/
Q_PROPERTY(int currentRow READ currentRow WRITE setCurrentRow NOTIFY currentRowChanged)
/**
* \brief Palette shown by the widget
*/
Q_PROPERTY(const ColorPalette& currentPalette READ currentPalette NOTIFY currentPaletteChanged)
/**
* \brief If a valid color, it's used when adding new colors to palettes
*/
Q_PROPERTY(QColor defaultColor READ defaultColor WRITE setDefaultColor NOTIFY defaultColorChanged)
public:
ColorPaletteWidget(QWidget* parent = nullptr);
~ColorPaletteWidget();
ColorPaletteModel* model() const;
/**
* \brief Currently selected palette
* \pre model() != nullptr and there is a selected palette
*/
const ColorPalette& currentPalette() const;
QSize colorSize() const;
Swatch::ColorSizePolicy colorSizePolicy() const;
QPen border() const;
int forcedRows() const;
int forcedColumns() const;
bool readOnly() const;
QColor currentColor() const;
int currentRow() const;
/**
* \brief Default color when adding a color to the current palette
*/
QColor defaultColor() const;
public Q_SLOTS:
void setModel(ColorPaletteModel* model);
void setColorSize(const QSize& colorSize);
void setColorSizePolicy(Swatch::ColorSizePolicy colorSizePolicy);
void setBorder(const QPen& border);
void setForcedRows(int forcedRows);
void setForcedColumns(int forcedColumns);
void setReadOnly(bool readOnly);
/**
* \brief Clear the selected color
*/
void clearCurrentColor();
/**
* \brief Attempt to select a color
*
* If the given color is available in the current palete, it will be selected
* \return \b true on success
*/
bool setCurrentColor(const QColor& color);
/**
* \brief Attempt to select a color by name
*
* If the given color is available in the current palete, it will be selected
* \return \b true on success
*/
bool setCurrentColor(const QString& name);
/**
* \brief Attempt to select a color by index
*
* If the given color is available in the current palete, it will be selected
* \return \b true on success
*/
bool setCurrentColor(int index);
/**
* \brief Set the selected row in the model
*/
void setCurrentRow(int currentRow);
/**
* \brief Sets the default for new colors
* If invalid, it will show a dialog
*/
void setDefaultColor(const QColor& color);
Q_SIGNALS:
void modelChanged(ColorPaletteModel* model);
void colorSizeChanged(const QSize& colorSize);
void colorSizePolicyChanged(Swatch::ColorSizePolicy colorSizePolicy);
void forcedRowsChanged(int forcedRows);
void forcedColumnsChanged(int forcedColumns);
void readOnlyChanged(bool readOnly);
void currentColorChanged(const QColor& currentColor);
void currentColorChanged(int index);
void borderChanged(const QPen& border);
void currentRowChanged(int currentRow);
void currentPaletteChanged(const ColorPalette& palette);
void defaultColorChanged(const QColor& color);
private Q_SLOTS:
void on_palette_list_currentIndexChanged(int index);
void on_swatch_doubleClicked(int index);
private:
class Private;
std::unique_ptr p;
};
} // namespace color_widgets
#endif // COLOR_WIDGETS_COLOR_PALETTE_WIDGET_HPP