mirror of
https://github.com/IndeemaSoftware/QSimpleScada.git
synced 2026-10-18 06:16:35 +08:00
369 lines
9.2 KiB
C++
369 lines
9.2 KiB
C++
#include "qscadaobject.h"
|
|
|
|
#include <QMouseEvent>
|
|
#include <QDebug>
|
|
#include <QApplication>
|
|
#include <QGraphicsDropShadowEffect>
|
|
#include <QPainter>
|
|
#include <QPen>
|
|
|
|
#define RESIZE_FIELD_SIZE 10
|
|
#define RESIZE_AREA(x, y) ((geometry().width() - RESIZE_FIELD_SIZE) < x) && ((geometry().height() - RESIZE_FIELD_SIZE) < y)
|
|
|
|
QScadaObject::QScadaObject(QWidget *parent) :
|
|
QWidget(parent),
|
|
mInfo{new QScadaObjectInfo(this)},
|
|
mEffect{new QGraphicsDropShadowEffect},
|
|
mStatus{QObjectStatusNone}
|
|
{
|
|
setGeometry(100, 100, 100, 100);
|
|
if (info()->showBackground()) {
|
|
setPalette(QPalette(Qt::transparent));
|
|
setAutoFillBackground(true);
|
|
}
|
|
|
|
mEffect->setOffset(0);
|
|
setGraphicsEffect(mEffect);
|
|
|
|
dynamicStatusChanged(mInfo);
|
|
|
|
setAction(QObjectActionNone);
|
|
setMouseTracking(true);//this not mouseMoveEven is called everytime mouse is moved
|
|
|
|
connect(mInfo, SIGNAL(dynamicStatusChanged(QScadaObjectInfo *)), this, SLOT(dynamicStatusChanged(QScadaObjectInfo *)));
|
|
}
|
|
|
|
QScadaObject::~QScadaObject()
|
|
{
|
|
delete mInfo;
|
|
delete mEffect;
|
|
}
|
|
|
|
void QScadaObject::setGeometry(int x, int y, int width, int height)
|
|
{
|
|
setGeometry(QRect(x, y, width, height));
|
|
}
|
|
|
|
void QScadaObject::setGeometry(const QRect &r)
|
|
{
|
|
info()->setGeometry(r);
|
|
QWidget::setGeometry(r);
|
|
}
|
|
|
|
QRect QScadaObject::geometry()
|
|
{
|
|
return info()->geometry();
|
|
}
|
|
|
|
void QScadaObject::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
if (mIsEditable) {
|
|
switch (action()) {
|
|
case QObjectActionMove:{
|
|
move(event->x(), event->y());
|
|
break;
|
|
}
|
|
case QObjectActionResize:{
|
|
resize(event->x(), event->y());
|
|
break;
|
|
}
|
|
case QObjectActionNone: {
|
|
if (RESIZE_AREA(event->x(), event->y())) {
|
|
QApplication::setOverrideCursor(Qt::SizeFDiagCursor);
|
|
} else if (underMouse()) {
|
|
QApplication::setOverrideCursor(Qt::OpenHandCursor);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
QWidget::mouseMoveEvent(event);
|
|
}
|
|
}
|
|
|
|
void QScadaObject::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
if (mIsEditable) {
|
|
if (event->button() == Qt::LeftButton) {
|
|
int lX = event->x();
|
|
int lY = event->y();
|
|
|
|
if (RESIZE_AREA(lX, lY)) {
|
|
setAction(QObjectActionResize);
|
|
} else {
|
|
setSelected(true);
|
|
QApplication::setOverrideCursor(Qt::ClosedHandCursor);
|
|
setAction(QObjectActionMove);
|
|
|
|
mPosition.setX(lX);
|
|
mPosition.setY(lY);
|
|
}
|
|
}
|
|
} else {
|
|
QWidget::mousePressEvent(event);
|
|
}
|
|
}
|
|
|
|
void QScadaObject::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
if (mIsEditable) {
|
|
(void)event;
|
|
setAction(QObjectActionNone);
|
|
QApplication::setOverrideCursor(Qt::ArrowCursor);
|
|
} else {
|
|
QWidget::mouseReleaseEvent(event);
|
|
}
|
|
}
|
|
|
|
void QScadaObject::mouseDoubleClickEvent(QMouseEvent *e)
|
|
{
|
|
if (e->button() == Qt::LeftButton) {
|
|
emit objectDoubleClicked(this);
|
|
}
|
|
}
|
|
|
|
void QScadaObject::paintEvent(QPaintEvent *e)
|
|
{
|
|
QPainter lPainter(this);
|
|
QPixmap lMarkerPixmap(info()->imageName(mStatus));
|
|
QPixmap lBackgroundPixmap(info()->backGroundImage());
|
|
QPen lLinepen(Qt::black);
|
|
lLinepen.setCapStyle(Qt::RoundCap);
|
|
lPainter.setRenderHint(QPainter::Antialiasing,true);
|
|
lPainter.setPen(lLinepen);
|
|
|
|
//draw object title
|
|
lPainter.drawText(QPoint(10, 20), mInfo->title());
|
|
int lX;
|
|
int lY;
|
|
|
|
if (info()->axiesEnabled()) {
|
|
//draw axies
|
|
|
|
switch(info()->axisPosition()) {
|
|
case QObjectAxisPositionLeft:
|
|
lX = 12;
|
|
break;
|
|
case QObjectAxisPositionRight:
|
|
lX = geometry().width() - 30;
|
|
break;
|
|
}
|
|
lY = geometry().height() - 10;
|
|
int lWidth = 10;
|
|
int lInner = 4;
|
|
|
|
lPainter.drawEllipse(lX-lInner/2,
|
|
lY-lInner/2,
|
|
lInner,
|
|
lInner);
|
|
lPainter.drawText(QPoint(lX - 10, geometry().height()-2), info()->axis().insideAxisString());//inside position
|
|
|
|
lPainter.drawLine(lX, lY,
|
|
lX, lY -lWidth);
|
|
lPainter.drawLine(lX, lY -lWidth-1,
|
|
lX-3, lY -lWidth+3);
|
|
lPainter.drawLine(lX, lY -lWidth-1,
|
|
lX+3, lY -lWidth+3);
|
|
lPainter.drawText(QPoint(lX - 3, lY -lWidth-3), info()->axis().upsideAxisString());//up possibtion
|
|
|
|
lPainter.drawLine(lX, lY,
|
|
lX + lWidth, lY);
|
|
lPainter.drawLine(lX + lWidth+1, lY,
|
|
lX + lWidth-3, lY-3);
|
|
lPainter.drawLine(lX + lWidth+1, lY,
|
|
lX + lWidth-3, lY+3);
|
|
lPainter.drawText(QPoint(lX + lWidth + 3, lY+3), info()->axis().asideAxisString());//aside position
|
|
}
|
|
|
|
//draw resize dots
|
|
lX = geometry().width()-RESIZE_FIELD_SIZE;
|
|
lY = geometry().height();
|
|
|
|
lLinepen.setColor(Qt::darkGray);
|
|
lLinepen.setWidth(1);
|
|
lPainter.setPen(lLinepen);
|
|
|
|
if (mIsEditable) {
|
|
for (int i=1; i<=RESIZE_FIELD_SIZE; i++) {
|
|
for (int j=1; j<=i; j++) {
|
|
lPainter.drawPoint(QPoint(lX + 2*i, lY - 2*j));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (info()->showMarkers()) {
|
|
QSize lSize = lMarkerPixmap.size();
|
|
lPainter.drawPixmap(QRect((width() - lSize.width()) /2,
|
|
(height() - lSize.height()) / 2,
|
|
lSize.width(),
|
|
lSize.height()),
|
|
lMarkerPixmap);
|
|
}
|
|
|
|
if (info()->showBackgroundImage()) {
|
|
lPainter.drawPixmap(QRect(0,
|
|
0,
|
|
width(),
|
|
height()),
|
|
lBackgroundPixmap.scaled(width(), height(),
|
|
Qt::KeepAspectRatioByExpanding));
|
|
}
|
|
|
|
if (info()->isDynamic()) {
|
|
switch(mStatus) {
|
|
case QObjectStatusNone:
|
|
lLinepen.setColor(Qt::darkGray);
|
|
break;
|
|
case QObjectStatusRed:
|
|
lLinepen.setColor(QColor(171, 27, 227, 255));
|
|
break;
|
|
case QObjectStatusYellow:
|
|
lLinepen.setColor(QColor(228, 221, 29, 255));
|
|
break;
|
|
case QObjectStatusGreen:
|
|
lLinepen.setColor(QColor(14, 121, 7, 255));
|
|
break;
|
|
}
|
|
} else {
|
|
lLinepen.setColor(Qt::black);
|
|
}
|
|
|
|
if (info()->showBackground()) {
|
|
lLinepen.setWidth(2);
|
|
lPainter.setPen(lLinepen);
|
|
lPainter.drawRoundedRect(0,0,width(), height(),3,3);
|
|
}
|
|
|
|
QWidget::paintEvent(e);
|
|
}
|
|
|
|
void QScadaObject::dynamicStatusChanged(QScadaObjectInfo*)
|
|
{
|
|
if (info()->isDynamic()) {
|
|
switch(mStatus) {
|
|
case QObjectStatusNone:
|
|
setPalette(QPalette(Qt::lightGray));
|
|
break;
|
|
case QObjectStatusRed:
|
|
setPalette(QPalette(Qt::red));
|
|
break;
|
|
case QObjectStatusYellow:
|
|
setPalette(QPalette(Qt::yellow));
|
|
break;
|
|
case QObjectStatusGreen:
|
|
setPalette(QPalette(Qt::green));
|
|
break;
|
|
}
|
|
} else {
|
|
setPalette(QPalette(Qt::white));
|
|
}
|
|
|
|
if (!info()->showBackground()) {
|
|
setPalette(QPalette(Qt::transparent));
|
|
}
|
|
}
|
|
|
|
QScadaObjectStatus QScadaObject::status() const
|
|
{
|
|
return mStatus;
|
|
}
|
|
|
|
void QScadaObject::setStatus(const QScadaObjectStatus &status)
|
|
{
|
|
mStatus = status;
|
|
dynamicStatusChanged(mInfo);
|
|
}
|
|
|
|
bool QScadaObject::isEditable() const
|
|
{
|
|
return mIsEditable;
|
|
}
|
|
|
|
void QScadaObject::setIsEditable(bool isEditable)
|
|
{
|
|
mIsEditable = isEditable;
|
|
}
|
|
|
|
void QScadaObject::update()
|
|
{
|
|
if (info()->showBackground()) {
|
|
setPalette(QPalette(Qt::transparent));
|
|
setAutoFillBackground(true);
|
|
}
|
|
|
|
QWidget::update();
|
|
|
|
setGeometry(info()->geometry());
|
|
dynamicStatusChanged(info());
|
|
}
|
|
|
|
bool QScadaObject::selected() const
|
|
{
|
|
return mSelected;
|
|
}
|
|
|
|
void QScadaObject::setSelected(bool selected)
|
|
{
|
|
mSelected = selected;
|
|
|
|
if (mSelected) {
|
|
emit objectSelected(mInfo->id());
|
|
|
|
mEffect->setBlurRadius(50);
|
|
} else {
|
|
mEffect->setBlurRadius(10);
|
|
}
|
|
}
|
|
|
|
QScadaObjectInfo *QScadaObject::info() const
|
|
{
|
|
return mInfo;
|
|
}
|
|
|
|
void QScadaObject::setInfo(QScadaObjectInfo *info)
|
|
{
|
|
setGeometry(info->geometry());
|
|
mInfo = info;
|
|
}
|
|
|
|
QScadaObjectAction QScadaObject::action() const
|
|
{
|
|
return mAction;
|
|
}
|
|
|
|
void QScadaObject::setAction(const QScadaObjectAction &action)
|
|
{
|
|
mAction = action;
|
|
}
|
|
|
|
void QScadaObject::move(int x, int y)
|
|
{
|
|
int lX = geometry().x() + x - mPosition.x();
|
|
int lY = geometry().y() + y - mPosition.y();
|
|
|
|
setGeometry(lX,
|
|
lY,
|
|
geometry().width(),
|
|
geometry().height());
|
|
|
|
if (x != 0 && x != 0) {
|
|
emit objectMove(lX, lY);
|
|
}
|
|
}
|
|
|
|
void QScadaObject::resize(int x, int y)
|
|
{
|
|
int lX = x - geometry().width();
|
|
int lY = y - geometry().height();
|
|
|
|
setGeometry(geometry().x(),
|
|
geometry().y(),
|
|
geometry().width() + lX,
|
|
geometry().height() + lY);
|
|
|
|
repaint();
|
|
|
|
if (x != 0 && y != 0) {
|
|
emit objectResize(lX, lY);
|
|
}
|
|
}
|