1 /* 2 This file is part of Telegram Desktop, 3 the official desktop application for the Telegram messaging service. 4 5 For license and copyright information please follow this link: 6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL 7 */ 8 #pragma once 9 10 #include "ui/rp_widget.h" 11 12 namespace Ui { 13 14 class ResizeArea : public RpWidget { 15 public: ResizeArea(QWidget * parent)16 ResizeArea(QWidget *parent) : RpWidget(parent) { 17 setCursor(style::cur_sizehor); 18 } 19 moveLeft()20 rpl::producer<int> moveLeft() const { 21 return _moveLeft.events(); 22 } 23 template <typename Callback> addMoveLeftCallback(Callback && callback)24 void addMoveLeftCallback(Callback &&callback) { 25 moveLeft( 26 ) | rpl::start_with_next( 27 std::forward<Callback>(callback), 28 lifetime()); 29 } 30 moveFinished()31 rpl::producer<> moveFinished() const { 32 return _moveFinished.events(); 33 } 34 template <typename Callback> addMoveFinishedCallback(Callback && callback)35 void addMoveFinishedCallback(Callback &&callback) { 36 moveFinished( 37 ) | rpl::start_with_next( 38 std::forward<Callback>(callback), 39 lifetime()); 40 } 41 ~ResizeArea()42 ~ResizeArea() { 43 moveFinish(); 44 } 45 46 protected: mousePressEvent(QMouseEvent * e)47 void mousePressEvent(QMouseEvent *e) override { 48 if (e->button() == Qt::LeftButton) { 49 _moving = true; 50 _moveStartLeft = e->pos().x(); 51 } 52 } mouseReleaseEvent(QMouseEvent * e)53 void mouseReleaseEvent(QMouseEvent *e) override { 54 if (e->button() == Qt::LeftButton) { 55 moveFinish(); 56 } 57 } mouseMoveEvent(QMouseEvent * e)58 void mouseMoveEvent(QMouseEvent *e) override { 59 if (_moving) { 60 _moveLeft.fire(e->globalPos().x() - _moveStartLeft); 61 } 62 } 63 64 private: moveFinish()65 void moveFinish() { 66 if (base::take(_moving)) { 67 _moveFinished.fire({}); 68 } 69 } 70 71 rpl::event_stream<int> _moveLeft; 72 rpl::event_stream<> _moveFinished; 73 int _moveStartLeft = 0; 74 bool _moving = false; 75 76 }; 77 78 } // namespace Ui 79