From 7ec02d28ea7cc3d48cc9dddfd22971a5b645f5b5 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Fri, 26 Jan 2018 12:43:17 +0100 Subject: [PATCH] ui: Filepicker fixes * don't reset filepath used to open file picker dialog for SaveFileDialog * don't reset filepath used to open filepicker for OpenProject dialog * fixed non-native file picker starts in wrong directory if provided with filename to open (instead of directory) * fixed non-native dialog displays machines root directory if empty path is provided --- src/lib_gui/qt/element/QtDirectoryListBox.cpp | 2 +- src/lib_gui/qt/element/QtLocationPicker.cpp | 4 +-- src/lib_gui/qt/graphics/QtGraphicsView.cpp | 2 +- src/lib_gui/qt/utility/QtFileDialog.cpp | 26 ++++++++++++------- src/lib_gui/qt/utility/QtFileDialog.h | 9 ++++--- src/lib_gui/qt/window/QtMainWindow.cpp | 2 +- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.cpp b/src/lib_gui/qt/element/QtDirectoryListBox.cpp index 2ce7d3cd..e167beea 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.cpp +++ b/src/lib_gui/qt/element/QtDirectoryListBox.cpp @@ -107,7 +107,7 @@ void QtListItemWidget::handleButtonPress() path = relativeRoot.getConcatenated(path); } - QStringList list = QtFileDialog::getFileNamesAndDirectories(this, QString::fromStdString(path.str())); + QStringList list = QtFileDialog::getFileNamesAndDirectories(this, path); if (!list.isEmpty()) { setText(list.at(0)); diff --git a/src/lib_gui/qt/element/QtLocationPicker.cpp b/src/lib_gui/qt/element/QtLocationPicker.cpp index 24a78351..55c17018 100644 --- a/src/lib_gui/qt/element/QtLocationPicker.cpp +++ b/src/lib_gui/qt/element/QtLocationPicker.cpp @@ -108,11 +108,11 @@ void QtLocationPicker::handleButtonPress() QString fileName; if (m_pickDirectory) { - fileName = QtFileDialog::getExistingDirectory(this, tr("Select Directory"), QString::fromStdString(path.str())); + fileName = QtFileDialog::getExistingDirectory(this, tr("Select Directory"), path); } else { - fileName = QtFileDialog::getOpenFileName(this, tr("Open File"), QString::fromStdString(path.str()), m_fileFilter); + fileName = QtFileDialog::getOpenFileName(this, tr("Open File"), path, m_fileFilter); } if (!fileName.isEmpty()) diff --git a/src/lib_gui/qt/graphics/QtGraphicsView.cpp b/src/lib_gui/qt/graphics/QtGraphicsView.cpp index a893d7e2..53b6c1c1 100644 --- a/src/lib_gui/qt/graphics/QtGraphicsView.cpp +++ b/src/lib_gui/qt/graphics/QtGraphicsView.cpp @@ -454,7 +454,7 @@ void QtGraphicsView::stopTimer() void QtGraphicsView::exportGraph() { QString fileName = QtFileDialog::showSaveFileDialog( - nullptr, "Save image", QDir::homePath(), "PNG (*.png);;JPEG (*.JPEG);;BMP Files (*.bmp)"); + nullptr, "Save image", FilePath(), "PNG (*.png);;JPEG (*.JPEG);;BMP Files (*.bmp)"); if (!fileName.isNull()) { diff --git a/src/lib_gui/qt/utility/QtFileDialog.cpp b/src/lib_gui/qt/utility/QtFileDialog.cpp index 2ddc7042..1aa9f53d 100644 --- a/src/lib_gui/qt/utility/QtFileDialog.cpp +++ b/src/lib_gui/qt/utility/QtFileDialog.cpp @@ -5,13 +5,19 @@ #include #include "qt/utility/QtFilesAndDirectoriesDialog.h" +#include "utility/file/FilePath.h" #include "utility/utilityApp.h" -QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const QString& dir) +QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const FilePath& path) { + const QString dir = getDir(QString::fromStdString((path.isDirectory() ? path : path.getParentDirectory()).str())); + QFileDialog* dialog = (utility::getOsType() == OS_MAC ? new QFileDialog(parent) : new QtFilesAndDirectoriesDialog(parent)); - dialog->setDirectory(getDir(dir)); + if (!dir.isEmpty()) + { + dialog->setDirectory(dir); + } QListView *l = dialog->findChild("listView"); if (l) @@ -35,25 +41,25 @@ QStringList QtFileDialog::getFileNamesAndDirectories(QWidget* parent, const QStr return list; } -QString QtFileDialog::getExistingDirectory(QWidget* parent, const QString& caption, const QString& dir) +QString QtFileDialog::getExistingDirectory(QWidget* parent, const QString& caption, const FilePath& dir) { - return QFileDialog::getExistingDirectory(parent, caption, getDir(dir)); + return QFileDialog::getExistingDirectory(parent, caption, getDir(QString::fromStdString(dir.str()))); } -QString QtFileDialog::getOpenFileName(QWidget* parent, const QString& caption, const QString& dir, const QString& filter) +QString QtFileDialog::getOpenFileName(QWidget* parent, const QString& caption, const FilePath& dir, const QString& filter) { - return QFileDialog::getOpenFileName(parent, caption, getDir(dir), filter); + return QFileDialog::getOpenFileName(parent, caption, getDir(QString::fromStdString(dir.str())), filter); } QString QtFileDialog::showSaveFileDialog( - QWidget *parent, const QString& title, const QString& directory, const QString& filter) + QWidget *parent, const QString& title, const FilePath& directory, const QString& filter) { #if defined(Q_OS_WIN) || defined(Q_OS_MAC) - return QFileDialog::getSaveFileName(parent, title, directory, filter); + return QFileDialog::getSaveFileName(parent, title, getDir(QString::fromStdString(directory.str())), filter); #else - QFileDialog dialog(parent, title, directory, filter); + QFileDialog dialog(parent, title, getDir(QString::fromStdString(directory.str())), filter); if (parent) { @@ -96,7 +102,7 @@ QString QtFileDialog::getDir(QString dir) { static bool used = false; - if (!used && !dir.size()) + if (!used && dir.isEmpty()) { dir = QDir::homePath(); } diff --git a/src/lib_gui/qt/utility/QtFileDialog.h b/src/lib_gui/qt/utility/QtFileDialog.h index c468d734..17356cbf 100644 --- a/src/lib_gui/qt/utility/QtFileDialog.h +++ b/src/lib_gui/qt/utility/QtFileDialog.h @@ -1,6 +1,7 @@ #ifndef QT_FILE_DIALOG_H #define QT_FILE_DIALOG_H +class FilePath; class QString; class QStringList; class QWidget; @@ -8,13 +9,13 @@ class QWidget; class QtFileDialog { public: - static QStringList getFileNamesAndDirectories(QWidget* parent, const QString& dir); + static QStringList getFileNamesAndDirectories(QWidget* parent, const FilePath& path); - static QString getExistingDirectory(QWidget* parent, const QString& caption, const QString& dir); - static QString getOpenFileName(QWidget* parent, const QString& caption, const QString& dir, const QString& filter); + static QString getExistingDirectory(QWidget* parent, const QString& caption, const FilePath& dir); + static QString getOpenFileName(QWidget* parent, const QString& caption, const FilePath& dir, const QString& filter); static QString showSaveFileDialog( - QWidget *parent, const QString& title, const QString& directory, const QString& filter); + QWidget *parent, const QString& title, const FilePath& directory, const QString& filter); private: static QString getDir(QString dir); diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index a7628073..f6b2baa6 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -585,7 +585,7 @@ void QtMainWindow::newProjectFromCDB(const std::string& filePath, const std::vec void QtMainWindow::openProject() { QString fileName = QtFileDialog::getOpenFileName( - this, tr("Open File"), QDir::homePath(), "Sourcetrail Project Files (*.srctrlprj *.coatiproject)"); + this, tr("Open File"), FilePath(), "Sourcetrail Project Files (*.srctrlprj *.coatiproject)"); if (!fileName.isEmpty()) {