Skip to content

Commit

Permalink
Merge branch 'dev/animation' into switchbutton
Browse files Browse the repository at this point in the history
  • Loading branch information
Whale107 authored Aug 22, 2024
2 parents c380f0b + 49cd53a commit 98013cb
Show file tree
Hide file tree
Showing 20 changed files with 554 additions and 32 deletions.
1 change: 1 addition & 0 deletions include/DWidget/DBounceAnimation
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "dbounceanimation.h"
31 changes: 31 additions & 0 deletions include/widgets/dbounceanimation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#ifndef DBOUNCEANIMATION_H
#define DBOUNCEANIMATION_H

#include <DObject>
#include <QObject>

class QPropertyAnimation;
class QAbstractScrollArea;
class DBounceAnimationPrivate;
class DBounceAnimation : public QObject, public DTK_CORE_NAMESPACE::DObject
{
Q_OBJECT
public:
explicit DBounceAnimation(QObject *parent = nullptr);

void setAnimationTarget(QAbstractScrollArea *w);
void setAniMationEnable(bool enable);

protected:
bool eventFilter(QObject *o, QEvent *e) override;
void bounceBack(Qt::Orientation orientation);

private:
D_DECLARE_PRIVATE(DBounceAnimation)

};

#endif // DBOUNCEANIMATION_H
7 changes: 6 additions & 1 deletion include/widgets/dbuttonbox.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2019 - 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

Expand Down Expand Up @@ -47,6 +47,8 @@ class DButtonBoxButton : public QAbstractButton, public DCORE_NAMESPACE::DObject
void paintEvent(QPaintEvent *e) override;
void keyPressEvent(QKeyEvent *event) override;
bool event(QEvent *e) override;

friend class DButtonBox;
};

class DButtonBoxPrivate;
Expand Down Expand Up @@ -78,6 +80,9 @@ class DButtonBox : public QWidget, public DCORE_NAMESPACE::DObject
void buttonReleased(QAbstractButton *);
void buttonToggled(QAbstractButton *, bool);

protected:
bool eventFilter(QObject *o, QEvent *e) override;

private:
void paintEvent(QPaintEvent *e) override;

Expand Down
15 changes: 13 additions & 2 deletions include/widgets/dtoolbutton.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,34 @@
#ifndef DTOOLBUTTON_H
#define DTOOLBUTTON_H

#include <QToolButton>
#include <dtkwidget_global.h>

#include <QToolButton>

#include <DDciIcon>
#include <DDciIconPlayer>

DWIDGET_BEGIN_NAMESPACE
DGUI_USE_NAMESPACE

class LIBDTKWIDGETSHARED_EXPORT DToolButton : public QToolButton
class DToolButtonPrivate;
class LIBDTKWIDGETSHARED_EXPORT DToolButton : public QToolButton, public DCORE_NAMESPACE::DObject
{
Q_OBJECT
public:
DToolButton(QWidget *parent = nullptr);
void setAlignment(Qt::Alignment flag);
Qt::Alignment alignment() const;
void setDciIcon(const DDciIcon &dciIcon);

protected:
void paintEvent(QPaintEvent *event) override;
void initStyleOption(QStyleOptionToolButton *option) const;
QSize sizeHint() const override;
bool event(QEvent *e) override;

private:
D_DECLARE_PRIVATE(DToolButton)
};

DWIDGET_END_NAMESPACE
Expand Down
Binary file not shown.
Binary file not shown.
Binary file added src/widgets/assets/icons/bloom/radio_checked.dci
Binary file not shown.
Binary file not shown.
4 changes: 4 additions & 0 deletions src/widgets/assets/icons/dtk-icon-theme.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -74,5 +74,9 @@
<file alias="window_normal.dci">bloom/window_normal.dci</file>
<file alias="switch_on.dci">bloom/switch_on.dci</file>
<file alias="switch_off.dci">bloom/switch_off.dci</file>
<file alias="radio_checked.dci">bloom/radio_checked.dci</file>
<file alias="radio_unchecked.dci">bloom/radio_unchecked.dci</file>
<file alias="checkbox_checked.dci">bloom/checkbox_checked.dci</file>
<file alias="checkbox_unchecked.dci">bloom/checkbox_unchecked.dci</file>
</qresource>
</RCC>
107 changes: 107 additions & 0 deletions src/widgets/dbounceanimation.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#include "private/dbounceanimation_p.h"
#include <QPropertyAnimation>
#include <QEvent>
#include <QDebug>
#include <QAbstractScrollArea>
#include <QScrollBar>
#include <QWheelEvent>
#include <QTimer>

DBounceAnimationPrivate::DBounceAnimationPrivate(DBounceAnimation *qq)
: DObjectPrivate (qq)
, m_animation(nullptr)
, m_animationTarget(nullptr)
, m_deltaSum(0)
{
}

DBounceAnimation::DBounceAnimation(QObject *parent)
: QObject(parent)
, DObject(*new DBounceAnimationPrivate(this))
{
}

void DBounceAnimation::setAnimationTarget(QAbstractScrollArea *w)
{
D_D(DBounceAnimation);
if (!w)
return;

if (d->m_animationTarget == w)
return;

d->m_animationTarget = w;
}

void DBounceAnimation::setAniMationEnable(bool enable)
{
D_D(DBounceAnimation);
enable ? d->m_animationTarget->installEventFilter(this)
: d->m_animationTarget->removeEventFilter(this);
}

bool DBounceAnimation::eventFilter(QObject *o, QEvent *e)
{
D_D(DBounceAnimation);
if (e->type() == QEvent::Wheel) {
if (auto absscroll = dynamic_cast<QAbstractScrollArea *>(o)) {
if (auto wheelEvent = dynamic_cast<QWheelEvent *>(e)) {
if (absscroll->verticalScrollBar()->value() <= 0 || absscroll->verticalScrollBar()->value() >= absscroll->verticalScrollBar()->maximum()) {
d->m_deltaSum += wheelEvent->delta();
bounceBack(wheelEvent->angleDelta().x() == 0 ? Qt::Vertical : Qt::Horizontal);
}
}
}
}

return false;
}

void DBounceAnimation::bounceBack(Qt::Orientation orientation)
{
D_D(DBounceAnimation);
if (d->m_animation)
return;

if (orientation & Qt::Vertical && d->m_animationTarget->verticalScrollBar()->maximum() == d->m_animationTarget->verticalScrollBar()->minimum())
return;

if (orientation & Qt::Horizontal && d->m_animationTarget->horizontalScrollBar()->maximum() == d->m_animationTarget->horizontalScrollBar()->minimum())
return;

d->m_animation = new QPropertyAnimation(this);
d->m_animation->setTargetObject(d->m_animationTarget->viewport());
d->m_animation->setPropertyName("pos");
d->m_animation->setDuration(100);
d->m_animation->setEasingCurve(QEasingCurve::InQuart);
d->m_animation->setStartValue(QPoint(d->m_animationTarget->viewport()->x(), d->m_animationTarget->viewport()->y()));

QTimer::singleShot(100, this, [this, d, orientation]() {

if (orientation & Qt::Vertical) {
d->m_animation->setEndValue(
QPoint(d->m_animationTarget->viewport()->x(), d->m_animationTarget->viewport()->y() + d->m_deltaSum / 16));
} else {
d->m_animation->setEndValue(
QPoint(d->m_animationTarget->viewport()->x() + d->m_deltaSum / 16, d->m_animationTarget->viewport()->y()));
}

d->m_animation->start();

connect(d->m_animation, &QPropertyAnimation::finished, this, [d]() {
if (d->m_animation->direction() == QPropertyAnimation::Backward) {
delete d->m_animation;
d->m_animation = nullptr;
return;
}

d->m_animation->setDirection(QPropertyAnimation::Direction::Backward);
d->m_animation->setDuration(1000);
d->m_animation->start(QPropertyAnimation::DeleteWhenStopped);
d->m_deltaSum = 0;
});
});
}
Loading

0 comments on commit 98013cb

Please sign in to comment.