diff options
Diffstat (limited to 'src/qmmpui/filedialog.cpp')
| -rw-r--r-- | src/qmmpui/filedialog.cpp | 347 |
1 files changed, 160 insertions, 187 deletions
diff --git a/src/qmmpui/filedialog.cpp b/src/qmmpui/filedialog.cpp index 9408ab881..75befcd7e 100644 --- a/src/qmmpui/filedialog.cpp +++ b/src/qmmpui/filedialog.cpp @@ -30,132 +30,20 @@ #include "qtfiledialog_p.h" -FileDialog* FileDialog::_instance = 0; +//static functions +FileDialog* FileDialog::m_instance = 0; +QList<FileDialogFactory*> *FileDialog::m_factories = 0; +QHash <FileDialogFactory*, QString> *FileDialog::m_files = 0; +FileDialogFactory *FileDialog::m_currentFactory = 0; -QMap<QString,FileDialogFactory*> FileDialog::factories = QMap<QString,FileDialogFactory*>(); - -FileDialog::FileDialog() : QObject(), m_initialized(false) -{ - m_lastDir = 0; -} - -bool FileDialog::isModal() -{ - return instance()->modal(); -} - -void FileDialog::setEnabled(FileDialogFactory *factory) -{ - if (factories.isEmpty()) - { - registerBuiltinFactories(); - registerExternalFactories(); - } - QSettings settings (Qmmp::configFile(), QSettings::IniFormat); - settings.setValue("FileDialog", factories.key(factory)); -} - -bool FileDialog::isEnabled(FileDialogFactory *factory) -{ - if (factories.isEmpty()) - { - registerBuiltinFactories(); - registerExternalFactories(); - } - QSettings settings (Qmmp::configFile(), QSettings::IniFormat); - QString f_dialogName = settings.value("FileDialog", "qt_dialog").toString(); - return factories.value(f_dialogName) == factory; -} - -void FileDialog::init(QObject* receiver, const char* member, QString *dir) -{ - m_lastDir = dir; - if (m_initialized) - disconnect(); - if (receiver && member) - { - connect(this,SIGNAL(filesAdded(const QStringList&)), receiver, member); - connect(this,SIGNAL(filesAdded(const QStringList&)), SLOT(updateLastDir(const QStringList&))); - m_initialized = true; - } -} - -QString FileDialog::getExistingDirectory(QWidget *parent, - const QString &caption, - const QString &dir) -{ - return instance()->existingDirectory(parent,caption,dir); -} - -QString FileDialog::getOpenFileName(QWidget *parent, - const QString &caption, - const QString &dir, - const QString &filter, - QString *selectedFilter) -{ - return instance()->openFileName(parent,caption,dir,filter,selectedFilter); -} - -QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption, - const QString &dir,const QString &filter, - QString *selectedFilter) +void FileDialog::checkFactories() { - return instance()->openFileNames(parent,caption,dir,filter,selectedFilter); -} - -QString FileDialog::getSaveFileName (QWidget *parent, const QString &caption, - const QString& dir, const QString &filter, - QString *selectedFilter) -{ - return instance()->saveFileName(parent,caption,dir,filter,selectedFilter); -} - -//virtual -QString FileDialog::existingDirectory(QWidget *parent, const QString &caption, const QString &dir) -{ - FileDialog *instance = FileDialog::defaultInstance(); - QString dir_path = instance->existingDirectory(parent, caption, dir); - delete instance; - return dir_path; -} - -QString FileDialog::openFileName(QWidget *parent, const QString &caption, const QString &dir, - const QString &filter, QString *selectedFilter) -{ - FileDialog *instance = FileDialog::defaultInstance(); - QString file_path = instance->openFileName(parent, caption, dir, filter, selectedFilter); - delete instance; - return file_path; -} + if(m_factories) + return; -QStringList FileDialog::openFileNames(QWidget *parent, const QString &caption, const QString &dir, - const QString &filter, QString *selectedFilter) -{ - FileDialog *instance = FileDialog::defaultInstance(); - QStringList list = instance->openFileNames(parent, caption, dir, filter, selectedFilter); - delete instance; - return list; -} - -QString FileDialog::saveFileName(QWidget *parent, const QString &caption, const QString &dir, - const QString &filter, QString *selectedFilter) -{ - FileDialog *instance = FileDialog::defaultInstance(); - QString file_path = instance->saveFileName(parent, caption, dir, filter, selectedFilter); - delete instance; - return file_path; -} - - -void FileDialog::registerBuiltinFactories() -{ - FileDialogFactory *fct = new QtFileDialogFactory(); - qApp->installTranslator(fct->createTranslator(qApp)); - registerFactory(fct); -} - -void FileDialog::registerExternalFactories() -{ + m_factories = new QList<FileDialogFactory *>; + m_files = new QHash <FileDialogFactory*, QString>; + m_factories->append(new QtFileDialogFactory); QDir pluginsDir (Qmmp::pluginsPath()); pluginsDir.cd("FileDialogs"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) @@ -165,18 +53,17 @@ void FileDialog::registerExternalFactories() if (loader.isLoaded()) qDebug("FileDialog: loaded plugin %s", qPrintable(fileName)); else - qDebug("FileDialog: %s",qPrintable(loader.errorString())); + qWarning("FileDialog: %s",qPrintable(loader.errorString())); - FileDialogFactory *fct = 0; + FileDialogFactory *factory = 0; if (plugin) - fct = qobject_cast<FileDialogFactory *>(plugin); + factory = qobject_cast<FileDialogFactory *>(plugin); - if (fct) + if (factory) { - if (!registerFactory(fct)) - qDebug("Warning: Plugin with name %s is already registered...", - qPrintable(fileName)); - qApp->installTranslator(fct->createTranslator(qApp)); + m_factories->append(factory); + m_files->insert(factory, fileName); + qApp->installTranslator(factory->createTranslator(qApp)); } } #ifndef Q_OS_WIN32 @@ -199,76 +86,61 @@ void FileDialog::registerExternalFactories() #endif } -bool FileDialog::registerFactory(FileDialogFactory *factory) +QList <FileDialogFactory*> *FileDialog::factories() { - if (!factories.contains(factory->properties().shortName)) - { - factories.insert(factory->properties().shortName, factory); - return true; - } - return false; + checkFactories(); + return m_factories; } -QString FileDialog::m_current_factory = QString(); - -FileDialog* FileDialog::instance() +void FileDialog::setEnabled(FileDialogFactory *factory) { - if (factories.isEmpty()) - { - registerBuiltinFactories(); - registerExternalFactories(); - } - + checkFactories(); QSettings settings (Qmmp::configFile(), QSettings::IniFormat); - QString f_dialogName = settings.value("FileDialog", "qt_dialog").toString(); - - QStringList names = factories.keys(); + settings.setValue("FileDialog", factory->properties().shortName); +} - if (!names.contains(f_dialogName)) - f_dialogName = "qt_dialog"; +bool FileDialog::isEnabled(FileDialogFactory *factory) +{ + checkFactories(); + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QString name = settings.value("FileDialog", "qt_dialog").toString(); + return factory->properties().shortName == name; +} - if (m_current_factory != f_dialogName || !_instance) - { - if (_instance) - { - delete _instance; - _instance = 0; - } +QString FileDialog::file(FileDialogFactory *factory) +{ + checkFactories(); + return m_files->value(factory); +} - foreach(QString name,names) - { - if (name == f_dialogName) - { - _instance = factories[name]->create(); - m_current_factory = f_dialogName; - break; - } - } +QString FileDialog::getExistingDirectory(QWidget *parent, + const QString &caption, + const QString &dir) +{ + return instance()->existingDirectory(parent,caption,dir); +} - if (!_instance) - _instance = factories["qt_dialog"]->create(); - } - return _instance; +QString FileDialog::getOpenFileName(QWidget *parent, + const QString &caption, + const QString &dir, + const QString &filter, + QString *selectedFilter) +{ + return instance()->openFileName(parent,caption,dir,filter,selectedFilter); } -FileDialog* FileDialog::defaultInstance() +QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption, + const QString &dir,const QString &filter, + QString *selectedFilter) { - if (factories.isEmpty()) - { - registerBuiltinFactories(); - registerExternalFactories(); - } - return factories["qt_dialog"]->create(); + return instance()->openFileNames(parent,caption,dir,filter,selectedFilter); } -QList <FileDialogFactory*> FileDialog::registeredFactories() +QString FileDialog::getSaveFileName (QWidget *parent, const QString &caption, + const QString& dir, const QString &filter, + QString *selectedFilter) { - if (factories.isEmpty()) - { - registerBuiltinFactories(); - registerExternalFactories(); - } - return factories.values(); + return instance()->saveFileName(parent,caption,dir,filter,selectedFilter); } void FileDialog::popup(QWidget *parent, @@ -285,7 +157,7 @@ void FileDialog::popup(QWidget *parent, FileDialog* inst = instance(); inst->setParent(parent); inst->init(receiver, member, dir); - if (!inst->modal()) + if (!m_currentFactory->properties().modal) inst->raise(*dir, m, caption, filters.split(";;")); else { @@ -305,6 +177,107 @@ void FileDialog::popup(QWidget *parent, } } +FileDialog* FileDialog::instance() +{ + checkFactories(); + FileDialogFactory *selected = 0; + + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QString name = settings.value("FileDialog", "qt_dialog").toString(); + foreach(FileDialogFactory *factory, *m_factories) + { + if(factory->properties().shortName == name) + { + selected = factory; + break; + } + } + + if(!selected) + selected = m_factories->at(0); + + if(selected == m_currentFactory && m_instance) + return m_instance; + + if(m_instance) + { + delete m_instance; + m_instance = 0; + } + + m_currentFactory = selected; + m_instance = m_currentFactory->create(); + return m_instance; +} + +FileDialog* FileDialog::createDefault() +{ + return m_factories->at(0)->create(); +} + +//base implementation +FileDialog::FileDialog() : QObject(), m_initialized(false) +{ + m_lastDir = 0; +} + +FileDialog::~FileDialog() {} + +void FileDialog::raise(const QString &dir, Mode mode, const QString &caption, const QStringList &mask) +{ + Q_UNUSED(dir); + Q_UNUSED(mode); + Q_UNUSED(caption); + Q_UNUSED(mask); +} + +QString FileDialog::existingDirectory(QWidget *parent, const QString &caption, const QString &dir) +{ + FileDialog *instance = FileDialog::createDefault(); + QString dir_path = instance->existingDirectory(parent, caption, dir); + delete instance; + return dir_path; +} + +QString FileDialog::openFileName(QWidget *parent, const QString &caption, const QString &dir, + const QString &filter, QString *selectedFilter) +{ + FileDialog *instance = FileDialog::createDefault(); + QString file_path = instance->openFileName(parent, caption, dir, filter, selectedFilter); + delete instance; + return file_path; +} + +QStringList FileDialog::openFileNames(QWidget *parent, const QString &caption, const QString &dir, + const QString &filter, QString *selectedFilter) +{ + FileDialog *instance = FileDialog::createDefault(); + QStringList list = instance->openFileNames(parent, caption, dir, filter, selectedFilter); + delete instance; + return list; +} + +QString FileDialog::saveFileName(QWidget *parent, const QString &caption, const QString &dir, + const QString &filter, QString *selectedFilter) +{ + FileDialog *instance = FileDialog::createDefault(); + QString file_path = instance->saveFileName(parent, caption, dir, filter, selectedFilter); + delete instance; + return file_path; +} + +void FileDialog::init(QObject* receiver, const char* member, QString *dir) +{ + m_lastDir = dir; + if (m_initialized) + disconnect(); + if (receiver && member) + { + connect(this,SIGNAL(filesAdded(const QStringList&)), receiver, member); + connect(this,SIGNAL(filesAdded(const QStringList&)), SLOT(updateLastDir(const QStringList&))); + m_initialized = true; + } +} void FileDialog::updateLastDir(const QStringList& list) { |
