Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
1.9 kB
1
Indexable
Never
class TimelineScene::ResizeDecoration::ResizeHandleItem : public QGraphicsPathItem
{
public:
	ResizeHandleItem(QGraphicsItem * parent = nullptr)
		: QGraphicsPathItem(parent)
		, m_physical(new QGraphicsRectItem(this))
	{
		QPen transparentPen;
		transparentPen.setColor(Qt::transparent);
		transparentPen.setWidth(physicalWidth);
		transparentPen.setBrush(Qt::transparent);
		m_physical->setPen(transparentPen);
		m_physical->setAcceptHoverEvents(true);
		m_physical->setFlag(ItemIsSelectable, false);
		m_physical->setFlag(ItemIgnoresTransformations);
		setFlag(ItemIgnoresTransformations);

		m_physical->setCursor(Qt::SizeHorCursor);
	}

	void setPath(QPainterPath const & path)
	{
		if (this->path() == path)
			return;
		QGraphicsPathItem::setPath(path);
	}
	//установка clipping прямоугольника в рамках которого отрисовываются видимые уши ресайза
	void setClipRect(QRectF const & rect)
	{
		if (m_clippingRect == rect)
			return;
		prepareGeometryChange();
		m_clippingRect = rect;
	}
	//установка размера невидимой кликабельной области
	void setClickRect(QRectF const & rect)
	{
		m_physical->setRect(rect);
	}

	void paint(QPainter * painter, QStyleOptionGraphicsItem const * option, QWidget * widget = nullptr) override
	{
		painter->setRenderHint(QPainter::Antialiasing);
		if (!m_clippingRect.isNull())
			painter->setClipRect(m_clippingRect);
		QGraphicsPathItem::paint(painter, option, widget);
	}

	QGraphicsRectItem * physical() const { return m_physical; }
	qreal penWidth() const { return physicalWidth; }

private:
	int physicalWidth = 4;
	//невидимый прямоугольник отвечающий за кликабельную область
	QGraphicsRectItem * m_physical = nullptr;
	QRectF m_clippingRect;
};