Public Member Functions | Public Attributes

QxtFlowViewAnimator Class Reference

#include <qxtflowview_p.h>

Collaboration diagram for QxtFlowViewAnimator:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 QxtFlowViewAnimator ()
void start (int slide)
void stop (int slide)
void update ()

Public Attributes

QxtFlowViewStatestate
int target
int step
int frame
QTimer animateTimer

Detailed Description

Definition at line 180 of file qxtflowview_p.h.


Constructor & Destructor Documentation

QxtFlowViewAnimator::QxtFlowViewAnimator (  )

Definition at line 123 of file qxtflowview_p.cpp.

                                        :
        state(0), target(0), step(0), frame(0)
{
}

Member Function Documentation

void QxtFlowViewAnimator::start ( int  slide )
void QxtFlowViewAnimator::stop ( int  slide )

Definition at line 138 of file qxtflowview_p.cpp.

References animateTimer, frame, step, and target.

Referenced by QxtFlowViewPrivate::setCurrentIndex(), and update().

{
    step = 0;
    target = slide;
    frame = slide << 16;
    animateTimer.stop();
}
void QxtFlowViewAnimator::update (  )

Definition at line 146 of file qxtflowview_p.cpp.

References QxtFlowViewState::angle, SlideInfo::angle, animateTimer, QxtFlowViewState::centerIndex, QxtFlowViewState::centerSlide, SlideInfo::cx, SlideInfo::cy, fmul(), frame, fsin(), IANGLE_MAX, int(), QxtFlowViewState::leftSlides, QuadProgPP::max(), QxtFlowViewState::offsetX, QxtFlowViewState::offsetY, PFREAL_ONE, QxtFlowViewState::reset(), QxtFlowViewState::rightSlides, SlideInfo::slideIndex, QxtFlowViewState::spacing, state, step, stop(), and target.

{
    if (!animateTimer.isActive())
        return;
    if (step == 0)
        return;
    if (!state)
        return;

    int speed = 16384 / 4;

#if 1
    // deaccelerate when approaching the target
    const int max = 2 * 65536;

    int fi = frame;
    fi -= (target << 16);
    if (fi < 0)
        fi = -fi;
    fi = qMin(fi, max);

    int ia = IANGLE_MAX * (fi - max / 2) / (max * 2);
    speed = 512 + 16384 * (PFREAL_ONE + fsin(ia)) / PFREAL_ONE;
#endif

    frame += speed * step;

    int index = frame >> 16;
    int pos = frame & 0xffff;
    int neg = 65536 - pos;
    int tick = (step < 0) ? neg : pos;
    PFreal ftick = (tick * PFREAL_ONE) >> 16;

    if (step < 0)
        index++;

    if (state->centerIndex != index)
    {
        state->centerIndex = index;
        frame = index << 16;
        state->centerSlide.slideIndex = state->centerIndex;
        for (int i = 0; i < (int)state->leftSlides.count(); i++)
            state->leftSlides[i].slideIndex = state->centerIndex - 1 - i;
        for (int i = 0; i < (int)state->rightSlides.count(); i++)
            state->rightSlides[i].slideIndex = state->centerIndex + 1 + i;
    }

    state->centerSlide.angle = (step * tick * state->angle) >> 16;
    state->centerSlide.cx = -step * fmul(state->offsetX, ftick);
    state->centerSlide.cy = fmul(state->offsetY, ftick);

    if (state->centerIndex == target)
    {
        stop(target);
        state->reset();
        return;
    }

    for (int i = 0; i < (int)state->leftSlides.count(); i++)
    {
        SlideInfo& si = state->leftSlides[i];
        si.angle = state->angle;
        si.cx = -(state->offsetX + state->spacing * i * PFREAL_ONE + step * state->spacing * ftick);
        si.cy = state->offsetY;
    }

    for (int i = 0; i < (int)state->rightSlides.count(); i++)
    {
        SlideInfo& si = state->rightSlides[i];
        si.angle = -state->angle;
        si.cx = state->offsetX + state->spacing * i * PFREAL_ONE - step * state->spacing * ftick;
        si.cy = state->offsetY;
    }

    if (step > 0)
    {
        PFreal ftick = (neg * PFREAL_ONE) >> 16;
        state->rightSlides[0].angle = -(neg * state->angle) >> 16;
        state->rightSlides[0].cx = fmul(state->offsetX, ftick);
        state->rightSlides[0].cy = fmul(state->offsetY, ftick);
    }
    else
    {
        PFreal ftick = (pos * PFREAL_ONE) >> 16;
        state->leftSlides[0].angle = (pos * state->angle) >> 16;
        state->leftSlides[0].cx = -fmul(state->offsetX, ftick);
        state->leftSlides[0].cy = fmul(state->offsetY, ftick);
    }

    // must change direction ?
    if (target < index) if (step > 0)
            step = -1;
    if (target > index) if (step < 0)
            step = 1;

    // the first and last slide must fade in/fade out
    int nleft = state->leftSlides.count();
    int nright = state->rightSlides.count();
    int fade = pos / 256;

    for (int index = 0; index < nleft; index++)
    {
        int blend = 256;
        if (index == nleft - 1)
            blend = (step > 0) ? 0 : 128 - fade / 2;
        if (index == nleft - 2)
            blend = (step > 0) ? 128 - fade / 2 : 256 - fade / 2;
        if (index == nleft - 3)
            blend = (step > 0) ? 256 - fade / 2 : 256;
        state->leftSlides[index].blend = blend;
    }
    for (int index = 0; index < nright; index++)
    {
        int blend = (index < nright - 2) ? 256 : 128;
        if (index == nright - 1)
            blend = (step > 0) ? fade / 2 : 0;
        if (index == nright - 2)
            blend = (step > 0) ? 128 + fade / 2 : fade / 2;
        if (index == nright - 3)
            blend = (step > 0) ? 256 : 128 + fade / 2;
        state->rightSlides[index].blend = blend;
    }

}

Member Data Documentation

Definition at line 193 of file qxtflowview_p.h.

Referenced by QxtFlowView::QxtFlowView(), start(), stop(), and update().

Definition at line 192 of file qxtflowview_p.h.

Referenced by stop(), and update().

Definition at line 184 of file qxtflowview_p.h.

Referenced by QxtFlowView::QxtFlowView(), start(), and update().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines