diff options
| author | vovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38> | 2007-07-24 16:05:25 +0000 |
|---|---|---|
| committer | vovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38> | 2007-07-24 16:05:25 +0000 |
| commit | 6f1f9ca43a8773cdfb5e3a7d72fda79c4a442016 (patch) | |
| tree | e48d4fc57cf018e8f33442521a3f08682ff3437e /src/filedialog.cpp | |
| parent | e838956a1dee86e490701e72c1f04ced7a4fdda6 (diff) | |
| download | qmmp-6f1f9ca43a8773cdfb5e3a7d72fda79c4a442016.tar.gz qmmp-6f1f9ca43a8773cdfb5e3a7d72fda79c4a442016.tar.bz2 qmmp-6f1f9ca43a8773cdfb5e3a7d72fda79c4a442016.zip | |
added filedialog interface, fixed plugin paths
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@38 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/filedialog.cpp')
| -rw-r--r-- | src/filedialog.cpp | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/src/filedialog.cpp b/src/filedialog.cpp new file mode 100644 index 000000000..744f4726b --- /dev/null +++ b/src/filedialog.cpp @@ -0,0 +1,297 @@ +#include "filedialog.h" + +#include <QSettings> + + +#include <QApplication> +#include <QPluginLoader> + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#include "playlistmodel.h" + +FileDialog* FileDialog::_instance = 0; + +QMap<QString,FileDialogFactory*> FileDialog::factories = QMap<QString,FileDialogFactory*>(); + +FileDialog::FileDialog() : QObject(), m_initialized(false) +{ +} + + +bool FileDialog::isModal() +{ + return instance()->modal(); +} + +void FileDialog::init(QObject* o) +{ + if(!m_initialized && !instance()->modal()) + { + PlayListModel* model = NULL; + if( ( model = qobject_cast<PlayListModel*>(o)) ) + { + connect(this,SIGNAL(filesAdded(const QStringList&)),model,SLOT(addFileList(const QStringList&))); + m_initialized = true; + } + } +} + + + +QString FileDialog::getExistingDirectory( QWidget * parent, const QString & caption, const QString & dir,bool def) +{ + QString s; + if(def) + s = defaultInstance()->existingDirectory(parent,caption,dir); + else + s = instance()->existingDirectory(parent,caption,dir); + delete _instance; + _instance = 0; + return s; +} + +QString FileDialog::getOpenFileName(QWidget * parent, + const QString & caption, + const QString & dir, + const QString & filter, + QString * selectedFilter,bool def) +{ + QString s; + if(def) + s = defaultInstance()->openFileName(parent,caption,dir,filter,selectedFilter); + else + s = instance()->openFileName(parent,caption,dir,filter,selectedFilter); + delete _instance; + _instance = 0; + return s; +} + +QStringList FileDialog::getOpenFileNames(QWidget * parent, const QString & caption , const QString & dir , + const QString & filter, QString * selectedFilter,bool def) +{ + QStringList sl; + if(def) + sl = defaultInstance()->openFileNames(parent,caption ,dir ,filter, selectedFilter); + else + sl = instance()->openFileNames(parent,caption,dir,filter,selectedFilter); + delete _instance; + _instance = 0; + return sl; +} + +QString FileDialog::getSaveFileName ( QWidget * parent, const QString & caption, + const QString & dir, const QString & filter, QString * selectedFilter,bool def) +{ + QString s; + if(def) + s = defaultInstance()->saveFileName(parent,caption,dir,filter,selectedFilter); + else + s = instance()->saveFileName(parent,caption,dir,filter,selectedFilter); + delete _instance; + _instance = 0; + return s; +} + + +QString FileDialog::existingDirectory(QWidget *, const QString &, const QString &) +{ + return QString(); +} + +QString FileDialog::openFileName(QWidget *, const QString &, const QString &, const QString &, QString *) +{ + return QString(); +} + +QStringList FileDialog::openFileNames(QWidget *, const QString &, const QString &, const QString &, QString *) +{ + return QStringList(); +} + +QString FileDialog::saveFileName(QWidget *, const QString &, const QString &, const QString &, QString *) +{ + return QString(); +} + + +void FileDialog::registerBuiltinFactories() +{ + registerFactory(new QtFileDialogFactory()); + //registerFactory(new QmmpFileDialogFactory()); +} + +void FileDialog::registerExternalFactories() +{ + QDir pluginsDir (QDir::homePath()+"/.qmmp/plugins/FileDialogs"); + + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + //qWarning("file dialog path: %s",qPrintable(fileName)); + QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); + QObject *plugin = loader.instance(); + if (loader.isLoaded()) + qDebug("FileDialog: plugin loaded - %s", qPrintable(fileName)); + else + qDebug("FileDialog: %s",qPrintable(loader.errorString())); + + FileDialogFactory *fct = 0; + if (plugin) + fct = qobject_cast<FileDialogFactory *>(plugin); + + if (fct) + if (!registerFactory(fct)) + qDebug("Warning: Plugin with name %s is already registered...", + qPrintable(fct->name())); + } +} + +bool FileDialog::registerFactory(FileDialogFactory *f) +{ + QString name = f->name(); + if (!factories.contains(name)) + { + factories.insert(name,f); + return true; + } + return false; +} + +QString FileDialog::m_current_factory = QString(); + +FileDialog* FileDialog::instance() +{ + //qWarning("INSTANCE"); + if(_instance && _instance->modal()) + { + delete _instance; + _instance = 0; + } + + if(factories.isEmpty()) + { + registerBuiltinFactories(); + registerExternalFactories(); + } + + QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat ); + QString f_dialogName = + settings.value("FileDialog",QtFileDialogFactory::QtFileDialogFactoryName).toString(); + + QStringList names = factories.keys(); + + if(m_current_factory != f_dialogName || !_instance) + { + if(_instance) + delete _instance; + + qWarning("%s\t%s",qPrintable(m_current_factory),qPrintable(f_dialogName)); + foreach(QString name,names) + { + if(name == f_dialogName) + { + _instance = factories[name]->create(); + m_current_factory = f_dialogName; + } + } + + if(!_instance) + _instance = factories[QtFileDialogFactory::QtFileDialogFactoryName]->create(); + } + else if(!_instance->modal()) + //return _instance; + _instance->raise(); + + return _instance; + +} + +FileDialog* FileDialog::defaultInstance() +{ + if(_instance) + { + delete _instance; + _instance = 0; + } + + if(factories.isEmpty()) + { + registerBuiltinFactories(); + registerExternalFactories(); + } + + _instance = factories[QtFileDialogFactory::QtFileDialogFactoryName]->create(); + + return _instance; +} + +QStringList FileDialog::registeredFactories() +{ + if(factories.isEmpty()) + { + registerBuiltinFactories(); + registerExternalFactories(); + } + return factories.keys(); +} + + +void FileDialog::popup(QObject* o,const QString& d,Mode m,const QStringList& f) +{ + instance()->init(o); + instance()->raise(d,m,f); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +QtFileDialog::~QtFileDialog() +{ + qWarning("QtFileDialog::~QtFileDialog()"); +} + +QString QtFileDialog::existingDirectory(QWidget * parent, const QString & caption, const QString & dir) +{ + return QFileDialog::getExistingDirectory(parent,caption,dir,QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly); +} + +QString QtFileDialog::openFileName(QWidget * parent,const QString & caption,const QString & dir,const QString & filter, + QString * selectedFilter) +{ + return QFileDialog::getOpenFileName(parent,caption,dir,filter,selectedFilter); +} + +QStringList QtFileDialog::openFileNames(QWidget * parent, const QString & caption , const QString & dir , + const QString & filter, QString * selectedFilter) +{ + return QFileDialog::getOpenFileNames(parent,caption,dir,filter,selectedFilter); +} + + QString QtFileDialog::saveFileName ( QWidget * parent, const QString & caption, + const QString & dir, const QString & filter, QString * selectedFilter) +{ + return QFileDialog::getSaveFileName(parent,caption,dir,filter,selectedFilter); +} + + + + + + +FileDialog* QtFileDialogFactory::create() +{ + return new QtFileDialog(); +} + +QString QtFileDialogFactory::name() +{ + return QtFileDialogFactoryName; +} + +QString QtFileDialogFactory::QtFileDialogFactoryName = "Qt File Dialog"; + + |
