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
00025 class PlaylistItemData
00026 {
00027 public:
00028 PlaylistItemData();
00029 virtual ~PlaylistItemData();
00030
00041 virtual QString property(const QString &key, const QString &def=0) const=0;
00042
00049 virtual void setProperty(const QString &key, const QString &property)=0;
00050
00054 virtual void clearProperty(const QString &key)=0;
00055
00059 virtual QStringList properties() const=0;
00060
00064 virtual bool isProperty(const QString &key) const=0;
00065
00076 virtual QString title() const;
00077
00081 virtual KURL url() const { return KURL(property("url")); }
00085 virtual void setUrl(const KURL &url) { setProperty("url", url.url()); }
00086
00091 virtual QCString mimetype() const;
00092
00097 virtual QCString playObject() const;
00098
00102 virtual QString file() const { return url().path(); }
00103
00107 virtual int length() const;
00108
00112 virtual void setLength(int ms);
00113
00118 QString lengthString() const;
00119
00127 virtual bool operator == (const PlaylistItemData &d) const;
00128
00133 virtual bool operator != (const PlaylistItemData &d) const;
00134
00138 virtual void remove() = 0;
00139
00140
00144 bool streamable() const { return isProperty("stream_"); }
00145
00146 public:
00151 void added();
00152
00157 void removed();
00158
00163 void modified();
00164
00165
00166 public:
00173 void addRef() { mRefs++; }
00174 void removeRef() { mRefs--; if (!mRefs) delete this; }
00175
00176 private:
00177 mutable int mRefs;
00178 };
00179
00180
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
00315 class Playlist : public QObject
00316 {
00317 Q_OBJECT
00318 friend class PlaylistItemData;
00319 public:
00320 Playlist(QObject *parent, const char *name);
00325 virtual ~Playlist();
00326
00330 virtual void reset()=0;
00331
00335 virtual void clear()=0;
00336
00340 virtual void addFile(const KURL&, bool play=false)=0;
00341
00345 virtual PlaylistItem next()=0;
00346
00351 virtual PlaylistItem nextSection();
00352
00356 virtual PlaylistItem previous()=0;
00357
00362 virtual PlaylistItem previousSection();
00363
00367 virtual PlaylistItem current()=0;
00371 virtual void setCurrent(const PlaylistItem &)=0;
00372
00376 virtual PlaylistItem getFirst() const =0;
00377
00381 virtual PlaylistItem getAfter(const PlaylistItem &item) const =0;
00382
00387 virtual bool listVisible() const =0;
00388
00392 int handleArguments();
00393
00418 virtual QValueList<PlaylistItem> select(
00419 const QStringList &keys, const QStringList &values,
00420 int limit=-1, bool exact=false, bool caseSensitive=false
00421 );
00422
00429 virtual QValueList<PlaylistItem> select(
00430 const QString &key, const QString &value,
00431 int limit=-1, bool exact=false, bool caseSensitive=false
00432 );
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:
00452 virtual void showList()=0;
00456 virtual void hideList()=0;
00460 virtual void toggleList();
00461
00462 signals:
00468 void playCurrent();
00469
00473 void listHidden();
00474
00478 void listShown();
00479 };
00480
00489 class PlaylistNotifier
00490 {
00491 public:
00492 PlaylistNotifier();
00493 virtual ~PlaylistNotifier();
00494
00498 virtual void added(PlaylistItem &) {}
00499
00503 virtual void removed(PlaylistItem &) {}
00504
00509 virtual void modified(PlaylistItem &) {}
00510 };
00511
00512
00513 #endif
00514