SystemGui/Sources/Tower/LightShowWidget.cpp
2022-12-11 13:50:51 -05:00

149 lines
4.1 KiB
C++

#include "LightShowWidget.h"
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <math.h>
#include <QScrollBar>
#define VIEW_CENTER viewport()->rect().center()
#define VIEW_WIDTH viewport()->rect().width()
#define VIEW_HEIGHT viewport()->rect().height()
CLightShowWidget::CLightShowWidget(QWidget *parent)
{
mScale = 1.0;
mDoMousePan = false;
setParent(parent);
mScene = new QGraphicsScene(this);
mScene->setItemIndexMethod(QGraphicsScene::NoIndex);
mScene->setSceneRect(-5000, -5000, 10000, 10000);
// scene->setSceneRect(-100,-100,10000,10000);
setScene(mScene);
// setMinimumSize(500,500);
// setMaximumSize(parent->size());
setTransformationAnchor(AnchorUnderMouse);
// setTransformationAnchor(AnchorViewCenter);
setDragMode(QGraphicsView::NoDrag);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mViewportRect = new QGraphicsRectItem(0,0,50,50);
mViewportRect->setPen(QPen(Qt::darkBlue));
mSceneRect = new QGraphicsRectItem(sceneRect());
mSceneRect->setPen(QPen(Qt::red));
mLedStringRect = new QGraphicsRectItem();
mLedStringRect->setPen(QPen(Qt::darkGreen));
// test->setBrush(QBrush(Qt::darkBlue));
// mScene->addItem(mViewportRect);
// mScene->addItem(mSceneRect);
// mScene->addItem(mLedStringRect);
mLedStringWidget = new CLedStringWidget(300);
mScene->addItem(mLedStringWidget);
// mLedStringWidget->setTransform(QTransform::fromScale(10, 10), true);
mLedStringWidget->setPos(0,100);
setSceneRect(-100,-100,parentWidget()->geometry().width(),parentWidget()->geometry().height());
setMinimumSize(parentWidget()->geometry().width(),parentWidget()->geometry().height());
mScene->views().at(0)->setBackgroundBrush(QBrush(QColor(Qt::black)));
}
void CLightShowWidget::wheelEvent(QWheelEvent *event)
{
ScaleView(pow((double)2, event->delta() / 240.0));
}
void CLightShowWidget::ScaleView(qreal scaleFactor)
{
qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
if (/*factor < 0.07 || */factor > 1)
return;
scale(scaleFactor, scaleFactor);
mScale *= scaleFactor;
qreal deltaW = factor * sceneRect().width();
qreal deltaH = factor * sceneRect().height();
}
void CLightShowWidget::ZoomIn()
{
ScaleView(qreal(1.2));
}
void CLightShowWidget::ZoomOut()
{
ScaleView(1 / qreal(1.2));
}
void CLightShowWidget::showEvent(QShowEvent *event)
{
mNominalTransform = transform();
mLedStringRect->setRect(mLedStringWidget->boundingRect());
}
void CLightShowWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton){
mLasMousePos = event->pos();
mDoMousePan = true;
}
QGraphicsView::mousePressEvent(event);
}
void CLightShowWidget::mouseMoveEvent(QMouseEvent *event)
{
if (mDoMousePan){
QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(mLasMousePos);
Pan(mouseDelta);
}
QGraphicsView::mouseMoveEvent(event);
mLasMousePos = event->pos();
}
void CLightShowWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton){
mDoMousePan = false;
}
QGraphicsView::mouseReleaseEvent(event);
}
void CLightShowWidget::Pan(QPointF delta)
{
// Scale the pan amount by the current zoom.
// delta *= mScale;
delta *= PAN_SPEED;
// qDebug("Moving by x:%f, y:%f",delta.x(),delta.y());
delta.setX(-delta.rx());
delta.setY(-delta.ry());
QRectF NewViewRect = sceneRect();
NewViewRect.translate(delta.x(),delta.y());
mCurTransform = transform();
setSceneRect(NewViewRect);
mViewportRect->setRect(viewport()->geometry());
mSceneRect->setRect(sceneRect());
// qDebug("Scene Rect: left: %f, right:%f, top:%f, bottom:%f",sceneRect().left(),sceneRect().right(),sceneRect().top(),sceneRect().bottom());
// Have panning be anchored from the mouse.
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}