PowerModeler/source/customBorderContainer.cpp

203 lines
7.3 KiB
C++
Raw Normal View History

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