ui: fixed files and directories dialog to offer selection of files (issue #521)

* added and used QtFilesAndDirectoriesDialog in file list boxes for windows and linux
* implemented allowing to select multiple entries which adds more rows to the path listbox
This commit is contained in:
mlangkabel
2017-12-11 17:24:20 +01:00
parent 22b4d2a2b9
commit ec852affbe
6 changed files with 96 additions and 18 deletions
+2
View File
@@ -99,6 +99,8 @@ add_files(
qt/utility/QtDeviceScaledPixmap.h
qt/utility/QtFileDialog.cpp
qt/utility/QtFileDialog.h
qt/utility/QtFilesAndDirectoriesDialog.cpp
qt/utility/QtFilesAndDirectoriesDialog.h
qt/utility/QtHighlighter.cpp
qt/utility/QtHighlighter.h
qt/utility/QtScrollSpeedChangeListener.cpp
+14 -4
View File
@@ -84,9 +84,14 @@ void QtListItemWidget::handleButtonPress()
}
QStringList list = QtFileDialog::getFileNamesAndDirectories(this, QString::fromStdString(path.str()));
for (int i = 0; i < list.size(); i++)
if (!list.isEmpty())
{
setText(list.at(i));
setText(list.at(0));
}
for (int i = 1; i < list.size(); i++)
{
m_list->addListBoxItemWithText(list.at(i));
}
handleFocus();
@@ -260,8 +265,7 @@ void QtDirectoryListBox::setStringList(const std::vector<std::string>& list)
for (const std::string& str : list)
{
QtListItemWidget* widget = addListBoxItem();
widget->setText(QString::fromStdString(str));
addListBoxItemWithText(QString::fromStdString(str));
}
m_relativeRootDirectory = root;
@@ -269,6 +273,12 @@ void QtDirectoryListBox::setStringList(const std::vector<std::string>& list)
QTimer::singleShot(1, this, &QtDirectoryListBox::resize);
}
void QtDirectoryListBox::addListBoxItemWithText(const QString& text)
{
QtListItemWidget* widget = addListBoxItem();
widget->setText(text);
}
void QtDirectoryListBox::selectItem(QListWidgetItem* item)
{
for (int i = 0; i < m_list->count(); i++)
@@ -59,6 +59,8 @@ public:
std::vector<std::string> getStringList();
void setStringList(const std::vector<std::string>& list);
void addListBoxItemWithText(const QString& text);
void selectItem(QListWidgetItem* item);
bool isForStrings() const;
+11 -14
View File
@@ -4,36 +4,33 @@
#include <QListView>
#include <QTreeView>
#include "qt/utility/QtFilesAndDirectoriesDialog.h"
#include "utility/utilityApp.h"
QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const QString& dir)
{
QFileDialog dialog(parent);
QFileDialog* dialog = (utility::getOsType() == OS_MAC ? new QFileDialog(parent) : new QtFilesAndDirectoriesDialog(parent));
if (utility::getOsType() != OS_MAC)
{
dialog.setFileMode(QFileDialog::Directory);
}
dialog->setDirectory(getDir(dir));
dialog.setDirectory(getDir(dir));
QListView *l = dialog.findChild<QListView*>("listView");
QListView *l = dialog->findChild<QListView*>("listView");
if (l)
{
l->setSelectionMode(QAbstractItemView::SingleSelection);
l->setSelectionMode(QAbstractItemView::ExtendedSelection);
}
QTreeView *t = dialog.findChild<QTreeView*>();
QTreeView *t = dialog->findChild<QTreeView*>();
if (t)
{
t->setSelectionMode(QAbstractItemView::SingleSelection);
t->setSelectionMode(QAbstractItemView::ExtendedSelection);
}
QStringList list;
if (dialog.exec())
if (dialog->exec())
{
list = dialog.selectedFiles();
list = dialog->selectedFiles();
}
delete dialog;
return list;
}
@@ -0,0 +1,45 @@
#include "qt/utility/QtFilesAndDirectoriesDialog.h"
#include <QListView>
#include <QPushButton>
#include <QEvent>
#include "utility/file/FilePath.h"
#include "utility/utilityApp.h"
QtFilesAndDirectoriesDialog::QtFilesAndDirectoriesDialog(QWidget* parent)
: QFileDialog(parent)
{
setFileMode(QFileDialog::Directory);
setOption(QFileDialog::DontUseNativeDialog, true);
for (QPushButton* button: findChildren<QPushButton*>())
{
if (button->text().toLower().contains("open") || button->text().toLower().contains("choose"))
{
button->installEventFilter(this);
button->disconnect(SIGNAL(clicked()));
connect(button, &QPushButton::clicked, this, &QtFilesAndDirectoriesDialog::chooseClicked);
break;
}
}
}
QtFilesAndDirectoriesDialog::~QtFilesAndDirectoriesDialog()
{
}
void QtFilesAndDirectoriesDialog::chooseClicked()
{
QDialog::accept();
}
bool QtFilesAndDirectoriesDialog::eventFilter(QObject* obj, QEvent* event)
{
QPushButton* button = qobject_cast<QPushButton*>(obj);
if (event->type() == QEvent::EnabledChange && button && !button->isEnabled())
{
// we need to check if the button is already enabled, otherwise this would cause an infinite loop
button->setEnabled(true);
}
return QObject::eventFilter(obj, event);
}
@@ -0,0 +1,22 @@
#ifndef QT_FILES_AND_DIRECTORIES_DIALOG
#define QT_FILES_AND_DIRECTORIES_DIALOG
#include <QFileDialog>
class QListView;
class QtFilesAndDirectoriesDialog: public QFileDialog
{
Q_OBJECT
public:
QtFilesAndDirectoriesDialog(QWidget* parent);
virtual ~QtFilesAndDirectoriesDialog();
public slots:
void chooseClicked();
private:
bool eventFilter(QObject* obj, QEvent* event);
};
#endif // QT_FILES_AND_DIRECTORIES_DIALOG