Add option to remember last location for file dialogs

Add an option to remember the location of the last opened or saved file
and use it as the default location for the next file dialog because
always going back to the default location set in the preferences dialog
can be a real hastle.

See issues #224, #276 and #281.
This commit is contained in:
Martin Kleusberg
2015-05-03 13:22:13 +02:00
parent f21ff619f2
commit 861ecec527
11 changed files with 182 additions and 79 deletions
+2
View File
@@ -73,6 +73,7 @@ set(SQLB_MOC_HDR
src/CipherDialog.h
src/ExportSqlDialog.h
src/SqlUiLexer.h
src/FileDialog.h
)
set(SQLB_SRC
@@ -101,6 +102,7 @@ set(SQLB_SRC
src/CipherDialog.cpp
src/ExportSqlDialog.cpp
src/SqlUiLexer.cpp
src/FileDialog.cpp
)
set(SQLB_FORMS
+4 -6
View File
@@ -3,8 +3,8 @@
#include "sqlitedb.h"
#include "PreferencesDialog.h"
#include "src/qhexedit.h"
#include "FileDialog.h"
#include <QFileDialog>
#include <QKeySequence>
#include <QShortcut>
@@ -75,10 +75,9 @@ void EditDialog::importData()
for(int i=0;i<image_formats_list.size();++i)
image_formats.append(QString("*.%1 ").arg(QString::fromUtf8(image_formats_list.at(i))));
QString fileName = QFileDialog::getOpenFileName(
QString fileName = FileDialog::getOpenFileName(
this,
tr("Choose a file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString()
tr("Choose a file")
#ifndef Q_OS_MAC // Filters on OS X are buggy
, tr("Text files(*.txt);;Image files(%1);;All files(*)").arg(image_formats)
#endif
@@ -99,10 +98,9 @@ void EditDialog::importData()
void EditDialog::exportData()
{
QString fileName = QFileDialog::getSaveFileName(
QString fileName = FileDialog::getSaveFileName(
this,
tr("Choose a filename to export data"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.txt);;All files(*)"));
if(fileName.size() > 0)
+4 -7
View File
@@ -4,11 +4,11 @@
#include "PreferencesDialog.h"
#include "sqlitetablemodel.h"
#include "sqlite.h"
#include "FileDialog.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QFileDialog>
#include <QSettings>
ExportCsvDialog::ExportCsvDialog(DBBrowserDB* db, QWidget* parent, const QString& query, const QString& selection)
@@ -145,10 +145,9 @@ void ExportCsvDialog::accept()
if(!m_sQuery.isEmpty())
{
// called from sqlexecute query tab
QString sFilename = QFileDialog::getSaveFileName(
QString sFilename = FileDialog::getSaveFileName(
this,
tr("Choose a filename to export data"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.csv *.txt)"));
if(sFilename.isEmpty())
{
@@ -174,10 +173,9 @@ void ExportCsvDialog::accept()
QStringList filenames;
if(selectedItems.size() == 1)
{
QString fileName = QFileDialog::getSaveFileName(
QString fileName = FileDialog::getSaveFileName(
this,
tr("Choose a filename to export data"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.csv *.txt)"));
if(fileName.isEmpty())
{
@@ -190,10 +188,9 @@ void ExportCsvDialog::accept()
else
{
// ask for folder
QString csvfolder = QFileDialog::getExistingDirectory(
QString csvfolder = FileDialog::getExistingDirectory(
this,
tr("Choose a directory"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if(csvfolder.isEmpty())
+2 -3
View File
@@ -4,10 +4,10 @@
#include "PreferencesDialog.h"
#include "sqlitetablemodel.h"
#include "sqlite.h"
#include "FileDialog.h"
#include <QFile>
#include <QMessageBox>
#include <QFileDialog>
#include <QSettings>
static QString sSettingsGroup("exportsql");
@@ -62,10 +62,9 @@ void ExportSqlDialog::accept()
tr("Please select at least 1 table."));
return;
}
QString fileName = QFileDialog::getSaveFileName(
QString fileName = FileDialog::getSaveFileName(
this,
tr("Choose a filename to export"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.sql *.txt)"));
if(fileName.isEmpty())
+57
View File
@@ -0,0 +1,57 @@
#include "FileDialog.h"
#include "PreferencesDialog.h"
QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, const QString &filter, QString *selectedFilter, Options options)
{
QString result = QFileDialog::getOpenFileName(parent, caption, getFileDialogPath(), filter, selectedFilter, options);
if(!result.isEmpty())
setFileDialogPath(result);
return result;
}
QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, const QString& filter, QString* selectedFilter, Options options)
{
QString result = QFileDialog::getSaveFileName(parent, caption, getFileDialogPath(), filter, selectedFilter, options);
if(!result.isEmpty())
setFileDialogPath(result);
return result;
}
QString FileDialog::getExistingDirectory(QWidget* parent, const QString& caption, Options options)
{
QString result = QFileDialog::getExistingDirectory(parent, caption, getFileDialogPath(), options);
if(!result.isEmpty())
setFileDialogPath(result);
return result;
}
QString FileDialog::getFileDialogPath()
{
switch(PreferencesDialog::getSettingsValue("db", "savedefaultlocation").toInt())
{
case 0: // Remember last location
case 2: // Remember last location for current session only
return PreferencesDialog::getSettingsValue("db", "lastlocation").toString();
case 1: // Always use this locations
return PreferencesDialog::getSettingsValue("db", "defaultlocation").toString();
default:
return "";
}
}
void FileDialog::setFileDialogPath(const QString& new_path)
{
QString dir = QFileInfo(new_path).absolutePath();
switch(PreferencesDialog::getSettingsValue("db", "savedefaultlocation").toInt())
{
case 0: // Remember last location
PreferencesDialog::setSettingsValue("db", "lastlocation", dir);
break;
case 2: // Remember last location for current session only
PreferencesDialog::setSettingsValue("db", "lastlocation", dir, true);
break;
case 1: // Always use this locations
break; // Do nothing
}
}
+23
View File
@@ -0,0 +1,23 @@
#ifndef FILEDIALOG_H
#define FILEDIALOG_H
#include <QFileDialog>
class FileDialog : public QFileDialog
{
public:
static QString getOpenFileName(QWidget* parent = 0, const QString& caption = QString(),
const QString& filter = QString(), QString* selectedFilter = 0,
Options options = 0);
static QString getSaveFileName(QWidget* parent = 0, const QString& caption = QString(),
const QString& filter = QString(), QString* selectedFilter = 0,
Options options = 0);
static QString getExistingDirectory(QWidget* parent = 0, const QString& caption = QString(),
Options options = 0);
private:
static QString getFileDialogPath();
static void setFileDialogPath(const QString& new_path);
};
#endif
+16 -27
View File
@@ -17,8 +17,8 @@
#include "CipherDialog.h"
#include "ExportSqlDialog.h"
#include "SqlUiLexer.h"
#include "FileDialog.h"
#include <QFileDialog>
#include <QFile>
#include <QApplication>
#include <QTextStream>
@@ -198,10 +198,9 @@ bool MainWindow::fileOpen(const QString& fileName, bool dontAddToRecentFiles)
QString wFile = fileName;
if (!QFile::exists(wFile))
{
wFile = QFileDialog::getOpenFileName(
wFile = FileDialog::getOpenFileName(
this,
tr("Choose a database file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString()
tr("Choose a database file")
#ifndef Q_OS_MAC // Filters on OS X are buggy
, tr("SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*)")
#endif
@@ -243,7 +242,7 @@ bool MainWindow::fileOpen(const QString& fileName, bool dontAddToRecentFiles)
void MainWindow::fileNew()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Choose a filename to save under"), PreferencesDialog::getSettingsValue("db", "defaultlocation").toString());
QString fileName = FileDialog::getSaveFileName(this, tr("Choose a filename to save under"));
if(!fileName.isEmpty())
{
if(QFile::exists(fileName))
@@ -826,10 +825,9 @@ void MainWindow::mainTabSelected(int tabindex)
void MainWindow::importTableFromCSV()
{
QString wFile = QFileDialog::getOpenFileName(
QString wFile = FileDialog::getOpenFileName(
this,
tr("Choose a text file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.csv *.txt);;All files(*)"));
if (QFile::exists(wFile) )
@@ -898,10 +896,9 @@ void MainWindow::exportDatabaseToSQL()
void MainWindow::importDatabaseFromSQL()
{
// Get file name to import
QString fileName = QFileDialog::getOpenFileName(
QString fileName = FileDialog::getOpenFileName(
this,
tr("Choose a file to import"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.sql *.txt);;All files(*)"));
// Cancel when file doesn't exist
@@ -916,10 +913,9 @@ void MainWindow::importDatabaseFromSQL()
"If you answer no we will attempt to import the data in the SQL file to the current database."),
QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) || !db.isOpen())
{
newDbFile = QFileDialog::getSaveFileName(
newDbFile = FileDialog::getSaveFileName(
this,
tr("Choose a filename to save under"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString());
tr("Choose a filename to save under"));
if(QFile::exists(newDbFile))
{
QMessageBox::information(this, QApplication::applicationName(), tr("File %1 already exists. Please choose a different name.").arg(newDbFile));
@@ -1250,10 +1246,9 @@ unsigned int MainWindow::openSqlTab(bool resetCounter)
void MainWindow::openSqlFile()
{
QString file = QFileDialog::getOpenFileName(
QString file = FileDialog::getOpenFileName(
this,
tr("Select SQL file to open"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.sql *.txt);;All files(*)"));
if(QFile::exists(file))
@@ -1297,10 +1292,9 @@ void MainWindow::saveSqlFile()
void MainWindow::saveSqlFileAs()
{
QString file = QFileDialog::getSaveFileName(
QString file = FileDialog::getSaveFileName(
this,
tr("Select file name"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Text files(*.sql *.txt);;All files(*)"));
if(!file.isEmpty())
@@ -1313,10 +1307,9 @@ void MainWindow::saveSqlFileAs()
void MainWindow::loadExtension()
{
QString file = QFileDialog::getOpenFileName(
QString file = FileDialog::getOpenFileName(
this,
tr("Select extension file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Extensions(*.so *.dll);;All files(*)"));
if(file.isEmpty())
@@ -1719,9 +1712,8 @@ void MainWindow::on_treePlotColumns_itemDoubleClicked(QTreeWidgetItem *item, int
void MainWindow::on_butSavePlot_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,
QString fileName = FileDialog::getSaveFileName(this,
tr("Choose a filename to save under"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*)")
);
if(!fileName.isEmpty())
@@ -1790,9 +1782,8 @@ bool MainWindow::loadProject(QString filename)
// Show the open file dialog when no filename was passed as parameter
if(filename.isEmpty())
{
filename = QFileDialog::getOpenFileName(this,
filename = FileDialog::getOpenFileName(this,
tr("Choose a file to open"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("DB Browser for SQLite project file (*.sqbpro)"));
}
@@ -1930,9 +1921,8 @@ static void saveDbTreeState(const QTreeView* tree, QXmlStreamWriter& xml, QModel
void MainWindow::saveProject()
{
QString filename = QFileDialog::getSaveFileName(this,
QString filename = FileDialog::getSaveFileName(this,
tr("Choose a filename to save under"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("DB Browser for SQLite project file (*.sqbpro)")
);
if(!filename.isEmpty())
@@ -2014,10 +2004,9 @@ void MainWindow::saveProject()
void MainWindow::fileAttach()
{
// Get file name of database to attach
QString file = QFileDialog::getOpenFileName(
QString file = FileDialog::getOpenFileName(
this,
tr("Choose a database file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString());
tr("Choose a database file"));
if(!QFile::exists(file))
return;
+24 -11
View File
@@ -1,10 +1,10 @@
#include "PreferencesDialog.h"
#include "ui_PreferencesDialog.h"
#include "sqlitedb.h"
#include "FileDialog.h"
#include <QDir>
#include <QSettings>
#include <QFileDialog>
#include <QColorDialog>
#include <QMessageBox>
#include <QKeyEvent>
@@ -39,10 +39,9 @@ PreferencesDialog::~PreferencesDialog()
void PreferencesDialog::chooseLocation()
{
QString s = QFileDialog::getExistingDirectory(
QString s = FileDialog::getExistingDirectory(
this,
tr("Choose a directory"),
getSettingsValue("db", "defaultlocation").toString(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if(!s.isEmpty())
@@ -52,6 +51,7 @@ void PreferencesDialog::chooseLocation()
void PreferencesDialog::loadSettings()
{
ui->encodingComboBox->setCurrentIndex(ui->encodingComboBox->findText(getSettingsValue("db", "defaultencoding").toString(), Qt::MatchFixedString));
ui->comboDefaultLocation->setCurrentIndex(getSettingsValue("db", "savedefaultlocation").toInt());
ui->locationEdit->setText(getSettingsValue("db", "defaultlocation").toString());
ui->checkUpdates->setChecked(getSettingsValue("checkversion", "enabled").toBool());
ui->checkHideSchemaLinebreaks->setChecked(getSettingsValue("db", "hideschemalinebreaks").toBool());
@@ -97,6 +97,7 @@ void PreferencesDialog::saveSettings()
{
setSettingsValue("db", "defaultencoding", ui->encodingComboBox->currentText());
setSettingsValue("db", "defaultlocation", ui->locationEdit->text());
setSettingsValue("db", "savedefaultlocation", ui->comboDefaultLocation->currentIndex());
setSettingsValue("db", "hideschemalinebreaks", ui->checkHideSchemaLinebreaks->isChecked());
setSettingsValue("db", "foreignkeys", ui->foreignKeysCheckBox->isChecked());
setSettingsValue("db", "prefetchsize", ui->spinPrefetchSize->value());
@@ -156,13 +157,18 @@ QVariant PreferencesDialog::getSettingsValue(const QString& group, const QString
}
}
void PreferencesDialog::setSettingsValue(const QString& group, const QString& name, const QVariant& value)
void PreferencesDialog::setSettingsValue(const QString& group, const QString& name, const QVariant& value, bool dont_save_to_disk)
{
// Set the group and save the given value
QSettings settings(QApplication::organizationName(), QApplication::organizationName());
settings.beginGroup(group);
settings.setValue(name, value);
settings.endGroup();
// Sometime the value has to be saved for the current session only but get discarded when the application exits.
// In order to achieve this this flag can be set which disables the save to disk mechanism and only leaves the save to cache part active.
if(dont_save_to_disk == false)
{
// Set the group and save the given value
QSettings settings(QApplication::organizationName(), QApplication::organizationName());
settings.beginGroup(group);
settings.setValue(name, value);
settings.endGroup();
}
// Also change it in the cache
m_hCache[group + name] = value;
@@ -174,10 +180,18 @@ QVariant PreferencesDialog::getSettingsDefaultValue(const QString& group, const
if(group == "db" && name == "defaultencoding")
return "UTF-8";
// db/savedefaultlocation?
if(group == "db" && name == "savedefaultlocation")
return 2;
// db/defaultlocation?
if(group == "db" && name == "defaultlocation")
return QDir::homePath();
// db/lastlocation?
if(group == "db" && name == "lastlocation")
return getSettingsValue("db", "defaultlocation");
// db/hideschemalinebreaks?
if(group == "db" && name == "hideschemalinebreaks")
return false;
@@ -338,10 +352,9 @@ bool PreferencesDialog::eventFilter(QObject *obj, QEvent *event)
void PreferencesDialog::addExtension()
{
QString file = QFileDialog::getOpenFileName(
QString file = FileDialog::getOpenFileName(
this,
tr("Select extension file"),
PreferencesDialog::getSettingsValue("db", "defaultlocation").toString(),
tr("Extensions(*.so *.dll);;All files(*)"));
if(QFile::exists(file))
+1 -1
View File
@@ -21,7 +21,7 @@ public:
// Use these methods to access the application settings.
static QVariant getSettingsValue(const QString& group, const QString& name);
static void setSettingsValue(const QString& group, const QString& name, const QVariant& value);
static void setSettingsValue(const QString& group, const QString& name, const QVariant& value, bool dont_save_to_disk = false);
private slots:
virtual void loadSettings();
+45 -22
View File
@@ -28,32 +28,55 @@
</attribute>
<layout class="QFormLayout" name="formLayout_3">
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QLineEdit" name="locationEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>316</width>
<height>0</height>
</size>
</property>
<widget class="QComboBox" name="comboDefaultLocation">
<item>
<property name="text">
<string>Remember last location</string>
</property>
</item>
<item>
<property name="text">
<string>Always use this location</string>
</property>
</item>
<item>
<property name="text">
<string>Remember last location for session only</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QToolButton" name="setLocationButton">
<property name="text">
<string>...</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="locationEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>316</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="setLocationButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
+4 -2
View File
@@ -50,7 +50,8 @@ HEADERS += \
sqlite.h \
CipherDialog.h \
ExportSqlDialog.h \
SqlUiLexer.h
SqlUiLexer.h \
FileDialog.h
SOURCES += \
sqlitedb.cpp \
@@ -76,7 +77,8 @@ SOURCES += \
Application.cpp \
CipherDialog.cpp \
ExportSqlDialog.cpp \
SqlUiLexer.cpp
SqlUiLexer.cpp \
FileDialog.cpp
RESOURCES += icons/icons.qrc \
translations/flags/flags.qrc