VirtualBox

Ignore:
Timestamp:
Feb 12, 2019 6:56:16 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128807
Message:

FE/Qt: bugref:9373: macOS: More native UIGraphicsScrollBar behavior (s.a. r128788).

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

    r77285 r77290  
    219219    , m_iHoverOffTimerId(0)
    220220    , m_iHoveringValue(0)
     221#ifdef VBOX_WS_MAC
     222    , m_fRevealed(false)
     223    , m_iRevealingValue(0)
     224    , m_iRevealOnTimerId(0)
     225    , m_iRevealOffTimerId(0)
     226#endif
    221227{
    222228    pScene->addItem(this);
     
    239245    , m_iHoverOffTimerId(0)
    240246    , m_iHoveringValue(0)
     247#ifdef VBOX_WS_MAC
     248    , m_fRevealed(false)
     249    , m_iRevealingValue(0)
     250    , m_iRevealOnTimerId(0)
     251    , m_iRevealOffTimerId(0)
     252#endif
    241253{
    242254    prepare();
     
    407419        update();
    408420    }
     421
     422#ifdef VBOX_WS_MAC
     423
     424    else
     425
     426    /* If that is reveal-in timer: */
     427    if (m_iRevealOnTimerId != 0 && iTimerId == m_iRevealOnTimerId)
     428    {
     429        /* Wait for timer no more: */
     430        m_iRevealOnTimerId = 0;
     431    }
     432
     433    else
     434
     435    /* If that is reveal-out timer: */
     436    if (m_iRevealOffTimerId != 0 && iTimerId == m_iRevealOffTimerId)
     437    {
     438        /* Wait for timer no more: */
     439        m_iRevealOffTimerId = 0;
     440        /* Emit reveal-out signal if not hovered or was reinvoked not long time ago: */
     441        if (!m_fHovered && !m_pToken->isHovered() && m_iRevealOnTimerId == 0)
     442            emit sigRevealLeave();
     443        /* Restart timer otherwise: */
     444        else
     445            m_iRevealOffTimerId = startTimer(2000);
     446        /* Update in any case: */
     447        update();
     448    }
     449
     450#endif
    409451}
    410452
     
    506548        m_pToken->show();
    507549}
     550
     551#ifdef VBOX_WS_MAC
     552void UIGraphicsScrollBar::sltHandleRevealingStart()
     553{
     554    /* Only if not yet revealed, that way we
     555     * make sure trigger emitted just once: */
     556    if (!m_fRevealed)
     557    {
     558        /* Mark token revealed: */
     559        m_fRevealed = true;
     560        /* Emit reveal signal immediately: */
     561        emit sigRevealEnter();
     562    }
     563
     564    /* Restart fresh sustain timer: */
     565    m_iRevealOnTimerId = startTimer(1000);
     566}
     567
     568void UIGraphicsScrollBar::sltStateEnteredFaded()
     569{
     570    /* Mark token faded: */
     571    m_fRevealed = false;
     572}
     573
     574void UIGraphicsScrollBar::sltStateEnteredRevealed()
     575{
     576    /* Start reveal-out timer: */
     577    m_iRevealOffTimerId = startTimer(2000);
     578}
     579#endif /* VBOX_WS_MAC */
    508580
    509581void UIGraphicsScrollBar::prepare()
     
    580652{
    581653    prepareHoveringAnimation();
     654#ifdef VBOX_WS_MAC
     655    prepareRevealingAnimation();
     656#endif
    582657}
    583658
     
    653728    }
    654729}
     730
     731#ifdef VBOX_WS_MAC
     732void UIGraphicsScrollBar::prepareRevealingAnimation()
     733{
     734    /* Create revealing animation machine: */
     735    QStateMachine *pRevealingMachine = new QStateMachine(this);
     736    if (pRevealingMachine)
     737    {
     738        /* Create 'faded' state: */
     739        QState *pStateFaded = new QState(pRevealingMachine);
     740        /* Create 'revealed' state: */
     741        QState *pStateRevealed = new QState(pRevealingMachine);
     742
     743        /* Configure 'faded' state: */
     744        if (pStateFaded)
     745        {
     746            /* When we entering fade state => we assigning revealingValue to 0: */
     747            pStateFaded->assignProperty(this, "revealingValue", 0);
     748            connect(pStateFaded, &QState::propertiesAssigned, this, &UIGraphicsScrollBar::sltStateEnteredFaded);
     749
     750            /* Add state transitions: */
     751            QSignalTransition *pFadeToRevealed = pStateFaded->addTransition(this, SIGNAL(sigRevealEnter()), pStateRevealed);
     752            if (pFadeToRevealed)
     753            {
     754                /* Create forward animation: */
     755                QPropertyAnimation *pRevealingAnimationForward = new QPropertyAnimation(this, "revealingValue", this);
     756                if (pRevealingAnimationForward)
     757                {
     758                    pRevealingAnimationForward->setDuration(200);
     759                    pRevealingAnimationForward->setStartValue(0);
     760                    pRevealingAnimationForward->setEndValue(100);
     761
     762                    /* Add to transition: */
     763                    pFadeToRevealed->addAnimation(pRevealingAnimationForward);
     764                }
     765            }
     766        }
     767
     768        /* Configure 'revealed' state: */
     769        if (pStateRevealed)
     770        {
     771            /* When we entering revealed state => we assigning revealingValue to 100: */
     772            pStateRevealed->assignProperty(this, "revealingValue", 100);
     773            connect(pStateRevealed, &QState::propertiesAssigned, this, &UIGraphicsScrollBar::sltStateEnteredRevealed);
     774
     775            /* Add state transitions: */
     776            QSignalTransition *pRevealedToFaded = pStateRevealed->addTransition(this, SIGNAL(sigRevealLeave()), pStateFaded);
     777            if (pRevealedToFaded)
     778            {
     779                /* Create backward animation: */
     780                QPropertyAnimation *pRevealingAnimationBackward = new QPropertyAnimation(this, "revealingValue", this);
     781                if (pRevealingAnimationBackward)
     782                {
     783                    pRevealingAnimationBackward->setDuration(200);
     784                    pRevealingAnimationBackward->setStartValue(100);
     785                    pRevealingAnimationBackward->setEndValue(0);
     786
     787                    /* Add to transition: */
     788                    pRevealedToFaded->addAnimation(pRevealingAnimationBackward);
     789                }
     790            }
     791        }
     792
     793        /* Initial state is 'fade': */
     794        pRevealingMachine->setInitialState(pStateFaded);
     795        /* Start state-machine: */
     796        pRevealingMachine->start();
     797    }
     798
     799    /* Install self-listener: */
     800    connect(this, &UIGraphicsScrollBar::sigValueChanged, this, &UIGraphicsScrollBar::sltHandleRevealingStart);
     801}
     802#endif /* VBOX_WS_MAC */
    655803
    656804void UIGraphicsScrollBar::updateExtent()
     
    770918    {
    771919        QColor tokenColor = pal.color(QPalette::Active, QPalette::Mid);
     920        tokenColor.setAlpha(255 * ((double)m_iRevealingValue / 100));
    772921        tokenColor = tokenColor.darker(140);
    773922        QRectF tokenRectangle = QRect(actualTokenPosition(), QSize(m_iExtent, 2 * m_iExtent));
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsScrollBar.h

    r77285 r77290  
    3535    Q_OBJECT;
    3636    Q_PROPERTY(int hoveringValue READ hoveringValue WRITE setHoveringValue);
     37#ifdef VBOX_WS_MAC
     38    Q_PROPERTY(int revealingValue READ revealingValue WRITE setRevealingValue);
     39#endif
    3740
    3841signals:
     
    4245    /** Notifies listeners about hover leave. */
    4346    void sigHoverLeave();
     47
     48#ifdef VBOX_WS_MAC
     49    /** Notifies listeners about token should be revealed. */
     50    void sigRevealEnter();
     51    /** Notifies listeners about token should be faded. */
     52    void sigRevealLeave();
     53#endif
    4454
    4555    /** Notifies listeners about @a iValue has changed. */
     
    114124    /** Handles hovered state entering. */
    115125    void sltStateEnteredHovered();
     126
     127#ifdef VBOX_WS_MAC
     128    /** Handles signals to start revealing. */
     129    void sltHandleRevealingStart();
     130    /** Handles faded state entering. */
     131    void sltStateEnteredFaded();
     132    /** Handles revealed state entering. */
     133    void sltStateEnteredRevealed();
     134#endif
    116135
    117136private:
     
    129148    /** Prepares hovering animation. */
    130149    void prepareHoveringAnimation();
     150#ifdef VBOX_WS_MAC
     151    /** Prepares revealing animation. */
     152    void prepareRevealingAnimation();
     153#endif
    131154
    132155    /** Updates scroll-bar extent value. */
     
    150173    int hoveringValue() const { return m_iHoveringValue; }
    151174
     175#ifdef VBOX_WS_MAC
     176    /** Defines revealing animation @a iValue. */
     177    void setRevealingValue(int iValue) { m_iRevealingValue = iValue; update(); }
     178    /** Returns revealing animation value. */
     179    int revealingValue() const { return m_iRevealingValue; }
     180#endif
     181
    152182    /** Holds the orientation. */
    153183    const Qt::Orientation  m_enmOrientation;
     
    181211    /** Holds the hovering animation value. */
    182212    int   m_iHoveringValue;
     213
     214#ifdef VBOX_WS_MAC
     215    /** Holds whether token is revealed. */
     216    bool  m_fRevealed;
     217    /** Holds the revealing animation value. */
     218    int   m_iRevealingValue;
     219    /** Holds the reveal-out timer id. */
     220    int   m_iRevealOnTimerId;
     221    /** Holds the reveal-out timer id. */
     222    int   m_iRevealOffTimerId;
     223#endif
    183224};
    184225
Note: See TracChangeset for help on using the changeset viewer.

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