Swiftray  1.0
collapse-button.h
Go to the documentation of this file.
1 #include <QToolButton>
2 #include <QApplication>
3 #include <QDebug>
4 #include <QPropertyAnimation>
5 #include <QAbstractAnimation>
6 #include <QParallelAnimationGroup>
7 
8 #pragma once
9 
10 class CollapseButton : public QToolButton {
11 public:
12  CollapseButton(QWidget *parent) : QToolButton(parent), content_(nullptr) {
13  setCheckable(true);
14  setStyleSheet("background:none");
15  setIconSize(QSize(8, 8));
16  setFont(QApplication::font());
17  connect(this, &QToolButton::toggled, [=](bool checked) {
18  setArrowType(checked ? Qt::ArrowType::DownArrow : Qt::ArrowType::RightArrow);
19  content_ != nullptr && checked ? showContent() : hideContent();
20  });
21  }
22 
23  void setText(const QString &text) {
24  QToolButton::setText(" " + text);
25  }
26 
27  void setContent(QWidget *content) {
28  qInfo() << "Set content" << content;
29  assert(content != nullptr);
30  content_ = content;
31  auto animation_ = new QPropertyAnimation(content_, "maximumHeight"); // QObject with auto delete
32  animation_->setStartValue(0);
33  animation_->setEasingCurve(QEasingCurve::InOutQuad);
34  animation_->setDuration(300);
35  animation_->setEndValue(content->geometry().height() + 10);
36  animator_.addAnimation(animation_);
37  if (!isChecked()) {
38  content->setMaximumHeight(0);
39  }
40  }
41 
42  void hideContent() {
43  animator_.setDirection(QAbstractAnimation::Backward);
44  animator_.start();
45  }
46 
47  void showContent() {
48  animator_.setDirection(QAbstractAnimation::Forward);
49  animator_.start();
50  }
51 
52 private:
53  QWidget *content_;
54  QParallelAnimationGroup animator_;
55 };
Definition: collapse-button.h:10
CollapseButton(QWidget *parent)
Definition: collapse-button.h:12
void setText(const QString &text)
Definition: collapse-button.h:23
void hideContent()
Definition: collapse-button.h:42
void showContent()
Definition: collapse-button.h:47
void setContent(QWidget *content)
Definition: collapse-button.h:27