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
m_ui->treeView->setModel(m_entryFilterModel = new EntryFilterModel(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->setSourceModel(m_entryModel = new EntryModel(m_undoStack, this));
#ifdef Q_OS_WIN32
@ -156,6 +155,22 @@ MainWindow::MainWindow(QWidget *parent) :
m_ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// splitter sizes
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
// file related actions
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::canRedoChanged, m_ui->actionRedo, &QAction::setEnabled);
// 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);
// models
connect(m_ui->treeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &MainWindow::accountSelected);
@ -200,7 +215,6 @@ MainWindow::MainWindow(QWidget *parent) :
// setup other controls
m_ui->actionAlwaysCreateBackup->setChecked(settings.value(QStringLiteral("alwayscreatebackup"), false).toBool());
m_ui->accountFilterLineEdit->setText(settings.value(QStringLiteral("accountfilter"), QString()).toString());
m_ui->actionHidePasswords->setChecked(m_fieldModel->hidePasswords());
m_ui->centralWidget->installEventFilter(this);
settings.endGroup();
}
@ -281,7 +295,15 @@ void MainWindow::closeEvent(QCloseEvent *event)
settings.setValue(QStringLiteral("recententries"), existingEntires);
settings.setValue(QStringLiteral("accountfilter"), m_ui->accountFilterLineEdit->text());
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();
}
@ -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.
*/

View File

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

View File

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

View File

@ -18,7 +18,6 @@ using namespace Io;
namespace QtGui {
/*!
* \class EntryModel
* \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),
m_accountEntry(nullptr),
m_fields(nullptr),
m_hidePasswords(false)
m_passwordVisibility(PasswordVisibility::OnlyWhenEditing)
{}
#ifdef MODEL_UNDO_SUPPORT
@ -76,14 +76,24 @@ QVariant FieldModel::data(const QModelIndex &index, int role) const
switch(index.column()) {
case 0:
return QString::fromStdString(m_fields->at(index.row()).name());
case 1:
if(role == Qt::DisplayRole
&& m_hidePasswords
&& m_fields->at(index.row()).type() == FieldType::Password) {
return QString(m_fields->at(index.row()).value().size(), QChar(0x2022));
} else {
return QString::fromStdString(m_fields->at(index.row()).value());
case 1: {
bool showPassword = m_fields->at(index.row()).type() != FieldType::Password;
if(!showPassword) {
switch(m_passwordVisibility) {
case PasswordVisibility::Always:
showPassword = true;
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:
;
}

View File

@ -24,6 +24,16 @@ enum FieldModelRoles
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
#ifdef MODEL_UNDO_SUPPORT
, public StackSupport
@ -40,7 +50,7 @@ public:
const Io::AccountEntry *accountEntry() const;
void setAccountEntry(Io::AccountEntry *entry);
std::vector<Io::Field> *fields();
bool hidePasswords() const;
PasswordVisibility passwordVisibility() const;
QVariant data(const QModelIndex &index, int role) const;
QMap<int, QVariant> itemData(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
@ -56,13 +66,13 @@ public:
const Io::Field *field(std::size_t row) const;
public Q_SLOTS:
void setHidePasswords(bool hidePasswords);
void setPasswordVisibility(PasswordVisibility passwordVisibility);
void reset();
private:
Io::AccountEntry *m_accountEntry;
std::vector<Io::Field> *m_fields;
bool m_hidePasswords;
PasswordVisibility m_passwordVisibility;
};
/*!
@ -103,16 +113,22 @@ inline void FieldModel::reset()
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) {
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);
}
}