00001 #ifndef NOATUNPLAYLIST_H
00002 #define NOATUNPLAYLIST_H
00003
00004 #include <qobject.h>
00005 #include <kurl.h>
00006 #include <qdict.h>
00007 #include <qstringlist.h>
00008 #include <cassert>
00009
00010 class PlaylistItem;
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 class PlaylistItemData
00026 {
00027 public:
00028 PlaylistItemData();
00029 virtual ~PlaylistItemData();
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 virtual QString property(const QString &key, const QString &def=0) const=0;
00042
00043
00044
00045
00046
00047
00048
00049 virtual void setProperty(const QString &key, const QString &property)=0;
00050
00051
00052
00053
00054 virtual void clearProperty(const QString &key)=0;
00055
00056
00057
00058
00059 virtual QStringList properties() const=0;
00060
00061
00062
00063
00064 virtual bool isProperty(const QString &key) const=0;
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 virtual QString title() const;
00077
00078
00079
00080
00081 virtual KURL url() const { return KURL(property("url")); }
00082
00083
00084
00085 virtual void setUrl(const KURL &url) { setProperty("url", url.url()); }
00086
00087
00088
00089
00090
00091 virtual QCString mimetype() const;
00092
00093
00094
00095
00096
00097 virtual QCString playObject() const;
00098
00099
00100
00101
00102 virtual QString file() const { return url().path(); }
00103
00104
00105
00106
00107 virtual int length() const;
00108
00109
00110
00111
00112 virtual void setLength(int ms);
00113
00114
00115
00116
00117
00118 QString lengthString() const;
00119
00120
00121
00122
00123
00124
00125
00126
00127 virtual bool operator == (const PlaylistItemData &d) const;
00128
00129
00130
00131
00132
00133 virtual bool operator != (const PlaylistItemData &d) const;
00134
00135
00136
00137
00138 virtual void remove() = 0;
00139
00140
00141
00142
00143
00144 bool streamable() const { return isProperty("stream_"); }
00145
00146 public:
00147
00148
00149
00150
00151 void added();
00152
00153
00154
00155
00156
00157 void removed();
00158
00159
00160
00161
00162
00163 void modified();
00164
00165
00166 public:
00167
00168
00169
00170
00171
00172
00173 void addRef() { mRefs++; }
00174 void removeRef() { mRefs--; if (!mRefs) delete this; }
00175
00176 private:
00177 mutable int mRefs;
00178 };
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 class PlaylistItem
00195 {
00196 public:
00197 PlaylistItem(const PlaylistItem &source);
00198 PlaylistItem(PlaylistItemData *source);
00199 PlaylistItem() : mData(0) {}
00200 ~PlaylistItem();
00201
00202 PlaylistItem &operator =(const PlaylistItem &source);
00203 PlaylistItem &operator =(PlaylistItemData *source);
00204
00205 PlaylistItemData *data() { return mData; }
00206 const PlaylistItemData *data() const { return mData; }
00207
00208 const PlaylistItem &operator =(const PlaylistItem &source) const;
00209 const PlaylistItem &operator =(const PlaylistItemData *source) const;
00210
00211 operator bool() const { return (bool)mData; }
00212 bool isNull() const { return !(bool)mData; }
00213
00214 bool operator ==(const PlaylistItem &i) const
00215 {
00216 if (data()==i.data()) return true;
00217 if (!data() || !i.data()) return false;
00218 return *i.data()==*data();
00219 }
00220 bool operator ==(const PlaylistItemData *i) const
00221 {
00222 if (data()==i) return true;
00223 if (!data() || !i) return false;
00224 return *i==*data();
00225 }
00226
00227 bool operator !=(const PlaylistItem &i) const
00228 { return ! (*this==i); }
00229 bool operator !=(const PlaylistItemData *i) const
00230 { return ! (*this->data()==*i); }
00231
00232 QString property(const QString &key, const QString &def=0) const
00233 {
00234 assert(mData);
00235 return mData->property(key, def);
00236 }
00237
00238 void setProperty(const QString &key, const QString &property)
00239 {
00240 assert(mData);
00241 const_cast<PlaylistItemData*>(mData)->setProperty(key, property);
00242 }
00243
00244 void clearProperty(const QString &key)
00245 {
00246 assert(mData);
00247 const_cast<PlaylistItemData*>(mData)->clearProperty(key);
00248 }
00249
00250 QStringList properties() const
00251 {
00252 assert(mData);
00253 return mData->properties();
00254 }
00255
00256 bool isProperty(const QString &key) const
00257 {
00258 assert(mData);
00259 return mData->isProperty(key);
00260 }
00261
00262 KURL url() const { assert(mData); return mData->url(); }
00263 void setUrl(const KURL &url)
00264 {
00265 assert(mData);
00266 const_cast<PlaylistItemData*>(mData)->setUrl(url);
00267 }
00268
00269 QCString mimetype() const { assert(mData); return mData->mimetype(); }
00270 QCString playObject() const { assert(mData); return mData->playObject(); }
00271 QString file() const { assert(mData); return mData->file(); }
00272
00273 QString title() const
00274 {
00275 assert(mData);
00276 return mData->title();
00277 }
00278
00279 int length() const
00280 {
00281 assert(mData);
00282 return mData->length();
00283 }
00284
00285 void setLength(int ms) const
00286 {
00287 assert(mData);
00288 mData->setLength(ms);
00289 }
00290
00291 QString lengthString() const { assert(mData); return mData->lengthString(); }
00292
00293 void remove() { assert(mData); mData->remove(); }
00294
00295 bool streamable() const { assert(mData); return mData->streamable(); }
00296
00297 private:
00298
00299 void removeRef() const;
00300 void addRef() const;
00301
00302 private:
00303 mutable PlaylistItemData *mData;
00304 void *_bc1, *_bc2;
00305 };
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 class Playlist : public QObject
00316 {
00317 Q_OBJECT
00318 friend class PlaylistItemData;
00319 public:
00320 Playlist(QObject *parent, const char *name);
00321
00322
00323
00324
00325 virtual ~Playlist();
00326
00327
00328
00329
00330 virtual void reset()=0;
00331
00332
00333
00334
00335 virtual void clear()=0;
00336
00337
00338
00339
00340 virtual void addFile(const KURL&, bool play=false)=0;
00341
00342
00343
00344
00345 virtual PlaylistItem next()=0;
00346
00347
00348
00349
00350
00351 virtual PlaylistItem nextSection();
00352
00353
00354
00355
00356 virtual PlaylistItem previous()=0;
00357
00358
00359
00360
00361
00362 virtual PlaylistItem previousSection();
00363
00364
00365
00366
00367 virtual PlaylistItem current()=0;
00368
00369
00370
00371 virtual void setCurrent(const PlaylistItem &)=0;
00372
00373
00374
00375
00376 virtual PlaylistItem getFirst() const =0;
00377
00378
00379
00380
00381 virtual PlaylistItem getAfter(const PlaylistItem &item) const =0;
00382
00383
00384
00385
00386
00387 virtual bool listVisible() const =0;
00388
00389
00390
00391
00392 int handleArguments();
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 virtual QValueList<PlaylistItem> select(
00419 const QStringList &keys, const QStringList &values,
00420 int limit=-1, bool exact=false, bool caseSensitive=false
00421 );
00422
00423
00424
00425
00426
00427
00428
00429 virtual QValueList<PlaylistItem> select(
00430 const QString &key, const QString &value,
00431 int limit=-1, bool exact=false, bool caseSensitive=false
00432 );
00433
00434
00435
00436
00437 inline QValueList<PlaylistItem> select(
00438 const char *key, const char *value,
00439 int limit=-1, bool exact=false, bool caseSensitive=false
00440 )
00441 {
00442 return select(
00443 QString(key), QString(value),
00444 limit, exact, caseSensitive
00445 );
00446 }
00447
00448 public slots:
00449
00450
00451
00452 virtual void showList()=0;
00453
00454
00455
00456 virtual void hideList()=0;
00457
00458
00459
00460 virtual void toggleList();
00461
00462 signals:
00463
00464
00465
00466
00467
00468 void playCurrent();
00469
00470
00471
00472
00473 void listHidden();
00474
00475
00476
00477
00478 void listShown();
00479 };
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489 class PlaylistNotifier
00490 {
00491 public:
00492 PlaylistNotifier();
00493 virtual ~PlaylistNotifier();
00494
00495
00496
00497
00498 virtual void added(PlaylistItem &) {}
00499
00500
00501
00502
00503 virtual void removed(PlaylistItem &) {}
00504
00505
00506
00507
00508
00509 virtual void modified(PlaylistItem &) {}
00510 };
00511
00512
00513 #endif
00514