#include "customBorderContainer.h" #include //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); m_borderMove->setGeometry(m_borderSize, m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize * 5); } void CustomBorderContainer::updateContentWidget() { m_contentWidget->update(); }