diff --git a/gui/fielddelegate.cpp b/gui/fielddelegate.cpp new file mode 100644 index 0000000..c5e5c92 --- /dev/null +++ b/gui/fielddelegate.cpp @@ -0,0 +1,38 @@ +#include "fielddelegate.h" + +#include "../model/fieldmodel.h" + +#include + +#include + +using namespace std; +using namespace Io; + +namespace QtGui { + +FieldDelegate::FieldDelegate(QObject *parent) : + QStyledItemDelegate(parent) +{} + +void FieldDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + if(auto *lineEdit = qobject_cast(editor)) { + const auto *model = index.model(); + lineEdit->setText(model->data(index, Qt::EditRole).toString()); + if(const auto *fieldModel = qobject_cast(model)) { + if(fieldModel->passwordVisibility() == PasswordVisibility::Never) { + lineEdit->setEchoMode(fieldModel->field(static_cast(index.row()))->type() != FieldType::Password ? QLineEdit::Normal : QLineEdit::Password); + } else { + lineEdit->setEchoMode(QLineEdit::Normal); + } + } else { + lineEdit->setEchoMode(QLineEdit::Normal); + } + } else { + QStyledItemDelegate::setEditorData(editor, index); + } +} + +} // namespace QtGui + diff --git a/gui/fielddelegate.h b/gui/fielddelegate.h new file mode 100644 index 0000000..7c593c3 --- /dev/null +++ b/gui/fielddelegate.h @@ -0,0 +1,18 @@ +#ifndef QTGUI_FIELDDELEGATE_H +#define QTGUI_FIELDDELEGATE_H + +#include + +namespace QtGui { + +class FieldDelegate : public QStyledItemDelegate +{ +public: + FieldDelegate(QObject *parent = nullptr); + + void setEditorData(QWidget *editor, const QModelIndex &index) const; +}; + +} // namespace QtGui + +#endif // QTGUI_FIELDDELEGATE_H diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 7f8af04..d16f97d 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -1,4 +1,5 @@ #include "./mainwindow.h" +#include "./fielddelegate.h" #include "../model/fieldmodel.h" #include "../model/entrymodel.h" @@ -18,16 +19,12 @@ #include #include #include -#include #include -#include #include #include #include -#include #include #include -#include #include #include #include @@ -143,6 +140,7 @@ 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_ui->tableView->setItemDelegate(new FieldDelegate(this)); m_entryFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_entryFilterModel->setSourceModel(m_entryModel = new EntryModel(m_undoStack, this)); #ifdef Q_OS_WIN32 diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index 80b90de..b2722a5 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -191,6 +191,9 @@ Fi&le + + Recently opened files + &Recent @@ -246,6 +249,9 @@ &View + + Sets the visibility of fields marked as "password field" + Password &visibility @@ -432,6 +438,9 @@ &Export ... + + Export passwords to plain text files + @@ -489,7 +498,7 @@ true - show always + &show always @@ -497,7 +506,7 @@ true - show only when editing + show &only when editing @@ -505,7 +514,7 @@ true - hide always + &hide always diff --git a/model/fieldmodel.cpp b/model/fieldmodel.cpp index a1f901e..20ba121 100644 --- a/model/fieldmodel.cpp +++ b/model/fieldmodel.cpp @@ -76,24 +76,12 @@ 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: { - 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 + case 1: + return (m_passwordVisibility == PasswordVisibility::Always + || role == Qt::EditRole + || m_fields->at(index.row()).type() != FieldType::Password) ? QString::fromStdString(m_fields->at(index.row()).value()) : QString(m_fields->at(index.row()).value().size(), QChar(0x2022)); - } default: ; } diff --git a/passwordmanager.pro b/passwordmanager.pro index 0e6d500..a5b0a48 100644 --- a/passwordmanager.pro +++ b/passwordmanager.pro @@ -42,7 +42,8 @@ guiqtwidgets { gui/passwordgeneratordialog.cpp \ gui/undocommands.cpp \ gui/stacksupport.cpp \ - gui/initiatequi.cpp + gui/initiatequi.cpp \ + gui/fielddelegate.cpp FORMS += gui/mainwindow.ui \ gui/passwordgeneratordialog.ui @@ -57,14 +58,15 @@ HEADERS += model/entrymodel.h \ model/fieldmodel.h \ model/entryfiltermodel.h \ util/testroutines.h \ - cli/cli.h \ - gui/initiategui.h + cli/cli.h guiqtwidgets { HEADERS += gui/mainwindow.h \ gui/passwordgeneratordialog.h \ gui/undocommands.h \ - gui/stacksupport.h + gui/stacksupport.h \ + gui/initiategui.h \ + gui/fielddelegate.h } guiqtquick {