2023-02-16 13:51:55 +08:00
|
|
|
|
// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
|
|
|
|
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
|
|
|
|
//
|
|
|
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
2022-06-20 13:40:16 +08:00
|
|
|
|
|
|
|
|
|
#ifndef SLIDERCONTAINER_H
|
|
|
|
|
#define SLIDERCONTAINER_H
|
|
|
|
|
|
|
|
|
|
#include <DSlider>
|
|
|
|
|
|
|
|
|
|
#include <QProxyStyle>
|
|
|
|
|
#include <QTimer>
|
|
|
|
|
|
|
|
|
|
class QLabel;
|
|
|
|
|
class SliderProxyStyle;
|
|
|
|
|
class SliderIconWidget;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 滚动条的类的封装,封装这个类的原因,是为了方便设置左右图标,dtk中的对应的DSlider类也有这个功能,
|
|
|
|
|
* 但是只能简单的设置左右图标,对于右边图标有阴影的,需要外部提供一个带阴影图标,但是如果由外部来提供,
|
|
|
|
|
* 通过QPixmap绘制的带阴影的图标无法消除锯齿(即使通过反走样也不行),因此在此处封装这个类
|
|
|
|
|
*/
|
|
|
|
|
class SliderContainer : public QWidget
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
enum IconPosition {
|
|
|
|
|
LeftIcon = 0,
|
|
|
|
|
RightIcon
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit SliderContainer(QWidget *parent);
|
|
|
|
|
~SliderContainer() override;
|
|
|
|
|
|
|
|
|
|
void setTitle(const QString &text);
|
2022-07-20 14:42:28 +08:00
|
|
|
|
void setSliderProxyStyle(QProxyStyle *proxyStyle);
|
2022-06-20 13:40:16 +08:00
|
|
|
|
void setIcon(const IconPosition &iconPosition, const QIcon &icon);
|
2022-07-20 14:42:28 +08:00
|
|
|
|
void setIcon(const IconPosition &iconPosition, const QPixmap &icon, const QSize &shadowSize, int space);
|
2022-06-20 13:40:16 +08:00
|
|
|
|
|
2022-11-22 13:24:39 +08:00
|
|
|
|
void setPageStep(int step);
|
|
|
|
|
void setRange(int min, int max);
|
2023-08-23 14:11:20 +08:00
|
|
|
|
int getSliderValue();
|
2022-11-22 13:24:39 +08:00
|
|
|
|
|
2022-06-20 13:40:16 +08:00
|
|
|
|
Q_SIGNALS:
|
|
|
|
|
void iconClicked(const IconPosition &);
|
2022-07-20 14:42:28 +08:00
|
|
|
|
void sliderValueChanged(int value);
|
|
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
void updateSliderValue(int value);
|
2022-06-20 13:40:16 +08:00
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
bool eventFilter(QObject *watched, QEvent *event) override;
|
|
|
|
|
QSize getSuitableSize(const QSize &iconSize, const QSize &bgSize);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
SliderIconWidget *m_leftIconWidget;
|
|
|
|
|
QSlider *m_slider;
|
|
|
|
|
QLabel *m_titleLabel;
|
|
|
|
|
SliderIconWidget *m_rightIconWidget;
|
|
|
|
|
QWidget *m_spaceLeftWidget;
|
|
|
|
|
QWidget *m_spaceRightWidget;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 用来设置滚动条的样式
|
|
|
|
|
* @param drawSpecial: true
|
|
|
|
|
*/
|
|
|
|
|
class SliderProxyStyle : public QProxyStyle
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
enum StyleType {
|
|
|
|
|
RoundHandler = 0, // 绘制那种黑色圆底滑动条
|
|
|
|
|
Normal // 绘制那种通用的滑动条
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit SliderProxyStyle(StyleType drawSpecial = RoundHandler, QStyle *style = nullptr);
|
|
|
|
|
~SliderProxyStyle() override;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override;
|
|
|
|
|
|
|
|
|
|
private:
|
2022-11-28 14:01:16 +08:00
|
|
|
|
void drawNormalSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const;
|
|
|
|
|
void drawRoundSlider(QPainter *painter, QRect rectGroove, QRect rectHandle, const QWidget *wigdet) const;
|
2022-06-20 13:40:16 +08:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
StyleType m_drawSpecial;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // VOLUMESLIDER_H
|