ukui-clock/qroundProgressBar.h

272 lines
9.6 KiB
C++

/*
* Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/&gt;.
*
*/
#ifndef QROUNDPROGRESSBAR_H
#define QROUNDPROGRESSBAR_H
#include <QWidget>
#include <QStyleOption>
#include <QGSettings>
#include "constant_class.h"
#include "gsettingsubject.h"
/**
* @brief The QRoundProgressBar class represents a circular progress bar and maintains its API
* similar to the *QProgressBar*.
*
* ### Styles
* QRoundProgressBar currently supports Donut, Pie and Line styles. See setBarStyle() for more details.
*
* ### Colors
* Generally QRoundProgressBar uses its palette and font attributes to define how it will look.
*
* The following \a QPalette members are considered:
* - *QPalette::Window* background of the whole widget (normally should be set to Qt::NoBrush)
* - *QPalette::Base* background of the non-filled progress bar area (should be set to Qt::NoBrush to make it transparent)
* - *QPalette::AlternateBase* background of the central circle where the text is shown (for \a Donut style)
* - *QPalette::Shadow* foreground of the non-filled progress bar area (i.e. border color)
* - *QPalette::Highlight* background of the filled progress bar area
* - *QPalette::Text* color of the text shown in the center
*
* Create a \a QPalette with given attributes and apply it via `setPalette()`.
*
* ### Color gradient
* \a Donut and \a Pie styles allow to use color gradient for currernt value area instead of plain brush fill.
* See setDataColors() for more details.
*
* ### Value text
* Value text is generally drawn inside the QRoundProgressBar using its `font()` and \a QPalette::Text role from its `palette()`.
*
* To define pattern of the text, use setFormat() function (see Qt's \a QProgressBar for more details).
*
* To define number of decimals to be shown, use setDecimals() function.
*
* ### Font
* To use own font for value text, apply it via `setFont()`.
*
* By default, font size will be adjusted automatically to fit the inner circle of the widget.
*/
class QRoundProgressBar : public QWidget
{
Q_OBJECT
public:
explicit QRoundProgressBar(QWidget *parent = 0);
static const int PositionLeft = 90;
static const int PositionTop = 90;
static const int PositionRight = 0;
static const int PositionBottom = -90;
/**
* @brief Return position (in degrees) of minimum value.
* \sa setNullPosition
*/
double nullPosition() const { return m_nullPosition; }
/**
* @brief Defines position of minimum value.
* @param position position on the circle (in degrees) of minimum value
* \sa nullPosition
*/
void setNullPosition(double position);
/**
* @brief The BarStyle enum defines general look of the progress bar.
*/
enum BarStyle
{
/// Donut style (filled torus around the text)
StyleDonut,
/// Pie style (filled pie segment with the text in center)
StylePie,
/// Line style (thin round line around the text)
StyleLine
};
/**
* @brief Sets visual style of the widget.
* \sa barStyle
*/
void setBarStyle(BarStyle style);
/**
* @brief Returns current progree bar style.
* \sa setBarStyle
*/
BarStyle barStyle() const { return m_barStyle; }
/**
* @brief Sets width of the outline circle pen.
* @param penWidth width of the outline circle pen (in pixels)
*/
void setOutlinePenWidth(double penWidth);
/**
* @brief Returns width of the outline circle pen.
*/
double outlinePenWidth() const { return m_outlinePenWidth; }
/**
* @brief Sets width of the data circle pen.
* @param penWidth width of the data circle pen (in pixels)
*/
void setDataPenWidth(double penWidth);
/**
* @brief Returns width of the data circle pen.
*/
double dataPenWidth() const { return m_dataPenWidth; }
/**
* @brief Sets colors of the visible data and makes gradient brush from them.
* Gradient colors can be set for \a Donut and \a Pie styles (see setBarStyle() function).
*
* *Warning*: this function will override widget's `palette()` to set dynamically created gradient brush.
*
* @param stopPoints List of colors (should have at least 2 values, see Qt's \a QGradientStops for more details).
* Color value at point 0 corresponds to the minimum() value, while color value at point 1
* corresponds to the maximum(). Other colors will be distributed accordingly to the defined ranges (see setRange()).
*/
void setDataColors(const QGradientStops& stopPoints);
/**
* @brief Defines the string used to generate the current text.
* If no format is set, no text will be shown.
* @param format see \a QProgressBar's format description
* \sa setDecimals
*/
void setFormat(const QString& format);
/**
* @brief Sets format string to empty string. No text will be shown therefore.
* See setFormat() for more information.
*/
void resetFormat();
/**
* @brief Returns the string used to generate the current text.
*/
QString format() const { return m_format; }
/**
* @brief Sets number of decimals to show after the comma (default is 1).
* \sa setFormat
*/
void setDecimals(int count);
/**
* @brief Returns number of decimals to show after the comma (default is 1).
* \sa setFormat, setDecimals
*/
int decimals() const { return m_decimals; }
/**
* @brief Returns current value shown on the widget.
* \sa setValue()
*/
double value() const { return m_value; }
/**
* @brief Returns minimum of the allowed value range.
* \sa setMinimum, setRange
*/
double minimum() const { return m_min; }
/**
* @brief Returns maximum of the allowed value range.
* \sa setMaximum, setRange
*/
double maximum() const { return m_max; }
double time_max = 10000;
double ring_max = 3600;
QColor getRingRunColor() const;
void setRingRunColor(const QColor &value);
void switchRunRingColor();
void switchStopRingColor();
public Q_SLOTS:
/**
* @brief Defines minimum und maximum of the allowed value range.
* If the current value does not fit into the range, it will be automatically adjusted.
* @param min minimum of the allowed value range
* @param max maximum of the allowed value range
*/
void setRange(double min, double max);
/**
* @brief Defines minimum of the allowed value range.
* If the current value does not fit into the range, it will be automatically adjusted.
* @param min minimum of the allowed value range
* \sa setRange
*/
void setMinimum(double min);
/**
* @brief Defines maximum of the allowed value range.
* If the current value does not fit into the range, it will be automatically adjusted.
* @param max maximum of the allowed value range
* \sa setRange
*/
void setMaximum(double max);
/**
* @brief Sets a value which will be shown on the widget.
* @param val must be between minimum() and maximum()
*/
void setValue(double val);
void settingsStyle();
protected:
virtual void paintEvent(QPaintEvent *event);
virtual void drawBackground(QPainter& p, const QRectF& baseRect);
//virtual void drawBase(QPainter& p, const QRectF& baseRect);
virtual void drawBase(QPainter &p, const QRectF &baseRect,const QRectF &innerRect);
//virtual void drawValue(QPainter& p, const QRectF& baseRect, double value, double arcLength);
virtual void drawValue(QPainter& p, const QRectF& baseRect, double value, double arcLength, const QRectF & innerRect, double innerRadius);
virtual void calculateInnerRect(const QRectF& baseRect, double outerRadius, QRectF& innerRect, double& innerRadius);
virtual void drawInnerBackground(QPainter& p, const QRectF& innerRect);
virtual void drawText(QPainter& p, const QRectF& innerRect, double innerRadius, double value);
virtual QString valueToText(double value) const;
virtual void valueFormatChanged();
virtual QSize minimumSizeHint() const { return QSize(32,32); }
virtual bool hasHeightForWidth() const { return true; }
virtual int heightForWidth(int w) const { return w; }
void rebuildDataBrushIfNeeded();
double m_min, m_max;
double m_value;
double m_nullPosition;
BarStyle m_barStyle;
double m_outlinePenWidth, m_dataPenWidth;
QGradientStops m_gradientData;
bool m_rebuildBrush;
QString m_format;
int m_decimals;
static const int UF_VALUE = 1;
static const int UF_PERCENT = 2;
static const int UF_MAX = 4;
int m_updateFlags;
float m_innerOuterRate = 1;
QStyleOption opt;
QColor mainColor;
private:
QColor ringRunColor = QColor(55, 144, 250,255);
};
#endif // QROUNDPROGRESSBAR_H