From ac64d9ea04cce79f4c4b8a5a64be43e5251dadce Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Wed, 3 Feb 2016 07:58:24 +0000 Subject: renamed file dialog git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6121 90c681e8-e032-0410-971d-27865f9a5e38 --- .../ClassicFileDialog/ClassicFileDialog.pro | 39 -- .../ClassicFileDialog/classicfiledialog.cpp | 140 ------ .../ClassicFileDialog/classicfiledialog.h | 89 ---- .../ClassicFileDialog/classicfiledialog.ui | 173 ------- .../ClassicFileDialog/classicfiledialogimpl.cpp | 525 --------------------- .../ClassicFileDialog/classicfiledialogimpl.h | 116 ----- src/plugins/FileDialogs/FileDialogs.pro | 2 +- .../TwoPanelFileDialog/TwoPanelFileDialog.pro | 39 ++ .../TwoPanelFileDialog/twopanelfiledialog.cpp | 133 ++++++ .../TwoPanelFileDialog/twopanelfiledialog.h | 86 ++++ .../TwoPanelFileDialog/twopanelfiledialog.ui | 173 +++++++ .../TwoPanelFileDialog/twopanelfiledialogimpl.cpp | 525 +++++++++++++++++++++ .../TwoPanelFileDialog/twopanelfiledialogimpl.h | 116 +++++ 13 files changed, 1073 insertions(+), 1083 deletions(-) delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/ClassicFileDialog.pro delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.cpp delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.h delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.ui delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.cpp delete mode 100644 src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.h create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/TwoPanelFileDialog.pro create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.cpp create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.h create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.ui create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.cpp create mode 100644 src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.h (limited to 'src') diff --git a/src/plugins/FileDialogs/ClassicFileDialog/ClassicFileDialog.pro b/src/plugins/FileDialogs/ClassicFileDialog/ClassicFileDialog.pro deleted file mode 100644 index 3e54289e3..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/ClassicFileDialog.pro +++ /dev/null @@ -1,39 +0,0 @@ -include(../../plugins.pri) - -INCLUDEPATH += ../../../../src - -TARGET =$$PLUGINS_PREFIX/FileDialogs/classicfiledialog - - -HEADERS += classicfiledialog.h \ - classicfiledialogimpl.h - -SOURCES += classicfiledialog.cpp \ - classicfiledialogimpl.cpp - - -FORMS += classicfiledialog.ui - -CONFIG += warn_on plugin - -TEMPLATE = lib - -QMAKE_LIBDIR += ../../../../lib - -#RESOURCES += translations/translations.qrc - -unix { - isEmpty(LIB_DIR){ - LIB_DIR = /lib - } - target.path = $$LIB_DIR/classic/FileDialogs - INSTALLS += target - - QMAKE_CLEAN =$$PLUGINS_PREFIX/FileDialogs/libclassicfiledialog.so - LIBS += -lqmmpui -lqmmp -} - -win32 { - LIBS += -lqmmpui0 -lqmmp0 - QMAKE_LIBDIR += ../../../../bin -} diff --git a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.cpp b/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.cpp deleted file mode 100644 index 2b703b5fd..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************** -* Copyright (C) 2008-2012 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., * -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -***************************************************************************/ - -#include -#include -#include -#include -#include "classicfiledialogimpl.h" -#include "classicfiledialog.h" - -ClassicFileDialog::ClassicFileDialog() -{ - m_dialog = new ClassicFileDialogImpl(); - connect(m_dialog,SIGNAL(filesAdded(const QStringList&)),this,SIGNAL(filesAdded(const QStringList&))); -} - -void ClassicFileDialog::handleSelected(/*const QStringList& s */) -{ -} - -ClassicFileDialog::~ClassicFileDialog() -{ - qWarning("ClassicFileDialog::~ClassicFileDialog()"); - delete m_dialog; -} -void ClassicFileDialog::raise(const QString &dir, Mode mode, const QString &caption, - const QStringList &mask) -{ - m_dialog->setModeAndMask(dir, mode, mask); - m_dialog->setWindowTitle(caption); - m_dialog->show(); - m_dialog->raise(); -} - -QString ClassicFileDialog::existingDirectory(QWidget *parent, const QString &caption, const QString &dir) -{ - ClassicFileDialogImpl *dialog = new ClassicFileDialogImpl(parent); - dialog->setWindowTitle(caption); - dialog->setModeAndMask(dir, FileDialog::AddDir); - QStringList l; - if (dialog->exec() == QDialog::Accepted) - l = dialog->selectedFiles(); - dialog->deleteLater(); - return l.isEmpty() ? QString() : l.at(0); -} - -QString ClassicFileDialog::openFileName(QWidget *parent, const QString &caption, - const QString &dir, const QString &filter, QString*) -{ - ClassicFileDialogImpl *dialog = new ClassicFileDialogImpl(parent); - dialog->setWindowTitle(caption); - dialog->setModeAndMask(dir, FileDialog::AddFile, filter.split(";;")); - QStringList l; - if (dialog->exec() == QDialog::Accepted) - l = dialog->selectedFiles(); - dialog->deleteLater(); - return l.isEmpty() ? QString() : l.at(0); -} - -QStringList ClassicFileDialog::openFileNames(QWidget *parent, const QString &caption, - const QString &dir, const QString &filter, QString *) -{ - ClassicFileDialogImpl *dialog = new ClassicFileDialogImpl(parent); - dialog->setWindowTitle(caption); - dialog->setModeAndMask(dir, FileDialog::AddFiles, filter.split(";;")); - QStringList l; - if (dialog->exec() == QDialog::Accepted) - l = dialog->selectedFiles(); - dialog->deleteLater(); - return l; -} - -QString ClassicFileDialog::saveFileName (QWidget *parent, const QString &caption, - const QString &dir, const QString &filter, QString*) -{ - ClassicFileDialogImpl *dialog = new ClassicFileDialogImpl(parent); - dialog->setWindowTitle(caption); - dialog->setModeAndMask(dir, FileDialog::SaveFile, filter.split(";;")); - QStringList l; - if (dialog->exec() == QDialog::Accepted) - l = dialog->selectedFiles(); - dialog->deleteLater(); - if (l.isEmpty()) - return QString(); - else - return l.at(0); -} - -FileDialog* ClassicFileDialogFactory::create() -{ - return new ClassicFileDialog(); -} - -const FileDialogProperties ClassicFileDialogFactory::properties() const -{ - FileDialogProperties properties; - properties.name = tr("Classic File Dialog"); - properties.shortName = "classic_dialog"; - properties.hasAbout = true; - properties.modal = false; - return properties; -} - -void ClassicFileDialogFactory::showAbout(QWidget *parent) -{ - QMessageBox::about (parent, tr("About Qmmp File Dialog"), - tr("Qmmp File Dialog")+"\n"+ - tr("Written by:\n" - "Vladimir Kuznetsov \n" - "Ilya Kotov ")+"\n"+ - tr("Some code is copied from the Qt library")); - -} - -QTranslator *ClassicFileDialogFactory::createTranslator(QObject *parent) -{ - QTranslator *translator = new QTranslator(parent); - QString locale = Qmmp::systemLanguageID(); - translator->load(QString(":/classic_file_dialog_plugin_") + locale); - return translator; -} - -Q_EXPORT_PLUGIN2(ClassicFileDialog, ClassicFileDialogFactory) diff --git a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.h b/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.h deleted file mode 100644 index fcebd8207..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.h +++ /dev/null @@ -1,89 +0,0 @@ -/************************************************************************** -* Copyright (C) 2008-2012 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., * -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -***************************************************************************/ - - -#ifndef ClassicFileDialog_H -#define ClassicFileDialog_H - -#include - -class ClassicFileDialogImpl; - -class ClassicFileDialog : public FileDialog -{ - Q_OBJECT -public: - ClassicFileDialog(); - virtual ~ClassicFileDialog(); - - void raise(const QString &dir = QString(), - Mode mode = AddFiles, - const QString &caption = QString(), - const QStringList &mask = QStringList()); - - QString existingDirectory(QWidget *parent = 0, - const QString &caption = QString(), - const QString &dir = QString()); - - QString openFileName(QWidget *parent = 0, - const QString &caption = QString(), - const QString &dir = QString(), - const QString &filter = QString(), - QString *selectedFilter = 0); - - QStringList openFileNames(QWidget *parent = 0, - const QString &caption = QString(), - const QString &dir = QString(), - const QString &filter = QString(), - QString *selectedFilter = 0); - - QString saveFileName (QWidget *parent = 0, - const QString &caption = QString(), - const QString &dir = QString(), - const QString &filter = QString(), - QString *selectedFilter = 0); - -public slots: - void handleSelected(); - -private: - ClassicFileDialogImpl *m_dialog; -}; - - - - -class ClassicFileDialogFactory : public QObject, public FileDialogFactory -{ - Q_OBJECT - Q_INTERFACES(FileDialogFactory) -public: - virtual FileDialog* create(); - virtual const FileDialogProperties properties() const; - virtual void showAbout(QWidget*); - virtual QTranslator *createTranslator(QObject *parent); - virtual ~ClassicFileDialogFactory() - { - ; - } -}; - - -#endif diff --git a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.ui b/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.ui deleted file mode 100644 index 0b900c84b..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialog.ui +++ /dev/null @@ -1,173 +0,0 @@ - - - ClassicFileDialog - - - - 0 - 0 - 611 - 400 - - - - Add Files - - - true - - - - 6 - - - 6 - - - 6 - - - - - - 1 - 0 - - - - true - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - QAbstractItemView::NoEditTriggers - - - QAbstractItemView::SelectRows - - - - - QAbstractItemView::NoEditTriggers - - - - - - - - - - File name: - - - - - - - - - - Files of type: - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToMinimumContentsLength - - - - - - - - - - - Qt::Horizontal - - - - 232 - 20 - - - - - - - - Play - - - - - - - - 0 - 0 - - - - Add - - - - - - - - 0 - 0 - - - - Close - - - - - - - - - - - closeButton - clicked() - ClassicFileDialog - reject() - - - 459 - 291 - - - 153 - 289 - - - - - diff --git a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.cpp b/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.cpp deleted file mode 100644 index f82fff715..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.cpp +++ /dev/null @@ -1,525 +0,0 @@ -/************************************************************************** -* Copyright (C) 2016 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., * -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -***************************************************************************/ - -#include "classicfiledialogimpl.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -#define HISTORY_SIZE 8 - - -/** - * This variable has been copied from Qt library - */ - -const char *qt_file_dialog_filter_reg_exp = - "([a-zA-Z0-9 -]*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$"; - -/** - * This function has 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); -} - -ClassicFileDialogImpl::ClassicFileDialogImpl(QWidget * parent) : QDialog(parent) -{ - m_ui.setupUi(this); - setAttribute(Qt::WA_QuitOnClose, false); - m_mode = 0; - - m_dirModel = new QFileSystemModel(this); - m_dirModel->setReadOnly(true); - m_ui.dirListView->setModel(m_dirModel); - m_dirModel->setRootPath(""); - m_dirModel->setFilter(QDir::AllDirs | QDir::NoDot); - m_dirModel->setNameFilterDisables (false); - - connect(m_ui.dirListView->selectionModel(), - SIGNAL(selectionChanged (QItemSelection, QItemSelection)), - SLOT(updateDirSelection (QItemSelection, QItemSelection))); - - connect(m_ui.fileListWidget, SIGNAL(itemSelectionChanged()), SLOT(updateFileSelection ())); - - //PathCompleter* fileCompleter = new PathCompleter (m_fileModel, m_ui.fileListView, this); - //m_ui.fileNameLineEdit->setCompleter (fileCompleter); - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - //closeOnAddToolButton->setChecked(settings.value("ClassicFileDialog/close_on_add", false).toBool()); - restoreGeometry(settings.value("ClassicFileDialog/geometry").toByteArray()); - m_history = settings.value("ClassicFileDialog/history").toStringList(); - m_ui.lookInComboBox->addItems(m_history); - m_ui.lookInComboBox->setMaxCount(HISTORY_SIZE); - QCompleter* dirCompleter = new QCompleter (m_dirModel, this); - m_ui.lookInComboBox->setCompleter (dirCompleter); - - if(qApp->style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, 0, this)) - { - m_ui.playButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPlay)); - m_ui.addButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogOpenButton)); - m_ui.closeButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogCloseButton)); - } -} - -ClassicFileDialogImpl::~ClassicFileDialogImpl() -{ -} - -QStringList ClassicFileDialogImpl::selectedFiles () -{ - QStringList l; - if (m_mode == FileDialog::SaveFile) - { - QModelIndexList indexes = m_ui.dirListView->selectionModel()->selectedRows(0); - if(!indexes.isEmpty() && indexes.first().isValid()) - { - l << m_dirModel->filePath(indexes.first()) + "/" + m_ui.fileNameLineEdit->text(); - } - } - else if(m_mode == FileDialog::AddDir || m_mode == FileDialog::AddDirs) - { - foreach (QModelIndex index, m_ui.dirListView->selectionModel()->selectedRows(0)) - { - if(index.isValid() && (m_dirModel->fileName(index) != "..")) - { - l << m_dirModel->filePath(index); - } - } - } - else - { - foreach (QListWidgetItem *item, m_ui.fileListWidget->selectedItems()) - { - l << item->data(Qt::UserRole).toString(); - } - } - return l; -} - -void ClassicFileDialogImpl::updateDirSelection(const QItemSelection &s, const QItemSelection &) -{ - m_ui.fileListWidget->clear(); - - if(m_mode == FileDialog::AddDir || m_mode == FileDialog::AddDirs) - { - m_ui.addButton->setEnabled(!selectedFiles().isEmpty()); - return; - } - - if(s.indexes().isEmpty()) - return; - - QModelIndex index = s.indexes().first(); - - if(index.isValid()) - updateFileList(m_dirModel->filePath(index)); -} - -void ClassicFileDialogImpl::updateFileSelection () -{ - QStringList l; - QStringList files; - foreach(QListWidgetItem *item, m_ui.fileListWidget->selectedItems()) - { - if (!l.contains(item->text())) - { - files << item->data(Qt::UserRole).toString(); - l << item->text(); - } - } - - if (!l.isEmpty()) - { - QString str; - if (l.size() == 1) - str = l.at(0); - else - { - str = l.join ("\" \""); - str.append("\""); - str.prepend("\""); - } - if (!m_ui.fileNameLineEdit->hasFocus()) - m_ui.fileNameLineEdit->setText(str); - if (m_mode == FileDialog::AddFiles || m_mode == FileDialog::AddFile/* || FileDialog::SaveFile*/) - { - m_ui.addButton->setEnabled(true); - foreach(str, files) - { - if (QFileInfo(str).isDir()) - { - m_ui.addButton->setEnabled(false); - break; - } - } - } - else - m_ui.addButton->setEnabled(true); - } - else - { - m_ui.fileNameLineEdit->clear(); - m_ui.addButton->setEnabled(false); - } -} - -void ClassicFileDialogImpl::on_dirListView_doubleClicked(const QModelIndex &ind) -{ - if (!ind.isValid()) - return; - - QFileInfo info = m_dirModel->fileInfo(ind); - QModelIndex rootIndex = m_dirModel->setRootPath(info.canonicalFilePath()); - qDebug("+%s+", qPrintable(info.canonicalFilePath())); - if(rootIndex.isValid()) - m_ui.dirListView->setRootIndex(rootIndex); - m_ui.lookInComboBox->setEditText(m_dirModel->filePath(rootIndex)); - - - - /*{ - QFileInfo info = m_model->fileInfo(ind); - if (info.isDir()) - { - fileListView->setRootIndex(ind); - lookInComboBox->setEditText(m_model->filePath(ind)); - fileListView->selectionModel()->clear (); - //treeView->setRootIndex(ind); - //treeView->selectionModel()->clear (); - //m_model->setRootPath(m_model->filePath(ind)); - } - else - { - QStringList l; - l << m_model->filePath(ind); - addToHistory(l[0]); - addFiles(l); - } - }*/ -} - -void ClassicFileDialogImpl::on_lookInComboBox_activated(const QString &path) -{ - /*if (QDir(path).exists ()) - { - fileListView->setRootIndex(m_model->index(path)); - treeView->setRootIndex(m_model->index(path)); - m_model->setRootPath(path); - }*/ -} - -void ClassicFileDialogImpl::on_upToolButton_clicked() -{ -/*#ifndef Q_OS_WIN - if (!m_model->parent(fileListView->rootIndex()).isValid()) - return; -#endif - fileListView->setRootIndex(m_model->parent(fileListView->rootIndex())); - //treeView->setRootIndex(fileListView->rootIndex()); - lookInComboBox->setEditText(m_model->filePath(fileListView->rootIndex())); - fileListView->selectionModel()->clear (); - //m_model->setRootPath(m_model->filePath(treeView->rootIndex()));*/ -} - -void ClassicFileDialogImpl::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 (); - //m_model->setRootPath(m_model->filePath(ind)); - } - else - { - QStringList l; - l << m_model->filePath(ind); - addToHistory(l[0]); - addFiles(l); - } - }*/ -} - -void ClassicFileDialogImpl::on_fileListView_doubleClicked(const QModelIndex& ind) -{ - /*if (ind.isValid()) - { - QFileInfo info = m_model->fileInfo(ind); - if (info.isDir()) - { - fileListView->setRootIndex(ind); - lookInComboBox->setEditText(m_model->filePath(ind)); - fileListView->selectionModel()->clear (); - //treeView->setRootIndex(ind); - //treeView->selectionModel()->clear (); - //m_model->setRootPath(m_model->filePath(ind)); - } - else - { - QStringList l; - l << m_model->filePath(ind); - addToHistory(l[0]); - addFiles(l); - } - }*/ -} - -void ClassicFileDialogImpl::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 ClassicFileDialogImpl::on_addButton_clicked() -{ - QStringList l = selectedFiles(); - - if(!l.isEmpty()) - { - addToHistory(l.first()); - addFiles(l); - } -} - -void ClassicFileDialogImpl::setModeAndMask(const QString& path, FileDialog::Mode m, const QStringList& mask) -{ - m_mode = m; - m_ui.dirListView->clearSelection(); - m_ui.fileTypeComboBox->clear(); - - QFileInfo info(path); - QString fileName; - - if(info.isFile()) - { - fileName = info.fileName(); - info = QFileInfo(info.absolutePath()); - } - - if(!info.exists()) - { - info = QFileInfo(QDir::homePath()); - fileName.clear(); - } - - if (m_dirModel->filePath(m_ui.dirListView->rootIndex()) != info.absolutePath()) - { - m_dirModel->setRootPath(info.path()); - m_ui.dirListView->setRootIndex(m_dirModel->index(info.absolutePath())); - m_ui.dirListView->setCurrentIndex(m_dirModel->index(info.absoluteFilePath())); - m_ui.dirListView->selectionModel()->selectedRows(m_ui.dirListView->currentIndex().row()); - } - m_ui.lookInComboBox->setEditText(info.canonicalFilePath()); - - m_ui.fileNameLineEdit->setText(fileName); - m_ui.addButton->setEnabled(!fileName.isEmpty()); - - switch (m) - { - case FileDialog::AddFile: - case FileDialog::AddFiles: - case FileDialog::AddDirsFiles: - { - m_ui.fileListWidget->setVisible(true); - m_ui.playButton->setVisible(true); - m_ui.addButton->setText(tr("Add")); - m_ui.fileTypeComboBox->clear(); - m_ui.fileTypeComboBox->addItems(mask); - m_ui.fileTypeComboBox->setEnabled(true); - on_fileTypeComboBox_activated(0); - m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); - if(m == FileDialog::AddFile) - m_ui.fileListWidget->setSelectionMode(QAbstractItemView::SingleSelection); - else - m_ui.fileListWidget->setSelectionMode (QAbstractItemView::ExtendedSelection); - break; - } - case FileDialog::AddDir: - case FileDialog::AddDirs: - { - m_ui.fileListWidget->setVisible(false); - m_ui.playButton->setVisible(false); - m_ui.addButton->setText(tr("Add")); - m_ui.fileTypeComboBox->clear(); - m_ui.fileTypeComboBox->addItem(tr("Directories")); - m_ui.fileTypeComboBox->setEnabled(false); - if(m == FileDialog::AddDir) - m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); - else - m_ui.dirListView->setSelectionMode (QAbstractItemView::ExtendedSelection); - break; - } - case FileDialog::SaveFile: - { - m_ui.fileListWidget->setVisible(false); - m_ui.playButton->setVisible(false); - m_ui.addButton->setText(tr("Save")); - m_ui.fileTypeComboBox->clear(); - m_ui.fileTypeComboBox->addItems(mask); - m_ui.fileTypeComboBox->setEnabled(true); - on_fileTypeComboBox_activated(0); - m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); - m_ui.fileListWidget->setSelectionMode(QAbstractItemView::SingleSelection); - break; - } - default: - ; - } -} - -void ClassicFileDialogImpl::on_fileTypeComboBox_activated(int index) -{ - m_filters = qt_clean_filter_list(m_ui.fileTypeComboBox->itemText(index)); - - m_ui.fileListWidget->clear(); - - QModelIndexList indexes = m_ui.dirListView->selectionModel()->selectedRows(0); - - if(!indexes.isEmpty() && indexes.first().isValid()) - updateFileList(m_dirModel->filePath(indexes.first())); -} - -void ClassicFileDialogImpl::updateFileList(const QString &path) -{ - m_ui.fileListWidget->clear(); - QDir dir(path); - dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); - dir.setSorting(QDir::Name); - - foreach (QFileInfo info, dir.entryInfoList(m_filters)) - { - QListWidgetItem *item = new QListWidgetItem(info.fileName()); - item->setIcon(m_dirModel->iconProvider()->icon(info)); - item->setData(Qt::UserRole, info.absoluteFilePath()); - m_ui.fileListWidget->addItem(item); - } -} - -void ClassicFileDialogImpl::hideEvent (QHideEvent *event) -{ - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - //settings.setValue("ClassicFileDialog/close_on_add", closeOnAddToolButton->isChecked()); - settings.setValue("ClassicFileDialog/geometry", saveGeometry()); - settings.setValue("ClassicFileDialog/history", m_history); - QWidget::hideEvent(event); -} - -void ClassicFileDialogImpl::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(); - - m_ui.lookInComboBox->clear(); - m_ui.lookInComboBox->addItems(m_history); -} - -void ClassicFileDialogImpl::addFiles(const QStringList &list) -{ - if (!isModal()) - { - emit filesAdded(list); - accept(); - } - else if (m_mode == FileDialog::SaveFile) - { - //check file extension - QString f_name = m_ui.fileNameLineEdit->text(); - bool contains = false; - foreach(QString str, qt_clean_filter_list(m_ui.fileTypeComboBox->currentText())) - { - QRegExp regExp(str); - regExp.setPatternSyntax(QRegExp::Wildcard); - if (f_name.contains(regExp)) - { - contains = true; - break; - } - } - //add extensio to file name - if (!contains) - { - QString ext = qt_clean_filter_list(m_ui.fileTypeComboBox->currentText())[0]; - ext.remove("*"); - if (!ext.isEmpty() && ext != ".") - { - f_name.append(ext); - qDebug("ClassicFileDialogImpl: added file extension"); - m_ui.fileNameLineEdit->setText(f_name); - return; - } - } - QFileInfo info(list[0]); - - if (info.exists()) - { - if (QMessageBox::question (this, windowTitle (), - tr("%1 already exists.\nDo you want to replace it?") - .arg(m_ui.fileNameLineEdit->text()), - QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) - accept(); - else - return; - - } - accept(); - } - else - accept(); -} diff --git a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.h b/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.h deleted file mode 100644 index 3af02bcc3..000000000 --- a/src/plugins/FileDialogs/ClassicFileDialog/classicfiledialogimpl.h +++ /dev/null @@ -1,116 +0,0 @@ -/************************************************************************** -* Copyright (C) 20016 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., * -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -***************************************************************************/ - -#ifndef CLASSICFILEDIALOGIMPL_H -#define CLASSICFILEDIALOGIMPL_H - -#include "ui_classicfiledialog.h" -#include -#include -#include -#include -#include - - -class ClassicFileDialogImpl : public QDialog -{ - Q_OBJECT -public: - ClassicFileDialogImpl(QWidget *parent = 0); - - ~ClassicFileDialogImpl(); - - void setModeAndMask(const QString &path, FileDialog::Mode m, const QStringList& mask = QStringList()); - QStringList selectedFiles (); - -signals: - void filesAdded(const QStringList&); - -private slots: - void updateDirSelection(const QItemSelection&s, const QItemSelection&); - void updateFileSelection(); - void on_dirListView_doubleClicked(const QModelIndex&ind); - - void on_lookInComboBox_activated(const QString&); - void on_upToolButton_clicked(); - void on_fileListView_doubleClicked(const QModelIndex&); - void on_treeView_doubleClicked(const QModelIndex&); - void on_fileNameLineEdit_textChanged (const QString &text); - void on_addButton_clicked(); - void on_fileTypeComboBox_activated(int); - - -private: - void updateFileList(const QString &path); - void hideEvent (QHideEvent *event); - int m_mode; - QFileSystemModel* m_dirModel; - - Ui::ClassicFileDialog m_ui; - - void addToHistory(const QString &path); - void addFiles(const QStringList &list); - QStringList m_history; - QStringList m_filters; - -}; - -class PathCompleter : public QCompleter -{ - Q_OBJECT -public: - PathCompleter(QAbstractItemModel *model, QAbstractItemView *itemView, QObject *parent = 0) : QCompleter(model, parent) - { - m_itemView = itemView; - } - - QString pathFromIndex(const QModelIndex &index) const - { - const QFileSystemModel *fileModel = static_cast(model()); - QString currentLocation = fileModel->filePath(m_itemView->rootIndex()); - QString path = fileModel->filePath(index); - if (path.startsWith(currentLocation)) - { - path = path.mid(currentLocation.length() + 1); - } - return path; - } - - - QStringList splitPath(const QString &path) const - { - if (path.isEmpty()) - return QStringList(completionPrefix()); - QStringList parts; - if (!path.startsWith(QDir::separator())) - { - const QFileSystemModel *fileModel = static_cast(model()); - QString currentLocation = QDir::toNativeSeparators(fileModel->filePath(m_itemView->rootIndex())); - parts = QCompleter::splitPath(currentLocation); - } - parts << QCompleter::splitPath(path); - return parts; - } -private: - QAbstractItemView *m_itemView; -}; - - -#endif //CLASSICFILEDIALOGIMPL_H diff --git a/src/plugins/FileDialogs/FileDialogs.pro b/src/plugins/FileDialogs/FileDialogs.pro index 9d058ce23..fcf8a2d83 100644 --- a/src/plugins/FileDialogs/FileDialogs.pro +++ b/src/plugins/FileDialogs/FileDialogs.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS += QmmpFileDialog ClassicFileDialog +SUBDIRS += QmmpFileDialog TwoPanelFileDialog diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/TwoPanelFileDialog.pro b/src/plugins/FileDialogs/TwoPanelFileDialog/TwoPanelFileDialog.pro new file mode 100644 index 000000000..0a63a52af --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/TwoPanelFileDialog.pro @@ -0,0 +1,39 @@ +include(../../plugins.pri) + +INCLUDEPATH += ../../../../src + +TARGET =$$PLUGINS_PREFIX/FileDialogs/twopanelfiledialog + + +HEADERS += twopanelfiledialog.h \ + twopanelfiledialogimpl.h + +SOURCES += twopanelfiledialog.cpp \ + twopanelfiledialogimpl.cpp + + +FORMS += twopanelfiledialog.ui + +CONFIG += warn_on plugin + +TEMPLATE = lib + +QMAKE_LIBDIR += ../../../../lib + +#RESOURCES += translations/translations.qrc + +unix { + isEmpty(LIB_DIR){ + LIB_DIR = /lib + } + target.path = $$LIB_DIR/twopanel/FileDialogs + INSTALLS += target + + QMAKE_CLEAN =$$PLUGINS_PREFIX/FileDialogs/libtwopanelfiledialog.so + LIBS += -lqmmpui -lqmmp +} + +win32 { + LIBS += -lqmmpui0 -lqmmp0 + QMAKE_LIBDIR += ../../../../bin +} diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.cpp b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.cpp new file mode 100644 index 000000000..66f2d0214 --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.cpp @@ -0,0 +1,133 @@ +/************************************************************************** +* Copyright (C) 2008-2012 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., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +***************************************************************************/ + +#include +#include +#include +#include +#include "twopanelfiledialogimpl.h" +#include "twopanelfiledialog.h" + +TwoPanelFileDialog::TwoPanelFileDialog() +{ + m_dialog = new TwoPanelFileDialogImpl(); + connect(m_dialog, SIGNAL(filesAdded(QStringList)),this, SIGNAL(filesAdded(QStringList))); +} + +TwoPanelFileDialog::~TwoPanelFileDialog() +{ + qWarning("%s", Q_FUNC_INFO); + delete m_dialog; +} +void TwoPanelFileDialog::raise(const QString &dir, Mode mode, const QString &caption, + const QStringList &mask) +{ + m_dialog->setModeAndMask(dir, mode, mask); + m_dialog->setWindowTitle(caption); + m_dialog->show(); + m_dialog->raise(); +} + +QString TwoPanelFileDialog::existingDirectory(QWidget *parent, const QString &caption, const QString &dir) +{ + TwoPanelFileDialogImpl *dialog = new TwoPanelFileDialogImpl(parent); + dialog->setWindowTitle(caption); + dialog->setModeAndMask(dir, FileDialog::AddDir); + QStringList l; + if (dialog->exec() == QDialog::Accepted) + l = dialog->selectedFiles(); + dialog->deleteLater(); + return l.isEmpty() ? QString() : l.at(0); +} + +QString TwoPanelFileDialog::openFileName(QWidget *parent, const QString &caption, + const QString &dir, const QString &filter, QString*) +{ + TwoPanelFileDialogImpl *dialog = new TwoPanelFileDialogImpl(parent); + dialog->setWindowTitle(caption); + dialog->setModeAndMask(dir, FileDialog::AddFile, filter.split(";;")); + QStringList l; + if (dialog->exec() == QDialog::Accepted) + l = dialog->selectedFiles(); + dialog->deleteLater(); + return l.isEmpty() ? QString() : l.at(0); +} + +QStringList TwoPanelFileDialog::openFileNames(QWidget *parent, const QString &caption, + const QString &dir, const QString &filter, QString *) +{ + TwoPanelFileDialogImpl *dialog = new TwoPanelFileDialogImpl(parent); + dialog->setWindowTitle(caption); + dialog->setModeAndMask(dir, FileDialog::AddFiles, filter.split(";;")); + QStringList l; + if (dialog->exec() == QDialog::Accepted) + l = dialog->selectedFiles(); + dialog->deleteLater(); + return l; +} + +QString TwoPanelFileDialog::saveFileName (QWidget *parent, const QString &caption, + const QString &dir, const QString &filter, QString*) +{ + TwoPanelFileDialogImpl *dialog = new TwoPanelFileDialogImpl(parent); + dialog->setWindowTitle(caption); + dialog->setModeAndMask(dir, FileDialog::SaveFile, filter.split(";;")); + QStringList l; + if (dialog->exec() == QDialog::Accepted) + l = dialog->selectedFiles(); + dialog->deleteLater(); + if (l.isEmpty()) + return QString(); + else + return l.at(0); +} + +FileDialog* TwoPanelFileDialogFactory::create() +{ + return new TwoPanelFileDialog(); +} + +const FileDialogProperties TwoPanelFileDialogFactory::properties() const +{ + FileDialogProperties properties; + properties.name = tr("Two-panel File Dialog"); + properties.shortName = "twopanel_dialog"; + properties.hasAbout = true; + properties.modal = false; + return properties; +} + +void TwoPanelFileDialogFactory::showAbout(QWidget *parent) +{ + QMessageBox::about (parent, tr("About Two-panel File Dialog"), + tr("Two-panel File Dialog") + "\n" + + tr("Written by: Ilya Kotov ") + "\n" + + tr("Based on code from the Qt library")); +} + +QTranslator *TwoPanelFileDialogFactory::createTranslator(QObject *parent) +{ + QTranslator *translator = new QTranslator(parent); + QString locale = Qmmp::systemLanguageID(); + translator->load(QString(":/twopanel_file_dialog_plugin_") + locale); + return translator; +} + +Q_EXPORT_PLUGIN2(TwoPanelFileDialog, TwoPanelFileDialogFactory) diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.h b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.h new file mode 100644 index 000000000..9f3c5ae86 --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.h @@ -0,0 +1,86 @@ +/************************************************************************** +* Copyright (C) 2008-2012 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., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +***************************************************************************/ + + +#ifndef TWOPANELFILEDIALOG_H +#define TWOPANELFILEDIALOG_H + +#include + +class TwoPanelFileDialogImpl; + +class TwoPanelFileDialog : public FileDialog +{ + Q_OBJECT +public: + TwoPanelFileDialog(); + virtual ~TwoPanelFileDialog(); + + void raise(const QString &dir = QString(), + Mode mode = AddFiles, + const QString &caption = QString(), + const QStringList &mask = QStringList()); + + QString existingDirectory(QWidget *parent = 0, + const QString &caption = QString(), + const QString &dir = QString()); + + QString openFileName(QWidget *parent = 0, + const QString &caption = QString(), + const QString &dir = QString(), + const QString &filter = QString(), + QString *selectedFilter = 0); + + QStringList openFileNames(QWidget *parent = 0, + const QString &caption = QString(), + const QString &dir = QString(), + const QString &filter = QString(), + QString *selectedFilter = 0); + + QString saveFileName (QWidget *parent = 0, + const QString &caption = QString(), + const QString &dir = QString(), + const QString &filter = QString(), + QString *selectedFilter = 0); + +private: + TwoPanelFileDialogImpl *m_dialog; +}; + + + + +class TwoPanelFileDialogFactory : public QObject, public FileDialogFactory +{ + Q_OBJECT + Q_INTERFACES(FileDialogFactory) +public: + virtual FileDialog* create(); + virtual const FileDialogProperties properties() const; + virtual void showAbout(QWidget*); + virtual QTranslator *createTranslator(QObject *parent); + virtual ~TwoPanelFileDialogFactory() + { + ; + } +}; + + +#endif diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.ui b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.ui new file mode 100644 index 000000000..843a54efb --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialog.ui @@ -0,0 +1,173 @@ + + + TwoPanelFileDialog + + + + 0 + 0 + 611 + 400 + + + + Add Files + + + true + + + + 6 + + + 6 + + + 6 + + + + + + 1 + 0 + + + + true + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SelectRows + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + + File name: + + + + + + + + + + Files of type: + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToMinimumContentsLength + + + + + + + + + + + Qt::Horizontal + + + + 232 + 20 + + + + + + + + Play + + + + + + + + 0 + 0 + + + + Add + + + + + + + + 0 + 0 + + + + Close + + + + + + + + + + + closeButton + clicked() + TwoPanelFileDialog + reject() + + + 459 + 291 + + + 153 + 289 + + + + + diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.cpp b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.cpp new file mode 100644 index 000000000..53ee54e7e --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.cpp @@ -0,0 +1,525 @@ +/************************************************************************** +* Copyright (C) 2016 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., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +***************************************************************************/ + +#include "twopanelfiledialogimpl.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define HISTORY_SIZE 8 + + +/** + * This variable has been copied from Qt library + */ + +const char *qt_file_dialog_filter_reg_exp = + "([a-zA-Z0-9 -]*)\\(([a-zA-Z0-9_.*? +;#\\-\\[\\]@\\{\\}/!<>\\$%&=^~:\\|]*)\\)$"; + +/** + * This function has 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); +} + +TwoPanelFileDialogImpl::TwoPanelFileDialogImpl(QWidget * parent) : QDialog(parent) +{ + m_ui.setupUi(this); + setAttribute(Qt::WA_QuitOnClose, false); + m_mode = 0; + + m_dirModel = new QFileSystemModel(this); + m_dirModel->setReadOnly(true); + m_ui.dirListView->setModel(m_dirModel); + m_dirModel->setRootPath(""); + m_dirModel->setFilter(QDir::AllDirs | QDir::NoDot); + m_dirModel->setNameFilterDisables (false); + + connect(m_ui.dirListView->selectionModel(), + SIGNAL(selectionChanged (QItemSelection, QItemSelection)), + SLOT(updateDirSelection (QItemSelection, QItemSelection))); + + connect(m_ui.fileListWidget, SIGNAL(itemSelectionChanged()), SLOT(updateFileSelection ())); + + //PathCompleter* fileCompleter = new PathCompleter (m_fileModel, m_ui.fileListView, this); + //m_ui.fileNameLineEdit->setCompleter (fileCompleter); + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + //closeOnAddToolButton->setChecked(settings.value("TwoPanelFileDialog/close_on_add", false).toBool()); + restoreGeometry(settings.value("TwoPanelFileDialog/geometry").toByteArray()); + m_history = settings.value("TwoPanelFileDialog/history").toStringList(); + m_ui.lookInComboBox->addItems(m_history); + m_ui.lookInComboBox->setMaxCount(HISTORY_SIZE); + QCompleter* dirCompleter = new QCompleter (m_dirModel, this); + m_ui.lookInComboBox->setCompleter (dirCompleter); + + if(qApp->style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, 0, this)) + { + m_ui.playButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MediaPlay)); + m_ui.addButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogOpenButton)); + m_ui.closeButton->setIcon(qApp->style()->standardIcon(QStyle::SP_DialogCloseButton)); + } +} + +TwoPanelFileDialogImpl::~TwoPanelFileDialogImpl() +{ +} + +QStringList TwoPanelFileDialogImpl::selectedFiles () +{ + QStringList l; + if (m_mode == FileDialog::SaveFile) + { + QModelIndexList indexes = m_ui.dirListView->selectionModel()->selectedRows(0); + if(!indexes.isEmpty() && indexes.first().isValid()) + { + l << m_dirModel->filePath(indexes.first()) + "/" + m_ui.fileNameLineEdit->text(); + } + } + else if(m_mode == FileDialog::AddDir || m_mode == FileDialog::AddDirs) + { + foreach (QModelIndex index, m_ui.dirListView->selectionModel()->selectedRows(0)) + { + if(index.isValid() && (m_dirModel->fileName(index) != "..")) + { + l << m_dirModel->filePath(index); + } + } + } + else + { + foreach (QListWidgetItem *item, m_ui.fileListWidget->selectedItems()) + { + l << item->data(Qt::UserRole).toString(); + } + } + return l; +} + +void TwoPanelFileDialogImpl::updateDirSelection(const QItemSelection &s, const QItemSelection &) +{ + m_ui.fileListWidget->clear(); + + if(m_mode == FileDialog::AddDir || m_mode == FileDialog::AddDirs) + { + m_ui.addButton->setEnabled(!selectedFiles().isEmpty()); + return; + } + + if(s.indexes().isEmpty()) + return; + + QModelIndex index = s.indexes().first(); + + if(index.isValid()) + updateFileList(m_dirModel->filePath(index)); +} + +void TwoPanelFileDialogImpl::updateFileSelection () +{ + QStringList l; + QStringList files; + foreach(QListWidgetItem *item, m_ui.fileListWidget->selectedItems()) + { + if (!l.contains(item->text())) + { + files << item->data(Qt::UserRole).toString(); + l << item->text(); + } + } + + if (!l.isEmpty()) + { + QString str; + if (l.size() == 1) + str = l.at(0); + else + { + str = l.join ("\" \""); + str.append("\""); + str.prepend("\""); + } + if (!m_ui.fileNameLineEdit->hasFocus()) + m_ui.fileNameLineEdit->setText(str); + if (m_mode == FileDialog::AddFiles || m_mode == FileDialog::AddFile/* || FileDialog::SaveFile*/) + { + m_ui.addButton->setEnabled(true); + foreach(str, files) + { + if (QFileInfo(str).isDir()) + { + m_ui.addButton->setEnabled(false); + break; + } + } + } + else + m_ui.addButton->setEnabled(true); + } + else + { + m_ui.fileNameLineEdit->clear(); + m_ui.addButton->setEnabled(false); + } +} + +void TwoPanelFileDialogImpl::on_dirListView_doubleClicked(const QModelIndex &ind) +{ + if (!ind.isValid()) + return; + + QFileInfo info = m_dirModel->fileInfo(ind); + QModelIndex rootIndex = m_dirModel->setRootPath(info.canonicalFilePath()); + qDebug("+%s+", qPrintable(info.canonicalFilePath())); + if(rootIndex.isValid()) + m_ui.dirListView->setRootIndex(rootIndex); + m_ui.lookInComboBox->setEditText(m_dirModel->filePath(rootIndex)); + + + + /*{ + QFileInfo info = m_model->fileInfo(ind); + if (info.isDir()) + { + fileListView->setRootIndex(ind); + lookInComboBox->setEditText(m_model->filePath(ind)); + fileListView->selectionModel()->clear (); + //treeView->setRootIndex(ind); + //treeView->selectionModel()->clear (); + //m_model->setRootPath(m_model->filePath(ind)); + } + else + { + QStringList l; + l << m_model->filePath(ind); + addToHistory(l[0]); + addFiles(l); + } + }*/ +} + +void TwoPanelFileDialogImpl::on_lookInComboBox_activated(const QString &path) +{ + /*if (QDir(path).exists ()) + { + fileListView->setRootIndex(m_model->index(path)); + treeView->setRootIndex(m_model->index(path)); + m_model->setRootPath(path); + }*/ +} + +void TwoPanelFileDialogImpl::on_upToolButton_clicked() +{ +/*#ifndef Q_OS_WIN + if (!m_model->parent(fileListView->rootIndex()).isValid()) + return; +#endif + fileListView->setRootIndex(m_model->parent(fileListView->rootIndex())); + //treeView->setRootIndex(fileListView->rootIndex()); + lookInComboBox->setEditText(m_model->filePath(fileListView->rootIndex())); + fileListView->selectionModel()->clear (); + //m_model->setRootPath(m_model->filePath(treeView->rootIndex()));*/ +} + +void TwoPanelFileDialogImpl::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 (); + //m_model->setRootPath(m_model->filePath(ind)); + } + else + { + QStringList l; + l << m_model->filePath(ind); + addToHistory(l[0]); + addFiles(l); + } + }*/ +} + +void TwoPanelFileDialogImpl::on_fileListView_doubleClicked(const QModelIndex& ind) +{ + /*if (ind.isValid()) + { + QFileInfo info = m_model->fileInfo(ind); + if (info.isDir()) + { + fileListView->setRootIndex(ind); + lookInComboBox->setEditText(m_model->filePath(ind)); + fileListView->selectionModel()->clear (); + //treeView->setRootIndex(ind); + //treeView->selectionModel()->clear (); + //m_model->setRootPath(m_model->filePath(ind)); + } + else + { + QStringList l; + l << m_model->filePath(ind); + addToHistory(l[0]); + addFiles(l); + } + }*/ +} + +void TwoPanelFileDialogImpl::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 TwoPanelFileDialogImpl::on_addButton_clicked() +{ + QStringList l = selectedFiles(); + + if(!l.isEmpty()) + { + addToHistory(l.first()); + addFiles(l); + } +} + +void TwoPanelFileDialogImpl::setModeAndMask(const QString& path, FileDialog::Mode m, const QStringList& mask) +{ + m_mode = m; + m_ui.dirListView->clearSelection(); + m_ui.fileTypeComboBox->clear(); + + QFileInfo info(path); + QString fileName; + + if(info.isFile()) + { + fileName = info.fileName(); + info = QFileInfo(info.absolutePath()); + } + + if(!info.exists()) + { + info = QFileInfo(QDir::homePath()); + fileName.clear(); + } + + if (m_dirModel->filePath(m_ui.dirListView->rootIndex()) != info.absolutePath()) + { + m_dirModel->setRootPath(info.path()); + m_ui.dirListView->setRootIndex(m_dirModel->index(info.absolutePath())); + m_ui.dirListView->setCurrentIndex(m_dirModel->index(info.absoluteFilePath())); + m_ui.dirListView->selectionModel()->selectedRows(m_ui.dirListView->currentIndex().row()); + } + m_ui.lookInComboBox->setEditText(info.canonicalFilePath()); + + m_ui.fileNameLineEdit->setText(fileName); + m_ui.addButton->setEnabled(!fileName.isEmpty()); + + switch (m) + { + case FileDialog::AddFile: + case FileDialog::AddFiles: + case FileDialog::AddDirsFiles: + { + m_ui.fileListWidget->setVisible(true); + m_ui.playButton->setVisible(true); + m_ui.addButton->setText(tr("Add")); + m_ui.fileTypeComboBox->clear(); + m_ui.fileTypeComboBox->addItems(mask); + m_ui.fileTypeComboBox->setEnabled(true); + on_fileTypeComboBox_activated(0); + m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); + if(m == FileDialog::AddFile) + m_ui.fileListWidget->setSelectionMode(QAbstractItemView::SingleSelection); + else + m_ui.fileListWidget->setSelectionMode (QAbstractItemView::ExtendedSelection); + break; + } + case FileDialog::AddDir: + case FileDialog::AddDirs: + { + m_ui.fileListWidget->setVisible(false); + m_ui.playButton->setVisible(false); + m_ui.addButton->setText(tr("Add")); + m_ui.fileTypeComboBox->clear(); + m_ui.fileTypeComboBox->addItem(tr("Directories")); + m_ui.fileTypeComboBox->setEnabled(false); + if(m == FileDialog::AddDir) + m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); + else + m_ui.dirListView->setSelectionMode (QAbstractItemView::ExtendedSelection); + break; + } + case FileDialog::SaveFile: + { + m_ui.fileListWidget->setVisible(false); + m_ui.playButton->setVisible(false); + m_ui.addButton->setText(tr("Save")); + m_ui.fileTypeComboBox->clear(); + m_ui.fileTypeComboBox->addItems(mask); + m_ui.fileTypeComboBox->setEnabled(true); + on_fileTypeComboBox_activated(0); + m_ui.dirListView->setSelectionMode(QAbstractItemView::SingleSelection); + m_ui.fileListWidget->setSelectionMode(QAbstractItemView::SingleSelection); + break; + } + default: + ; + } +} + +void TwoPanelFileDialogImpl::on_fileTypeComboBox_activated(int index) +{ + m_filters = qt_clean_filter_list(m_ui.fileTypeComboBox->itemText(index)); + + m_ui.fileListWidget->clear(); + + QModelIndexList indexes = m_ui.dirListView->selectionModel()->selectedRows(0); + + if(!indexes.isEmpty() && indexes.first().isValid()) + updateFileList(m_dirModel->filePath(indexes.first())); +} + +void TwoPanelFileDialogImpl::updateFileList(const QString &path) +{ + m_ui.fileListWidget->clear(); + QDir dir(path); + dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); + dir.setSorting(QDir::Name); + + foreach (QFileInfo info, dir.entryInfoList(m_filters)) + { + QListWidgetItem *item = new QListWidgetItem(info.fileName()); + item->setIcon(m_dirModel->iconProvider()->icon(info)); + item->setData(Qt::UserRole, info.absoluteFilePath()); + m_ui.fileListWidget->addItem(item); + } +} + +void TwoPanelFileDialogImpl::hideEvent (QHideEvent *event) +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + //settings.setValue("TwoPanelFileDialog/close_on_add", closeOnAddToolButton->isChecked()); + settings.setValue("TwoPanelFileDialog/geometry", saveGeometry()); + settings.setValue("TwoPanelFileDialog/history", m_history); + QWidget::hideEvent(event); +} + +void TwoPanelFileDialogImpl::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(); + + m_ui.lookInComboBox->clear(); + m_ui.lookInComboBox->addItems(m_history); +} + +void TwoPanelFileDialogImpl::addFiles(const QStringList &list) +{ + if (!isModal()) + { + emit filesAdded(list); + accept(); + } + else if (m_mode == FileDialog::SaveFile) + { + //check file extension + QString f_name = m_ui.fileNameLineEdit->text(); + bool contains = false; + foreach(QString str, qt_clean_filter_list(m_ui.fileTypeComboBox->currentText())) + { + QRegExp regExp(str); + regExp.setPatternSyntax(QRegExp::Wildcard); + if (f_name.contains(regExp)) + { + contains = true; + break; + } + } + //add extensio to file name + if (!contains) + { + QString ext = qt_clean_filter_list(m_ui.fileTypeComboBox->currentText())[0]; + ext.remove("*"); + if (!ext.isEmpty() && ext != ".") + { + f_name.append(ext); + qDebug("TwoPanelFileDialogImpl: added file extension"); + m_ui.fileNameLineEdit->setText(f_name); + return; + } + } + QFileInfo info(list[0]); + + if (info.exists()) + { + if (QMessageBox::question (this, windowTitle (), + tr("%1 already exists.\nDo you want to replace it?") + .arg(m_ui.fileNameLineEdit->text()), + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) + accept(); + else + return; + + } + accept(); + } + else + accept(); +} diff --git a/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.h b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.h new file mode 100644 index 000000000..4085316e2 --- /dev/null +++ b/src/plugins/FileDialogs/TwoPanelFileDialog/twopanelfiledialogimpl.h @@ -0,0 +1,116 @@ +/************************************************************************** +* Copyright (C) 20016 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., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * +***************************************************************************/ + +#ifndef TWOPANELFILEDIALOGIMPL_H +#define TWOPANELFILEDIALOGIMPL_H + +#include "ui_twopanelfiledialog.h" +#include +#include +#include +#include +#include + + +class TwoPanelFileDialogImpl : public QDialog +{ + Q_OBJECT +public: + TwoPanelFileDialogImpl(QWidget *parent = 0); + + ~TwoPanelFileDialogImpl(); + + void setModeAndMask(const QString &path, FileDialog::Mode m, const QStringList& mask = QStringList()); + QStringList selectedFiles (); + +signals: + void filesAdded(const QStringList&); + +private slots: + void updateDirSelection(const QItemSelection&s, const QItemSelection&); + void updateFileSelection(); + void on_dirListView_doubleClicked(const QModelIndex&ind); + + void on_lookInComboBox_activated(const QString&); + void on_upToolButton_clicked(); + void on_fileListView_doubleClicked(const QModelIndex&); + void on_treeView_doubleClicked(const QModelIndex&); + void on_fileNameLineEdit_textChanged (const QString &text); + void on_addButton_clicked(); + void on_fileTypeComboBox_activated(int); + + +private: + void updateFileList(const QString &path); + void hideEvent (QHideEvent *event); + int m_mode; + QFileSystemModel* m_dirModel; + + Ui::TwoPanelFileDialog m_ui; + + void addToHistory(const QString &path); + void addFiles(const QStringList &list); + QStringList m_history; + QStringList m_filters; + +}; + +class PathCompleter : public QCompleter +{ + Q_OBJECT +public: + PathCompleter(QAbstractItemModel *model, QAbstractItemView *itemView, QObject *parent = 0) : QCompleter(model, parent) + { + m_itemView = itemView; + } + + QString pathFromIndex(const QModelIndex &index) const + { + const QFileSystemModel *fileModel = static_cast(model()); + QString currentLocation = fileModel->filePath(m_itemView->rootIndex()); + QString path = fileModel->filePath(index); + if (path.startsWith(currentLocation)) + { + path = path.mid(currentLocation.length() + 1); + } + return path; + } + + + QStringList splitPath(const QString &path) const + { + if (path.isEmpty()) + return QStringList(completionPrefix()); + QStringList parts; + if (!path.startsWith(QDir::separator())) + { + const QFileSystemModel *fileModel = static_cast(model()); + QString currentLocation = QDir::toNativeSeparators(fileModel->filePath(m_itemView->rootIndex())); + parts = QCompleter::splitPath(currentLocation); + } + parts << QCompleter::splitPath(path); + return parts; + } +private: + QAbstractItemView *m_itemView; +}; + + +#endif //TWOPANELFILEDIALOGIMPL_H -- cgit v1.2.3-13-gbd6f