231 lines
6.3 KiB
C++
231 lines
6.3 KiB
C++
|
|
#include "fm_drag_zoom_widget.h"
|
|
#if (USE_DRAG_ZOOM)
|
|
|
|
#include <QPainter>
|
|
#include <QMouseEvent>
|
|
#include <QDebug>
|
|
#include <QTimer>
|
|
#include "../core/rm_math.h"
|
|
#include "../rm_include.h"
|
|
|
|
//#include "rm_controlwidget.h"
|
|
//#include "rm_constants.h"
|
|
|
|
FMDragZoomWidget::FMDragZoomWidget(QWidget *parent) : QWidget(parent)
|
|
{
|
|
#if (DRAG_ZOOM_BY_RATIO)
|
|
ratio = QSize(160000,90000);
|
|
#endif //
|
|
|
|
_mousePressed = false;
|
|
_drawStarted = false;
|
|
_ROIEnabled = false;
|
|
|
|
#if (USE_DRAG_ZOOM)
|
|
_disabled = false;
|
|
_block = false;
|
|
#endif
|
|
|
|
QPixmap pixmap;
|
|
pixmap.load(":/image/cursor_magnify.png");
|
|
_magnify = new QCursor(pixmap);
|
|
}
|
|
|
|
QPoint FMDragZoomWidget::filterPoint(QPoint point)
|
|
{
|
|
#if (DRAG_ZOOM_BY_RATIO)
|
|
QRectF bound = QRectAspectFitRect(ratio,QRect(0,0,this->size().width(),this->size().height()));
|
|
#else // DRAG_ZOOM_BY_RATIO
|
|
#if (TOP_DOWN_360)
|
|
QRectF bound = QRectAspectFitRect(QSize(1,1),QRect(0,0,this->size().width(),this->size().height()));
|
|
#else
|
|
QRectF bound = QRectAspectFitRect(QSize(160000,90000),QRect(0,0,this->size().width(),this->size().height()));
|
|
#endif
|
|
#endif // DRAG_ZOOM_BY_RATIO
|
|
|
|
if(bound.contains(point) == false)
|
|
{
|
|
double xmin = qMin(bound.left(), bound.right());
|
|
double xmax = qMax(bound.left(), bound.right());
|
|
double ymax = qMax(bound.top(), bound.bottom());
|
|
double ymin = qMin(bound.top(), bound.bottom());
|
|
|
|
return QPoint((int)qMax(qMin(point.x(),(int)xmax),(int)xmin),(int)qMax(qMin(point.y(),(int)ymax),(int)ymin));
|
|
}
|
|
return point;
|
|
}
|
|
|
|
void FMDragZoomWidget::sendSelectedSignal()
|
|
{
|
|
_rect = _rect.normalized();
|
|
// 영역이 너무 작을 경우 취소
|
|
if(_rect.width() < 5 || _rect.height() < 5)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 후방도 16:9로 고정되어 있어 문제가 안됨. ???
|
|
#if (DRAG_ZOOM_BY_RATIO)
|
|
QRectF bound = QRectAspectFitRect(ratio,QRect(0,0,this->size().width(),this->size().height()));
|
|
#else // DRAG_ZOOM_BY_RATIO
|
|
#if (TOP_DOWN_360)
|
|
QRectF bound = QRectAspectFitRect(QSize(1,1),QRect(0,0,this->size().width(),this->size().height()));
|
|
#else // TOP_DOWN_360
|
|
QRectF bound = QRectAspectFitRect(QSize(160000,90000),QRect(0,0,this->size().width(),this->size().height()));
|
|
#endif // TOP_DOWN_360
|
|
#endif // DRAG_ZOOM_BY_RATIO
|
|
// 크기는 확인
|
|
//qInfo() << "AREA" << this->size() << "BOUND" << bound << "RECT" << _rect << __FUNCTION__;
|
|
|
|
double xmin = qMin(_rect.left(), _rect.right());
|
|
double ymin = qMin(_rect.top(), _rect.bottom());
|
|
|
|
double x = (xmin - bound.left()) / bound.width();
|
|
double y = (ymin - bound.top()) / bound.height();
|
|
|
|
double width = ((double)_rect.width()) / bound.width();
|
|
double height = ((double)_rect.height()) / bound.height();
|
|
|
|
//qInfo() << "RECT" << x << y << width << height << __FUNCTION__;
|
|
#if (FISH_EYE_CLIP)
|
|
// 실제 사용자가 화면에서 선택한 영역은 원본 데이터의 85% CLIP 영역
|
|
qInfo() << "XYWH:" << x << y << width << height << __FUNCTION__;
|
|
// (버릴 영역의 크기: 15% / 2 = 7.5%)
|
|
x = (x * 0.85) + 0.075;
|
|
y = (y * 0.85) + 0.075;
|
|
width *= 0.85;
|
|
height *= 0.85;
|
|
//qInfo() << "XYWH2:" << x << y << width << height << __FUNCTION__;
|
|
#endif
|
|
emit ROISelected(x,y,width,height);
|
|
}
|
|
|
|
void FMDragZoomWidget::ROIReset()
|
|
{
|
|
_mousePressed = false;
|
|
_ROIEnabled = true;
|
|
//update();
|
|
}
|
|
void FMDragZoomWidget::setROIEnabled(bool enabled)
|
|
{
|
|
_ROIEnabled = enabled;
|
|
}
|
|
|
|
void FMDragZoomWidget::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
//time.start(); // 확인
|
|
#if (USE_DRAG_ZOOM)
|
|
if(_disabled || _block) {
|
|
QWidget::mousePressEvent(event);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if(_ROIEnabled == true && event->button() == Qt::LeftButton)
|
|
{
|
|
_mousePressed = true;
|
|
_rect.setTopLeft(filterPoint(event->pos()));
|
|
_rect.setBottomRight(filterPoint(event->pos()));
|
|
}
|
|
QWidget::mousePressEvent(event);
|
|
}
|
|
void FMDragZoomWidget::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
//qInfo() << _ROIEnabled << __FUNCTION__;
|
|
if(_ROIEnabled == true && _mousePressed == true)
|
|
{
|
|
_rect.setBottomRight(filterPoint(event->pos()));
|
|
if(fabs((float)_rect.width()) > 5.0f && fabs((float)_rect.height()) > 5.0f)
|
|
{
|
|
setCursor(*_magnify); // 클릭시 커서를 변경하면 보기 싫다.
|
|
}
|
|
update();
|
|
}
|
|
QWidget::mouseMoveEvent(event);
|
|
}
|
|
void FMDragZoomWidget::mouseReleaseEvent(QMouseEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
#if (USE_DRAG_ZOOM)
|
|
if(_disabled || _block) {
|
|
QWidget::mouseReleaseEvent(event);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
//qInfo() << "CLICKED _ROIEnabled:" << _ROIEnabled << "_mousePressed:" << _mousePressed << "_drawStarted:" << _drawStarted << __FUNCTION__;
|
|
|
|
|
|
bool ROI = false;
|
|
if(_ROIEnabled == true && _mousePressed == true)
|
|
{
|
|
#if (CLICK_PAUSE_PLAY)
|
|
if(_rect.width() < 5 && _rect.height() < 5) {
|
|
emit clicked();
|
|
}
|
|
#endif // CLICK_PAUSE_PLAY
|
|
|
|
if(_drawStarted == true)
|
|
{
|
|
sendSelectedSignal();
|
|
ROI = true;
|
|
_rect.setRect(0,0,0,0); // 삭제
|
|
update();
|
|
}
|
|
|
|
unsetCursor();
|
|
}
|
|
|
|
if(ROI == false)
|
|
{
|
|
emit ROICleared();
|
|
}
|
|
_mousePressed = false;
|
|
QWidget::mouseReleaseEvent(event);
|
|
}
|
|
void FMDragZoomWidget::onReleaseDisabled()
|
|
{
|
|
_block = false;
|
|
}
|
|
void FMDragZoomWidget::mouseDoubleClickEvent(QMouseEvent *e)
|
|
{
|
|
_block = true;
|
|
QTimer::singleShot(100,Qt::PreciseTimer,this,SLOT(onReleaseDisabled()));
|
|
QWidget::mouseDoubleClickEvent(e);
|
|
}
|
|
|
|
void FMDragZoomWidget::paintEvent(QPaintEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
|
|
_painter.begin(this);
|
|
QPen pen(Qt::red);
|
|
_painter.setPen(pen);
|
|
_painter.setRenderHint(QPainter::Antialiasing, false);
|
|
|
|
QRect nrect = _rect;
|
|
nrect = nrect.normalized();
|
|
|
|
if(_mousePressed)
|
|
{
|
|
_painter.drawPixmap(0,0,_pixmap);
|
|
if(nrect.width() > 5 && nrect.height() > 5) {
|
|
_painter.drawRect(nrect);
|
|
}
|
|
_drawStarted = true;
|
|
}
|
|
else if (_drawStarted && !_pixmap.isNull())
|
|
{
|
|
QPainter tempPainter(&_pixmap);
|
|
tempPainter.setRenderHint(QPainter::Antialiasing, false);
|
|
tempPainter.setPen(pen);
|
|
if(nrect.width() > 5 && nrect.height() > 5) {
|
|
tempPainter.drawRect(nrect);
|
|
}
|
|
_painter.drawPixmap(0,0,_pixmap);
|
|
}
|
|
_painter.end();
|
|
}
|
|
#endif // USE_DRAG_ZOOM
|