mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-11-29 19:06:55 -05:00
Autocomplete usernames based on most frequent in database
* Fixes #3126 * Limit autocompletion to the top ten used usernames - Load common usernames when database is opened - Transition from QLineEdit to QComboBox for usernames - Dropdown menu of the combobox lets user choose a common username - Common usernames are autocompleted via inline completion - Common usernames are sorted by frequency (first) and name (second)
This commit is contained in:
parent
a22e8a1f40
commit
f85642741d
13 changed files with 134 additions and 10 deletions
|
|
@ -85,6 +85,8 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
|
|||
, m_autoTypeAssocModel(new AutoTypeAssociationsModel(this))
|
||||
, m_autoTypeDefaultSequenceGroup(new QButtonGroup(this))
|
||||
, m_autoTypeWindowSequenceGroup(new QButtonGroup(this))
|
||||
, m_usernameCompleter(new QCompleter(this))
|
||||
, m_usernameCompleterModel(new QStringListModel(this))
|
||||
{
|
||||
setupMain();
|
||||
setupAdvanced();
|
||||
|
|
@ -129,6 +131,12 @@ void EditEntryWidget::setupMain()
|
|||
m_mainUi->setupUi(m_mainWidget);
|
||||
addPage(tr("Entry"), FilePath::instance()->icon("actions", "document-edit"), m_mainWidget);
|
||||
|
||||
m_mainUi->usernameComboBox->setEditable(true);
|
||||
m_usernameCompleter->setCompletionMode(QCompleter::InlineCompletion);
|
||||
m_usernameCompleter->setCaseSensitivity(Qt::CaseSensitive);
|
||||
m_usernameCompleter->setModel(m_usernameCompleterModel);
|
||||
m_mainUi->usernameComboBox->setCompleter(m_usernameCompleter);
|
||||
|
||||
m_mainUi->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show"));
|
||||
m_mainUi->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator"));
|
||||
#ifdef WITH_XC_NETWORKING
|
||||
|
|
@ -273,7 +281,7 @@ void EditEntryWidget::setupEntryUpdate()
|
|||
{
|
||||
// Entry tab
|
||||
connect(m_mainUi->titleEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
connect(m_mainUi->usernameEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
connect(m_mainUi->usernameComboBox->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
connect(m_mainUi->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setModified()));
|
||||
|
|
@ -707,7 +715,7 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
|
|||
m_customData->copyDataFrom(entry->customData());
|
||||
|
||||
m_mainUi->titleEdit->setReadOnly(m_history);
|
||||
m_mainUi->usernameEdit->setReadOnly(m_history);
|
||||
m_mainUi->usernameComboBox->lineEdit()->setReadOnly(m_history);
|
||||
m_mainUi->urlEdit->setReadOnly(m_history);
|
||||
m_mainUi->passwordEdit->setReadOnly(m_history);
|
||||
m_mainUi->passwordRepeatEdit->setReadOnly(m_history);
|
||||
|
|
@ -742,7 +750,7 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
|
|||
m_historyWidget->setEnabled(!m_history);
|
||||
|
||||
m_mainUi->titleEdit->setText(entry->title());
|
||||
m_mainUi->usernameEdit->setText(entry->username());
|
||||
m_mainUi->usernameComboBox->lineEdit()->setText(entry->username());
|
||||
m_mainUi->urlEdit->setText(entry->url());
|
||||
m_mainUi->passwordEdit->setText(entry->password());
|
||||
m_mainUi->passwordRepeatEdit->setText(entry->password());
|
||||
|
|
@ -751,6 +759,13 @@ void EditEntryWidget::setForms(Entry* entry, bool restore)
|
|||
m_mainUi->expirePresets->setEnabled(!m_history);
|
||||
m_mainUi->togglePasswordButton->setChecked(config()->get("security/passwordscleartext").toBool());
|
||||
|
||||
QList<QString> commonUsernames = m_db->commonUsernames();
|
||||
m_usernameCompleterModel->setStringList(commonUsernames);
|
||||
QString usernameToRestore = m_mainUi->usernameComboBox->lineEdit()->text();
|
||||
m_mainUi->usernameComboBox->clear();
|
||||
m_mainUi->usernameComboBox->addItems(commonUsernames);
|
||||
m_mainUi->usernameComboBox->lineEdit()->setText(usernameToRestore);
|
||||
|
||||
m_mainUi->notesEdit->setPlainText(entry->notes());
|
||||
|
||||
m_advancedUi->attachmentsWidget->setEntryAttachments(entry->attachments());
|
||||
|
|
@ -910,7 +925,7 @@ void EditEntryWidget::updateEntryData(Entry* entry) const
|
|||
entry->attachments()->copyDataFrom(m_advancedUi->attachmentsWidget->entryAttachments());
|
||||
entry->customData()->copyDataFrom(m_customData.data());
|
||||
entry->setTitle(m_mainUi->titleEdit->text().replace(newLineRegex, " "));
|
||||
entry->setUsername(m_mainUi->usernameEdit->text().replace(newLineRegex, " "));
|
||||
entry->setUsername(m_mainUi->usernameComboBox->lineEdit()->text().replace(newLineRegex, " "));
|
||||
entry->setUrl(m_mainUi->urlEdit->text().replace(newLineRegex, " "));
|
||||
entry->setPassword(m_mainUi->passwordEdit->text());
|
||||
entry->setExpires(m_mainUi->expireCheck->isChecked());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue