aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-07-09 18:54:22 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-07-09 18:54:22 +0000
commite85b77286f66edecdc3707065e39b31f2e220f5a (patch)
tree8d92254944d3c9391c61231bc114758f9ac23370 /src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp
parentc0a9e456b6a935b67f2d3357a9cef7170cfee418 (diff)
downloadqmmp-e85b77286f66edecdc3707065e39b31f2e220f5a.tar.gz
qmmp-e85b77286f66edecdc3707065e39b31f2e220f5a.tar.bz2
qmmp-e85b77286f66edecdc3707065e39b31f2e220f5a.zip
completed file dialog support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@443 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp')
-rw-r--r--src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp339
1 files changed, 309 insertions, 30 deletions
diff --git a/src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp b/src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp
index 3abec0222..4121b7d28 100644
--- a/src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp
+++ b/src/plugins/FileDialogs/QmmpFileDialog/qmmpfiledialogimpl.cpp
@@ -1,37 +1,149 @@
+/**************************************************************************
+* Copyright (C) 2008 by Ilya Kotov *
+* forkotov02@hotmail.ru *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+***************************************************************************/
+
#include "qmmpfiledialogimpl.h"
#include <QDirModel>
#include <QApplication>
#include <QFileInfo>
#include <QStyle>
+#include <QSettings>
+#include <QMessageBox>
+
+#define HISTORY_SIZE 8
+
+
+/**
+ * This variable had been copied from Qt library
+ */
+
+const char *qt_file_dialog_filter_reg_exp =
+ "([a-zA-Z0-9 -]*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$";
+
+/**
+ * This function had been copied from Qt library
+ */
+
+// Makes a list of filters from a normal filter string "Image Files (*.png *.jpg)"
+static QStringList qt_clean_filter_list(const QString &filter)
+{
+ QRegExp regexp(QString::fromLatin1(qt_file_dialog_filter_reg_exp));
+ QString f = filter;
+ int i = regexp.indexIn(f);
+ if (i >= 0)
+ f = regexp.cap(2);
+ return f.split(QLatin1Char(' '), QString::SkipEmptyParts);
+}
+
+
-QmmpFileDialogImpl::QmmpFileDialogImpl( QWidget * parent, Qt::WindowFlags f) : QDialog(parent,f)
+QmmpFileDialogImpl::QmmpFileDialogImpl(QWidget * parent, Qt::WindowFlags f) : QDialog(parent,f)
{
setupUi(this);
setAttribute(Qt::WA_QuitOnClose, FALSE);
m_model = new QDirModel(this);
m_model->setSorting(QDir::Type /*| QDir::Name*/);
fileListView->setModel(m_model);
- //fileListView->setViewMode(QListView::IconMode);
+ treeView->setModel(m_model);
listToolButton->setChecked(true);
upToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowUp));
listToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_FileDialogListView));
- iconToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_FileDialogDetailedView));
+ closeOnAddToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogOkButton));
+ detailsToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_FileDialogDetailedView));
+ connect(fileListView->selectionModel(),
+ SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),
+ SLOT(updateSelection ()));
+ connect(treeView->selectionModel(),
+ SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),
+ SLOT(updateSelection ()));
+ PathCompleter* completer = new PathCompleter (m_model, fileListView, this);
+ fileNameLineEdit->setCompleter (completer);
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ closeOnAddToolButton->setChecked(settings.value("QMMPFileDialog/close_on_add", FALSE).toBool());
+ restoreGeometry(settings.value("QMMPFileDialog/geometry").toByteArray());
+ m_history = settings.value("QMMPFileDialog/history").toStringList();
+ lookInComboBox->addItems(m_history);
+ lookInComboBox->setMaxCount(HISTORY_SIZE);
+ QCompleter* dir_completer = new QCompleter (m_model, this);
+ lookInComboBox->setCompleter (dir_completer);
}
QmmpFileDialogImpl::~QmmpFileDialogImpl()
{
}
-void QmmpFileDialogImpl::on_lookInComboBox_activated(const QString&)
+QStringList QmmpFileDialogImpl::selectedFiles ()
{
- qWarning("TODO: %s %d",__FILE__,__LINE__);
+ QStringList l;
+ if (m_mode == FileDialog::SaveFile)
+ {
+ l << m_model->filePath(fileListView->rootIndex()) + "/" + fileNameLineEdit->text();
+ qDebug(qPrintable(l[0]));
+ }
+ else
+ {
+ QModelIndexList ml = fileListView->selectionModel()->selectedIndexes();
+ foreach(QModelIndex i,ml)
+ l << m_model->filePath(i);
+ }
+ return l;
+}
+
+void QmmpFileDialogImpl::on_lookInComboBox_activated(const QString &path)
+{
+ if (QDir(path).exists ())
+ {
+ fileListView->setRootIndex(m_model->index(path));
+ treeView->setRootIndex(m_model->index(path));
+ }
}
void QmmpFileDialogImpl::on_upToolButton_clicked()
{
fileListView->setRootIndex(m_model->parent(fileListView->rootIndex()));
+ treeView->setRootIndex(m_model->parent(fileListView->rootIndex()));
lookInComboBox->setEditText(m_model->filePath(fileListView->rootIndex()));
+ fileListView->selectionModel()->clear ();
+}
+
+void QmmpFileDialogImpl::on_treeView_doubleClicked(const QModelIndex& ind)
+{
+ if (ind.isValid())
+ {
+ QFileInfo info = m_model->fileInfo(ind);
+ if (info.isDir())
+ {
+ treeView->setRootIndex(ind);
+ lookInComboBox->setEditText(m_model->filePath(ind));
+ treeView->selectionModel()->clear ();
+ fileListView->setRootIndex(ind);
+ fileListView->selectionModel()->clear ();
+ }
+ else
+ {
+ QStringList l;
+ l << m_model->filePath(ind);
+ addToHistory(l[0]);
+ addFiles(l);
+ }
+ }
}
void QmmpFileDialogImpl::on_fileListView_doubleClicked(const QModelIndex& ind)
@@ -43,20 +155,41 @@ void QmmpFileDialogImpl::on_fileListView_doubleClicked(const QModelIndex& ind)
{
fileListView->setRootIndex(ind);
lookInComboBox->setEditText(m_model->filePath(ind));
+ fileListView->selectionModel()->clear ();
+ treeView->setRootIndex(ind);
+ treeView->selectionModel()->clear ();
}
else
{
QStringList l;
l << m_model->filePath(ind);
- emit filesAdded(l);
+ addToHistory(l[0]);
+ addFiles(l);
}
}
-
}
void QmmpFileDialogImpl::on_fileNameLineEdit_returnPressed()
{
- on_addPushButton_clicked();
+ qWarning("TODO: %s %d", __FILE__, __LINE__);
+}
+
+void QmmpFileDialogImpl::on_fileNameLineEdit_textChanged (const QString &text)
+{
+ if (m_mode == FileDialog::SaveFile)
+ {
+ addPushButton->setEnabled(!text.isEmpty());
+ return;
+ }
+ QModelIndex index;
+ if (text.startsWith("/"))
+ index = m_model->index(text);
+ else
+ index = m_model->index(m_model->filePath(fileListView->rootIndex()) + "/" + text);
+ if (!index.isValid() || !fileNameLineEdit->hasFocus())
+ return;
+ fileListView->selectionModel()->clear();
+ fileListView->selectionModel()->select(index, QItemSelectionModel::Select);
}
void QmmpFileDialogImpl::on_addPushButton_clicked()
@@ -65,53 +198,199 @@ void QmmpFileDialogImpl::on_addPushButton_clicked()
QStringList l;
foreach(QModelIndex i,ml)
l << m_model->filePath(i);
- qWarning("!!!!!!!!!");
- emit filesAdded(l);
+ if (!l.isEmpty())
+ {
+ addToHistory(l[0]);
+ addFiles(l);
+ }
}
void QmmpFileDialogImpl::setModeAndMask(const QString& d,FileDialog::Mode m, const QStringList& mask)
{
- if (m == FileDialog::AddFiles)
+ m_mode = m;
+ fileListView->clearSelection ();
+ treeView->clearSelection ();
+ fileTypeComboBox->clear();
+ addPushButton->setEnabled(FALSE);
+ addPushButton->setText(tr("Add"));
+
+ QString fileName;
+ QString path = d;
+
+ if (m == FileDialog::SaveFile)
{
- setWindowTitle("Add Files");
- m_model->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
- m_model->setNameFilters(mask);
+ if (path.endsWith('/'))
+ path.remove(path.size()-1, 1);
+ path = path.left(path.lastIndexOf ('/'));
+ fileName = d.section('/', -1);
+ fileNameLineEdit->setText(fileName);
+ addPushButton->setEnabled(!fileName.isEmpty());
+ addPushButton->setText(tr("Save"));
+ }
+
+ if (m_model->filePath(fileListView->rootIndex()) != path)
+ {
+ fileListView->setRootIndex(m_model->index(path));
+ treeView->setRootIndex(m_model->index(path));
}
- else if (m == FileDialog::AddDirs)
+
+ if (m == FileDialog::AddDirs || m == FileDialog::AddDir)
{
- setWindowTitle("Add Dirs");
- m_model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
+ m_model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot); //dirs only
+ fileTypeComboBox->addItem(tr("Directories"));
+ fileTypeComboBox->setEnabled(FALSE);
}
else
{
- setWindowTitle("Save File");
m_model->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
- qWarning("To be implemented...");
+ fileTypeComboBox->setEnabled(TRUE);
+ fileTypeComboBox->addItems(mask);
+ on_fileTypeComboBox_activated(0);
+ }
+
+ //set selection mode
+ if (m == FileDialog::AddDir || m == FileDialog::AddFile || m == FileDialog::SaveFile)
+ {
+ fileListView->setSelectionMode (QAbstractItemView::SingleSelection);
+ treeView->setSelectionMode (QAbstractItemView::SingleSelection);
+ }
+ else
+ {
+ fileListView->setSelectionMode (QAbstractItemView::ExtendedSelection);
+ treeView->setSelectionMode (QAbstractItemView::ExtendedSelection);
}
- m_model->setSorting(QDir::Type);
- fileListView->setRootIndex(m_model->index(d));
- m_model->sort(0);
- lookInComboBox->setEditText(QDir::cleanPath(d));
+ lookInComboBox->setEditText(QDir::cleanPath(path));
}
void QmmpFileDialogImpl::on_listToolButton_toggled(bool yes)
{
if (yes)
{
- iconToolButton->setChecked(false);
- fileListView->setViewMode(QListView::ListMode);
- fileListView->setGridSize(QSize(-1, -1));
+ stackedWidget->setCurrentIndex(0);
}
}
-void QmmpFileDialogImpl::on_iconToolButton_toggled(bool yes)
+void QmmpFileDialogImpl::on_detailsToolButton_toggled(bool yes)
{
if (yes)
{
- listToolButton->setChecked(false);
- fileListView->setViewMode(QListView::IconMode);
- fileListView->setGridSize(QSize(82, 82));
+ stackedWidget->setCurrentIndex(1);
}
}
+void QmmpFileDialogImpl::on_fileTypeComboBox_activated(int index)
+{
+ m_model->setNameFilters(qt_clean_filter_list(fileTypeComboBox->itemText(index)));
+}
+
+void QmmpFileDialogImpl::hideEvent (QHideEvent *event)
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.setValue("QMMPFileDialog/close_on_add", closeOnAddToolButton->isChecked());
+ settings.setValue("QMMPFileDialog/geometry", saveGeometry());
+ settings.setValue("QMMPFileDialog/history", m_history);
+ QWidget::hideEvent(event);
+}
+
+void QmmpFileDialogImpl::updateSelection ()
+{
+ QModelIndexList ml;
+ if (stackedWidget->currentIndex() == 0)
+ ml = fileListView->selectionModel()->selectedIndexes();
+ else
+ ml = treeView->selectionModel()->selectedIndexes();
+ QStringList l;
+ QStringList files;
+ foreach(QModelIndex i,ml)
+ {
+ if (!l.contains(m_model->filePath(i).section("/", -1)))
+ {
+ files << m_model->filePath(i);
+ l << m_model->filePath(i).section("/", -1);
+ }
+ }
+
+ if (!l.isEmpty())
+ {
+ QString str;
+ if (l.size() == 1)
+ str = l.at(0);
+ else
+ {
+ str = l.join ("\" \"");
+ str.append("\"");
+ str.prepend("\"");
+ }
+ if (!fileNameLineEdit->hasFocus())
+ fileNameLineEdit->setText(str);
+ if (m_mode == FileDialog::AddFiles || m_mode == FileDialog::AddFile/* || FileDialog::SaveFile*/)
+ {
+ addPushButton->setEnabled(TRUE);
+ foreach(str, files)
+ {
+ if (QFileInfo(str).isDir())
+ {
+ addPushButton->setEnabled(FALSE);
+ break;
+ }
+ }
+ }
+ else
+ addPushButton->setEnabled(TRUE);
+ }
+ else
+ {
+ fileNameLineEdit->clear();
+ addPushButton->setEnabled(FALSE);
+ }
+}
+
+void QmmpFileDialogImpl::addToHistory(const QString &path)
+{
+ QString path_copy = path;
+ if (path_copy.endsWith('/'))
+ path_copy.remove(path.size()-1, 1);
+ QString dir_path = path.left(path_copy.lastIndexOf ('/'));
+
+ m_history.removeAll(dir_path);
+ m_history.prepend(dir_path);
+
+ while ( m_history.size() > HISTORY_SIZE)
+ m_history.removeLast();
+
+ lookInComboBox->clear();
+ lookInComboBox->addItems(m_history);
+}
+
+void QmmpFileDialogImpl::addFiles(const QStringList &list)
+{
+ if (list.isEmpty())
+ return;
+ if (!isModal())
+ {
+ emit filesAdded(list);
+ if (closeOnAddToolButton->isChecked())
+ reject();
+ }
+ else if (m_mode == FileDialog::SaveFile)
+ {
+ //TODO check file extension
+ QFileInfo info(m_model->filePath(fileListView->rootIndex()) + "/" + fileNameLineEdit->text());
+
+ if (info.exists())
+ {
+ if (QMessageBox::question (this, windowTitle (), fileNameLineEdit->text() + " " +
+ tr("already exists.") + "\n" +
+ tr("Do you want to replace it?"),
+ QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok)
+ accept();
+ else
+ return;
+
+ }
+ accept();
+ }
+ else
+ accept();
+}