From 6f6802f6733cc0c47a1fa2bdd44c639c3818482b Mon Sep 17 00:00:00 2001 From: James Hogan Date: Sat, 14 Feb 2009 23:38:17 +0000 Subject: [PATCH] Mime type based filter loading loading code no longer in KwDocument, but still distributed among playlist classes --- kworship/KwDocument.cpp | 42 ++++------------- kworship/KwDocument.h | 10 ++-- kworship/KwExportFilter.h | 7 +-- kworship/KwFilterManager.cpp | 106 +++++++++++++++++++++++++++++++++--------- kworship/KwFilterManager.h | 25 ++++++++++ kworship/KwImportFilter.h | 4 +- kworship/KwKWorshipFilter.cpp | 38 +++++++++++++-- kworship/KwKWorshipFilter.h | 4 +- kworship/kworship.cpp | 36 +++++++++++++- 9 files changed, 202 insertions(+), 70 deletions(-) diff --git a/kworship/KwDocument.cpp b/kworship/KwDocument.cpp index 7dc0536..ac05716 100644 --- a/kworship/KwDocument.cpp +++ b/kworship/KwDocument.cpp @@ -79,29 +79,21 @@ KwPlaylistList* KwDocument::playlist() } /* - * Saving and loading actions + * Mutators */ -/// Load the file. -void KwDocument::reload() +/// Set the main playlist. +void KwDocument::setPlaylist(KwPlaylistList* playlist) { - // Start off by opening the archive file - if (!m_url.isLocalFile()) - { - KMessageBox::error(0, - i18n("Non-local loads not yet supported"), - i18n("KWorship")); - return; - } - - // Create a new archive object and fill it - KwArchive* archive = new KwArchive(m_url.toLocalFile(), false); - loadFromArchive(archive); - delete archive; - - setModified(false); + delete m_playlist; + m_playlist = playlist; + emit playlistReset(); } +/* + * Saving and loading actions + */ + /// Save the file. void KwDocument::save() { @@ -170,20 +162,6 @@ void KwDocument::setModified(bool modified) * Archive interface. */ -/// Load from an archive. -void KwDocument::loadFromArchive(KwArchive* archive) -{ - Q_ASSERT(archive->isReading()); - - KwPlaylistList* playlist = archive->extractPlaylist("0"); - if (0 != playlist) - { - delete m_playlist; - m_playlist = playlist; - playlistReset(); - } -} - /// Save to an archive. void KwDocument::saveToArchive(KwArchive* archive) const { diff --git a/kworship/KwDocument.h b/kworship/KwDocument.h index 373f40f..70d7e1d 100644 --- a/kworship/KwDocument.h +++ b/kworship/KwDocument.h @@ -66,15 +66,19 @@ class KwDocument : public QObject /// Get the main playlist. KwPlaylistList* playlist(); + /* + * Mutators + */ + + /// Set the main playlist. + void setPlaylist(KwPlaylistList* playlist); + public slots: /* * Saving and loading actions */ - /// Load the file. - void reload(); - /// Save the file. void save(); diff --git a/kworship/KwExportFilter.h b/kworship/KwExportFilter.h index 90a5406..dd57c1e 100644 --- a/kworship/KwExportFilter.h +++ b/kworship/KwExportFilter.h @@ -30,11 +30,12 @@ #include -#include #include +#include +#include class KwDocument; -class QString; +class KUrl; /// Export file filter. class KDE_EXPORT KwExportFilter : public virtual KwFilter @@ -114,7 +115,7 @@ class KDE_EXPORT KwExportFilter : public virtual KwFilter void saveLimitations(KwDocument* doc, Limitations* o_limitations); /// Save the document to file. - virtual bool save(KwDocument* doc, const QString& filename) = 0; + virtual bool save(KwDocument* doc, const KUrl& url) = 0; /* * Accessors diff --git a/kworship/KwFilterManager.cpp b/kworship/KwFilterManager.cpp index 140c04f..96e0867 100644 --- a/kworship/KwFilterManager.cpp +++ b/kworship/KwFilterManager.cpp @@ -36,6 +36,10 @@ KwFilterManager::KwFilterManager() , m_loadSaveFilters() , m_importFilters() , m_exportFilters() +, m_loadMimeFilters() +, m_saveMimeFilters() +, m_importMimeFilters() +, m_exportMimeFilters() { } @@ -69,60 +73,118 @@ void KwFilterManager::addLoadSaveFilter(KwLoadSaveFilter* loadSaveFilter, bool m { m_defaultLoadSaveFilter = loadSaveFilter; } + + // Update hashes of filters for each mime type + QStringList mimes = loadSaveFilter->importMimeTypes(); + foreach (QString mime, mimes) + { + m_loadMimeFilters[mime] = loadSaveFilter; + } + mimes = loadSaveFilter->exportMimeTypes(); + foreach (QString mime, mimes) + { + m_saveMimeFilters[mime] = loadSaveFilter; + } } /// Add an import filter. void KwFilterManager::addImportFilter(KwImportFilter* importFilter) { m_importFilters += importFilter; + + // Update hash of import filters for each mime type + QStringList mimes = importFilter->importMimeTypes(); + foreach (QString mime, mimes) + { + m_importMimeFilters[mime] = importFilter; + } } /// Add an export filter. void KwFilterManager::addExportFilter(KwExportFilter* exportFilter) { m_exportFilters += exportFilter; + + // Update hash of export filters for each mime type + QStringList mimes = exportFilter->exportMimeTypes(); + foreach (QString mime, mimes) + { + m_exportMimeFilters[mime] = exportFilter; + } } /// Get load mime types. QStringList KwFilterManager::loadMimeTypes() const { - QStringList result; - foreach (KwLoadSaveFilter* filter, m_loadSaveFilters) - { - result += filter->importMimeTypes(); - } - return result; + return m_loadMimeFilters.keys(); } /// Get save mime types. QStringList KwFilterManager::saveMimeTypes() const { - QStringList result; - foreach (KwLoadSaveFilter* filter, m_loadSaveFilters) - { - result += filter->exportMimeTypes(); - } - return result; + return m_saveMimeFilters.keys(); } /// Get import mime types. QStringList KwFilterManager::importMimeTypes() const { - QStringList result; - foreach (KwImportFilter* filter, m_importFilters) - { - result += filter->importMimeTypes(); - } - return result; + return m_importMimeFilters.keys(); } /// Get export mime types. QStringList KwFilterManager::exportMimeTypes() const { - QStringList result; - foreach (KwExportFilter* filter, m_exportFilters) + return m_exportMimeFilters.keys(); +} + +/// Get the load filter for a mime type. +KwLoadSaveFilter* KwFilterManager::loadFilterFromMimeType(const QString& mimeType) +{ + if (m_loadMimeFilters.contains(mimeType)) + { + return m_loadMimeFilters[mimeType]; + } + else + { + return 0; + } +} + +/// Get the save filter for a mime type. +KwLoadSaveFilter* KwFilterManager::saveFilterFromMimeType(const QString& mimeType) +{ + if (m_saveMimeFilters.contains(mimeType)) + { + return m_saveMimeFilters[mimeType]; + } + else + { + return 0; + } +} + +/// Get the import filter for a mime type. +KwImportFilter* KwFilterManager::importFilterFromMimeType(const QString& mimeType) +{ + if (m_importMimeFilters.contains(mimeType)) + { + return m_importMimeFilters[mimeType]; + } + else + { + return 0; + } +} + +/// Get the export filter for a mime type. +KwExportFilter* KwFilterManager::exportFilterFromMimeType(const QString& mimeType) +{ + if (m_exportMimeFilters.contains(mimeType)) + { + return m_exportMimeFilters[mimeType]; + } + else { - result += filter->exportMimeTypes(); + return 0; } - return result; } diff --git a/kworship/KwFilterManager.h b/kworship/KwFilterManager.h index 7c24ac8..2710689 100644 --- a/kworship/KwFilterManager.h +++ b/kworship/KwFilterManager.h @@ -29,6 +29,7 @@ #include #include +#include #include class KwImportFilter; @@ -75,6 +76,18 @@ class KDE_EXPORT KwFilterManager /// Get export mime types. QStringList exportMimeTypes() const; + /// Get the load filter for a mime type. + KwLoadSaveFilter* loadFilterFromMimeType(const QString& mimeType); + + /// Get the save filter for a mime type. + KwLoadSaveFilter* saveFilterFromMimeType(const QString& mimeType); + + /// Get the import filter for a mime type. + KwImportFilter* importFilterFromMimeType(const QString& mimeType); + + /// Get the export filter for a mime type. + KwExportFilter* exportFilterFromMimeType(const QString& mimeType); + private: /* @@ -92,6 +105,18 @@ class KDE_EXPORT KwFilterManager /// List of export filters. QList m_exportFilters; + + /// Hash of filters for each load mime type. + QHash m_loadMimeFilters; + + /// Hash of filters for each save mime type. + QHash m_saveMimeFilters; + + /// Hash of filters for each import mime type. + QHash m_importMimeFilters; + + /// Hash of filters for each export mime type. + QHash m_exportMimeFilters; }; #endif // _KwFilterManager_h_ diff --git a/kworship/KwImportFilter.h b/kworship/KwImportFilter.h index cb4302e..c0494f4 100644 --- a/kworship/KwImportFilter.h +++ b/kworship/KwImportFilter.h @@ -33,7 +33,7 @@ #include class KwDocument; -class QString; +class KUrl; /// Import file filter. class KDE_EXPORT KwImportFilter : public virtual KwFilter @@ -55,7 +55,7 @@ class KDE_EXPORT KwImportFilter : public virtual KwFilter */ /// Load the document from a file. - virtual KwDocument* load(const QString& filename) = 0; + virtual KwDocument* load(const KUrl& url) = 0; /* * Accessors diff --git a/kworship/KwKWorshipFilter.cpp b/kworship/KwKWorshipFilter.cpp index 44cd9e6..1c11b3b 100644 --- a/kworship/KwKWorshipFilter.cpp +++ b/kworship/KwKWorshipFilter.cpp @@ -24,6 +24,13 @@ */ #include "KwKWorshipFilter.h" +#include "KwDocument.h" +#include "KwArchive.h" +#include "KwPlaylistList.h" + +#include +#include +#include /* * Constructors + destructor @@ -48,13 +55,36 @@ KwKWorshipFilter::~KwKWorshipFilter() * Main interface */ -KwDocument* KwKWorshipFilter::load(const QString& filename) +KwDocument* KwKWorshipFilter::load(const KUrl& url) { - /// @todo Implement KwKWorshipFilter::load - Q_ASSERT(false); + // Start off by opening the archive file + if (!url.isLocalFile()) + { + KMessageBox::error(0, + i18n("Non-local loads not yet supported"), + i18n("KWorship")); + return 0; + } + + KwDocument* doc = new KwDocument(url); + // Open archive object and fill it + KwArchive* archive = new KwArchive(url.toLocalFile(), false); + Q_ASSERT(archive->isReading()); + + KwPlaylistList* playlist = archive->extractPlaylist("0"); + if (0 != playlist) + { + doc->setPlaylist(playlist); + } + + delete archive; + + doc->setModified(false); + + return doc; } -bool KwKWorshipFilter::save(KwDocument* doc, const QString& filename) +bool KwKWorshipFilter::save(KwDocument* doc, const KUrl& url) { /// @todo Implement KwKWorshipFilter::save Q_ASSERT(false); diff --git a/kworship/KwKWorshipFilter.h b/kworship/KwKWorshipFilter.h index 445442b..457f525 100644 --- a/kworship/KwKWorshipFilter.h +++ b/kworship/KwKWorshipFilter.h @@ -48,10 +48,10 @@ class KwKWorshipFilter : public KwLoadSaveFilter */ /// Reimplemented. - virtual KwDocument* load(const QString& filename); + virtual KwDocument* load(const KUrl& url); /// Reimplemented. - virtual bool save(KwDocument* doc, const QString& filename); + virtual bool save(KwDocument* doc, const KUrl& url); protected: diff --git a/kworship/kworship.cpp b/kworship/kworship.cpp index f380e01..98e0597 100644 --- a/kworship/kworship.cpp +++ b/kworship/kworship.cpp @@ -27,6 +27,7 @@ #include "KwApplication.h" #include "KwPluginManager.h" #include "KwFilterManager.h" +#include "KwLoadSaveFilter.h" #include "KwPlaylistNode.h" #include "KwPlaylistList.h" @@ -293,8 +294,39 @@ kworship::~kworship() /// Load a specified playlist. void kworship::loadPlaylist(const KUrl& url) { - setDocument(url); - m_document->reload(); + // Find mime type + KMimeType::Ptr mimeType = KMimeType::findByUrl(url); + QString mime = mimeType->name(); + + // Use the appropriate filter + KwLoadSaveFilter* filter = KwApplication::self()->filterManager()->loadFilterFromMimeType(mime); + if (filter) + { + KwDocument* newDoc = filter->load(url); + if (0 != newDoc) + { + delete m_document; + m_document = newDoc; + + // Playlist will have changed + playlistReset(); + + // Wire up signals + connect(m_document, SIGNAL(playlistReset()), this, SLOT(playlistReset())); + } + else + { + KMessageBox::error(this, + i18n("Loading of \"%1\" failed.").arg(url.url()), + i18n("KWorship")); + } + } + else + { + KMessageBox::error(this, + i18n("No load filter exists for the mime type \"%1\"").arg(mime), + i18n("KWorship")); + } } /* -- 2.11.4.GIT