[vlc-devel] [PATCH] Qt: Seek/SoundSlider: handle hijacked released mouse state (fix #8583)

Jean-Baptiste Kempf jb at videolan.org
Sun May 19 11:04:35 CEST 2013


I'm not such a fan of this approach, but if it works, go for it.

On 18 May, Francois Cartegnie wrote :
> ---
>  modules/gui/qt4/util/input_slider.cpp | 49 +++++++++++++++++++++++++----------
>  modules/gui/qt4/util/input_slider.hpp |  3 +++
>  2 files changed, 39 insertions(+), 13 deletions(-)
> 
> diff --git a/modules/gui/qt4/util/input_slider.cpp b/modules/gui/qt4/util/input_slider.cpp
> index 9ea5efe..3a92a78 100644
> --- a/modules/gui/qt4/util/input_slider.cpp
> +++ b/modules/gui/qt4/util/input_slider.cpp
> @@ -199,9 +199,9 @@ void SeekSlider::updateBuffering( float f_buffering_ )
>      repaint();
>  }
>  
> -void SeekSlider::mouseReleaseEvent( QMouseEvent *event )
> +void SeekSlider::processReleasedButton()
>  {
> -    event->accept();
> +    if ( !isSliding && !isJumping ) return;
>      isSliding = false;
>      bool b_seekPending = seekLimitTimer->isActive();
>      seekLimitTimer->stop(); /* We're not sliding anymore: only last seek on release */
> @@ -210,11 +210,21 @@ void SeekSlider::mouseReleaseEvent( QMouseEvent *event )
>          isJumping = false;
>          return;
>      }
> -    QSlider::mouseReleaseEvent( event );
>      if( b_seekPending && isEnabled() )
>          updatePos();
>  }
>  
> +void SeekSlider::mouseReleaseEvent( QMouseEvent *event )
> +{
> +    if ( event->button() != Qt::LeftButton && event->button() != Qt::MidButton )
> +    {
> +        QSlider::mouseReleaseEvent( event );
> +        return;
> +    }
> +    event->accept();
> +    processReleasedButton();
> +}
> +
>  void SeekSlider::mousePressEvent( QMouseEvent* event )
>  {
>      /* Right-click */
> @@ -273,6 +283,12 @@ void SeekSlider::mousePressEvent( QMouseEvent* event )
>  
>  void SeekSlider::mouseMoveEvent( QMouseEvent *event )
>  {
> +    if ( ! ( event->buttons() & ( Qt::LeftButton | Qt::MidButton ) ) )
> +    {
> +        /* Handle button release when mouserelease has been hijacked by popup */
> +        processReleasedButton();
> +    }
> +
>      if ( !isEnabled() ) return event->accept();
>  
>      if( isSliding )
> @@ -546,23 +562,30 @@ void SoundSlider::mousePressEvent( QMouseEvent *event )
>      }
>  }
>  
> -void SoundSlider::mouseReleaseEvent( QMouseEvent *event )
> +void SoundSlider::processReleasedButton()
>  {
> -    if( event->button() != Qt::RightButton )
> +    if( !b_mouseOutside && value() != i_oldvalue )
>      {
> -        if( !b_mouseOutside && value() != i_oldvalue )
> -        {
> -            emit sliderReleased();
> -            setValue( value() );
> -            emit sliderMoved( value() );
> -        }
> -        isSliding = false;
> -        b_mouseOutside = false;
> +        emit sliderReleased();
> +        setValue( value() );
> +        emit sliderMoved( value() );
>      }
> +    isSliding = false;
> +    b_mouseOutside = false;
> +}
> +
> +void SoundSlider::mouseReleaseEvent( QMouseEvent *event )
> +{
> +    if( event->button() != Qt::RightButton )
> +        processReleasedButton();
>  }
>  
>  void SoundSlider::mouseMoveEvent( QMouseEvent *event )
>  {
> +    /* handle mouserelease hijacking */
> +    if ( isSliding && ( event->buttons() & ~Qt::RightButton ) == Qt::NoButton )
> +        processReleasedButton();
> +
>      if( isSliding )
>      {
>          QRect rect( paddingL - 15,    -1,
> diff --git a/modules/gui/qt4/util/input_slider.hpp b/modules/gui/qt4/util/input_slider.hpp
> index 91986dd..00b7b19 100644
> --- a/modules/gui/qt4/util/input_slider.hpp
> +++ b/modules/gui/qt4/util/input_slider.hpp
> @@ -71,6 +71,7 @@ protected:
>  
>      virtual QSize sizeHint() const;
>  
> +    void processReleasedButton();
>      bool isAnimationRunning() const;
>      qreal handleOpacity() const;
>      void setHandleOpacity( qreal opacity );
> @@ -143,6 +144,8 @@ protected:
>      virtual void mouseMoveEvent( QMouseEvent * );
>      virtual void mouseReleaseEvent( QMouseEvent * );
>  
> +    void processReleasedButton();
> +
>  private:
>      bool isSliding; /* Whether we are currently sliding by user action */
>      bool b_mouseOutside; /* Whether the mouse is outside or inside the Widget */
> -- 
> 1.8.1.4
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel

-- 
Best regards,

-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device



More information about the vlc-devel mailing list