From 0212913b5c6f076e1be7cf1dc05e6674813322cd Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sat, 28 Jun 2014 23:25:03 +0100 Subject: [PATCH] Merge with features_quality_side_bar --- source/app/PropertiesSidebar.cpp | 6 +- source/app/QualityMeasurementSidebar.cpp | 173 ++++++++++++++++ source/app/QualityMeasurementSidebar.h | 81 ++++++++ source/app/SubWindowHandle.cpp | 25 ++- source/app/SubWindowHandle.h | 18 +- source/app/ViewArea.cpp | 239 ++++++++++++----------- source/app/plaYUVerApp.cpp | 38 ++-- source/app/plaYUVerApp.h | 9 +- 8 files changed, 435 insertions(+), 154 deletions(-) create mode 100644 source/app/QualityMeasurementSidebar.cpp create mode 100644 source/app/QualityMeasurementSidebar.h diff --git a/source/app/PropertiesSidebar.cpp b/source/app/PropertiesSidebar.cpp index 668bfde..55e8448 100644 --- a/source/app/PropertiesSidebar.cpp +++ b/source/app/PropertiesSidebar.cpp @@ -269,7 +269,7 @@ FramePropertiesSideBar::FramePropertiesSideBar( QWidget* parent, Bool *pbIsPlayi // ------------------------------------------------------------- - histogramWidget = new HistogramWidget( 256, 140 ); + histogramWidget = new HistogramWidget( 256, 100 ); histogramWidget->setOptions( HistogramWidget::BlinkComputation | HistogramWidget::SelectMode | HistogramWidget::ShowLumaChannel ); histogramWidget->setWhatsThis( tr( "

This is the histogram drawing of " "the selected image channel" ) ); @@ -484,11 +484,11 @@ Void FramePropertiesSideBar::setSelection( const QRect &selectionArea ) if( selectionArea.isValid() ) { histogramWidget->stopHistogramComputation(); - //histogramWidget->updateSelectionData( new PlaYUVerFrame(m_pcFrame selectionArea)); - histogramWidget->updateSelectionData( new PlaYUVerFrame(m_pcFrame)); + histogramWidget->updateSelectionData( new PlaYUVerFrame(m_pcFrame, selectionArea)); fullImageButton->show(); selectionImageButton->show(); selectionImageButton->click(); + slotRenderingChanged( HistogramWidget::ImageSelectionHistogram ); } else { diff --git a/source/app/QualityMeasurementSidebar.cpp b/source/app/QualityMeasurementSidebar.cpp new file mode 100644 index 0000000..2c165e0 --- /dev/null +++ b/source/app/QualityMeasurementSidebar.cpp @@ -0,0 +1,173 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file QualityMeasurementSidebar.cpp + * \brief Definition of the quality measurement sidebar + */ + +#include "PlaYUVerDefs.h" +#include +#include "QualityMeasurementSidebar.h" +#include "SubWindowHandle.h" + +namespace plaYUVer +{ + +QualityMeasurementSidebar::QualityMeasurementSidebar( QWidget* parent, QMdiArea *mdiArea ) : + QWidget( parent ), + m_pcMainWindowMdiArea( mdiArea ), + m_pcCurrentSubWindow( NULL ) +{ + + // Side bar area ----------------------------------------------------- + + QLabel *RefLabel = new QLabel( tr( "Ref:" ) ); + RefLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); + + QLabel *RecLabel = new QLabel( tr( "Rec:" ) ); + RecLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); + + m_comboBoxRef = new QComboBox; + + m_comboBoxRec = new QComboBox; + + updateSubWindowList(); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget( RefLabel, 0, 0, Qt::AlignLeft ); + mainLayout->addWidget( m_comboBoxRef, 0, 1, Qt::AlignLeft ); + //mainLayout->addWidget( RecLabel, 1, 0, Qt::AlignLeft ); + //mainLayout->addWidget( m_comboBoxRec, 1, 1, Qt::AlignLeft ); + + m_ppcLabelQualityLabel[LUMA] = new QLabel( tr( "PSNR Y:" ) ); + m_ppcLabelQualityLabel[LUMA]->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); + m_ppcLabelQualityValue[LUMA] = new QLabel; + m_ppcLabelQualityValue[LUMA]->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + + m_ppcLabelQualityLabel[CHROMA_U] = new QLabel( tr( "PSNR U:" ) ); + m_ppcLabelQualityLabel[CHROMA_U]->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); + m_ppcLabelQualityValue[CHROMA_U] = new QLabel; + m_ppcLabelQualityValue[CHROMA_U]->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + + m_ppcLabelQualityLabel[CHROMA_V] = new QLabel( tr( "PSNR V:" ) ); + m_ppcLabelQualityLabel[CHROMA_V]->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); + m_ppcLabelQualityValue[CHROMA_V] = new QLabel; + m_ppcLabelQualityValue[CHROMA_V]->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + + QGridLayout *qualityResultsLayout = new QGridLayout; + qualityResultsLayout->addWidget( m_ppcLabelQualityLabel[LUMA], 0, 0 ); + qualityResultsLayout->addWidget( m_ppcLabelQualityValue[LUMA], 0, 1 ); + qualityResultsLayout->addWidget( m_ppcLabelQualityLabel[CHROMA_U], 1, 0 ); + qualityResultsLayout->addWidget( m_ppcLabelQualityValue[CHROMA_U], 1, 1 ); + qualityResultsLayout->addWidget( m_ppcLabelQualityLabel[CHROMA_V], 2, 0 ); + qualityResultsLayout->addWidget( m_ppcLabelQualityValue[CHROMA_V], 2, 1 ); + + QGroupBox *statisticsGroup = new QGroupBox( tr( "Quality" ) ); + statisticsGroup->setLayout( qualityResultsLayout ); + statisticsGroup->setWhatsThis( tr( "

Here you can see the quality results calculated for the " + "selected windows." ) ); + + mainLayout->addWidget( statisticsGroup, 4, 0, 3, 3 ); + + mainLayout->setRowStretch( 8, 10 ); + setLayout( mainLayout ); + + connect( m_comboBoxRef, SIGNAL( activated(int) ), this, SLOT( slotReferenceChanged(int) ) ); + +} + +QualityMeasurementSidebar::~QualityMeasurementSidebar() +{ + +} + +QSize QualityMeasurementSidebar::sizeHint() const +{ + QSize currSize = size(); + QSize bestSize( 240, currSize.height() ); + if( currSize.width() < bestSize.width() ) + return bestSize; + else + return currSize; +} + +Void QualityMeasurementSidebar::updateSubWindowList() +{ + SubWindowHandle *subWindow; + QString currSubWindowName; + m_pcWindowListNames.clear(); + for( Int i = 0; i < m_pcMainWindowMdiArea->subWindowList().size(); i++ ) + { + subWindow = qobject_cast( m_pcMainWindowMdiArea->subWindowList().at( i ) ); + currSubWindowName = subWindow->getWindowName(); + if( !m_pcSelectedWindowListNames.contains( currSubWindowName ) && !subWindow->getIsModule() ) + m_pcWindowListNames.append( currSubWindowName ); + } + m_comboBoxRef->clear(); + m_comboBoxRef->insertItems( 0, m_pcWindowListNames ); + m_comboBoxRef->setCurrentIndex( -1 ); +} + +Void QualityMeasurementSidebar::updateCurrentWindow( SubWindowHandle *subWindow ) +{ + m_pcCurrentSubWindow = subWindow; + updateSidebarData(); +} + +Void QualityMeasurementSidebar::updateSidebarData() +{ + QString value( "0.00" ); + SubWindowHandle* refSubWindow = m_pcCurrentSubWindow->getRefSubWindow(); + + if( refSubWindow ) + { + PlaYUVerFrame* currFrame = m_pcCurrentSubWindow->getCurrFrame(); + PlaYUVerFrame* refFrame = refSubWindow->getCurrFrame(); + Double quality; + + for( Int component = 0; component < 3; component++ ) + { + quality = currFrame->getPSNR( refFrame, component ); + m_ppcLabelQualityLabel[component]->setText( value.setNum( quality, 'f', 2 ) ); + } + } + else + { + for( Int component = 0; component < 3; component++ ) + { + m_ppcLabelQualityLabel[component]->setText( value ); + } + } +} + +Void QualityMeasurementSidebar::slotReferenceChanged( Int index ) +{ + SubWindowHandle *subWindow; + if( index > -1 && m_pcCurrentSubWindow ) + { + subWindow = qobject_cast( m_pcMainWindowMdiArea->subWindowList().at( index ) ); + if( subWindow ) + m_pcCurrentSubWindow->setRefSubWindow( subWindow ); + } + // updateSidebarData(); +} + +} // NAMESPACE + diff --git a/source/app/QualityMeasurementSidebar.h b/source/app/QualityMeasurementSidebar.h new file mode 100644 index 0000000..51bf01e --- /dev/null +++ b/source/app/QualityMeasurementSidebar.h @@ -0,0 +1,81 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file QualityMeasurementSidebar.h + * \brief Definition of the quality measurement sidebar + */ + +#ifndef __QUALITYMEASUREMENTSIDEBAR_H__ +#define __QUALITYMEASUREMENTSIDEBAR_H__ + +#include "config.h" +#include "PlaYUVerDefs.h" +#if( QT_VERSION_PLAYUVER == 5 ) +#include +#elif( QT_VERSION_PLAYUVER == 4 ) +#include +#include +#endif +#include "PlaYUVerStream.h" +#include "PlaYUVerFrame.h" +#include "HistogramWidget.h" + +namespace plaYUVer +{ + +class SubWindowHandle; + +class QualityMeasurementSidebar: public QWidget +{ +Q_OBJECT +public: + QualityMeasurementSidebar( QWidget*, QMdiArea * ); + ~QualityMeasurementSidebar(); + + QSize sizeHint() const; + + Void updateSubWindowList(); + Void updateCurrentWindow( SubWindowHandle * ); + Void updateSidebarData(); + +private: + QMdiArea* m_pcMainWindowMdiArea; + + QStringList m_pcWindowListNames; + QStringList m_pcSelectedWindowListNames; + + SubWindowHandle *m_pcCurrentSubWindow; + + QComboBox *m_comboBoxRef; + QComboBox *m_comboBoxRec; + + QLabel* m_ppcLabelQualityLabel[3]; + QLabel* m_ppcLabelQualityValue[3]; + + HistogramWidget *histogramWidget; + +private Q_SLOTS: + void slotReferenceChanged( int ); + +}; + +} // NAMESPACE + +#endif // __QUALITYMEASUREMENTSIDEBAR_H__ diff --git a/source/app/SubWindowHandle.cpp b/source/app/SubWindowHandle.cpp index 1e08a1e..be6cec4 100644 --- a/source/app/SubWindowHandle.cpp +++ b/source/app/SubWindowHandle.cpp @@ -31,6 +31,11 @@ namespace plaYUVer SubWindowHandle::SubWindowHandle( QWidget * parent, Bool isModule ) : QMdiSubWindow( parent ), + m_pCurrStream( NULL ), + m_pcCurrFrame( NULL ), + m_pcCurrentModule( NULL ), + m_pcReferenceSubWindow( NULL ), + m_bIsPlaying( false ), m_bIsModule( isModule ) { setParent( parent ); @@ -50,17 +55,11 @@ SubWindowHandle::SubWindowHandle( QWidget * parent, Bool isModule ) : connect( m_cScrollArea->horizontalScrollBar(), SIGNAL( actionTriggered( int ) ), this, SLOT( updateLastScrollValue() ) ); connect( m_cScrollArea->verticalScrollBar(), SIGNAL( actionTriggered( int ) ), this, SLOT( updateLastScrollValue() ) ); - // Define the cViewArea as the widget inside the scroll area +// Define the cViewArea as the widget inside the scroll area m_cScrollArea->setWidget( m_cViewArea ); m_cScrollArea->setWidgetResizable( true ); - m_pCurrStream = NULL; - //m_pCurrStream = new PlaYUVerStream; - m_pcCurrFrame = NULL; - m_pcCurrentModule = NULL; - m_cWindowName = QString( " " ); - m_bIsPlaying = false; m_cLastScroll = QPoint(); } @@ -130,7 +129,7 @@ Void SubWindowHandle::enableModule( PlaYUVerModuleIf* select_module ) disableModule(); } m_pcCurrentModule = select_module; - // refreshFrame(); +// refreshFrame(); } Void SubWindowHandle::disableModule() @@ -282,7 +281,7 @@ Void SubWindowHandle::normalSize() Void SubWindowHandle::zoomToFit() { - // Scale to a smaller size that the real to a nicer look +// Scale to a smaller size that the real to a nicer look QSize niceFit( m_cScrollArea->viewport()->size().width() - 5, m_cScrollArea->viewport()->size().height() - 5 ); scaleView( niceFit ); } @@ -309,7 +308,7 @@ Void SubWindowHandle::scaleView( const QSize & size ) QSize newSize = imgViewSize; newSize.scale( size, Qt::KeepAspectRatio ); - // Calc the zoom factor +// Calc the zoom factor Double wfactor = 1; Double hfactor = 1; @@ -390,7 +389,7 @@ void SubWindowHandle::updateLastScrollValue() QSize SubWindowHandle::sizeHint() const { QSize maxSize; // The size of the parent (viewport widget - // of the QMdiArea). +// of the QMdiArea). QWidget *p = parentWidget(); if( p ) @@ -404,8 +403,8 @@ QSize SubWindowHandle::sizeHint() const else if( m_pCurrStream ) isize = QSize( m_pCurrStream->getWidth() + 50, m_pCurrStream->getHeight() + 50 ); - // If the SubWindowHandle needs more space that the avaiable, we'll give - // to the subwindow a reasonable size preserving the image aspect ratio. +// If the SubWindowHandle needs more space that the avaiable, we'll give +// to the subwindow a reasonable size preserving the image aspect ratio. if( isize.width() < maxSize.width() && isize.height() < maxSize.height() ) { return isize; diff --git a/source/app/SubWindowHandle.h b/source/app/SubWindowHandle.h index 6a68ba2..1111be2 100644 --- a/source/app/SubWindowHandle.h +++ b/source/app/SubWindowHandle.h @@ -38,6 +38,7 @@ namespace plaYUVer { +class SubWindowHandle; class SubWindowHandle: public QMdiSubWindow { @@ -48,11 +49,13 @@ private: QScrollArea* m_cScrollArea; ViewArea* m_cViewArea; - PlaYUVerModuleIf* m_pcCurrentModule; - PlaYUVerStream* m_pCurrStream; PlaYUVerFrame* m_pcCurrFrame; + PlaYUVerModuleIf* m_pcCurrentModule; + + SubWindowHandle* m_pcReferenceSubWindow; + QString m_cWindowName; QString m_cCurrFileName; @@ -68,7 +71,7 @@ public: Bool mayClose(); Bool loadFile( QString cFilename, Bool bForceDialog = false ); Void reloadFile(); - Bool save( QString filename ); + Bool save( QString filename ); Bool play(); Void pause(); @@ -117,6 +120,15 @@ public: return m_pcCurrentModule; } + Void setRefSubWindow( SubWindowHandle* subWindow ) + { + m_pcReferenceSubWindow = subWindow; + } + SubWindowHandle* getRefSubWindow() + { + return m_pcReferenceSubWindow; + } + /** * Functions to enable a module in the * current SubWindow diff --git a/source/app/ViewArea.cpp b/source/app/ViewArea.cpp index c7965cb..d9eb04b 100644 --- a/source/app/ViewArea.cpp +++ b/source/app/ViewArea.cpp @@ -47,7 +47,7 @@ static const QColor imageMaskColor = Qt::green; static const QColor eraserColor = Qt::red; ViewArea::ViewArea( QWidget *parent ) : - QWidget( parent ) + QWidget( parent ) { setAttribute( Qt::WA_StaticContents ); // setAttribute( Qt::WA_NoBackground ); @@ -109,6 +109,7 @@ void ViewArea::clearMask() // return QSize( w, h ); // } +<<<<<<< HEAD Void ViewArea::setZoomFactor( Double f ) { m_zoomFactor = f; @@ -118,15 +119,18 @@ Void ViewArea::setZoomFactor( Double f ) } Void ViewArea::zoomChangeEvent(Double factor, QPoint center ) +======= +Void ViewArea::zoomChangeEvent( Double factor, QPoint center ) +>>>>>>> features_quality_side_bar { Double zoomFactor; Double maxZoom = 100.0; - Double minZoom = 0.01;//( 1.0 / m_pixmap.width() ); + Double minZoom = 0.01; //( 1.0 / m_pixmap.width() ); - if( ( m_zoomFactor == minZoom ) && (factor < 1 ) ) + if( ( m_zoomFactor == minZoom ) && ( factor < 1 ) ) return; - if( ( m_zoomFactor == maxZoom ) && (factor > 1 ) ) + if( ( m_zoomFactor == maxZoom ) && ( factor > 1 ) ) return; zoomFactor = m_zoomFactor * factor; @@ -138,7 +142,7 @@ Void ViewArea::zoomChangeEvent(Double factor, QPoint center ) zoomFactor = maxZoom; setZoomFactor( zoomFactor ); - emit zoomFactorChanged(factor, center); + emit zoomFactorChanged( factor, center ); } @@ -313,9 +317,7 @@ void ViewArea::paintEvent( QPaintEvent *event ) // to draw the whole pixmap if your widget is only partially exposed), and reverse map it with the painter matrix. // That gives us the part of the pixmap that has actually been exposed. // See: http://blog.qt.digia.com/blog/2006/05/13/fast-transformed-pixmapimage-drawing/ - QRect exposedRect = painter.worldTransform().inverted() - .mapRect(event->rect()) - .adjusted(-1, -1, 1, 1); + QRect exposedRect = painter.worldTransform().inverted().mapRect( event->rect() ).adjusted( -1, -1, 1, 1 ); // Draw the pixmap. painter.drawPixmap( exposedRect, m_pixmap, exposedRect ); @@ -346,7 +348,6 @@ void ViewArea::paintEvent( QPaintEvent *event ) painter.restore(); - // Draw a border around the image. if( m_xOffset || m_yOffset ) { @@ -355,55 +356,54 @@ void ViewArea::paintEvent( QPaintEvent *event ) } // Draw pixel values in grid - if(m_zoomFactor>=25.0) + if( m_zoomFactor >= 25.0 ) { Int imageWidth = m_pixmap.width(); Int imageHeight = m_pixmap.height(); Pixel sPixelValue; - QFont font("Helvetica"); - font.setPixelSize(m_zoomFactor/4); - painter.setFont(font); + QFont font( "Helvetica" ); + font.setPixelSize( m_zoomFactor / 4 ); + painter.setFont( font ); QRect vr = windowToView( winRect ); vr &= QRect( 0, 0, imageWidth, imageHeight ); - for(Int i=vr.x() ; i<=vr.right() ; i++) + for( Int i = vr.x(); i <= vr.right(); i++ ) { - for(Int j=vr.y() ; j<=vr.bottom() ; j++) + for( Int j = vr.y(); j <= vr.bottom(); j++ ) { - QPoint pixelTopLeft(i,j); + QPoint pixelTopLeft( i, j ); sPixelValue = m_pcCurrFrame->getPixelValue( pixelTopLeft, PlaYUVerFrame::COLOR_YUV ); - QRect pixelRect(viewToWindow(pixelTopLeft), QSize(m_zoomFactor,m_zoomFactor)); + QRect pixelRect( viewToWindow( pixelTopLeft ), QSize( m_zoomFactor, m_zoomFactor ) ); if( sPixelValue.Luma < 128 ) - painter.setPen(QColor(Qt::white)); + painter.setPen( QColor( Qt::white ) ); else - painter.setPen(QColor(Qt::black)); - painter.drawText(pixelRect, Qt::AlignCenter, QString::number(sPixelValue.Luma)); + painter.setPen( QColor( Qt::black ) ); + painter.drawText( pixelRect, Qt::AlignCenter, QString::number( sPixelValue.Luma ) ); } } QColor color( Qt::white ); QPen mainPen = QPen( color, 1, Qt::SolidLine ); - painter.setPen(mainPen); + painter.setPen( mainPen ); // Draw vertical line - for( Int x = vr.x(); x <= (vr.right()+1); x ++ ) + for( Int x = vr.x(); x <= ( vr.right() + 1 ); x++ ) { // Always draw the full line otherwise the line stippling // varies with the location of view area and we get glitchy // patterns. - painter.drawLine( viewToWindow(QPoint(x,0)), viewToWindow(QPoint(x,imageHeight)) ); + painter.drawLine( viewToWindow( QPoint( x, 0 ) ), viewToWindow( QPoint( x, imageHeight ) ) ); } // Draw horizontal line - for( Int y = vr.y(); y <= (vr.bottom()+1); y ++ ) + for( Int y = vr.y(); y <= ( vr.bottom() + 1 ); y++ ) { - painter.drawLine( viewToWindow(QPoint(0,y)), viewToWindow(QPoint(imageWidth,y)) ); + painter.drawLine( viewToWindow( QPoint( 0, y ) ), viewToWindow( QPoint( imageWidth, y ) ) ); } } - QRect sr = viewToWindow( m_selectedArea ); QRect ir = sr & winRect; @@ -498,7 +498,7 @@ void ViewArea::paintEvent( QPaintEvent *event ) break; } default: - color = selectionColor; // ?Problems! + color = selectionColor; // ?Problems! } color.setAlpha( 120 ); @@ -532,7 +532,6 @@ void ViewArea::wheelEvent( QWheelEvent *event ) factor=0.8; zoomChangeEvent( factor , event->pos() ); } - } void ViewArea::mousePressEvent( QMouseEvent *event ) @@ -549,7 +548,7 @@ void ViewArea::mousePressEvent( QMouseEvent *event ) { if( tool() == NavigationTool ) { - if( !(m_xOffset && m_yOffset) ) + if( !( m_xOffset && m_yOffset ) ) setCursor( Qt::ClosedHandCursor ); m_lastWindowPos = event->pos(); @@ -609,14 +608,14 @@ void ViewArea::mouseMoveEvent( QMouseEvent *event ) #ifndef _MSC_VER // Add this code line to avoid slow navigation with some specific mouses // This seems to always appear on windows - if(qApp->hasPendingEvents()) - return; + if( qApp->hasPendingEvents()) + return; #endif QPoint actualPos = windowToView( event->pos() ); QRect updateRect; - emit positionChanged( actualPos , m_pcCurrFrame ); + emit positionChanged( actualPos, m_pcCurrFrame ); // If mouse left button pressed if( event->buttons() == Qt::LeftButton && m_lastPos != QPoint( -1, -1 ) ) @@ -636,7 +635,7 @@ void ViewArea::mouseMoveEvent( QMouseEvent *event ) if( tool() == NavigationTool ) { - QPoint offset = m_lastWindowPos - event->pos() ; + QPoint offset = m_lastWindowPos - event->pos(); emit moveScroll( offset ); } @@ -686,19 +685,19 @@ void ViewArea::mouseMoveEvent( QMouseEvent *event ) } } } -/* else // if tool() == BlockSelectionTool || MaskTool || EraserTool - { - m_blockTrackEnable = false; - // If cursor is inside the selected area, we most redraw - // the selection rect because it may be smaller. - if( m_selectedArea.contains( actualPos ) ) - { - m_selectedArea = m_grid.rectContains( m_lastPos ); - } + /* else // if tool() == BlockSelectionTool || MaskTool || EraserTool + { + m_blockTrackEnable = false; + // If cursor is inside the selected area, we most redraw + // the selection rect because it may be smaller. + if( m_selectedArea.contains( actualPos ) ) + { + m_selectedArea = m_grid.rectContains( m_lastPos ); + } - m_selectedArea = m_selectedArea.united( m_grid.rectContains( actualPos ) ); - } -*/ + m_selectedArea = m_selectedArea.united( m_grid.rectContains( actualPos ) ); + } + */ if( tool() == NormalSelectionTool ) { // Intercept the selected area with the image area to limit the @@ -751,89 +750,92 @@ void ViewArea::mouseReleaseEvent( QMouseEvent *event ) { if( tool() == NavigationTool ) { - unsetCursor(); + unsetCursor(); } - - // Normal Mode ------------------------------------------------------ - if( mode() == NormalMode ) + else if( tool() == NormalSelectionTool ) { - if( vpos == m_lastPos ) + // Normal Mode ------------------------------------------------------ + if( mode() == NormalMode ) { + if( vpos == m_lastPos ) + { + m_selectedArea = QRect(); + + if( tool() == BlockSelectionTool ) + m_blockTrackEnable = true; + } + emit selectionChanged( m_selectedArea ); + + } + + // Mask Mode ----------------------------------------------------------- + else if( mode() == MaskMode ) + { + if( !m_selectedArea.isNull() ) + { + updateMask( m_selectedArea ); + } + m_selectedArea = QRect(); - - if( tool() == BlockSelectionTool ) - m_blockTrackEnable = true; + m_blockTrackEnable = true; } - emit selectionChanged( m_selectedArea ); - + m_newShape = false; + update(); + m_lastPos = QPoint( -1, -1 ); } - - // Mask Mode ----------------------------------------------------------- - else if( mode() == MaskMode ) - { - if( !m_selectedArea.isNull() ) - { - updateMask( m_selectedArea ); - } - - m_selectedArea = QRect(); - m_blockTrackEnable = true; - } - m_newShape = false; - update(); - m_lastPos = QPoint( -1, -1 ); } } + //////////////////////////////////////////////////////////////////////////////// bool ViewArea::isPosValid( const QPoint &pos ) const { - if( pos.x() < 0 || pos.y() < 0 || pos.x() >= m_pixmap.width() || pos.y() >= m_pixmap.height() ) - return false; - else - return true; +if( pos.x() < 0 || pos.y() < 0 || pos.x() >= m_pixmap.width() || pos.y() >= m_pixmap.height() ) + return false; +else + return true; } //////////////////////////////////////////////////////////////////////////////// QPoint ViewArea::windowToView( const QPoint& pt ) const { - QPoint p; - p.setX( static_cast( ( pt.x() - m_xOffset ) / m_zoomFactor ) ); - p.setY( static_cast( ( pt.y() - m_yOffset ) / m_zoomFactor ) ); +QPoint p; +p.setX( static_cast( ( pt.x() - m_xOffset ) / m_zoomFactor ) ); +p.setY( static_cast( ( pt.y() - m_yOffset ) / m_zoomFactor ) ); - return p; +return p; } QRect ViewArea::windowToView( const QRect& rc ) const { - QRect r; +QRect r; - r.setTopLeft( windowToView( rc.topLeft() ) ); +r.setTopLeft( windowToView( rc.topLeft() ) ); // r.setRight ( (int)( ceil(( rc.right() - m_xOffset)/m_zoomFactor ))); // r.setBottom( (int)( ceil(( rc.bottom()- m_yOffset)/m_zoomFactor ))); // r.setRight ( static_cast(( rc.right() - m_xOffset ) / m_zoomFactor +1)); // r.setBottom( static_cast(( rc.bottom() - m_xOffset ) / m_zoomFactor+1)); - r.setBottomRight( windowToView( rc.bottomRight() ) ); - return r; +r.setBottomRight( windowToView( rc.bottomRight() ) ); +return r; } QPoint ViewArea::viewToWindow( const QPoint& pt ) const { - QPoint p; +QPoint p; - p.setX( static_cast( pt.x() * m_zoomFactor + m_xOffset ) ); - p.setY( static_cast( pt.y() * m_zoomFactor + m_yOffset ) ); +p.setX( static_cast( pt.x() * m_zoomFactor + m_xOffset ) ); +p.setY( static_cast( pt.y() * m_zoomFactor + m_yOffset ) ); - return p; +return p; } QRect ViewArea::viewToWindow( const QRect& rc ) const { - QRect r; +QRect r; - r.setTopLeft( viewToWindow( rc.topLeft() ) ); +r.setTopLeft( viewToWindow( rc.topLeft() ) ); // r.setRight ( (int)( ceil(( rc.right() +1+m_xOffset )*m_zoomFactor ) - 1 )); // r.setBottom( (int)( ceil(( rc.bottom()+1+m_yOffset )*m_zoomFactor ) - 1 )); // r.setRight ( (int)( ceil(( rc.right()+0.5)*m_zoomFactor )+ m_xOffset )-1); @@ -841,9 +843,9 @@ QRect ViewArea::viewToWindow( const QRect& rc ) const // qDebug()<<"Right = "<< r.right(); // r.setRight ( static_cast(( rc.right()+1) * m_zoomFactor + m_xOffset -1) ); // r.setBottom( static_cast(( rc.bottom()+1) * m_zoomFactor + m_yOffset -1)); - r.setBottomRight( viewToWindow( rc.bottomRight() ) ); +r.setBottomRight( viewToWindow( rc.bottomRight() ) ); - return r; +return r; } //////////////////////////////////////////////////////////////////////////////// @@ -851,42 +853,41 @@ QRect ViewArea::viewToWindow( const QRect& rc ) const //////////////////////////////////////////////////////////////////////////////// void ViewArea::updateMask( const QRect &rect ) { - switch( tool() ) - { - case MaskTool: - { - // Add rect to the mask - QPainter painter( &m_mask ); - painter.setBrush( Qt::color1 ); - painter.setPen( Qt::NoPen ); - painter.drawRect( rect ); - painter.end(); - break; - } - case EraserTool: - { - // Clears rect area in the mask - QPainter painter( &m_mask ); - painter.setBrush( Qt::color0 ); - painter.setPen( Qt::NoPen ); - painter.drawRect( rect ); - painter.end(); - break; - } - default: /* Do Nothing */ - ; - } +switch( tool() ) +{ +case MaskTool: +{ + // Add rect to the mask + QPainter painter( &m_mask ); + painter.setBrush( Qt::color1 ); + painter.setPen( Qt::NoPen ); + painter.drawRect( rect ); + painter.end(); + break; +} +case EraserTool: +{ + // Clears rect area in the mask + QPainter painter( &m_mask ); + painter.setBrush( Qt::color0 ); + painter.setPen( Qt::NoPen ); + painter.drawRect( rect ); + painter.end(); + break; +} +default: /* Do Nothing */ + ; +} } - void ViewArea::setInputStream( PlaYUVerStream *stream ) { - m_pStream = stream; +m_pStream = stream; } PlaYUVerStream* ViewArea::getInputStream() { - return m_pStream; +return m_pStream; } -} // NameSpace plaYUVer +} // NameSpace plaYUVer diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index 476451b..5030d9e 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -809,6 +809,8 @@ Void plaYUVerApp::chageSubWindowSelection() } updateStreamProperties(); updateFrameProperties(); + m_pcQualityMeasurement->updateCurrentWindow( m_pcCurrentSubWindow ); + m_pcQualityMeasurement->updateSubWindowList(); updateMenus(); } @@ -1311,21 +1313,31 @@ Void plaYUVerApp::createToolBars() Void plaYUVerApp::createDockWidgets() { // Properties Dock Window - m_arraySideBars.resize( TOTAL_SIDEBAR ); + m_arraySideBars.resize( TOTAL_DOCK ); m_pcStreamProperties = new StreamPropertiesSideBar( this ); - m_arraySideBars[STREAM_SIDEBAR] = new QDockWidget( tr( "Stream Information" ), this ); - m_arraySideBars[STREAM_SIDEBAR]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - m_arraySideBars[STREAM_SIDEBAR]->setWidget( m_pcStreamProperties ); - addDockWidget( Qt::RightDockWidgetArea, m_arraySideBars[STREAM_SIDEBAR] ); - connect( m_arraySideBars[STREAM_SIDEBAR], SIGNAL( visibilityChanged(bool) ), this, SLOT( updateProperties() ) ); + m_arraySideBars[STREAM_DOCK] = new QDockWidget( tr( "Stream Information" ), this ); + m_arraySideBars[STREAM_DOCK]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); + m_arraySideBars[STREAM_DOCK]->setWidget( m_pcStreamProperties ); + addDockWidget( Qt::RightDockWidgetArea, m_arraySideBars[STREAM_DOCK] ); + connect( m_arraySideBars[STREAM_DOCK], SIGNAL( visibilityChanged(bool) ), this, SLOT( updateProperties() ) ); m_pcFrameProperties = new FramePropertiesSideBar( this, &m_bIsPlaying ); - m_arraySideBars[FRAME_SIDEBAR] = new QDockWidget( tr( "Frame Information" ), this ); - m_arraySideBars[FRAME_SIDEBAR]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - m_arraySideBars[FRAME_SIDEBAR]->setWidget( m_pcFrameProperties ); - addDockWidget( Qt::RightDockWidgetArea, m_arraySideBars[FRAME_SIDEBAR] ); - connect( m_arraySideBars[FRAME_SIDEBAR], SIGNAL( visibilityChanged(bool) ), this, SLOT( updateProperties() ) ); + m_arraySideBars[FRAME_DOCK] = new QDockWidget( tr( "Frame Information" ), this ); + m_arraySideBars[FRAME_DOCK]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); + m_arraySideBars[FRAME_DOCK]->setWidget( m_pcFrameProperties ); + addDockWidget( Qt::RightDockWidgetArea, m_arraySideBars[FRAME_DOCK] ); + connect( m_arraySideBars[FRAME_DOCK], SIGNAL( visibilityChanged(bool) ), this, SLOT( updateProperties() ) ); + + QMainWindow::tabifyDockWidget( m_arraySideBars[FRAME_DOCK], m_arraySideBars[STREAM_DOCK] ); + //QMainWindow::setTabPosition(Qt::RightDockWidgetArea, QTabWidget::North); + + m_pcQualityMeasurement = new QualityMeasurementSidebar( this, mdiArea ); + m_arraySideBars[QUALITY_DOCK] = new QDockWidget( tr( "Quality Measurement" ), this ); + m_arraySideBars[QUALITY_DOCK]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); + m_arraySideBars[QUALITY_DOCK]->setWidget( m_pcQualityMeasurement ); + addDockWidget( Qt::RightDockWidgetArea, m_arraySideBars[QUALITY_DOCK] ); + } Void plaYUVerApp::createStatusBar() @@ -1348,9 +1360,9 @@ Void plaYUVerApp::readSettings() Bool visibleStreamProp, visibleFrameProp; settings.getDockVisibility( visibleStreamProp, visibleFrameProp ); if( !visibleStreamProp ) - m_arraySideBars[STREAM_SIDEBAR]->close(); + m_arraySideBars[STREAM_DOCK]->close(); if( !visibleFrameProp ) - m_arraySideBars[FRAME_SIDEBAR]->close(); + m_arraySideBars[FRAME_DOCK]->close(); } diff --git a/source/app/plaYUVerApp.h b/source/app/plaYUVerApp.h index a347cb9..7474e79 100644 --- a/source/app/plaYUVerApp.h +++ b/source/app/plaYUVerApp.h @@ -35,6 +35,7 @@ #include #include "ModulesHandle.h" #include "PropertiesSidebar.h" +#include "QualityMeasurementSidebar.h" namespace plaYUVer { @@ -181,14 +182,16 @@ private: enum SIDEBAR_LIST { - STREAM_SIDEBAR = 0, - FRAME_SIDEBAR, - TOTAL_SIDEBAR, + STREAM_DOCK = 0, + FRAME_DOCK, + QUALITY_DOCK, + TOTAL_DOCK, }; QVector m_arraySideBars; StreamPropertiesSideBar* m_pcStreamProperties; FramePropertiesSideBar* m_pcFrameProperties; + QualityMeasurementSidebar* m_pcQualityMeasurement; enum TOOLBAR_LIST {