Chatterino
Scrollbar.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 #include "widgets/BaseWidget.hpp"
6 
7 #include <QMutex>
8 #include <QPropertyAnimation>
9 #include <QWidget>
10 #include <pajlada/signals/signal.hpp>
11 
12 namespace chatterino {
13 
14 class ChannelView;
15 
16 class Scrollbar : public BaseWidget
17 {
18  Q_OBJECT
19 
20 public:
21  Scrollbar(ChannelView *parent = nullptr);
22 
23  void addHighlight(ScrollbarHighlight highlight);
25  const std::vector<ScrollbarHighlight> &highlights_);
26  void replaceHighlight(size_t index, ScrollbarHighlight replacement);
27 
28  void pauseHighlights();
29  void unpauseHighlights();
30  void clearHighlights();
31 
32  void scrollToBottom(bool animate = false);
33  void scrollToTop(bool animate = false);
34  bool isAtBottom() const;
35 
36  void setMaximum(qreal value);
37  void setMinimum(qreal value);
38  void setLargeChange(qreal value);
39  void setSmallChange(qreal value);
40  void setDesiredValue(qreal value, bool animated = false);
41  qreal getMaximum() const;
42  qreal getMinimum() const;
43  qreal getLargeChange() const;
44  qreal getSmallChange() const;
45  qreal getDesiredValue() const;
46  qreal getCurrentValue() const;
47 
48  const QPropertyAnimation &getCurrentValueAnimation() const;
49 
50  // offset the desired value without breaking smooth scolling
51  void offset(qreal value);
52  pajlada::Signals::NoArgSignal &getCurrentValueChanged();
53  pajlada::Signals::NoArgSignal &getDesiredValueChanged();
54  void setCurrentValue(qreal value);
55 
56  void printCurrentState(const QString &prefix = QString()) const;
57 
58  Q_PROPERTY(qreal desiredValue_ READ getDesiredValue WRITE setDesiredValue)
59 
60 protected:
61  void paintEvent(QPaintEvent *) override;
62  void resizeEvent(QResizeEvent *) override;
63  void mouseMoveEvent(QMouseEvent *event) override;
64  void mousePressEvent(QMouseEvent *event) override;
65  void mouseReleaseEvent(QMouseEvent *event) override;
66  void leaveEvent(QEvent *) override;
67 
68 private:
69  Q_PROPERTY(qreal currentValue_ READ getCurrentValue WRITE setCurrentValue)
70 
71  LimitedQueueSnapshot<ScrollbarHighlight> &getHighlightSnapshot();
72  void updateScroll();
73 
74  QMutex mutex_;
75 
76  QPropertyAnimation currentValueAnimation_;
77 
79  bool highlightsPaused_{false};
81 
82  bool atBottom_{false};
83 
84  int mouseOverIndex_ = -1;
85  int mouseDownIndex_ = -1;
86  QPoint lastMousePosition_;
87 
88  int buttonHeight_ = 0;
89  int trackHeight_ = 100;
90 
91  QRect thumbRect_;
92 
93  qreal maximum_ = 0;
94  qreal minimum_ = 0;
95  qreal largeChange_ = 0;
96  qreal smallChange_ = 5;
97  qreal desiredValue_ = 0;
98  qreal currentValue_ = 0;
99  qreal smoothScrollingOffset_ = 0;
100 
101  pajlada::Signals::NoArgSignal currentValueChanged_;
102  pajlada::Signals::NoArgSignal desiredValueChanged_;
103 };
104 
105 } // namespace chatterino
bool isAtBottom() const
Definition: Scrollbar.cpp:84
Definition: ScrollbarHighlight.hpp:9
void replaceHighlight(size_t index, ScrollbarHighlight replacement)
Definition: Scrollbar.cpp:44
void scrollToBottom(bool animate=false)
Definition: Scrollbar.cpp:74
void printCurrentState(const QString &prefix=QString()) const
Definition: Scrollbar.cpp:243
qreal currentValue_
Definition: Scrollbar.hpp:69
void mouseMoveEvent(QMouseEvent *event) override
Definition: Scrollbar.cpp:354
Definition: LimitedQueue.hpp:16
void setCurrentValue(qreal value)
Definition: Scrollbar.cpp:226
qreal getCurrentValue() const
Definition: Scrollbar.cpp:194
qreal getLargeChange() const
Definition: Scrollbar.cpp:179
const QPropertyAnimation & getCurrentValueAnimation() const
Definition: Scrollbar.cpp:199
Definition: LimitedQueueSnapshot.hpp:15
pajlada::Signals::NoArgSignal & getDesiredValueChanged()
Definition: Scrollbar.cpp:221
void pauseHighlights()
Definition: Scrollbar.cpp:49
Definition: Application.cpp:48
void setSmallChange(qreal value)
Definition: Scrollbar.cpp:110
Scrollbar(ChannelView *parent=nullptr)
Definition: Scrollbar.cpp:21
void addHighlight(ScrollbarHighlight highlight)
Definition: Scrollbar.cpp:33
pajlada::Signals::NoArgSignal & getCurrentValueChanged()
Definition: Scrollbar.cpp:216
void setDesiredValue(qreal value, bool animated=false)
Definition: Scrollbar.cpp:117
void unpauseHighlights()
Definition: Scrollbar.cpp:54
void mouseReleaseEvent(QMouseEvent *event) override
Definition: Scrollbar.cpp:427
void mousePressEvent(QMouseEvent *event) override
Definition: Scrollbar.cpp:401
qreal getSmallChange() const
Definition: Scrollbar.cpp:184
void leaveEvent(QEvent *) override
Definition: Scrollbar.cpp:468
qreal getDesiredValue() const
Definition: Scrollbar.cpp:189
void offset(qreal value)
Definition: Scrollbar.cpp:204
void setMinimum(qreal value)
Definition: Scrollbar.cpp:96
void setMaximum(qreal value)
Definition: Scrollbar.cpp:89
Definition: ChannelView.hpp:61
void clearHighlights()
Definition: Scrollbar.cpp:59
void setLargeChange(qreal value)
Definition: Scrollbar.cpp:103
qreal getMinimum() const
Definition: Scrollbar.cpp:174
void paintEvent(QPaintEvent *) override
Definition: Scrollbar.cpp:253
Definition: BaseWidget.hpp:14
void addHighlightsAtStart(const std::vector< ScrollbarHighlight > &highlights_)
Definition: Scrollbar.cpp:38
Definition: Scrollbar.hpp:16
void scrollToTop(bool animate=false)
Definition: Scrollbar.cpp:79
void resizeEvent(QResizeEvent *) override
Definition: Scrollbar.cpp:349
qreal getMaximum() const
Definition: Scrollbar.cpp:169
qreal desiredValue_
Definition: Scrollbar.hpp:58