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