added option to hide passwords when editing

This commit is contained in:
Martchus 2015-11-03 21:22:50 +01:00
parent 89762b4830
commit 4bbb82d898
6 changed files with 133 additions and 64 deletions

View File

@ -143,7 +143,6 @@ MainWindow::MainWindow(QWidget *parent) :
// setup models, tree and table view // setup models, tree and table view
m_ui->treeView->setModel(m_entryFilterModel = new EntryFilterModel(this)); m_ui->treeView->setModel(m_entryFilterModel = new EntryFilterModel(this));
m_ui->tableView->setModel(m_fieldModel = new FieldModel(m_undoStack, this)); m_ui->tableView->setModel(m_fieldModel = new FieldModel(m_undoStack, this));
m_fieldModel->setHidePasswords(settings.value("hidepasswords", true).toBool());
m_entryFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_entryFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
m_entryFilterModel->setSourceModel(m_entryModel = new EntryModel(m_undoStack, this)); m_entryFilterModel->setSourceModel(m_entryModel = new EntryModel(m_undoStack, this));
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
@ -156,6 +155,22 @@ MainWindow::MainWindow(QWidget *parent) :
m_ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// splitter sizes // splitter sizes
m_ui->splitter->setSizes(QList<int>() << 100 << 800); m_ui->splitter->setSizes(QList<int>() << 100 << 800);
// password visibility group
auto *passwordVisibilityGroup = new QActionGroup(this);
passwordVisibilityGroup->addAction(m_ui->actionShowAlways);
passwordVisibilityGroup->addAction(m_ui->actionShowOnlyWhenEditing);
passwordVisibilityGroup->addAction(m_ui->actionHideAlways);
QString pwVisibility(settings.value(QStringLiteral("pwvisibility")).toString());
QAction *pwVisibilityAction;
if(pwVisibility == QStringLiteral("always")) {
pwVisibilityAction = m_ui->actionShowAlways;
} else if(pwVisibility == QStringLiteral("hidden")) {
pwVisibilityAction = m_ui->actionHideAlways;
} else {
pwVisibilityAction = m_ui->actionShowOnlyWhenEditing;
}
pwVisibilityAction->setChecked(true);
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);
@ -185,7 +200,7 @@ MainWindow::MainWindow(QWidget *parent) :
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(m_ui->actionHidePasswords, &QAction::triggered, m_fieldModel, &FieldModel::setHidePasswords); 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);
@ -200,7 +215,6 @@ MainWindow::MainWindow(QWidget *parent) :
// setup other controls // setup other controls
m_ui->actionAlwaysCreateBackup->setChecked(settings.value(QStringLiteral("alwayscreatebackup"), false).toBool()); m_ui->actionAlwaysCreateBackup->setChecked(settings.value(QStringLiteral("alwayscreatebackup"), false).toBool());
m_ui->accountFilterLineEdit->setText(settings.value(QStringLiteral("accountfilter"), QString()).toString()); m_ui->accountFilterLineEdit->setText(settings.value(QStringLiteral("accountfilter"), QString()).toString());
m_ui->actionHidePasswords->setChecked(m_fieldModel->hidePasswords());
m_ui->centralWidget->installEventFilter(this); m_ui->centralWidget->installEventFilter(this);
settings.endGroup(); settings.endGroup();
} }
@ -281,7 +295,15 @@ void MainWindow::closeEvent(QCloseEvent *event)
settings.setValue(QStringLiteral("recententries"), existingEntires); settings.setValue(QStringLiteral("recententries"), existingEntires);
settings.setValue(QStringLiteral("accountfilter"), m_ui->accountFilterLineEdit->text()); settings.setValue(QStringLiteral("accountfilter"), m_ui->accountFilterLineEdit->text());
settings.setValue(QStringLiteral("alwayscreatebackup"), m_ui->actionAlwaysCreateBackup->isChecked()); settings.setValue(QStringLiteral("alwayscreatebackup"), m_ui->actionAlwaysCreateBackup->isChecked());
settings.setValue(QStringLiteral("hidepasswords"), m_ui->actionHidePasswords->isChecked()); QString pwVisibility;
if(m_ui->actionShowAlways->isChecked()) {
pwVisibility = QStringLiteral("always");
} else if(m_ui->actionHideAlways->isChecked()) {
pwVisibility = QStringLiteral("hidden");
} else {
pwVisibility = QStringLiteral("editing");
}
settings.setValue(QStringLiteral("pwvisibility"), pwVisibility);
settings.endGroup(); settings.endGroup();
} }
@ -1080,6 +1102,22 @@ void MainWindow::setFieldType(FieldType fieldType)
} }
} }
/*!
* \brief Sets the password visibility of m_fieldModel depending on which action has been chosen.
*
* This private slot is connected to the triggered signal of the passwordVisibility QActionGroup.
*/
void MainWindow::setPasswordVisibility(QAction *selectedAction)
{
if(selectedAction == m_ui->actionShowAlways) {
m_fieldModel->setPasswordVisibility(PasswordVisibility::Always);
} else if(selectedAction == m_ui->actionShowOnlyWhenEditing) {
m_fieldModel->setPasswordVisibility(PasswordVisibility::OnlyWhenEditing);
} else if(selectedAction == m_ui->actionHideAlways) {
m_fieldModel->setPasswordVisibility(PasswordVisibility::Never);
}
}
/*! /*!
* \brief Asks the user to change the password which will be used when calling saveFile() next time. * \brief Asks the user to change the password which will be used when calling saveFile() next time.
*/ */

View File

@ -86,6 +86,7 @@ private Q_SLOTS:
void markAsPasswordField(); void markAsPasswordField();
void markAsNormalField(); void markAsNormalField();
void setFieldType(Io::FieldType fieldType); void setFieldType(Io::FieldType fieldType);
void setPasswordVisibility(QAction *selectedAction);
QString selectedFieldsString() const; QString selectedFieldsString() const;
void insertFields(const QString &fieldsString); void insertFields(const QString &fieldsString);
void copyFieldsForXMilliSeconds(int x = 5000); void copyFieldsForXMilliSeconds(int x = 5000);

View File

@ -183,7 +183,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>848</width> <width>848</width>
<height>29</height> <height>27</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuProgramm"> <widget class="QMenu" name="menuProgramm">
@ -196,8 +196,7 @@
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="document-open-recent"> <iconset theme="document-open-recent">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<addaction name="actionSepRecent"/> <addaction name="actionSepRecent"/>
<addaction name="actionClearRecent"/> <addaction name="actionClearRecent"/>
@ -246,7 +245,15 @@
<property name="title"> <property name="title">
<string>&amp;View</string> <string>&amp;View</string>
</property> </property>
<addaction name="actionHidePasswords"/> <widget class="QMenu" name="menuPassword_visibility">
<property name="title">
<string>Password &amp;visibility</string>
</property>
<addaction name="actionShowAlways"/>
<addaction name="actionShowOnlyWhenEditing"/>
<addaction name="actionHideAlways"/>
</widget>
<addaction name="menuPassword_visibility"/>
<addaction name="actionShowUndoStack"/> <addaction name="actionShowUndoStack"/>
</widget> </widget>
<addaction name="menuProgramm"/> <addaction name="menuProgramm"/>
@ -263,8 +270,7 @@
<action name="actionOpen"> <action name="actionOpen">
<property name="icon"> <property name="icon">
<iconset theme="document-open"> <iconset theme="document-open">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Open ...</string> <string>&amp;Open ...</string>
@ -276,8 +282,7 @@
<action name="actionQuit"> <action name="actionQuit">
<property name="icon"> <property name="icon">
<iconset theme="application-exit"> <iconset theme="application-exit">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Quit</string> <string>&amp;Quit</string>
@ -289,8 +294,7 @@
<action name="actionAbout"> <action name="actionAbout">
<property name="icon"> <property name="icon">
<iconset theme="help-about"> <iconset theme="help-about">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;About</string> <string>&amp;About</string>
@ -299,8 +303,7 @@
<action name="actionSave"> <action name="actionSave">
<property name="icon"> <property name="icon">
<iconset theme="document-save"> <iconset theme="document-save">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Save</string> <string>&amp;Save</string>
@ -312,8 +315,7 @@
<action name="actionCreate"> <action name="actionCreate">
<property name="icon"> <property name="icon">
<iconset theme="document-new"> <iconset theme="document-new">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;New ...</string> <string>&amp;New ...</string>
@ -325,8 +327,7 @@
<action name="actionClose"> <action name="actionClose">
<property name="icon"> <property name="icon">
<iconset theme="window-close"> <iconset theme="window-close">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Close</string> <string>&amp;Close</string>
@ -338,8 +339,7 @@
<action name="actionChangepassword"> <action name="actionChangepassword">
<property name="icon"> <property name="icon">
<iconset theme="dialog-password"> <iconset theme="dialog-password">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Change &amp;password ...</string> <string>Change &amp;password ...</string>
@ -348,8 +348,7 @@
<action name="actionAddAccount"> <action name="actionAddAccount">
<property name="icon"> <property name="icon">
<iconset theme="list-add"> <iconset theme="list-add">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Add new account</string> <string>&amp;Add new account</string>
@ -361,8 +360,7 @@
<action name="actionSaveAs"> <action name="actionSaveAs">
<property name="icon"> <property name="icon">
<iconset theme="document-save-as"> <iconset theme="document-save-as">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Sa&amp;ve as ...</string> <string>Sa&amp;ve as ...</string>
@ -374,8 +372,7 @@
<action name="actionRemoveAccount"> <action name="actionRemoveAccount">
<property name="icon"> <property name="icon">
<iconset theme="list-remove"> <iconset theme="list-remove">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="iconText"> <property name="iconText">
<string>Remove selected entry</string> <string>Remove selected entry</string>
@ -387,8 +384,7 @@
<action name="actionInsertRow"> <action name="actionInsertRow">
<property name="icon"> <property name="icon">
<iconset theme="insert-text"> <iconset theme="insert-text">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Insert field</string> <string>&amp;Insert field</string>
@ -397,8 +393,7 @@
<action name="actionRemoveRows"> <action name="actionRemoveRows">
<property name="icon"> <property name="icon">
<iconset theme="list-remove"> <iconset theme="list-remove">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Remove selected &amp;field(s)</string> <string>Remove selected &amp;field(s)</string>
@ -412,8 +407,7 @@
<action name="actionClearRecent"> <action name="actionClearRecent">
<property name="icon"> <property name="icon">
<iconset theme="edit-clear"> <iconset theme="edit-clear">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Clear list</string> <string>&amp;Clear list</string>
@ -433,8 +427,7 @@
<action name="actionExport"> <action name="actionExport">
<property name="icon"> <property name="icon">
<iconset theme="document-export"> <iconset theme="document-export">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Export ...</string> <string>&amp;Export ...</string>
@ -443,8 +436,7 @@
<action name="actionShowContainingDirectory"> <action name="actionShowContainingDirectory">
<property name="icon"> <property name="icon">
<iconset theme="folder"> <iconset theme="folder">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Show containing &amp;directory</string> <string>Show containing &amp;directory</string>
@ -456,8 +448,7 @@
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="edit-undo"> <iconset theme="edit-undo">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Undo</string> <string>&amp;Undo</string>
@ -469,8 +460,7 @@
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="edit-redo"> <iconset theme="edit-redo">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Redo</string> <string>&amp;Redo</string>
@ -479,8 +469,7 @@
<action name="actionAddCategory"> <action name="actionAddCategory">
<property name="icon"> <property name="icon">
<iconset theme="list-add"> <iconset theme="list-add">
<normaloff/> <normaloff>.</normaloff>.</iconset>
</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Add &amp;new category</string> <string>Add &amp;new category</string>
@ -494,15 +483,31 @@
<string>&amp;Show undo stack</string> <string>&amp;Show undo stack</string>
</property> </property>
</action> </action>
<action name="actionHidePasswords"> <action name="actionSepRecent"/>
<action name="actionShowAlways">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Hide passwords</string> <string>show always</string>
</property>
</action>
<action name="actionShowOnlyWhenEditing">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>show only when editing</string>
</property>
</action>
<action name="actionHideAlways">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>hide always</string>
</property> </property>
</action> </action>
<action name="actionSepRecent"/>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<customwidgets> <customwidgets>

View File

@ -18,7 +18,6 @@ using namespace Io;
namespace QtGui { namespace QtGui {
/*! /*!
* \class EntryModel * \class EntryModel
* \brief The EntryModel class provides a model interface for a hierarchy of Entry instances. * \brief The EntryModel class provides a model interface for a hierarchy of Entry instances.

View File

@ -29,7 +29,7 @@ FieldModel::FieldModel(QObject *parent) :
QAbstractTableModel(parent), QAbstractTableModel(parent),
m_accountEntry(nullptr), m_accountEntry(nullptr),
m_fields(nullptr), m_fields(nullptr),
m_hidePasswords(false) m_passwordVisibility(PasswordVisibility::OnlyWhenEditing)
{} {}
#ifdef MODEL_UNDO_SUPPORT #ifdef MODEL_UNDO_SUPPORT
@ -76,14 +76,24 @@ QVariant FieldModel::data(const QModelIndex &index, int role) const
switch(index.column()) { switch(index.column()) {
case 0: case 0:
return QString::fromStdString(m_fields->at(index.row()).name()); return QString::fromStdString(m_fields->at(index.row()).name());
case 1: case 1: {
if(role == Qt::DisplayRole bool showPassword = m_fields->at(index.row()).type() != FieldType::Password;
&& m_hidePasswords if(!showPassword) {
&& m_fields->at(index.row()).type() == FieldType::Password) { switch(m_passwordVisibility) {
return QString(m_fields->at(index.row()).value().size(), QChar(0x2022)); case PasswordVisibility::Always:
} else { showPassword = true;
return QString::fromStdString(m_fields->at(index.row()).value()); break;
case PasswordVisibility::OnlyWhenEditing:
showPassword = role == Qt::EditRole;
break;
case PasswordVisibility::Never:
showPassword = false;
}
} }
return showPassword
? QString::fromStdString(m_fields->at(index.row()).value())
: QString(m_fields->at(index.row()).value().size(), QChar(0x2022));
}
default: default:
; ;
} }

View File

@ -24,6 +24,16 @@ enum FieldModelRoles
FieldTypeRole = Qt::UserRole + 1 /**< the field type */ FieldTypeRole = Qt::UserRole + 1 /**< the field type */
}; };
/*!
* \brief The PasswordVisibility enum defines when passwords will be visible.
*/
enum PasswordVisibility
{
Always, /**< passwords are always visible */
OnlyWhenEditing, /**< passwords are only visible when editing */
Never /**< passwords are never visible */
};
class FieldModel : public QAbstractTableModel class FieldModel : public QAbstractTableModel
#ifdef MODEL_UNDO_SUPPORT #ifdef MODEL_UNDO_SUPPORT
, public StackSupport , public StackSupport
@ -40,7 +50,7 @@ public:
const Io::AccountEntry *accountEntry() const; const Io::AccountEntry *accountEntry() const;
void setAccountEntry(Io::AccountEntry *entry); void setAccountEntry(Io::AccountEntry *entry);
std::vector<Io::Field> *fields(); std::vector<Io::Field> *fields();
bool hidePasswords() const; PasswordVisibility passwordVisibility() const;
QVariant data(const QModelIndex &index, int role) const; QVariant data(const QModelIndex &index, int role) const;
QMap<int, QVariant> itemData(const QModelIndex &index) const; QMap<int, QVariant> itemData(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value, int role); bool setData(const QModelIndex &index, const QVariant &value, int role);
@ -56,13 +66,13 @@ public:
const Io::Field *field(std::size_t row) const; const Io::Field *field(std::size_t row) const;
public Q_SLOTS: public Q_SLOTS:
void setHidePasswords(bool hidePasswords); void setPasswordVisibility(PasswordVisibility passwordVisibility);
void reset(); void reset();
private: private:
Io::AccountEntry *m_accountEntry; Io::AccountEntry *m_accountEntry;
std::vector<Io::Field> *m_fields; std::vector<Io::Field> *m_fields;
bool m_hidePasswords; PasswordVisibility m_passwordVisibility;
}; };
/*! /*!
@ -103,16 +113,22 @@ inline void FieldModel::reset()
setAccountEntry(nullptr); setAccountEntry(nullptr);
} }
inline bool FieldModel::hidePasswords() const /*!
* \brief Returns the password visibility.
*/
inline PasswordVisibility FieldModel::passwordVisibility() const
{ {
return m_hidePasswords; return m_passwordVisibility;
} }
inline void FieldModel::setHidePasswords(bool hidePasswords) /*!
* \brief Sets the password visibility.
*/
inline void FieldModel::setPasswordVisibility(PasswordVisibility passwordVisibility)
{ {
m_hidePasswords = hidePasswords; m_passwordVisibility = passwordVisibility;
if(m_fields) { if(m_fields) {
emit dataChanged(index(0, 1), index(m_fields->size() - 1, 1), QVector<int>() << Qt::DisplayRole); emit dataChanged(index(0, 1), index(m_fields->size() - 1, 1), QVector<int>() << Qt::DisplayRole << Qt::EditRole);
} }
} }