2025-04-15 16:39:36 +08:00
|
|
|
#include "customBorderContainer.h"
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
|
|
|
|
|
//Class Border
|
|
|
|
|
CustomBorderContainer::Border::Border(QWidget* parent, borderType type, CustomBorderContainer* container)
|
|
|
|
|
: QLabel(parent)
|
|
|
|
|
, m_type(type)
|
|
|
|
|
, m_contaniner(container)
|
|
|
|
|
{
|
|
|
|
|
switch(m_type)
|
|
|
|
|
{
|
|
|
|
|
case border_left:
|
|
|
|
|
case border_right:
|
|
|
|
|
setCursor(Qt::SizeHorCursor);
|
|
|
|
|
break;
|
|
|
|
|
case border_top:
|
|
|
|
|
case border_bottom:
|
|
|
|
|
setCursor(Qt::SizeVerCursor);
|
|
|
|
|
break;
|
|
|
|
|
case border_leftTop:
|
|
|
|
|
case border_rightBottom:
|
|
|
|
|
setCursor(Qt::SizeFDiagCursor);
|
|
|
|
|
break;
|
|
|
|
|
case border_rightTop:
|
|
|
|
|
case border_leftBottom:
|
|
|
|
|
setCursor(Qt::SizeBDiagCursor);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
setCursor(Qt::ArrowCursor);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::Border::mousePressEvent(QMouseEvent* event)
|
|
|
|
|
{
|
|
|
|
|
if(m_contaniner->m_operationOptions == NoOperation)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(event->button() != Qt::LeftButton)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_mouseIsPressed = true;
|
|
|
|
|
m_mouseLastPoint = event->globalPosition().toPoint();
|
|
|
|
|
|
|
|
|
|
QLabel::mousePressEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::Border::mouseMoveEvent(QMouseEvent* event)
|
|
|
|
|
{
|
|
|
|
|
if(m_mouseIsPressed)
|
|
|
|
|
{
|
|
|
|
|
m_mouseMoveLength = event->globalPosition().toPoint() - m_mouseLastPoint;
|
|
|
|
|
m_contaniner->scaleByCustomBorder(m_type, m_mouseMoveLength);
|
|
|
|
|
m_mouseLastPoint = event->globalPosition().toPoint();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QLabel::mouseMoveEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::Border::mouseReleaseEvent(QMouseEvent* event)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(event)
|
|
|
|
|
m_mouseIsPressed = false;
|
|
|
|
|
m_contaniner->updateBorder();
|
|
|
|
|
|
|
|
|
|
QLabel::mouseReleaseEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::Border::timerEvent(QTimerEvent* event)
|
|
|
|
|
{
|
|
|
|
|
if(event->timerId() == m_repaintTimer.timerId())
|
|
|
|
|
{
|
|
|
|
|
m_repaintTimer.stop();
|
|
|
|
|
m_contaniner->updateContentWidget();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Class CustomBorderContainer
|
|
|
|
|
CustomBorderContainer::CustomBorderContainer(QWidget *parent, QSize minimumSize, int borderSize)
|
|
|
|
|
: QObject(parent)
|
|
|
|
|
, m_contentWidget(parent)
|
|
|
|
|
, m_minimumSize(minimumSize)
|
|
|
|
|
, m_borderSize(borderSize)
|
|
|
|
|
{
|
|
|
|
|
m_operationOptions = NoOperation;
|
|
|
|
|
initializeBorder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CustomBorderContainer::~CustomBorderContainer()
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::initializeBorder()
|
|
|
|
|
{
|
|
|
|
|
m_borderLeft = new Border(m_contentWidget, border_left, this);
|
|
|
|
|
m_borderLeft->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderLeft->raise();
|
|
|
|
|
|
|
|
|
|
m_borderRight = new Border(m_contentWidget, border_right, this);
|
|
|
|
|
m_borderRight->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderRight->raise();
|
|
|
|
|
|
|
|
|
|
m_borderTop = new Border(m_contentWidget, border_top, this);
|
|
|
|
|
m_borderTop->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderTop->raise();
|
|
|
|
|
|
|
|
|
|
m_borderBottom = new Border(m_contentWidget, border_bottom, this);
|
|
|
|
|
m_borderBottom->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderBottom->raise();
|
|
|
|
|
|
|
|
|
|
m_borderLeftTop = new Border(m_contentWidget, border_leftTop, this);
|
|
|
|
|
m_borderLeftTop->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderLeftTop->raise();
|
|
|
|
|
|
|
|
|
|
m_borderLeftBottom = new Border(m_contentWidget, border_leftBottom, this);
|
|
|
|
|
m_borderLeftBottom->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderLeftBottom->raise();
|
|
|
|
|
|
|
|
|
|
m_borderRightTop = new Border(m_contentWidget, border_rightTop, this);
|
|
|
|
|
m_borderRightTop->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderRightTop->raise();
|
|
|
|
|
|
|
|
|
|
m_borderRightBottom = new Border(m_contentWidget, border_rightBottom, this);
|
|
|
|
|
m_borderRightBottom->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderRightBottom->raise();
|
|
|
|
|
|
|
|
|
|
m_borderMove = new Border(m_contentWidget, border_move, this);
|
|
|
|
|
m_borderMove->setStyleSheet("background-color:transparent");
|
|
|
|
|
m_borderMove->raise();
|
|
|
|
|
|
|
|
|
|
updateBorder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::scaleByCustomBorder(borderType type, const QPoint& moveLength)
|
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
|
|
|
|
case border_left:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height());
|
|
|
|
|
break;
|
|
|
|
|
case border_right:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height());
|
|
|
|
|
break;
|
|
|
|
|
case border_top:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width(), m_contentWidget->height() - moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_bottom:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width(), m_contentWidget->height() + moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_leftTop:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height() - moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_leftBottom:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height() + moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_rightTop:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height() - moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_rightBottom:
|
|
|
|
|
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height() + moveLength.y());
|
|
|
|
|
break;
|
|
|
|
|
case border_move:
|
|
|
|
|
m_contentWidget->move(moveLength + m_contentWidget->pos());
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//m_borderMove->setGeometry(m_borderSize, m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize * 10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::setMinimumWindowSize(QSize size)
|
|
|
|
|
{
|
|
|
|
|
m_minimumSize = size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::setBorderSize(int size)
|
|
|
|
|
{
|
|
|
|
|
m_borderSize = size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::setOperationOptions(OperationOptions options)
|
|
|
|
|
{
|
|
|
|
|
m_operationOptions = options;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::updateBorder()
|
|
|
|
|
{
|
|
|
|
|
m_borderLeft->setGeometry(0, m_borderSize, m_borderSize, m_contentWidget->height() - m_borderSize * 2);
|
|
|
|
|
m_borderTop->setGeometry(m_borderSize, 0, m_contentWidget->width() - m_borderSize * 2, m_borderSize);
|
|
|
|
|
m_borderRight->setGeometry(m_contentWidget->width() - m_borderSize, m_borderSize, m_borderSize, m_contentWidget->height() - m_borderSize * 2);
|
|
|
|
|
m_borderBottom->setGeometry(m_borderSize, m_contentWidget->height() - m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize);
|
|
|
|
|
m_borderLeftTop->setGeometry(0, 0, m_borderSize, m_borderSize);
|
|
|
|
|
m_borderLeftBottom->setGeometry(0, m_contentWidget->height() - m_borderSize, m_borderSize, m_borderSize);
|
|
|
|
|
m_borderRightTop->setGeometry(m_contentWidget->width() - m_borderSize, 0, m_borderSize, m_borderSize);
|
|
|
|
|
m_borderRightBottom->setGeometry(m_contentWidget->width() - m_borderSize, m_contentWidget->height() - m_borderSize, m_borderSize, m_borderSize);
|
2025-04-21 16:57:09 +08:00
|
|
|
m_borderMove->setGeometry(m_borderSize, m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize * 5);
|
2025-04-15 16:39:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CustomBorderContainer::updateContentWidget()
|
|
|
|
|
{
|
|
|
|
|
m_contentWidget->update();
|
|
|
|
|
}
|