Add auxiliar semi-transparent window in bottom-right corner of the image to illustrate the size and position of the current visible region of the image.

This commit is contained in:
Luis Lucas
2015-04-19 01:56:08 +01:00
parent ddb51110bf
commit 865d7efc38
2 changed files with 106 additions and 18 deletions
+100 -18
View File
@@ -64,8 +64,17 @@ ViewArea::ViewArea( QWidget *parent ) :
m_gridVisible = false;
m_snapToGrid = false;
m_blockTrackEnable = false;
m_visibleZoomRect = true;
m_pStream = NULL;
m_zoomWinTimer.setSingleShot(true);
m_zoomWinTimer.setInterval(2000);
connect( &m_zoomWinTimer, SIGNAL( timeout() ), this, SLOT( update() ) );
}
void ViewArea::startZoomWinTimer()
{
m_zoomWinTimer.start();
}
void ViewArea::setImage( PlaYUVerFrame* pcFrame )
@@ -85,6 +94,8 @@ void ViewArea::setImage( const QPixmap &pixmap )
updateSize();
update();
updateGeometry();
initZoomWinRect();
}
void ViewArea::clear()
@@ -107,6 +118,7 @@ Void ViewArea::setZoomFactor( Double f )
m_zoomFactor = f;
updateSize();
startZoomWinTimer();
update();
}
@@ -274,6 +286,53 @@ void ViewArea::setSelectedArea( QRect &rect )
update( updateRect.normalized() );
}
void ViewArea::initZoomWinRect()
{
int iMinX = 80;
int iMinY = 80;
int iMaxX = iMinX*5;
int iMaxY = iMinY*5;
double dSizeRatio, dWinZoomRatio;
int iHorizontalImg = (m_pixmap.width() > m_pixmap.height()) ? 1 : 0;
if( iHorizontalImg )
{
dSizeRatio = (double)m_pixmap.width()/(double)m_pixmap.height();
}
else
{
dSizeRatio = (double)m_pixmap.height()/(double)m_pixmap.width();
}
if( dSizeRatio > 5.0)
{
if( iHorizontalImg )
{
dWinZoomRatio = (double)(m_pixmap.width()*1024/iMaxX)/1000.0;
}
else
{
dWinZoomRatio = (double)(m_pixmap.height()*1024/iMaxY)/1000.0;
}
}
else
{
if( iHorizontalImg )
{
dWinZoomRatio = (double)(m_pixmap.height()*1024/iMinY)/1000.0;
}
else
{
dWinZoomRatio = (double)(m_pixmap.width()*1024/iMinX)/1000.0;
}
}
m_dZoomWinRatio = dWinZoomRatio;
}
////////////////////////////////////////////////////////////////////////////////
// Geometry Updates
////////////////////////////////////////////////////////////////////////////////
@@ -325,6 +384,7 @@ void ViewArea::resizeEvent( QResizeEvent *event )
return;
updateOffset();
startZoomWinTimer();
update();
}
////////////////////////////////////////////////////////////////////////////////
@@ -475,32 +535,52 @@ void ViewArea::paintEvent( QPaintEvent *event )
}
}
QRect zoomWinRect = QRect(0, 0, m_pixmap.width()/10, m_pixmap.height()/10 );
QPoint zWinPosition = QPoint(winRect.bottomRight()) -
QPoint(m_pixmap.width()/10,m_pixmap.height()/10) - QPoint(10,10);
zoomWinRect.moveTopLeft(zWinPosition);
painter.fillRect(zoomWinRect, QBrush(QColor(128, 128, 255, 128)));
painter.drawRect(zoomWinRect);
// VISIBLE ZOOM RECT
if( m_visibleZoomRect && m_zoomWinTimer.isActive() )
{
double dRatio = m_dZoomWinRatio;
QRect cImg = QRect(0, 0, m_pixmap.width(), m_pixmap.height() );
QPoint cZWinRBpos = QPoint(winRect.bottomRight()) - QPoint(15,15);
QRect cImgWinRect(0, 0, round((double)cImg.width()/dRatio), round((double)cImg.height()/dRatio) );
cImgWinRect.moveBottomRight(cZWinRBpos);
QRect vr = windowToView( winRect );
QRect cVisibleImg = vr & cImg;
//cVisibleImg.moveTopLeft(vr.topLeft());
QRect cVisibleWinRect;
cVisibleWinRect.setLeft(floor((double)cVisibleImg.x()/dRatio));
cVisibleWinRect.setTop(floor((double)cVisibleImg.y()/dRatio));
cVisibleWinRect.setRight(round((double)cVisibleImg.right()/dRatio));
cVisibleWinRect.setBottom(round((double)cVisibleImg.bottom()/dRatio));
QRect vr = windowToView( winRect );
zoomWinRect.moveTopLeft(QPoint(0,0));
QRect zoomVisibleRect = QRect(0,0,vr.width()/10,vr.height()/10) & zoomWinRect;
zoomVisibleRect.moveTopLeft(vr.topLeft()/10);
painter.fillRect(cImgWinRect, QBrush(QColor(128, 128, 128, 128)));
painter.setPen(QColor(50, 50, 50, 128));
painter.drawRect(cImgWinRect);
qDebug() << winRect << vr << zoomVisibleRect << m_pixmap.size() << zoomWinRect;
cVisibleWinRect.moveTopLeft( cImgWinRect.topLeft() + cVisibleWinRect.topLeft() );
if(zoomVisibleRect.left()<0)
zoomVisibleRect.moveLeft(0);
if(zoomVisibleRect.top()<0)
zoomVisibleRect.moveTop(0);
cVisibleWinRect = cVisibleWinRect & cImgWinRect;
zoomVisibleRect.moveTopLeft(zoomVisibleRect.topLeft() + zWinPosition);
if(cVisibleWinRect.left()<0)
cVisibleWinRect.moveLeft(0);
if(cVisibleWinRect.top()<0)
cVisibleWinRect.moveTop(0);
if(cVisibleWinRect.width()<=0)
cVisibleWinRect.setWidth(1);
if(cVisibleWinRect.height()<=0)
cVisibleWinRect.setHeight(1);
painter.fillRect(cVisibleWinRect, QBrush(QColor(200, 200, 200, 128)));
painter.setPen(QColor(255, 255, 255, 128));
painter.drawRect(cVisibleWinRect);
qDebug() << "Debug VisibleZoomRect: " << winRect << vr << cImgWinRect << cVisibleWinRect << cVisibleImg << dRatio;
}
painter.fillRect(zoomVisibleRect, QBrush(QColor(128, 200, 255, 128)));
painter.drawRect(zoomVisibleRect);
QRect sr = viewToWindow( m_selectedArea );
QRect ir = sr & winRect;
@@ -742,6 +822,8 @@ void ViewArea::mouseMoveEvent( QMouseEvent *event )
if( tool() == NavigationTool )
{
QPoint offset = m_lastWindowPos - event->pos();
startZoomWinTimer();
emit scrollBarMoved( offset );
}