added option to hide passwords when editing
This commit is contained in:
parent
89762b4830
commit
4bbb82d898
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>&View</string>
|
||||
</property>
|
||||
<addaction name="actionHidePasswords"/>
|
||||
<widget class="QMenu" name="menuPassword_visibility">
|
||||
<property name="title">
|
||||
<string>Password &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>&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>&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>&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>&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>&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>&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 &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>&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&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>&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 &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>&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>&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 &directory</string>
|
||||
|
@ -456,8 +448,7 @@
|
|||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="edit-undo">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Undo</string>
|
||||
|
@ -469,8 +460,7 @@
|
|||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="edit-redo">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&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 &new category</string>
|
||||
|
@ -494,15 +483,31 @@
|
|||
<string>&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>&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>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue