File: resizable-widget.cpp

package info (click to toggle)
obs-advanced-scene-switcher 1.32.8-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,492 kB
  • sloc: xml: 297,593; cpp: 147,875; python: 387; sh: 280; ansic: 170; makefile: 33
file content (106 lines) | stat: -rw-r--r-- 2,394 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "resizable-widget.hpp"

namespace advss {

ResizableWidget::ResizableWidget(QWidget *parent) : QWidget(parent) {}

void ResizableWidget::SetResizingEnabled(bool enable)
{
	setMouseTracking(enable);
	_customHeight = enable ? sizeHint().height() : 0;
	auto pol = sizePolicy();
	pol.setVerticalPolicy(enable ? QSizePolicy::Fixed
				     : QSizePolicy::Preferred);
	_resizingEnabled = enable;
}

void ResizableWidget::mousePressEvent(QMouseEvent *event)
{
	if (!_resizingEnabled) {
		QWidget::mousePressEvent(event);
		return;
	}

	if (IsInResizeArea(event->pos())) {
		_resizing = true;
		_lastMousePos = event->globalPosition().toPoint();
		event->accept();
	} else {
		QWidget::mousePressEvent(event);
	}
}

void ResizableWidget::mouseMoveEvent(QMouseEvent *event)
{
	if (!_resizingEnabled) {
		QWidget::mouseMoveEvent(event);
		return;
	}

	if (_resizing) {
		const int dy = event->globalPosition().toPoint().y() -
			       _lastMousePos.y();
		const int baseHeight = _customHeight == 0 ? height()
							  : _customHeight;
		const int newHeight = baseHeight + dy;
		_customHeight =
			std::clamp(newHeight, minimumHeight(), maximumHeight());
		updateGeometry();
		_lastMousePos = event->globalPosition().toPoint();
		event->accept();
	} else {
		setCursor(IsInResizeArea(event->pos()) ? Qt::SizeVerCursor
						       : Qt::ArrowCursor);
		QWidget::mouseMoveEvent(event);
	}
}

void ResizableWidget::mouseReleaseEvent(QMouseEvent *event)
{
	if (_resizing) {
		event->accept();
		_resizing = false;
	} else {
		QWidget::mouseReleaseEvent(event);
	}
}

void ResizableWidget::paintEvent(QPaintEvent *event)
{
	QWidget::paintEvent(event);

	if (!_resizingEnabled) {
		return;
	}

	// Draw a triangle in bottom-right as resize indicator
	QPainter painter(this);
	QPolygon triangle;
	triangle << QPoint(width() - 1, height() - _gripSize)
		 << QPoint(width() - _gripSize, height() - 1)
		 << QPoint(width() - 1, height() - 1);
	painter.setBrush(Qt::gray);
	painter.drawPolygon(triangle);
}

QSize ResizableWidget::sizeHint() const
{
	if (!_resizingEnabled) {
		return QWidget::sizeHint();
	}

	if (_customHeight == 0) {
		return QWidget::sizeHint();
	}

	return QSize(width(), _customHeight);
}

bool ResizableWidget::IsInResizeArea(const QPoint &pos) const
{
	return QRect(width() - _gripSize, height() - _gripSize, _gripSize,
		     _gripSize)
		.contains(pos);
}

} // namespace advss