diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mediafile.cpp | 14 | ||||
| -rw-r--r-- | src/mediafile.h | 18 | ||||
| -rw-r--r-- | src/playlistmodel.cpp | 63 | ||||
| -rw-r--r-- | src/playlistmodel.h | 18 |
4 files changed, 101 insertions, 12 deletions
diff --git a/src/mediafile.cpp b/src/mediafile.cpp index d6ccc6668..24b6ce174 100644 --- a/src/mediafile.cpp +++ b/src/mediafile.cpp @@ -24,7 +24,7 @@ #include "mediafile.h" -MediaFile::MediaFile(QString path) +MediaFile::MediaFile(const QString& path) : m_flag(FREE) { m_selected = FALSE; m_current = FALSE; @@ -114,7 +114,6 @@ void MediaFile::updateTags() { if (m_path.startsWith("http://")) return; - if (m_tag) { delete m_tag; @@ -150,3 +149,14 @@ void MediaFile::changeTitle(const QString &newtitle) m_title = newtitle; } +void MediaFile::setFlag(FLAGS f) +{ + m_flag = f; +} + + +MediaFile::FLAGS MediaFile::flag() const +{ + return m_flag; +} + diff --git a/src/mediafile.h b/src/mediafile.h index 799d508c1..7adab6603 100644 --- a/src/mediafile.h +++ b/src/mediafile.h @@ -31,12 +31,20 @@ class FileTag; class MediaFile { public: - MediaFile() + /*! + * Current state of media file. + * FREE - instance is free and may be deleted + * EDITING - instance is currently busy in some kind of operation(tags editing etc.) + * and can't be deleted at the moment. Set flag SCHEDULED_FOR_DELETION for it + * instead of delete operator call. + */ + enum FLAGS{FREE = 0,EDITING,SCHEDULED_FOR_DELETION}; + + MediaFile() : m_flag(FREE) {}; - MediaFile(QString); + MediaFile(const QString&); ~MediaFile(); - //MediaFile &operator=(const MediaFile &other); const QString path()const; const QString title()const; @@ -50,7 +58,8 @@ public: void updateTags(const FileTag*); void updateTags(); void changeTitle(const QString&); - + FLAGS flag()const; + void setFlag(FLAGS); private: void readMetadata(); @@ -62,6 +71,7 @@ private: bool m_current; bool m_use_meta; QString m_format; + FLAGS m_flag; }; diff --git a/src/playlistmodel.cpp b/src/playlistmodel.cpp index f88f59268..196608438 100644 --- a/src/playlistmodel.cpp +++ b/src/playlistmodel.cpp @@ -43,6 +43,28 @@ #define INVALID_ROW -1 +TagUpdater::TagUpdater(QObject* o,MediaFile* f):m_observable(o),m_file(f) +{ + m_file->setFlag(MediaFile::EDITING); + connect (m_observable, SIGNAL(destroyed (QObject * )),SLOT(updateTag())); + connect (m_observable, SIGNAL(destroyed (QObject * )),SLOT(deleteLater())); +} + +void TagUpdater::updateTag() +{ + if(m_file->flag() == MediaFile::SCHEDULED_FOR_DELETION) + { + delete m_file; + m_file = NULL; + } + else + { + m_file->updateTags(); + m_file->setFlag(MediaFile::FREE); + } +} + + PlayListModel::PlayListModel ( QObject *parent ) : QObject ( parent ) , m_selection() { @@ -60,8 +82,6 @@ PlayListModel::PlayListModel ( QObject *parent ) registerPlaylistFormat( new XSPFPlaylistFormat); #endif loadExternalPlaylistFormats(); - - //qRegisterMetaType<MediaFile*>("MediaFileStar"); } PlayListModel::~PlayListModel() @@ -145,7 +165,6 @@ void PlayListModel::clear() { if (!l.isNull()) { - qWarning("void PlayListModel::clear()"); l->finish(); l->wait(); } @@ -155,7 +174,18 @@ void PlayListModel::clear() m_current = 0; while ( !m_files.isEmpty() ) - delete m_files.takeFirst(); + { + MediaFile* mf = m_files.takeFirst(); + + if(mf->flag() == MediaFile::FREE) + { + delete mf; + } + else if(mf->flag() == MediaFile::EDITING) + { + mf->setFlag(MediaFile::SCHEDULED_FOR_DELETION); + } + } m_total_length = 0; m_play_state->resetState(); @@ -225,7 +255,14 @@ void PlayListModel::removeSelection(bool inverted) m_total_length -= f->length(); if (m_total_length < 0) m_total_length = 0; - delete f; + + if(f->flag() == MediaFile::FREE) + { + delete f; + f = NULL; + } + else if(f->flag() == MediaFile::EDITING) + f->setFlag(MediaFile::SCHEDULED_FOR_DELETION); select_after_delete = i; @@ -271,7 +308,15 @@ void PlayListModel::showDetails() { DecoderFactory *fact = Decoder::findByPath ( m_files.at ( i )->path() ); if ( fact ) - fact->showDetails ( 0, m_files.at ( i )->path() ); + { + QObject* o = fact->showDetails ( 0, m_files.at ( i )->path() ); + if(o) + { + TagUpdater *updater = new TagUpdater(o,m_files.at(i)); + m_editing_files.append(m_files.at(i)); + connect (updater, SIGNAL(destroyed (QObject * )),SIGNAL(listChanged())); + } + } return; } @@ -846,3 +891,9 @@ void PlayListModel::preparePlayState() + + + + + + diff --git a/src/playlistmodel.h b/src/playlistmodel.h index 1a14bd723..40849b7e8 100644 --- a/src/playlistmodel.h +++ b/src/playlistmodel.h @@ -63,6 +63,22 @@ struct SimpleSelection QList<int>m_selected_rows; }; +/*! + * Helper class used for tags update after details dialog closing. + * @author Vladimir Kuznetsov <vovanec@gmail.com> + */ +class TagUpdater : public QObject +{ +Q_OBJECT + QObject* m_observable; + MediaFile* m_file; +public: + TagUpdater(QObject* o,MediaFile* f); +protected slots: + void updateTag(); +}; + + class PlayListModel : public QObject { Q_OBJECT @@ -288,7 +304,9 @@ private: void removeSelection(bool inverted = false); private: + QList <MediaFile*> m_files; + QList <MediaFile*> m_editing_files; MediaFile* m_currentItem; int m_current; |
