Add (experimental) Qt settings

This commit is contained in:
Martchus 2016-08-16 00:37:17 +02:00
parent 544126373c
commit 77284da073
5 changed files with 89 additions and 33 deletions

View File

@ -8,6 +8,7 @@ set(META_APP_CATEGORIES "Utility")
set(META_APP_AUTHOR "Martchus") set(META_APP_AUTHOR "Martchus")
set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
set(META_APP_DESCRIPTION "A simple password store using AES-256-CBC encryption via OpenSSL") set(META_APP_DESCRIPTION "A simple password store using AES-256-CBC encryption via OpenSSL")
set(META_GUI_OPTIONAL true)
set(META_VERSION_MAJOR 2) set(META_VERSION_MAJOR 2)
set(META_VERSION_MINOR 1) set(META_VERSION_MINOR 1)
set(META_VERSION_PATCH 1) set(META_VERSION_PATCH 1)
@ -113,11 +114,13 @@ set(REQUIRED_ICONS
go-next go-next
qtcreator qtcreator
document-export document-export
password-generate
) )
# find c++utilities # find c++utilities
find_package(c++utilities 4.0.0 REQUIRED) find_package(c++utilities 4.0.0 REQUIRED)
use_cpp_utilities() use_cpp_utilities()
include(BasicConfig)
# find qtutilities # find qtutilities
if(WIDGETS_GUI OR QUICK_GUI) if(WIDGETS_GUI OR QUICK_GUI)
@ -130,7 +133,6 @@ find_package(passwordfile 3.1.0 REQUIRED)
use_password_file() use_password_file()
# include modules to apply configuration # include modules to apply configuration
include(BasicConfig)
if(WIDGETS_GUI OR QUICK_GUI) if(WIDGETS_GUI OR QUICK_GUI)
include(QtGuiConfig) include(QtGuiConfig)
include(QtConfig) include(QtConfig)

View File

@ -6,12 +6,13 @@
#include <qtutilities/resources/qtconfigarguments.h> #include <qtutilities/resources/qtconfigarguments.h>
#include <qtutilities/resources/resources.h> #include <qtutilities/resources/resources.h>
#include <qtutilities/settingsdialog/qtsettings.h>
#include <QTextCodec>
#include <QApplication> #include <QApplication>
#include <QFile> #include <QSettings>
using namespace ApplicationUtilities; using namespace ApplicationUtilities;
using namespace Dialogs;
namespace QtGui { namespace QtGui {
@ -20,14 +21,18 @@ int runWidgetsGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs,
SET_QT_APPLICATION_INFO; SET_QT_APPLICATION_INFO;
// init application // init application
QApplication a(argc, argv); QApplication a(argc, argv);
// restore Qt settings
QtSettings qtSettings;
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), QApplication::applicationName());
qtSettings.restore(settings);
qtSettings.apply();
// load resources needed by classes of qtutilities // load resources needed by classes of qtutilities
QtUtilitiesResources::init(); QtUtilitiesResources::init();
// apply settings specified via command line args // apply settings specified via command line args
qtConfigArgs.applySettings(); qtConfigArgs.applySettings();
LOAD_QT_TRANSLATIONS; LOAD_QT_TRANSLATIONS;
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
// init widgets GUI // init widgets GUI
QtGui::MainWindow w; MainWindow w(settings, &qtSettings);
w.show(); w.show();
if(!file.isEmpty()) { if(!file.isEmpty()) {
w.openFile(file); w.openFile(file);
@ -36,6 +41,8 @@ int runWidgetsGui(int argc, char *argv[], const QtConfigArguments &qtConfigArgs,
int res = a.exec(); int res = a.exec();
// cleanup resources // cleanup resources
QtUtilitiesResources::cleanup(); QtUtilitiesResources::cleanup();
// save Qt settings
qtSettings.save(settings);
return res; return res;
} }

View File

@ -17,6 +17,9 @@
#include <qtutilities/misc/desktoputils.h> #include <qtutilities/misc/desktoputils.h>
#include <qtutilities/misc/recentmenumanager.h> #include <qtutilities/misc/recentmenumanager.h>
#include <qtutilities/aboutdialog/aboutdialog.h> #include <qtutilities/aboutdialog/aboutdialog.h>
#include <qtutilities/settingsdialog/settingsdialog.h>
#include <qtutilities/settingsdialog/optioncategorymodel.h>
#include <qtutilities/settingsdialog/qtsettings.h>
#include <c++utilities/io/path.h> #include <c++utilities/io/path.h>
#include <c++utilities/io/catchiofailure.h> #include <c++utilities/io/catchiofailure.h>
@ -107,11 +110,14 @@ void MainWindow::setSomethingChanged(bool somethingChanged)
/*! /*!
* \brief Constructs a new main window. * \brief Constructs a new main window.
*/ */
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QSettings &settings, Dialogs::QtSettings *qtSettings, QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
m_ui(new Ui::MainWindow), m_ui(new Ui::MainWindow),
m_clearClipboardTimer(0), m_clearClipboardTimer(0),
m_aboutDlg(nullptr) m_aboutDlg(nullptr),
m_settings(settings),
m_qtSettings(qtSettings),
m_settingsDlg(nullptr)
{ {
// setup ui // setup ui
m_ui->setupUi(this); m_ui->setupUi(this);
@ -123,7 +129,6 @@ MainWindow::MainWindow(QWidget *parent) :
m_dontUpdateSelection = false; m_dontUpdateSelection = false;
updateUiStatus(); updateUiStatus();
// load settings // load settings
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), QApplication::applicationName());
settings.beginGroup(QStringLiteral("mainwindow")); settings.beginGroup(QStringLiteral("mainwindow"));
// init recent menu manager // init recent menu manager
m_recentMgr = new RecentMenuManager(m_ui->menuRecent, this); m_recentMgr = new RecentMenuManager(m_ui->menuRecent, this);
@ -170,7 +175,7 @@ MainWindow::MainWindow(QWidget *parent) :
pwVisibilityAction->setChecked(true); pwVisibilityAction->setChecked(true);
setPasswordVisibility(pwVisibilityAction); setPasswordVisibility(pwVisibilityAction);
// connect signals and slots // connect signals and slots
// file related actions // -> file related actions
connect(m_ui->actionSave, &QAction::triggered, this, &MainWindow::saveFile); connect(m_ui->actionSave, &QAction::triggered, this, &MainWindow::saveFile);
connect(m_ui->actionExport, &QAction::triggered, this, &MainWindow::exportFile); connect(m_ui->actionExport, &QAction::triggered, this, &MainWindow::exportFile);
connect(m_ui->actionShowContainingDirectory, &QAction::triggered, this, &MainWindow::showContainingDirectory); connect(m_ui->actionShowContainingDirectory, &QAction::triggered, this, &MainWindow::showContainingDirectory);
@ -178,34 +183,35 @@ MainWindow::MainWindow(QWidget *parent) :
connect(m_ui->actionCreate, &QAction::triggered, this, static_cast<bool (MainWindow::*)(void)>(&MainWindow::createFile)); connect(m_ui->actionCreate, &QAction::triggered, this, static_cast<bool (MainWindow::*)(void)>(&MainWindow::createFile));
connect(m_ui->actionQuit, &QAction::triggered, this, &MainWindow::close); connect(m_ui->actionQuit, &QAction::triggered, this, &MainWindow::close);
connect(m_ui->actionChangepassword, &QAction::triggered, this, &MainWindow::changePassword); connect(m_ui->actionChangepassword, &QAction::triggered, this, &MainWindow::changePassword);
// showing dialogs // -> showing dialogs
connect(m_ui->actionPasswordGenerator, &QAction::triggered, this, &MainWindow::showPassowrdGeneratorDialog); connect(m_ui->actionPasswordGenerator, &QAction::triggered, this, &MainWindow::showPassowrdGeneratorDialog);
connect(m_ui->actionAbout, &QAction::triggered, this, &MainWindow::showAboutDialog); connect(m_ui->actionAbout, &QAction::triggered, this, &MainWindow::showAboutDialog);
connect(m_ui->actionOpen, &QAction::triggered, this, &MainWindow::showOpenFileDialog); connect(m_ui->actionOpen, &QAction::triggered, this, &MainWindow::showOpenFileDialog);
connect(m_ui->actionSaveAs, &QAction::triggered, this, &MainWindow::showSaveFileDialog); connect(m_ui->actionSaveAs, &QAction::triggered, this, &MainWindow::showSaveFileDialog);
// add/remove account connect(m_ui->actionQtSettings, &QAction::triggered, this, &MainWindow::showSettingsDialog);
// -> add/remove account
connect(m_ui->actionAddAccount, &QAction::triggered, this, &MainWindow::addAccount); connect(m_ui->actionAddAccount, &QAction::triggered, this, &MainWindow::addAccount);
connect(m_ui->actionAddCategory, &QAction::triggered, this, &MainWindow::addCategory); connect(m_ui->actionAddCategory, &QAction::triggered, this, &MainWindow::addCategory);
connect(m_ui->actionRemoveRows, &QAction::triggered, this, &MainWindow::removeEntry); connect(m_ui->actionRemoveRows, &QAction::triggered, this, &MainWindow::removeEntry);
// insert/remove fields // -> insert/remove fields
connect(m_ui->actionInsertRow, &QAction::triggered, this, &MainWindow::insertRow); connect(m_ui->actionInsertRow, &QAction::triggered, this, &MainWindow::insertRow);
connect(m_ui->actionRemoveAccount, &QAction::triggered, this, &MainWindow::removeRows); connect(m_ui->actionRemoveAccount, &QAction::triggered, this, &MainWindow::removeRows);
// undo/redo // -> undo/redo
connect(m_ui->actionUndo, &QAction::triggered, m_undoStack, &QUndoStack::undo); connect(m_ui->actionUndo, &QAction::triggered, m_undoStack, &QUndoStack::undo);
connect(m_ui->actionRedo, &QAction::triggered, m_undoStack, &QUndoStack::redo); connect(m_ui->actionRedo, &QAction::triggered, m_undoStack, &QUndoStack::redo);
connect(m_undoStack, &QUndoStack::canUndoChanged, m_ui->actionUndo, &QAction::setEnabled); connect(m_undoStack, &QUndoStack::canUndoChanged, m_ui->actionUndo, &QAction::setEnabled);
connect(m_undoStack, &QUndoStack::canRedoChanged, m_ui->actionRedo, &QAction::setEnabled); connect(m_undoStack, &QUndoStack::canRedoChanged, m_ui->actionRedo, &QAction::setEnabled);
// view // -> view
connect(passwordVisibilityGroup, &QActionGroup::triggered, this, &MainWindow::setPasswordVisibility); connect(passwordVisibilityGroup, &QActionGroup::triggered, this, &MainWindow::setPasswordVisibility);
connect(m_ui->actionShowUndoStack, &QAction::triggered, this, &MainWindow::showUndoView); connect(m_ui->actionShowUndoStack, &QAction::triggered, this, &MainWindow::showUndoView);
// models // -> models
connect(m_ui->treeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &MainWindow::accountSelected); connect(m_ui->treeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &MainWindow::accountSelected);
connect(m_entryModel, &QAbstractItemModel::dataChanged, this, static_cast<void (MainWindow::*)(void)>(&MainWindow::setSomethingChanged)); connect(m_entryModel, &QAbstractItemModel::dataChanged, this, static_cast<void (MainWindow::*)(void)>(&MainWindow::setSomethingChanged));
connect(m_fieldModel, &QAbstractItemModel::dataChanged, this, static_cast<void (MainWindow::*)(void)>(&MainWindow::setSomethingChanged)); connect(m_fieldModel, &QAbstractItemModel::dataChanged, this, static_cast<void (MainWindow::*)(void)>(&MainWindow::setSomethingChanged));
// context menus // -> context menus
connect(m_ui->treeView, &QTableView::customContextMenuRequested, this, &MainWindow::showTreeViewContextMenu); connect(m_ui->treeView, &QTableView::customContextMenuRequested, this, &MainWindow::showTreeViewContextMenu);
connect(m_ui->tableView, &QTableView::customContextMenuRequested, this, &MainWindow::showTableViewContextMenu); connect(m_ui->tableView, &QTableView::customContextMenuRequested, this, &MainWindow::showTableViewContextMenu);
// filter // -> filter
//connect(m_ui->accountFilterLineEdit, &QLineEdit::textChanged, m_entryFilterModel, &QSortFilterProxyModel::setFilterFixedString); //connect(m_ui->accountFilterLineEdit, &QLineEdit::textChanged, m_entryFilterModel, &QSortFilterProxyModel::setFilterFixedString);
connect(m_ui->accountFilterLineEdit, &QLineEdit::textChanged, this, &MainWindow::applyFilter); connect(m_ui->accountFilterLineEdit, &QLineEdit::textChanged, this, &MainWindow::applyFilter);
// setup other controls // setup other controls
@ -275,13 +281,12 @@ void MainWindow::closeEvent(QCloseEvent *event)
m_undoView->close(); m_undoView->close();
} }
// save settings // save settings
QSettings settings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(), QApplication::applicationName()); m_settings.beginGroup(QStringLiteral("mainwindow"));
settings.beginGroup(QStringLiteral("mainwindow")); m_settings.setValue(QStringLiteral("geometry"), saveGeometry());
settings.setValue(QStringLiteral("geometry"), saveGeometry()); m_settings.setValue(QStringLiteral("state"), saveState());
settings.setValue(QStringLiteral("state"), saveState()); m_settings.setValue(QStringLiteral("recententries"), m_recentMgr->save());
settings.setValue(QStringLiteral("recententries"), m_recentMgr->save()); m_settings.setValue(QStringLiteral("accountfilter"), m_ui->accountFilterLineEdit->text());
settings.setValue(QStringLiteral("accountfilter"), m_ui->accountFilterLineEdit->text()); m_settings.setValue(QStringLiteral("alwayscreatebackup"), m_ui->actionAlwaysCreateBackup->isChecked());
settings.setValue(QStringLiteral("alwayscreatebackup"), m_ui->actionAlwaysCreateBackup->isChecked());
QString pwVisibility; QString pwVisibility;
if(m_ui->actionShowAlways->isChecked()) { if(m_ui->actionShowAlways->isChecked()) {
pwVisibility = QStringLiteral("always"); pwVisibility = QStringLiteral("always");
@ -290,8 +295,8 @@ void MainWindow::closeEvent(QCloseEvent *event)
} else { } else {
pwVisibility = QStringLiteral("editing"); pwVisibility = QStringLiteral("editing");
} }
settings.setValue(QStringLiteral("pwvisibility"), pwVisibility); m_settings.setValue(QStringLiteral("pwvisibility"), pwVisibility);
settings.endGroup(); m_settings.endGroup();
} }
void MainWindow::timerEvent(QTimerEvent *event) void MainWindow::timerEvent(QTimerEvent *event)
@ -302,6 +307,26 @@ void MainWindow::timerEvent(QTimerEvent *event)
} }
} }
/*!
* \brief Shows the settings dialog (which currently only consists of the Qt settings category).
*/
void MainWindow::showSettingsDialog()
{
if(!m_settingsDlg) {
m_settingsDlg = new SettingsDialog(this);
if(m_qtSettings) {
m_settingsDlg->setWindowTitle(tr("Qt settings"));
m_settingsDlg->setSingleCategory(m_qtSettings->category());
}
//connect(m_settingsDlg, &SettingsDialog::applied, this, &MainWindow::settingsAccepted);
}
if(m_settingsDlg->isHidden()) {
m_settingsDlg->showNormal();
} else {
m_settingsDlg->activateWindow();
}
}
/*! /*!
* \brief Shows the about dialog. * \brief Shows the about dialog.
*/ */

View File

@ -17,6 +17,7 @@ QT_FORWARD_DECLARE_CLASS(QCloseEvent)
QT_FORWARD_DECLARE_CLASS(QTreeWidgetItem) QT_FORWARD_DECLARE_CLASS(QTreeWidgetItem)
QT_FORWARD_DECLARE_CLASS(QUndoStack) QT_FORWARD_DECLARE_CLASS(QUndoStack)
QT_FORWARD_DECLARE_CLASS(QUndoView) QT_FORWARD_DECLARE_CLASS(QUndoView)
QT_FORWARD_DECLARE_CLASS(QSettings)
namespace Io { namespace Io {
DECLARE_ENUM_CLASS(EntryType, int); DECLARE_ENUM_CLASS(EntryType, int);
@ -29,6 +30,8 @@ class RecentMenuManager;
namespace Dialogs { namespace Dialogs {
class AboutDialog; class AboutDialog;
class SettingsDialog;
class QtSettings;
} }
namespace QtGui { namespace QtGui {
@ -46,7 +49,7 @@ class MainWindow : public QMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QSettings &settings, Dialogs::QtSettings *qtSettings = nullptr, QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
public slots: public slots:
@ -59,6 +62,13 @@ public slots:
bool saveFile(); bool saveFile();
void exportFile(); void exportFile();
bool closeFile(); bool closeFile();
// show dialogs
void showOpenFileDialog();
void showSaveFileDialog();
void showSettingsDialog();
void showAboutDialog();
void showPassowrdGeneratorDialog();
void showUndoView();
protected: protected:
bool eventFilter(QObject *obj, QEvent *event); bool eventFilter(QObject *obj, QEvent *event);
@ -66,12 +76,6 @@ protected:
void timerEvent(QTimerEvent *event); void timerEvent(QTimerEvent *event);
private slots: private slots:
// showing dialogs
void showAboutDialog();
void showPassowrdGeneratorDialog();
void showOpenFileDialog();
void showSaveFileDialog();
void showUndoView();
// file management // file management
bool showFile(); bool showFile();
// account/categories management // account/categories management
@ -124,6 +128,9 @@ private:
int m_clearClipboardTimer; int m_clearClipboardTimer;
MiscUtils::RecentMenuManager *m_recentMgr; MiscUtils::RecentMenuManager *m_recentMgr;
Dialogs::AboutDialog *m_aboutDlg; Dialogs::AboutDialog *m_aboutDlg;
QSettings &m_settings;
Dialogs::QtSettings *m_qtSettings;
Dialogs::SettingsDialog *m_settingsDlg;
}; };
} }

View File

@ -194,6 +194,9 @@
<property name="toolTip"> <property name="toolTip">
<string>Recently opened files</string> <string>Recently opened files</string>
</property> </property>
<property name="title">
<string/>
</property>
</widget> </widget>
<addaction name="actionCreate"/> <addaction name="actionCreate"/>
<addaction name="actionOpen"/> <addaction name="actionOpen"/>
@ -234,6 +237,7 @@
<string>&amp;Tools</string> <string>&amp;Tools</string>
</property> </property>
<addaction name="actionPasswordGenerator"/> <addaction name="actionPasswordGenerator"/>
<addaction name="actionQtSettings"/>
</widget> </widget>
<widget class="QMenu" name="menuView"> <widget class="QMenu" name="menuView">
<property name="title"> <property name="title">
@ -397,6 +401,9 @@
</property> </property>
</action> </action>
<action name="actionPasswordGenerator"> <action name="actionPasswordGenerator">
<property name="icon">
<iconset theme="password-generate"/>
</property>
<property name="text"> <property name="text">
<string>&amp;Password generator</string> <string>&amp;Password generator</string>
</property> </property>
@ -498,6 +505,14 @@
<string>&amp;hide always</string> <string>&amp;hide always</string>
</property> </property>
</action> </action>
<action name="actionQtSettings">
<property name="icon">
<iconset theme="qtcreator"/>
</property>
<property name="text">
<string>Qt settings</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<customwidgets> <customwidgets>