~ubuntu-branches/ubuntu/oneiric/kdeplasma-addons/oneiric

« back to all changes in this revision

Viewing changes to applets/rssnow/scroller.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Thomas
  • Date: 2010-05-25 09:50:14 UTC
  • mfrom: (1.1.28 upstream)
  • Revision ID: james.westby@ubuntu.com-20100525095014-6mlrm9z9bkws0zkt
Tags: 4:4.4.80-0ubuntu1
* New upstream beta release:
  - Bump kde-sc-dev-latest build-dep version to 4.4.80
  - Refresh kubuntu_04_kimpanel_disable_scim.diff
  - Update various .install files
  - Drop liblancelot0a and liblancelot-dev packages; Upstream has broken ABI
    without an .so version bump, and after discussion with Debian it was
    decided it was not worth it to ship an unstable library.
  - Add liblancelot files to plasma-widget-lancelot, adding appropriate
    Replaces: entries
* Switch to source format 3.0 (quilt):
  - Bump debhelper build-depend version to 7.3.16 or greater

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
#include <QList>
33
33
#include <QStyleOptionGraphicsItem>
34
34
#include <QGraphicsSceneMouseEvent>
 
35
#include <QPropertyAnimation>
35
36
#include <plasma/widgets/iconwidget.h>
36
 
#include <plasma/animator.h>
37
37
#define BTN_SIZE 20
38
38
 
39
39
using namespace Plasma;
40
40
 
41
41
Scroller::Scroller(QGraphicsItem *parent) :
42
42
        QGraphicsWidget(parent),
43
 
        m_animid(0),
44
43
        m_current(0),
45
 
        m_animdirection(0),
46
44
        m_animations(true),
47
45
        m_delayedNext(0),
48
46
        m_delayedPrev(0),
52
50
        m_itemlist(new QList<SingleFeedItem *>()),
53
51
        m_activeitemlist(new QList<SingleFeedItem *>()),
54
52
        m_left(new Plasma::IconWidget(this)),
55
 
        m_right(new Plasma::IconWidget(this))
 
53
        m_right(new Plasma::IconWidget(this)),
 
54
        m_isAnimating(false)
56
55
{
57
56
 
58
57
    setAcceptedMouseButtons(Qt::LeftButton);
78
77
 
79
78
    connect(m_left, SIGNAL(clicked()), this, SLOT(leftClicked()));
80
79
    connect(m_right, SIGNAL(clicked()), this, SLOT(rightClicked()));
81
 
    connect(Animator::self(), SIGNAL(customAnimationFinished(int)),
82
 
                     this, SLOT(animationComplete(int)));
83
80
}
84
81
 
85
 
Scroller::~Scroller() {
86
 
    //avoid possible problems when shutting down while animations
87
 
    //are happening.
88
 
    if (m_animid != 0) {
89
 
        Animator::self()->stopCustomAnimation(m_animid);
90
 
    }
91
 
    foreach (KIcon * icon, m_feedIcons) {
92
 
           delete icon;
93
 
    }
 
82
Scroller::~Scroller()
 
83
{
 
84
    qDeleteAll(m_feedIcons);
94
85
    delete m_list;
95
86
    delete m_itemlist;
96
87
    delete m_activeitemlist;
127
118
        data.icon = m_feedIcons["generic"];
128
119
        m_list->append(data);
129
120
    }
 
121
 
130
122
    if (m_list->size() < 1) { //the item is fetching feeds atm
131
123
        FeedData data;
132
124
        data.title = i18n("Fetching feeds");
134
126
        data.icon = m_feedIcons["generic"];
135
127
        m_list->append(data);
136
128
    }
 
129
 
137
130
    if (m_current > (m_list->size() - 1) && m_list->size() > 0) {
138
131
        //feed has grown smaller, just display the first item.
139
132
        kDebug() << "feed has grown smaller";
140
133
        m_current = 0;
141
134
    }
 
135
 
142
136
    //TODO: it would be neat if the actual contents of the feeditems
143
137
    //was checked so after an update the same item is displayed.
144
138
    if (m_itemlist->size() < 1) {
161
155
 
162
156
void Scroller::movePrev()
163
157
{
164
 
    if (m_animid != 0 ) {
 
158
    if (m_isAnimating) {
165
159
        m_delayedPrev++;
166
160
    } else {
167
161
        if (m_current > 0) {
169
163
        } else {
170
164
            m_current = m_list->size() - 1;
171
165
        }
172
 
        m_animdirection = -1;
173
 
        doAnimation();
 
166
        doAnimation(QAbstractAnimation::Backward);
174
167
    }
175
168
}
176
169
 
177
170
void Scroller::moveNext()
178
171
{
179
 
    if (m_animid != 0 ) {
 
172
    if (m_isAnimating) {
180
173
        m_delayedNext++;
181
174
    } else {
182
175
        if (m_current < (m_list->size()-1)) {
184
177
        } else {
185
178
            m_current = 0;
186
179
        }
187
 
        m_animdirection = 1;
188
 
        doAnimation();
 
180
        doAnimation(QAbstractAnimation::Forward);
189
181
    }
190
182
}
191
183
 
192
 
void Scroller::doAnimation()
 
184
void Scroller::doAnimation(QAbstractAnimation::Direction direction)
193
185
{
194
186
    if (m_list->size() > 1) {
195
 
        if (m_animations && m_animid == 0) {
 
187
        if (m_animations && !m_isAnimating) {
196
188
            SingleFeedItem * item = new SingleFeedItem(this);
197
189
            item->setFeedData(m_list->at(m_current));
198
190
            item->setDisplayExtra(m_hovered);
199
191
            item->setZValue(m_itemlist->size() + 1);
200
192
            item->show();
201
 
            item->setPos(m_animdirection * size().width(), 0);
 
193
            item->setPos((direction == QAbstractAnimation::Forward? 1 : -1) * size().width(), 0);
202
194
            item->setRect(QRect(0, 0, size().width(), size().height()));
203
195
            if (!m_itemlist->contains(item)) {
204
196
                m_itemlist->append(item);
213
205
            }
214
206
            time = 400 / queuelength;
215
207
            frames = time / 40;
216
 
            m_animid = Animator::self()->customAnimation(frames, time,
217
 
                                            Animator::LinearCurve,
218
 
                                            this, "animate");
 
208
 
 
209
            QPropertyAnimation *animation = m_animation.data();
 
210
            if (!animation) {
 
211
                animation = new QPropertyAnimation(this, "animate");
 
212
                animation->setStartValue(0.0);
 
213
                animation->setEndValue(1.0);
 
214
                animation->setEasingCurve(QEasingCurve::InOutQuad);
 
215
                m_animation = animation;
 
216
                connect(animation, SIGNAL(finished()), this, SLOT(animationComplete()));
 
217
            } else if (animation->state() == QAbstractAnimation::Running) {
 
218
                animation->pause();
 
219
            }
 
220
 
 
221
            animation->setDuration(time);
 
222
            animation->setDirection(direction);
 
223
            if (m_delayedNext > 0 || m_delayedPrev > 0) {
 
224
                animation->start(QAbstractAnimation::KeepWhenStopped);
 
225
            } else {
 
226
                animation->start(QAbstractAnimation::DeleteWhenStopped);
 
227
            }
 
228
            m_isAnimating = true;
219
229
        } else {
220
230
            m_itemlist->at(m_itemlist->size() - 1)->setFeedData(m_list->at(m_current));
221
231
        }
222
232
    }
223
233
}
224
234
 
225
 
void Scroller::animationComplete(int id)
226
 
{
227
 
    bool stillAnimating = false;
228
 
    if (id == m_animid) {
229
 
        m_animid = 0;
230
 
        m_activeitemlist->takeFirst(); //remove the first item.
231
 
        if (m_delayedNext > 0) {
232
 
            m_delayedPrev = 0;
233
 
            m_delayedNext--;
234
 
            QTimer::singleShot(0, this, SLOT(moveNext()));
235
 
            stillAnimating = true;
236
 
        } else if (m_delayedPrev > 0) {
237
 
            m_delayedPrev--;
238
 
            QTimer::singleShot(0, this, SLOT(movePrev()));
239
 
            stillAnimating = true;
 
235
void Scroller::animationComplete()
 
236
{
 
237
    m_isAnimating = false;
 
238
 
 
239
    m_activeitemlist->takeFirst(); //remove the first item.
 
240
    if (m_delayedNext > 0) {
 
241
        m_delayedPrev = 0;
 
242
        m_delayedNext--;
 
243
        QTimer::singleShot(50, this, SLOT(moveNext()));
 
244
    } else if (m_delayedPrev > 0) {
 
245
        m_delayedNext = 0;
 
246
        m_delayedPrev--;
 
247
        QTimer::singleShot(50, this, SLOT(movePrev()));
 
248
    } else if (m_itemlist->size() > 2) {
 
249
        QTimer::singleShot(0, this, SLOT(clearUnusedItems()));
 
250
    }
 
251
}
 
252
 
 
253
qreal Scroller::animValue() const
 
254
{
 
255
    qreal xPosition = 0.0;
 
256
 
 
257
    foreach (SingleFeedItem *item, *m_activeitemlist) {
 
258
        if (m_current == item->itemNumber()) {
 
259
            xPosition = item->pos().x();
 
260
            break;
240
261
        }
241
262
    }
242
263
 
243
 
    if (!stillAnimating && (m_itemlist->size() > 2) &&
244
 
        !Animator::self()->isAnimating()) {
245
 
            QTimer::singleShot(0, this, SLOT(clearUnusedItems()));
246
 
    }
 
264
    return xPosition;
247
265
}
248
266
 
249
 
void Scroller::animate(qreal anim)
 
267
void Scroller::animate(qreal value)
250
268
{
251
 
    int width = size().width();
 
269
    if (m_animation.isNull()) {
 
270
        return;
 
271
    }
 
272
 
 
273
    const int width = size().width();
 
274
    const bool isForward = m_animation.data()->direction() == QAbstractAnimation::Forward;
 
275
    int xPosition;
 
276
 
252
277
    foreach (SingleFeedItem * item, *m_activeitemlist) {
253
 
        int left;
254
278
        if (m_current == item->itemNumber()) {
255
 
            left = (m_animdirection * (1-anim) * width);
 
279
            xPosition = (isForward ? 1 * (1-value) : -1 * value) * width;
256
280
        } else {
257
 
            if (m_animdirection == 1) {
258
 
                left = ((-1 * width) + ((1-anim) * width));
259
 
            } else {
260
 
                left = (anim * width);
261
 
            }
 
281
            xPosition = (1-value) * width + (isForward ? -1 * width : 0);
262
282
        }
263
 
        item->setPos(left, 0);
 
283
        item->setX(xPosition);
264
284
    }
265
285
}
266
286
 
292
312
    QRect rect;
293
313
    rect.setWidth(width);
294
314
    rect.setHeight(height);
295
 
    if (m_itemlist != 0 && !m_animid) {
 
315
    if (m_itemlist != 0 && !m_isAnimating) {
296
316
        for (int i = 0; i < m_itemlist->size(); i++) {
297
317
            item = m_itemlist->at(i);
298
318
            item->setRect(rect);
395
415
            QMap<QString, QVariant> item = tmp.toMap();
396
416
            QString title = item["title"].toString();
397
417
            QString url = item["link"].toString();
398
 
            QString icon = item["icon"].toString();
 
418
            QString iconName = item["icon"].toString();
399
419
            QString feedtitle = item["feed_title"].toString();
400
420
            QString feedurl = item["feed_url"].toString();
401
421
 
411
431
                data.url = url;
412
432
                data.time = timestamp;
413
433
 
414
 
                if (!m_feedIcons.contains(icon)) {
415
 
                    QPixmap p = QPixmap(icon);
 
434
                KIcon *icon = m_feedIcons.value(iconName);
 
435
                if (!icon) {
 
436
                    QPixmap p = QPixmap(iconName);
416
437
                    if (!p.isNull()) {
417
 
                        m_feedIcons[icon] = new KIcon(p.scaled(16, 16));
418
 
                        data.icon = m_feedIcons[icon];
419
 
                    } else {
420
 
                        data.icon = m_feedIcons["generic"];
 
438
                        icon = new KIcon(p.scaled(16, 16));
 
439
                        m_feedIcons.insert(iconName, icon);
421
440
                    }
422
441
                }
423
442
 
424
 
                
 
443
                if (icon) {
 
444
                    data.icon = icon;
 
445
                } else {
 
446
                    data.icon = m_feedIcons["generic"];
 
447
                }
 
448
 
425
449
                data.itemNumber = m_list->size();
426
450
                m_list->append(data);
427
451
            }
451
475
                                         .arg(m_list->at(i).title);
452
476
        }
453
477
 
454
 
        FeedData noitems;
455
 
        noitems.title = "no items to display";
456
 
        noitems.extrainfo = "no items to display";
457
 
        noitems.text = data["title"].toString();
458
 
        noitems.icon = m_feedIcons["generic"];
459
 
 
460
478
        if (m_list->size() < 1) {
 
479
            FeedData noitems;
 
480
            noitems.title = "no items to display";
 
481
            noitems.extrainfo = "no items to display";
 
482
            noitems.text = data["title"].toString();
 
483
            noitems.icon = m_feedIcons["generic"];
 
484
 
461
485
            m_list->append(noitems);
462
486
        }
463
487