Skip to content

Commit

Permalink
chore: 新增进度条动效和一个新进度条类
Browse files Browse the repository at this point in the history
新增进度条动效和一个新进度条类

Log:
  • Loading branch information
Whale107 committed Aug 1, 2024
1 parent 3a01bae commit af79a48
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/DWidget/DIndeterminateProgressbar
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "dindeterminateprogressbar.h"
35 changes: 35 additions & 0 deletions include/widgets/dindeterminateprogressbar.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

#ifndef DINDETERMINATEPROGRESSBAR_H
#define DINDETERMINATEPROGRESSBAR_H

#include <DObject>
#include <DWidget>

DWIDGET_BEGIN_NAMESPACE

class DIndeterminateProgressbarPrivate;
class LIBDTKWIDGETSHARED_EXPORT DIndeterminateProgressbar : public QWidget, public DTK_CORE_NAMESPACE::DObject

Check warning on line 14 in include/widgets/dindeterminateprogressbar.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

class Dtk::Widget::DIndeterminateProgressbar is not documented!
{
Q_OBJECT
public:
explicit DIndeterminateProgressbar(QWidget *parent = nullptr);

Check warning on line 18 in include/widgets/dindeterminateprogressbar.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

function Dtk::Widget::DIndeterminateProgressbar::DIndeterminateProgressbar is not documented!

QSize sizeHint() const override;

Check warning on line 20 in include/widgets/dindeterminateprogressbar.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

function QSize Dtk::Widget::DIndeterminateProgressbar::sizeHint is not documented!

int sliderWidth();

Check warning on line 22 in include/widgets/dindeterminateprogressbar.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

function int Dtk::Widget::DIndeterminateProgressbar::sliderWidth is not documented!
void setSliderWidth(int width);

Check warning on line 23 in include/widgets/dindeterminateprogressbar.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

function void Dtk::Widget::DIndeterminateProgressbar::setSliderWidth is not documented!

protected:
void paintEvent(QPaintEvent *e) override;
void resizeEvent(QResizeEvent *e) override;

private:
D_DECLARE_PRIVATE(DIndeterminateProgressbar)
};

DWIDGET_END_NAMESPACE

#endif // DINDETERMINATEPROGRESSBAR_H
158 changes: 158 additions & 0 deletions src/widgets/dindeterminateprogressbar.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

#include "private/dindeterminateprogressbar_p.h"

#include <DStyle>

#include <QPainter>
#include <QTimer>
#include <QPropertyAnimation>
#include <QDebug>
#include <QPainterPath>

const int SPOT_WIDGET_WIDTH = 200;

DWIDGET_BEGIN_NAMESPACE

DIndeterminateProgressbarPrivate::DIndeterminateProgressbarPrivate(DIndeterminateProgressbar *qq)
: DObjectPrivate(qq)
, m_sliderWidget(new QWidget(qq))
, m_timer(new QTimer(qq))
, m_leftToRight(true)
, m_spotWidget(new QWidget(qq))
, m_animation(new QPropertyAnimation(m_spotWidget, "pos", qq))
{
}

DIndeterminateProgressbar::DIndeterminateProgressbar(QWidget *parent)
: QWidget(parent)
, DObject(*new DIndeterminateProgressbarPrivate(this))
{
D_D(DIndeterminateProgressbar);
d->m_spotWidget->setFixedSize(SPOT_WIDGET_WIDTH, height());
d->m_spotWidget->move(-SPOT_WIDGET_WIDTH, 0);

d->m_sliderWidget->setFixedWidth(150);
d->m_sliderWidget->move(0, 0);

d->m_timer->setInterval(10);
static int step = 0;
connect(d->m_timer, &QTimer::timeout, this, [this, d]() {
if (d->m_sliderWidget->geometry().right() >= rect().right()) {
d->m_leftToRight = false;
}

if (d->m_sliderWidget->geometry().left() <= rect().left()) {
d->m_leftToRight = true;
}

d->m_leftToRight ? step += 2 : step -= 2;
d->m_sliderWidget->move(step, 0);
});
d->m_timer->start();
}

QSize DIndeterminateProgressbar::sizeHint() const
{
return {width(), 20};
}

int DIndeterminateProgressbar::sliderWidth()
{
D_D(DIndeterminateProgressbar);
return d->m_sliderWidget->width();
}

void DIndeterminateProgressbar::setSliderWidth(int width)
{
D_D(DIndeterminateProgressbar);
if (d->m_sliderWidget->width() == width)
return;

d->m_sliderWidget->setFixedWidth(width);
}

void DIndeterminateProgressbar::resizeEvent(QResizeEvent *e)
{
D_D(DIndeterminateProgressbar);
d->m_sliderWidget->setFixedHeight(height());
d->m_spotWidget->setFixedSize(SPOT_WIDGET_WIDTH, height());

d->m_animation->setStartValue(QPoint(-SPOT_WIDGET_WIDTH, 0));
d->m_animation->setEndValue(QPoint(rect().right(), 0));
d->m_animation->setDuration(3000);
d->m_animation->setEasingCurve(QEasingCurve::InQuad);
d->m_animation->start();
connect(d->m_animation, &QPropertyAnimation::finished, this, [d]() {
d->m_animation->start();
});
QWidget::resizeEvent(e);
}

void DIndeterminateProgressbar::paintEvent(QPaintEvent *e)
{
D_D(DIndeterminateProgressbar);
QWidget::paintEvent(e);
QPainter p(this);

p.setRenderHint(QPainter::Antialiasing);
int radius;
this->height() <= DStyle::pixelMetric(style(), DStyle::PM_FrameRadius) * 2
? radius = height() / 2
: radius = DStyle::pixelMetric(style(), DStyle::PM_FrameRadius);

p.setBrush(QColor(0, 0, 0, int(0.1 * 255)));
p.setPen(Qt::NoPen);

p.drawRoundedRect(rect(), radius, radius);

QPen pen;
pen.setWidth(1);
pen.setColor(QColor(0, 0, 0, int(0.2 * 255)));
p.setBrush(Qt::NoBrush);
p.setPen(pen);
p.drawRoundedRect(rect().marginsRemoved(QMargins(1, 1, 1, 1)), radius, radius);

p.setPen(Qt::NoPen);
p.setBrush(palette().highlight().color());
p.drawRoundedRect(d->m_sliderWidget->geometry(), radius, radius);

pen.setColor(QColor(0, 0, 0, int(0.3 * 255)));
p.setBrush(Qt::NoBrush);
p.setPen(pen);
p.drawRoundedRect(d->m_sliderWidget->geometry().marginsRemoved(QMargins(1, 1, 1, 1)), radius, radius);

if (d->m_sliderWidget->width() < d->m_spotWidget->width() / 2)
return;

QPointF pointStart(d->m_spotWidget->geometry().left(), d->m_spotWidget->geometry().center().y());
QPointF pointEnd(d->m_spotWidget->geometry().right(), d->m_spotWidget->geometry().center().y());

QColor shadowColor(0, 0, 0, int(0.15 * 255));
QColor spotColor(255, 255, 255, int(0.5 * 255));
QColor highLightColor(palette().highlight().color());

QLinearGradient linear(pointStart, pointEnd);
linear.setColorAt(0, highLightColor);
linear.setColorAt(0.35, shadowColor);
linear.setColorAt(0.5, spotColor);
linear.setColorAt(0.65, shadowColor);
linear.setColorAt(1, highLightColor);
linear.setSpread(QGradient::PadSpread);
linear.setInterpolationMode(QLinearGradient::InterpolationMode::ColorInterpolation);

p.setBrush(linear);
p.setPen(Qt::NoPen);

QPainterPath clipPath;
clipPath.addRoundedRect(d->m_sliderWidget->geometry(), radius, radius);
p.setClipPath(clipPath);
p.setClipping(true);
p.drawRoundedRect(d->m_spotWidget->geometry().marginsRemoved(QMargins(1, 1, 1, 1)), radius, radius);
p.setClipping(false);
}

DWIDGET_END_NAMESPACE

6 changes: 3 additions & 3 deletions src/widgets/dtitlebar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -775,9 +775,9 @@ void DTitlebarPrivate::setIconVisible(bool visible)
return;

if (visible) {
if (dynamic_cast<QSpacerItem *>(leftLayout->itemAt(0)))
delete leftLayout->takeAt(0);
if (auto spacerItem = dynamic_cast<QSpacerItem *>(leftLayout->takeAt(0)))
delete spacerItem;

leftLayout->insertSpacing(0, 10);
leftLayout->insertWidget(1, iconLabel, 0, Qt::AlignLeading | Qt::AlignVCenter);
iconLabel->show();
Expand Down
34 changes: 34 additions & 0 deletions src/widgets/private/dindeterminateprogressbar_p.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

#ifndef DINDETERMINATEPROGRESSBAR_P_H
#define DINDETERMINATEPROGRESSBAR_P_H

#include <DObjectPrivate>
#include <DIndeterminateProgressbar>

#include <QTimer>

class QPropertyAnimation;

DWIDGET_BEGIN_NAMESPACE

class DIndeterminateProgressbarPrivate : public DTK_CORE_NAMESPACE::DObjectPrivate
{
public:
DIndeterminateProgressbarPrivate(DIndeterminateProgressbar *qq);

Check warning on line 20 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / cppcheck

Class 'DIndeterminateProgressbarPrivate' has a constructor with 1 argument that is not explicit. Such constructors should in general be explicit for type safety reasons. Using the explicit keyword in the constructor means some mistakes when using the class can be avoided.

QWidget *m_sliderWidget;

Check warning on line 22 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

variable QWidget* Dtk::Widget::DIndeterminateProgressbarPrivate::m_sliderWidget is not documented!
QTimer *m_timer;

Check warning on line 23 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

variable QTimer* Dtk::Widget::DIndeterminateProgressbarPrivate::m_timer is not documented!
bool m_leftToRight;

Check warning on line 24 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

variable bool Dtk::Widget::DIndeterminateProgressbarPrivate::m_leftToRight is not documented!
QWidget *m_spotWidget;

Check warning on line 25 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

variable QWidget* Dtk::Widget::DIndeterminateProgressbarPrivate::m_spotWidget is not documented!
QPropertyAnimation *m_animation;

Check warning on line 26 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / cppcheck

The class 'DIndeterminateProgressbarPrivate' is unsafe, wrong usage can cause memory/resource leaks for 'DIndeterminateProgressbarPrivate::m_animation'. This can for instance be fixed by adding proper cleanup in the destructor.

Check warning on line 26 in src/widgets/private/dindeterminateprogressbar_p.h

View workflow job for this annotation

GitHub Actions / check_job / DOXYGEN_CHECK

variable QPropertyAnimation* Dtk::Widget::DIndeterminateProgressbarPrivate::m_animation is not documented!

private:
D_DECLARE_PUBLIC(DIndeterminateProgressbar)
};

DWIDGET_END_NAMESPACE

#endif // DINDETERMINATEPROGRESSBAR_P_H

0 comments on commit af79a48

Please sign in to comment.