Skip to content
  • Vlad Zahorodnii's avatar
    [libkwineffects] Add TimeLine helper · ee88951b
    Vlad Zahorodnii authored
    Summary:
    Most effects use QTimeLine in the following manner
    
    ```lang=cpp
    if (...) {
        m_timeline->setCurrentTime(m_timeline->currentTime() + time);
    } else {
        m_timeline->setCurrentTime(m_timeline->currentTime() - time);
    }
    ```
    
    Because effects do not rely on a timer that QTimeLine has, they can't
    toggle direction of the QTimeLine, which makes somewhat harder to write
    effects. In some cases that's obvious what condition to use to figure
    out whether to add or subtract `time`, but there are cases when it's
    not. In addition to that, setCurrentTime allows to have negative
    currentTime, which in some cases causes bugs.
    
    And overall, the way effects use QTimeLine is really hack-ish. It makes
    more sense just to use an integer accumulator(like the Fall Apart
    effect is doing) than to use QTimeLine.
    
    Another problem with QTimeLine is that it's a QObject and some effects
    do
    
    ```lang=cpp
    class WindowInfo
    {
    public:
        ~WindowInfo();
    
        QTimeLine *timeLine;
    };
    
    WindowInfo::~WindowInfo()
    {
        delete timeLine;
    }
    
    // ...
    
    QHash<EffectWindow*, WindowInfo> m_windows;
    ```
    
    which is unsafe.
    
    This change adds the TimeLine class. The TimeLine class is a timeline
    helper that designed specifically for needs of effects.
    
    Demo
    
    ```lang=cpp
    TimeLine timeLine(1000, TimeLine::Forward);
    timeLine.setEasingCurve(QEasingCurve::Linear);
    
    timeLine.value(); // 0.0
    timeLine.running(); // false
    timeLine.done(); // false
    
    timeLine.update(420);
    timeLine.value(); // 0.42
    timeLine.running(); // true
    timeLine.done(); // false
    
    timeLine.toggleDirection();
    timeLine.value(); // 0.42
    timeLine.running(); // true
    timeLine.done(); // false
    
    timeLine.update(100);
    timeLine.value(); // 0.32
    timeLine.running(); // true
    timeLine.done(); // false
    
    timeLine.update(1000);
    timeLine.value(); // 0.0
    timeLine.running(); // false
    timeLine.done(); // true
    ```
    
    Test Plan: Ran tests.
    
    Reviewers: #kwin, davidedmundson, graesslin
    
    Reviewed By: #kwin, davidedmundson, graesslin
    
    Subscribers: romangg, graesslin, anthonyfieroni, davidedmundson, kwin
    
    Tags: #kwin
    
    Differential Revision: https://phabricator.kde.org/D13740
    ee88951b