mirror of
https://github.com/IndeemaSoftware/QSimpleScada.git
synced 2026-10-18 06:16:35 +08:00
339 lines
7.7 KiB
C++
339 lines
7.7 KiB
C++
#include "qscadaboard.h"
|
|
#include "qscadaboardinfo.h"
|
|
#include "qscadaboardcontroller.h"
|
|
#include "../QScadaObject/qscadaobjectinfo.h"
|
|
#include "../QScadaObject/qscadaobjectqml.h"
|
|
|
|
#include <QApplication>
|
|
#include <QPainter>
|
|
#include <QPen>
|
|
#include <QDebug>
|
|
|
|
QScadaBoard::QScadaBoard(int id, QWidget *parent) :
|
|
QWidget(parent),
|
|
mId{id},
|
|
mObjects{new QList<QScadaObject*>()},
|
|
mEditable{false},
|
|
mShowGrid{true},
|
|
mGrid{10},
|
|
mGridPixmap{nullptr}
|
|
{
|
|
setPalette(QPalette(Qt::transparent));
|
|
setAutoFillBackground(true);
|
|
|
|
setMouseTracking(true);//this not mouseMoveEven is called everytime mouse is moved
|
|
|
|
resetGridPixmap();
|
|
}
|
|
|
|
QScadaBoard::QScadaBoard(QScadaBoardInfo *boardInfo, QWidget *parent):
|
|
QWidget(parent),
|
|
mId{boardInfo->id()},
|
|
mObjects{new QList<QScadaObject*>()},
|
|
mEditable{false},
|
|
mShowGrid{true},
|
|
mGrid{10},
|
|
mGridPixmap{nullptr}
|
|
{
|
|
this->initBoard(boardInfo);
|
|
}
|
|
|
|
QScadaBoard::~QScadaBoard()
|
|
{
|
|
qDeleteAll(*mObjects);
|
|
delete mObjects;
|
|
}
|
|
|
|
void QScadaBoard::initBoard(QScadaBoardInfo *boardInfo)
|
|
{
|
|
if (boardInfo != nullptr) {
|
|
this->setEditable(false);
|
|
|
|
for (int i=boardInfo->objectList().count()-1; i>=0; i--) {
|
|
for (QScadaObjectInfo *info : boardInfo->objectList()) {
|
|
if (info->orderLevel() == i) {
|
|
this->initNewObject(info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
QScadaObject *QScadaBoard::initNewObject(QScadaObjectInfo *info)
|
|
{
|
|
QScadaObject *rObject = new QScadaObjectQML(info, this);
|
|
|
|
rObject->setIsEditable(mEditable);
|
|
connect(rObject, SIGNAL(objectDoubleClicked(QScadaObject*)), this , SIGNAL(objectDoubleClicked(QScadaObject*)));
|
|
connect(rObject, SIGNAL(objectSelected(int)), this , SLOT(newObjectSelected(int)));
|
|
connect(rObject, SIGNAL(objectMove(int,int)), this , SLOT(objectMove(int,int)));
|
|
connect(rObject, SIGNAL(objectResize(int,int)), this , SLOT(objectResize(int,int)));
|
|
rObject->setSelected(true);//make object selected only after signals are connected to handle highlight of new objects
|
|
rObject->show();
|
|
rObject->update();
|
|
mObjects->append(rObject);
|
|
|
|
emit newObjectCreated(rObject);
|
|
|
|
return rObject;
|
|
}
|
|
|
|
void QScadaBoard::createNewObject(QScadaObjectInfo *info)
|
|
{
|
|
QScadaObject *lObject = this->initNewObject(info);
|
|
|
|
bringToFront(lObject);
|
|
}
|
|
|
|
void QScadaBoard::createQMLObject(int id, QString path)
|
|
{
|
|
QScadaObjectInfo *lInfo = new QScadaObjectInfo();
|
|
lInfo->setId(id);
|
|
lInfo->setShowBackground(true);
|
|
lInfo->setType(QScadaObjectTypeQML);
|
|
lInfo->setUIResourcePath(path);
|
|
|
|
createNewObject(lInfo);
|
|
}
|
|
|
|
void QScadaBoard::createQMLObject(QString path)
|
|
{
|
|
this->createQMLObject(mObjects->count(), path);
|
|
}
|
|
|
|
void QScadaBoard::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
(void)event;
|
|
QApplication::setOverrideCursor(Qt::ArrowCursor);
|
|
}
|
|
|
|
void QScadaBoard::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
if (event->button() == Qt::LeftButton) {
|
|
newObjectSelected(-1);
|
|
emit objectSelected(nullptr);
|
|
}
|
|
}
|
|
|
|
void QScadaBoard::paintEvent(QPaintEvent *e)
|
|
{
|
|
if (mShowGrid) {
|
|
if (mGridPixmap == nullptr) {
|
|
resetGridPixmap();
|
|
}
|
|
|
|
if ((mGridPixmap->width() != this->width())
|
|
|| (mGridPixmap->height() != this->height())) {
|
|
delete mGridPixmap;
|
|
resetGridPixmap();
|
|
}
|
|
|
|
if (mUpdateGridPixmap) {
|
|
QPainter lPainter(mGridPixmap);
|
|
mGridPixmap->fill(Qt::white);
|
|
QPen lLinepen(Qt::darkGray);
|
|
lLinepen.setCapStyle(Qt::RoundCap);
|
|
lLinepen.setWidth(1);
|
|
lPainter.setRenderHint(QPainter::Antialiasing,true);
|
|
lPainter.setPen(lLinepen);
|
|
|
|
int lX = this->width();
|
|
int lY = this->height();
|
|
|
|
mGridPixmap->scaledToWidth(lX);
|
|
mGridPixmap->scaledToHeight(lY);
|
|
|
|
for (int i=0; i<=lX; i++) {
|
|
for (int j=1; j<=lY; j++) {
|
|
lPainter.drawPoint(QPoint(mGrid*i, mGrid*j));
|
|
}
|
|
}
|
|
|
|
mUpdateGridPixmap = false;
|
|
}
|
|
|
|
QPainter lPainter(this);
|
|
lPainter.drawPixmap(0, 0, mGridPixmap->width(), mGridPixmap->height(), *mGridPixmap);
|
|
}
|
|
|
|
QWidget::paintEvent(e);
|
|
}
|
|
|
|
void QScadaBoard::newObjectSelected(int id)
|
|
{
|
|
for(QScadaObject *object : *mObjects) {
|
|
if (id != object->info()->id()) {
|
|
object->setSelected(false);
|
|
} else {
|
|
this->bringToFront(object);
|
|
emit objectSelected(object);
|
|
}
|
|
}
|
|
}
|
|
|
|
void QScadaBoard::objectMove(int, int)
|
|
{
|
|
update();
|
|
}
|
|
|
|
void QScadaBoard::objectResize(int, int)
|
|
{
|
|
update();
|
|
}
|
|
|
|
void QScadaBoard::setId(int id)
|
|
{
|
|
mId = id;
|
|
}
|
|
|
|
int QScadaBoard::getId() const
|
|
{
|
|
return mId;
|
|
}
|
|
|
|
QList<QScadaObject *> *QScadaBoard::objects() const
|
|
{
|
|
return mObjects;
|
|
}
|
|
|
|
QList<QScadaObject*> QScadaBoard::getSeletedObjects()
|
|
{
|
|
QList<QScadaObject*> rList;
|
|
|
|
for(QScadaObject *object : *mObjects) {
|
|
if (object->selected()) {
|
|
rList.append(object);
|
|
}
|
|
}
|
|
|
|
return rList;
|
|
}
|
|
|
|
void QScadaBoard::resetGridPixmap()
|
|
{
|
|
mGridPixmap = new QPixmap(this->width(), this->height());
|
|
mUpdateGridPixmap = true;
|
|
}
|
|
|
|
void QScadaBoard::orderObject(QScadaObject *o)
|
|
{
|
|
bool lIsNew = false;
|
|
for (int i=0;i<mObjects->count();i++) {
|
|
if (mObjects->at(i)->info()->orderLevel() == o->info()->orderLevel()
|
|
&& mObjects->at(i)->info()->id() != o->info()->id()) {
|
|
lIsNew = true;
|
|
}
|
|
}
|
|
|
|
if (lIsNew){
|
|
for (int i=0;i<mObjects->count();i++) {
|
|
mObjects->at(i)->info()->orderDown();
|
|
|
|
if (mObjects->at(i)->info()->orderLevel() >= mObjects->count()) {
|
|
mObjects->at(i)->info()->setOrderLevel(mObjects->count()-1);
|
|
}
|
|
}
|
|
} else {
|
|
for (int i=0;i<mObjects->count();i++) {
|
|
if (mObjects->at(i)->info()->orderLevel() < o->info()->orderLevel()) {
|
|
mObjects->at(i)->info()->orderDown();
|
|
}
|
|
}
|
|
}
|
|
|
|
o->info()->setOrderLevel(0);
|
|
}
|
|
|
|
void QScadaBoard::bringToFront(QScadaObject *o)
|
|
{
|
|
orderObject(o);
|
|
o->raise();
|
|
}
|
|
|
|
void QScadaBoard::sendToBack(QScadaObject *o)
|
|
{
|
|
o->lower();
|
|
}
|
|
|
|
int QScadaBoard::grid() const
|
|
{
|
|
return mGrid;
|
|
}
|
|
|
|
void QScadaBoard::setGrid(int grid)
|
|
{
|
|
mGrid = grid;
|
|
}
|
|
|
|
void QScadaBoard::deleteObjectWithId(int id)
|
|
{
|
|
for (QScadaObject *object : *mObjects) {
|
|
if (id == object->info()->id()) {
|
|
mObjects->removeOne(object);
|
|
delete object;
|
|
repaint();
|
|
}
|
|
}
|
|
}
|
|
|
|
void QScadaBoard::deleteObject(QScadaObject *object)
|
|
{
|
|
deleteObjectWithId(object->info()->id());
|
|
}
|
|
|
|
void QScadaBoard::updateObjectWithId(int id)
|
|
{
|
|
for (QScadaObject *object : *mObjects) {
|
|
if (id == object->info()->id()) {
|
|
object->update();
|
|
object->updateUIProperties();
|
|
}
|
|
}
|
|
}
|
|
|
|
void QScadaBoard::updateValue(int id, QVariant value)
|
|
{
|
|
for (QScadaObject *object : *mObjects) {
|
|
if (id == object->info()->id()) {
|
|
object->updateValue(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
void QScadaBoard::setPropertyWithId(int id, QString property, QVariant value)
|
|
{
|
|
for (QScadaObject *object : *mObjects) {
|
|
if (id == object->info()->id()) {
|
|
object->setProperty(property.toLocal8Bit().data(), value);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool QScadaBoard::showGrid() const
|
|
{
|
|
return mShowGrid;
|
|
}
|
|
|
|
void QScadaBoard::setShowGrid(bool showGrid)
|
|
{
|
|
mShowGrid = showGrid;
|
|
|
|
repaint();
|
|
}
|
|
|
|
bool QScadaBoard::editable() const
|
|
{
|
|
return mEditable;
|
|
}
|
|
|
|
void QScadaBoard::setEditable(bool editable)
|
|
{
|
|
mEditable = editable;
|
|
|
|
for (QScadaObject *object : *mObjects) {
|
|
object->setIsEditable(editable);
|
|
}
|
|
|
|
update();
|
|
}
|