#pragma once #include "widgets/basewidget.hpp" #include "widgets/helper/scrollbarhighlight.hpp" #include #include #include #include #include namespace chatterino { class ColorScheme; namespace widgets { class ChannelView; class ScrollBar : public BaseWidget { Q_OBJECT public: ScrollBar(ChannelView *parent = 0); ~ScrollBar(); void removeHighlightsWhere(std::function func); void addHighlight(ScrollBarHighlight *highlight); Q_PROPERTY(qreal _desiredValue READ getDesiredValue WRITE setDesiredValue) void scrollToBottom(); bool isAtBottom() const; void setMaximum(qreal value); void setMinimum(qreal value); void setLargeChange(qreal value); void setSmallChange(qreal value); void setDesiredValue(qreal value, bool animated = false); qreal getMaximum() const; qreal getMinimum() const; qreal getLargeChange() const; qreal getSmallChange() const; qreal getDesiredValue() const; qreal getCurrentValue() const; // offset the desired value without breaking smooth scolling void offset(qreal value); boost::signals2::signal &getCurrentValueChanged(); void setCurrentValue(qreal value); void printCurrentState(const QString &prefix = QString()) const; private: Q_PROPERTY(qreal _currentValue READ getCurrentValue WRITE setCurrentValue) QMutex _mutex; QPropertyAnimation _currentValueAnimation; ScrollBarHighlight *_highlights; void paintEvent(QPaintEvent *); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void leaveEvent(QEvent *); bool atBottom = false; int _mouseOverIndex = -1; int _mouseDownIndex = -1; QPoint _lastMousePosition; int _buttonHeight = 16; int _trackHeight = 100; QRect _thumbRect; qreal _maximum = 0; qreal _minimum = 0; qreal _largeChange = 0; qreal _smallChange = 5; qreal _desiredValue = 0; qreal _currentValue = 0; qreal _smoothScrollingOffset = 0; boost::signals2::signal _currentValueChanged; pajlada::Settings::Setting &smoothScrollingSetting; void updateScroll(); }; } // namespace widgets } // namespace chatterino