VirtualBox

Changeset 79414 in vbox


Ignore:
Timestamp:
Jun 28, 2019 1:44:34 PM (6 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9241: Graphics Scroll Bar: Implementing delayed scrolling support.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.cpp

    r79389 r79414  
    2727#include <QStyle>
    2828#include <QStyleOptionGraphicsItem>
     29#include <QTimer>
    2930#include <QTimerEvent>
    3031
     
    3334#include "UIGraphicsScrollBar.h"
    3435#include "UIIconPool.h"
     36
     37
     38/** Small functor for QTimer::singleShot worker to perform delayed scrolling. */
     39class ScrollFunctor
     40{
     41public:
     42
     43    /** Performs delayed scrolling of specified @a pScrollBar to certain @a pos. */
     44    ScrollFunctor(UIGraphicsScrollBar *pScrollBar, const QPointF &pos)
     45        : m_pScrollBar(pScrollBar)
     46        , m_pos(pos)
     47    {}
     48
     49    /** Contains functor's body. */
     50    void operator()()
     51    {
     52        m_pScrollBar->scrollTo(m_pos, 100);
     53    }
     54
     55private:
     56
     57    /** Holds the scroll-bar reference to scroll. */
     58    UIGraphicsScrollBar *m_pScrollBar;
     59    /** Holds the position to scroll to. */
     60    QPointF              m_pos;
     61};
    3562
    3663
     
    218245    , m_iHoverOffTimerId(0)
    219246    , m_iHoveringValue(0)
     247    , m_fScrollInProgress(false)
    220248#ifdef VBOX_WS_MAC
    221249    , m_fRevealed(false)
     
    243271    , m_iHoverOffTimerId(0)
    244272    , m_iHoveringValue(0)
     273    , m_fScrollInProgress(false)
    245274#ifdef VBOX_WS_MAC
    246275    , m_fRevealed(false)
     
    269298{
    270299    return 2 * QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
     300}
     301
     302int UIGraphicsScrollBar::pageStep() const
     303{
     304    return 3 * step();
    271305}
    272306
     
    323357}
    324358
     359void UIGraphicsScrollBar::scrollTo(const QPointF &desiredPos, int iDelay /* = 500 */)
     360{
     361    /* Prepare current, desired and intermediate positions: */
     362    const QPointF currentPos = actualTokenPosition();
     363    const int iCurrentY = currentPos.y();
     364    const int iCurrentX = currentPos.x();
     365    const int iDesiredY = desiredPos.y();
     366    const int iDesiredX = desiredPos.x();
     367    QPointF intermediatePos;
     368
     369    /* Calculate intermediate position depending on orientation: */
     370    switch (m_enmOrientation)
     371    {
     372        case Qt::Horizontal:
     373        {
     374            if (iCurrentX < iDesiredX)
     375            {
     376                intermediatePos.setY(desiredPos.y());
     377                intermediatePos.setX(iCurrentX + pageStep() < iDesiredX ? iCurrentX + pageStep() : iDesiredX);
     378            }
     379            else if (iCurrentX > iDesiredX)
     380            {
     381                intermediatePos.setY(desiredPos.y());
     382                intermediatePos.setX(iCurrentX - pageStep() > iDesiredX ? iCurrentX - pageStep() : iDesiredX);
     383            }
     384            break;
     385        }
     386        case Qt::Vertical:
     387        {
     388            if (iCurrentY < iDesiredY)
     389            {
     390                intermediatePos.setX(desiredPos.x());
     391                intermediatePos.setY(iCurrentY + pageStep() < iDesiredY ? iCurrentY + pageStep() : iDesiredY);
     392            }
     393            else if (iCurrentY > iDesiredY)
     394            {
     395                intermediatePos.setX(desiredPos.x());
     396                intermediatePos.setY(iCurrentY - pageStep() > iDesiredY ? iCurrentY - pageStep() : iDesiredY);
     397            }
     398            break;
     399        }
     400    }
     401
     402    /* Move token to intermediate position: */
     403    if (!intermediatePos.isNull())
     404        sltTokenMoved(intermediatePos);
     405
     406    /* Continue, if we haven't reached required position: */
     407    if ((intermediatePos != desiredPos) && m_fScrollInProgress)
     408        QTimer::singleShot(iDelay, ScrollFunctor(this, desiredPos));
     409}
     410
    325411void UIGraphicsScrollBar::resizeEvent(QGraphicsSceneResizeEvent *pEvent)
    326412{
     
    349435    pEvent->accept();
    350436
    351     /* Redirect to token move handler: */
    352     sltTokenMoved(pEvent->pos());
     437    /* Start scrolling sequence: */
     438    m_fScrollInProgress = true;
     439    scrollTo(pEvent->pos());
     440}
     441
     442void UIGraphicsScrollBar::mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent)
     443{
     444    /* Call to base-class: */
     445    QIGraphicsWidget::mousePressEvent(pEvent);
     446
     447    /* Mark event accepted so that it couldn't
     448     * influence underlying widgets: */
     449    pEvent->accept();
     450
     451    /* Stop scrolling if any: */
     452    m_fScrollInProgress = false;
    353453}
    354454
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.h

    r79389 r79414  
    6969    /** Returns scrolling step. */
    7070    int step() const;
     71    /** Returns page scrolling step. */
     72    int pageStep() const;
    7173
    7274    /** Defines @a iMinimum scroll-bar value. */
     
    8587    int value() const;
    8688
     89    /** Performs scrolling to certain @a desiredPos with certain @a iDelay. */
     90    void scrollTo(const QPointF &desiredPos, int iDelay = 500);
     91
    8792protected:
    8893
     
    95100    /** Handles mouse-press @a pEvent. */
    96101    virtual void mousePressEvent(QGraphicsSceneMouseEvent *pEvent) /* override */;
     102    /** Handles mouse-release @a pEvent. */
     103    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *pEvent) /* override */;
    97104
    98105    /** Handles hover enter @a pEvent. */
     
    207214    int   m_iHoveringValue;
    208215
     216    /** Holds whether we are scrolling. */
     217    bool  m_fScrollInProgress;
     218
    209219#ifdef VBOX_WS_MAC
    210220    /** Holds whether token is revealed. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette