aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2007-07-24 16:05:25 +0000
committervovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2007-07-24 16:05:25 +0000
commit6f1f9ca43a8773cdfb5e3a7d72fda79c4a442016 (patch)
treee48d4fc57cf018e8f33442521a3f08682ff3437e /src
parente838956a1dee86e490701e72c1f04ced7a4fdda6 (diff)
downloadqmmp-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')
-rw-r--r--src/configdialog.cpp12
-rw-r--r--src/configdialog.ui52
-rw-r--r--src/eqwidget.cpp9
-rw-r--r--src/filedialog.cpp297
-rw-r--r--src/filedialog.h109
-rw-r--r--src/mainwindow.cpp107
-rw-r--r--src/playlistmodel.cpp25
-rw-r--r--src/playlistmodel.h63
-rw-r--r--src/src.pro14
9 files changed, 631 insertions, 57 deletions
diff --git a/src/configdialog.cpp b/src/configdialog.cpp
index e91139efc..bc62a2508 100644
--- a/src/configdialog.cpp
+++ b/src/configdialog.cpp
@@ -32,6 +32,7 @@
#include <outputfactory.h>
#include "skin.h"
+#include "filedialog.h"
#include "pluginitem.h"
#include "configdialog.h"
@@ -49,6 +50,7 @@ ConfigDialog::ConfigDialog ( QWidget *parent )
connect ( this, SIGNAL(accepted()),SLOT(saveSettings()));
ui.listWidget->setIconSize ( QSize ( 69,29 ) );
m_skin = Skin::getPointer();
+ ui.fileDialogComboBox->insertItems(0,FileDialog::registeredFactories());
readSettings();
loadSkins();
loadPluginsInfo();
@@ -86,6 +88,15 @@ void ConfigDialog::readSettings()
ui.hideToTrayRadioButton->setChecked(settings.value("Tray/hide_on_close", FALSE).toBool());
ui.closeGroupBox->setEnabled(ui.trayCheckBox->isChecked());
+
+ QString f_dialogName =
+ settings.value("FileDialog",QtFileDialogFactory::QtFileDialogFactoryName).toString();
+
+ int ind = FileDialog::registeredFactories().indexOf(f_dialogName);
+ if(ind != -1)
+ ui.fileDialogComboBox->setCurrentIndex(ind);
+ else
+ ui.fileDialogComboBox->setCurrentIndex(0);
}
void ConfigDialog::changePage ( QListWidgetItem *current, QListWidgetItem *previous )
@@ -329,6 +340,7 @@ void ConfigDialog::saveSettings()
settings.setValue ("Tray/message_delay", ui.messageDelaySpinBox->value());
settings.setValue ("Tray/show_tooltip", ui.toolTipCheckBox->isChecked());
settings.setValue ("Tray/hide_on_close",ui.hideToTrayRadioButton->isChecked());
+ settings.setValue ("FileDialog", ui.fileDialogComboBox->currentText());
}
diff --git a/src/configdialog.ui b/src/configdialog.ui
index 65e92eabe..6da70260e 100644
--- a/src/configdialog.ui
+++ b/src/configdialog.ui
@@ -426,6 +426,58 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="fileDialogTab" >
+ <attribute name="title" >
+ <string>File Dialog</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="fileDialogComboBox" />
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
</layout>
diff --git a/src/eqwidget.cpp b/src/eqwidget.cpp
index 627958dfd..7594bc345 100644
--- a/src/eqwidget.cpp
+++ b/src/eqwidget.cpp
@@ -21,8 +21,8 @@
#include <QEvent>
#include <QMenu>
#include <QInputDialog>
-#include <QFileDialog>
+#include "filedialog.h"
#include "skin.h"
#include "eqslider.h"
#include "eqtitlebar.h"
@@ -377,9 +377,10 @@ void EqWidget::importWinampEQF()
char header[31];
char name[257];
char bands[11];
- QString path = QFileDialog::getOpenFileName(this, tr("Import Preset"),
- "/home",
- "Winamp EQF (*.q1)");
+ QString path = FileDialog::getOpenFileName(this, tr("Import Preset"),
+ "/home",
+ QString("Winamp EQF (*.q1)"),NULL,true);
+
QFile file(path);
file.open(QIODevice::ReadOnly);
file.read ( header, 31);
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";
+
+
diff --git a/src/filedialog.h b/src/filedialog.h
new file mode 100644
index 000000000..8e82e98b7
--- /dev/null
+++ b/src/filedialog.h
@@ -0,0 +1,109 @@
+#ifndef FILEDIALOG_H
+#define FILEDIALOG_H
+
+#include <QString>
+#include <QStringList>
+
+#include <QFileDialog>
+#include <QMap>
+
+#define interface struct
+
+interface FileDialogFactory;
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////// FILE DIALOG //////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+class FileDialog : public QObject
+{
+Q_OBJECT
+ public:
+ enum Mode{AddFiles,AddDirs,SaveFiles};
+ static QString getExistingDirectory( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(),bool = FALSE);
+ static QString getOpenFileName(QWidget * parent = 0,const QString & caption = QString(),const QString & dir = QString(),const QString & filter = QString(),
+ QString * selectedFilter = 0,bool = FALSE);
+ static QStringList getOpenFileNames( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(),
+ const QString & filter = QString(), QString * selectedFilter = 0,bool = FALSE);
+ static QString getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(),
+ const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0,bool = FALSE);
+ static QStringList registeredFactories();
+
+ static bool isModal();
+ static void popup(QObject* ,const QString& = QString(),Mode = AddFiles,const QStringList& nameFilters = QStringList());
+ signals:
+ void filesAdded(const QStringList&);
+ protected:
+ FileDialog();
+ virtual QString existingDirectory( QWidget* , const QString& , const QString& );
+ virtual QString openFileName( QWidget* ,const QString& ,const QString& ,const QString& , QString* );
+ virtual QStringList openFileNames( QWidget* , const QString& , const QString& ,const QString& , QString* );
+ virtual QString saveFileName ( QWidget* , const QString& ,const QString& , const QString& , QString* );
+ virtual bool modal()const{ return TRUE;}
+ virtual ~FileDialog(){;}
+ virtual void init(QObject*);
+ virtual void raise(const QString& = QString(),Mode = AddFiles,const QStringList& = QStringList()){;}
+
+ static bool registerFactory(FileDialogFactory*);
+ public:
+ static void registerBuiltinFactories();
+ static void registerExternalFactories();
+ protected:
+ static FileDialog* instance();
+ static FileDialog* defaultInstance();
+ private:
+ static QMap <QString,FileDialogFactory*> factories;
+ static FileDialog* _instance;
+ static QString m_current_factory;
+ bool m_initialized;
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+
+interface FileDialogFactory
+{
+ virtual FileDialog* create() = 0;
+ virtual QString name() = 0;
+ virtual ~FileDialogFactory(){;}
+};
+
+Q_DECLARE_INTERFACE(FileDialogFactory, "FileDialogFactory/1.0");
+
+
+//////////////////////////////////////////// QT FILE DIALOG ////////////////////////////////////////////////////////////////////
+
+class QtFileDialog : public FileDialog
+{
+ public:
+ virtual ~QtFileDialog();
+ virtual QString existingDirectory(QWidget * parent , const QString & , const QString & dir);
+ virtual QString openFileName(QWidget * parent,const QString & caption,const QString & dir,const QString & filter,
+ QString * selectedFilter);
+ virtual QStringList openFileNames(QWidget * parent, const QString & caption , const QString & dir ,
+ const QString & filter, QString * selectedFilter);
+ virtual QString saveFileName ( QWidget * parent, const QString & caption,
+ const QString & dir, const QString & filter, QString * selectedFilter);
+};
+
+
+class QtFileDialogFactory : public QObject, public FileDialogFactory
+{
+ Q_OBJECT
+ Q_INTERFACES(FileDialogFactory);
+ public:
+ virtual FileDialog* create();
+ virtual QString name();
+ virtual ~QtFileDialogFactory(){;}
+ static QString QtFileDialogFactoryName;
+};
+
+
+#endif
+
+
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 4f2174646..b6243fb71 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -43,6 +43,7 @@
#include "jumptotrackdialog.h"
#include "aboutdialog.h"
#include <addurldialog.h>
+#include "filedialog.h"
MainWindow::MainWindow(const QStringList& args, QWidget *parent)
: QMainWindow(parent)
@@ -135,6 +136,9 @@ MainWindow::MainWindow(const QStringList& args, QWidget *parent)
new TcpServer(this);
+ FileDialog::registerBuiltinFactories();
+ FileDialog::registerExternalFactories();
+
m_playListModel->readSettings();
char buf[PATH_MAX + 1];
QString cwd = QString::fromLocal8Bit(getcwd(buf,PATH_MAX));
@@ -337,6 +341,7 @@ void MainWindow::closeEvent ( QCloseEvent *)
void MainWindow::addDir()
{
+ /*
QString s = QFileDialog::getExistingDirectory(
this,
tr("Choose a directory"),
@@ -347,10 +352,24 @@ void MainWindow::addDir()
return;
m_playListModel->addDirectory(s);
m_lastDir = s+"../";
+*/
+ if(FileDialog::isModal())
+ {
+ qWarning("void MainWindow::addDir()");
+ QString s = FileDialog::getExistingDirectory(this,tr("Choose a directory"),m_lastDir);
+
+ if (s.isEmpty())
+ return;
+ m_playListModel->addDirectory(s);
+ m_lastDir = s+"../";
+ }
+ else
+ FileDialog::popup(m_playListModel,m_lastDir,FileDialog::AddDirs,Decoder::nameFilters());
}
void MainWindow::addFile()
{
+ /*
QStringList files = QFileDialog::getOpenFileNames(
this,
tr("Select one or more files to open"),
@@ -358,12 +377,34 @@ void MainWindow::addFile()
Decoder::filter());
if (files.isEmpty ())
return;
- /*
- foreach(QString s, files)
- m_playListModel->load(new MediaFile(s));
- */
+
+ // foreach(QString s, files)
+ // m_playListModel->load(new MediaFile(s));
+
m_playListModel->addFiles(files);
m_lastDir = files.at(0);
+*/
+
+
+ if(FileDialog::isModal())
+ {
+ QStringList files = FileDialog::getOpenFileNames(
+ this,
+ tr("Select one or more files to open"),
+ m_lastDir,
+ Decoder::filter());
+ if (files.isEmpty ())
+ return;
+ /*
+ foreach(QString s, files)
+ m_playListModel->load(new MediaFile(s));
+ */
+ m_playListModel->addFiles(files);
+ m_lastDir = files.at(0);
+ }
+ else
+ FileDialog::popup(m_playListModel,m_lastDir,FileDialog::AddFiles,Decoder::nameFilters());
+
}
void MainWindow::clear()
@@ -565,16 +606,36 @@ void MainWindow::loadPlaylist()
l << fmt->getExtensions();
QString mask = tr("Playlist Files")+" (" + l.join(" *.").prepend("*.") + ")";
- QString f_name = QFileDialog::getOpenFileName(this,tr("Open Playlist"),m_lastDir,mask);
- if (!f_name.isEmpty())
+ if(FileDialog::isModal())
{
- m_playListModel->loadPlaylist(f_name);
- m_playlistName = QFileInfo(f_name).baseName();
+ //qWarning("Modal");
+ QString f_name = FileDialog::getOpenFileName(this,tr("Open Playlist"),m_lastDir,mask);
+ if (!f_name.isEmpty())
+ {
+ m_playListModel->loadPlaylist(f_name);
+ m_playlistName = QFileInfo(f_name).baseName();
+ }
+ m_lastDir = QFileInfo(f_name).absoluteDir().path();
+ }
+ else //FileDialog::popup(m_playListModel,m_lastDir,FileDialog::AddFiles,Decoder::nameFilters());
+ // TODO: implement playlist loading with nonmodal dialogs
+ // For now we'll use default dialog
+ {
+ //qWarning("Modal");
+ QString f_name = FileDialog::getOpenFileName(this,tr("Open Playlist"),m_lastDir,mask,0,true);
+ if (!f_name.isEmpty())
+ {
+ m_playListModel->loadPlaylist(f_name);
+ m_playlistName = QFileInfo(f_name).baseName();
+ }
+ m_lastDir = QFileInfo(f_name).absoluteDir().path();
}
- m_lastDir = QFileInfo(f_name).absoluteDir().path();
}
else
+ {
+ //qWarning("Non Modal");
qWarning("Error: There is no registered playlist parsers");
+ }
}
void MainWindow::savePlaylist()
@@ -587,15 +648,31 @@ void MainWindow::savePlaylist()
l << fmt->getExtensions();
QString mask = tr("Playlist Files")+" (" + l.join(" *.").prepend("*.") + ")";
- QString f_name = QFileDialog::getSaveFileName(this, tr("Save Playlist"),m_lastDir + "/" +
- m_playlistName + "." + l[0],mask);
+ if(FileDialog::isModal())
+ {
+ QString f_name = FileDialog::getSaveFileName(this, tr("Save Playlist"),m_lastDir + "/" +
+ m_playlistName + "." + l[0],mask);
- if (!f_name.isEmpty())
+ if (!f_name.isEmpty())
+ {
+ m_playListModel->savePlaylist(f_name);
+ m_playlistName = QFileInfo(f_name).baseName();
+ }
+ m_lastDir = QFileInfo(f_name).absoluteDir().path();
+ }
+ else // TODO: implement saving playlists with nonmodal dialogs
+ // For now we'll use default dialog
{
- m_playListModel->savePlaylist(f_name);
- m_playlistName = QFileInfo(f_name).baseName();
+ QString f_name = FileDialog::getSaveFileName(this, tr("Save Playlist"),m_lastDir + "/" +
+ m_playlistName + "." + l[0],mask,0,true);
+
+ if (!f_name.isEmpty())
+ {
+ m_playListModel->savePlaylist(f_name);
+ m_playlistName = QFileInfo(f_name).baseName();
+ }
+ m_lastDir = QFileInfo(f_name).absoluteDir().path();
}
- m_lastDir = QFileInfo(f_name).absoluteDir().path();
}
else
qWarning("Error: There is no registered playlist parsers");
diff --git a/src/playlistmodel.cpp b/src/playlistmodel.cpp
index 7a61563b0..06915daf1 100644
--- a/src/playlistmodel.cpp
+++ b/src/playlistmodel.cpp
@@ -361,6 +361,23 @@ void PlayListModel::addDirectory(const QString& s)
f_loader->start(QThread::IdlePriority);
}
+void PlayListModel::addFileList(const QStringList &l)
+{
+ foreach(QString str,l)
+ {
+ QFileInfo f_info(str);
+ if (f_info.exists())
+ {
+ if (f_info.isDir())
+ addDirectory(str);
+ else
+ addFile(str);
+ }
+ // Do processing the rest of events to avoid GUI freezing
+ QApplication::processEvents(QEventLoop::AllEvents,10);
+ }
+}
+
bool PlayListModel::setFileList(const QStringList & l)
{
bool model_cleared = FALSE;
@@ -379,7 +396,7 @@ bool PlayListModel::setFileList(const QStringList & l)
else
addFile(str);
}
- // Do the processing the rest of events to avoid GUI freezing
+ // Do processing the rest of events to avoid GUI freezing
QApplication::processEvents(QEventLoop::AllEvents,10);
}
@@ -763,9 +780,9 @@ void PlayListModel::savePlaylist(const QString & f_name)
void PlayListModel::loadExternalPlaylistFormats()
{
- QDir pluginsDir (qApp->applicationDirPath());
- pluginsDir.cdUp();
- pluginsDir.cd("Plugins/PlaylistFormats");
+ QDir pluginsDir (QDir::homePath()+"/.qmmp/plugins/PlaylistFormats");
+ //pluginsDir.cdUp();
+ //pluginsDir.cd("plugins/PlaylistFormats");
foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
diff --git a/src/playlistmodel.h b/src/playlistmodel.h
index 10285ba30..1a14bd723 100644
--- a/src/playlistmodel.h
+++ b/src/playlistmodel.h
@@ -92,25 +92,6 @@ public:
QList <QString> getTitles(int,int);
QList <QString> getTimes(int,int);
- void addFile(const QString&);
-
- /*!
- * Adds the list \b l of files to the model.
- */
- void addFiles(const QStringList& l);
-
- /*!
- * Adds \b dir to the model.
- */
- void addDirectory(const QString& dir);
-
- /*!
- * Loads list of files (regular files or directories),
- * returns \b TRUE if at least one file has been successfully loaded,
- * otherwise \b FALSE
- */
- bool setFileList(const QStringList&);
-
void moveItems(int from,int to);
/*!
@@ -174,7 +155,7 @@ public:
* Registers playlist format parser.
*/
bool registerPlaylistFormat(PlaylistFormat* p);
-
+
/*!
* Checks and loads external playlist format plugins
*/
@@ -184,7 +165,7 @@ public:
* Returns vector of reistered format parsers.
*/
const QList<PlaylistFormat*> registeredPlaylistFormats()const{return m_registered_pl_formats.values();}
-
+
const QStringList registeredPlaylistFormatNames()const{return m_registered_pl_formats.keys();}
/*!
@@ -217,6 +198,26 @@ public slots:
void showDetails();
void doCurrentVisibleRequest();
+ void addFile(const QString&);
+
+ /*!
+ * Adds the list \b l of files to the model.
+ */
+ void addFiles(const QStringList& l);
+
+ /*!
+ * Adds \b dir to the model.
+ */
+ void addDirectory(const QString& dir);
+
+ /*!
+ * Loads list of files (regular files or directories),
+ * returns \b TRUE if at least one file has been successfully loaded,
+ * otherwise \b FALSE
+ */
+ bool setFileList(const QStringList&);
+
+ void addFileList(const QStringList &l);
void randomizeList();
void reverseList();
@@ -245,12 +246,12 @@ public slots:
* Adds selected items to play queue.
*/
void addToQueue();
-
+
/*!
* Sets \b f media file to queue.
*/
void setQueued(MediaFile* f);
-
+
void preparePlayState();
private:
@@ -268,20 +269,20 @@ private:
* Returns bottommost row in current selection
*/
int bottommostInSelection(int);
-
+
/*!
* Creates and initializes file loader object.
*/
FileLoader* createFileLoader();
-
-
+
+
/*!
* Is someone of file loaders is running?
*/
bool isFileLoaderRunning()const;
-
+
/*!
- * Removes items from model. If \b inverted is \b false -
+ * Removes items from model. If \b inverted is \b false -
* selected items will be removed, else - unselected.
*/
void removeSelection(bool inverted = false);
@@ -321,15 +322,15 @@ private:
bool m_block_update_signals;
int m_total_length;
-
+
typedef QPointer<FileLoader> GuardedFileLoader;
-
+
/*! Vector of currently running file loaders.
* All loaders are automatically sheduled for deletion
* when finished.
*/
QVector<GuardedFileLoader> m_running_loaders;
-
+
friend class MainWindow;
};
diff --git a/src/src.pro b/src/src.pro
index 9db9ac694..0e8baefe0 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -8,7 +8,8 @@ include(../qmmp.pri)
FORMS += configdialog.ui \
preseteditor.ui \
jumptotrackdialog.ui \
- aboutdialog.ui
+ aboutdialog.ui
+
HEADERS += mainwindow.h \
fileloader.h \
button.h \
@@ -54,7 +55,10 @@ HEADERS += mainwindow.h \
jumptotrackdialog.h \
aboutdialog.h \
timeindicator.h \
- keyboardmanager.h
+ keyboardmanager.h \
+ filedialog.h
+
+
SOURCES += mainwindow.cpp \
mp3player.cpp \
fileloader.cpp \
@@ -99,7 +103,11 @@ SOURCES += mainwindow.cpp \
jumptotrackdialog.cpp \
aboutdialog.cpp \
timeindicator.cpp \
- keyboardmanager.cpp
+ keyboardmanager.cpp \
+ filedialog.cpp
+
+
+
contains(CONFIG,XSPF_PLUGIN){
message(*********************************************)
message(* XSPF support will be compiled as plugin *)