Enhance attribute entry and add protected attributes (#220)

* Allow protected attributes to be hidden
* Entry area is resizable
* Added test cases for protected attributes
This commit is contained in:
Jonathan White 2017-03-07 22:38:18 -05:00 committed by GitHub
parent a1e1a33308
commit 31494ec327
5 changed files with 195 additions and 48 deletions

View File

@ -132,6 +132,8 @@ void EditEntryWidget::setupAdvanced()
connect(m_advancedUi->addAttributeButton, SIGNAL(clicked()), SLOT(insertAttribute()));
connect(m_advancedUi->editAttributeButton, SIGNAL(clicked()), SLOT(editCurrentAttribute()));
connect(m_advancedUi->removeAttributeButton, SIGNAL(clicked()), SLOT(removeCurrentAttribute()));
connect(m_advancedUi->protectAttributeButton, SIGNAL(toggled(bool)), SLOT(protectCurrentAttribute(bool)));
connect(m_advancedUi->revealAttributeButton, SIGNAL(clicked(bool)), SLOT(revealCurrentAttribute()));
connect(m_advancedUi->attributesView->selectionModel(),
SIGNAL(currentChanged(QModelIndex,QModelIndex)),
SLOT(updateCurrentAttribute()));
@ -351,6 +353,11 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore)
m_advancedUi->attributesEdit->setEnabled(false);
}
QList<int> sizes = m_advancedUi->attributesSplitter->sizes();
sizes.replace(0, m_advancedUi->attributesSplitter->width() * 0.3);
sizes.replace(1, m_advancedUi->attributesSplitter->width() * 0.7);
m_advancedUi->attributesSplitter->setSizes(sizes);
IconStruct iconStruct;
iconStruct.uuid = entry->iconUuid();
iconStruct.number = entry->iconNumber();
@ -409,7 +416,7 @@ void EditEntryWidget::saveEntry()
return;
}
if (m_advancedUi->attributesView->currentIndex().isValid()) {
if (m_advancedUi->attributesView->currentIndex().isValid() && m_advancedUi->attributesEdit->isEnabled()) {
QString key = m_attributesModel->keyByIndex(m_advancedUi->attributesView->currentIndex());
m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(),
m_entryAttributes->isProtected(key));
@ -578,46 +585,96 @@ void EditEntryWidget::removeCurrentAttribute()
QModelIndex index = m_advancedUi->attributesView->currentIndex();
if (index.isValid()) {
m_entryAttributes->remove(m_attributesModel->keyByIndex(index));
if (MessageBox::question(this, tr("Confirm Remove"), tr("Are you sure you want to remove this attribute?"),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
m_entryAttributes->remove(m_attributesModel->keyByIndex(index));
}
}
}
void EditEntryWidget::updateCurrentAttribute()
{
QModelIndex newIndex = m_advancedUi->attributesView->currentIndex();
QString newKey = m_attributesModel->keyByIndex(newIndex);
if (m_history) {
if (newIndex.isValid()) {
QString key = m_attributesModel->keyByIndex(newIndex);
m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key));
m_advancedUi->attributesEdit->setEnabled(true);
if (!m_history && m_currentAttribute != newIndex) {
// Save changes to the currently selected attribute if editing is enabled
if (m_currentAttribute.isValid() && m_advancedUi->attributesEdit->isEnabled()) {
QString currKey = m_attributesModel->keyByIndex(m_currentAttribute);
m_entryAttributes->set(currKey, m_advancedUi->attributesEdit->toPlainText(),
m_entryAttributes->isProtected(currKey));
}
}
displayAttribute(newIndex, m_entryAttributes->isProtected(newKey));
m_currentAttribute = newIndex;
}
void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected)
{
// Block signals to prevent extra calls
m_advancedUi->protectAttributeButton->blockSignals(true);
if (index.isValid()) {
QString key = m_attributesModel->keyByIndex(index);
if (showProtected) {
m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED] Press reveal to view or edit"));
m_advancedUi->attributesEdit->setEnabled(false);
m_advancedUi->revealAttributeButton->setEnabled(true);
m_advancedUi->protectAttributeButton->setChecked(true);
}
else {
m_advancedUi->attributesEdit->setPlainText("");
m_advancedUi->attributesEdit->setEnabled(false);
m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key));
m_advancedUi->attributesEdit->setEnabled(true);
m_advancedUi->revealAttributeButton->setEnabled(false);
m_advancedUi->protectAttributeButton->setChecked(false);
}
// Don't allow editing in history view
m_advancedUi->protectAttributeButton->setEnabled(!m_history);
m_advancedUi->editAttributeButton->setEnabled(!m_history);
m_advancedUi->removeAttributeButton->setEnabled(!m_history);
}
else {
if (m_currentAttribute != newIndex) {
if (m_currentAttribute.isValid()) {
QString key = m_attributesModel->keyByIndex(m_currentAttribute);
m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(),
m_entryAttributes->isProtected(key));
}
m_advancedUi->attributesEdit->setPlainText("");
m_advancedUi->attributesEdit->setEnabled(false);
m_advancedUi->revealAttributeButton->setEnabled(false);
m_advancedUi->protectAttributeButton->setChecked(false);
m_advancedUi->protectAttributeButton->setEnabled(false);
m_advancedUi->editAttributeButton->setEnabled(false);
m_advancedUi->removeAttributeButton->setEnabled(false);
}
if (newIndex.isValid()) {
QString key = m_attributesModel->keyByIndex(newIndex);
m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key));
m_advancedUi->attributesEdit->setEnabled(true);
}
else {
m_advancedUi->attributesEdit->setPlainText("");
m_advancedUi->attributesEdit->setEnabled(false);
}
m_advancedUi->protectAttributeButton->blockSignals(false);
}
m_advancedUi->editAttributeButton->setEnabled(newIndex.isValid());
m_advancedUi->removeAttributeButton->setEnabled(newIndex.isValid());
m_currentAttribute = newIndex;
void EditEntryWidget::protectCurrentAttribute(bool state)
{
QModelIndex index = m_advancedUi->attributesView->currentIndex();
if (!m_history && index.isValid()) {
QString key = m_attributesModel->keyByIndex(index);
if (state) {
// Save the current text and protect the attribute
m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(), true);
} else {
// Unprotect the current attribute value (don't save text as it is obscured)
m_entryAttributes->set(key, m_entryAttributes->value(key), false);
}
// Display the attribute
displayAttribute(index, state);
}
}
void EditEntryWidget::revealCurrentAttribute()
{
if (! m_advancedUi->attributesEdit->isEnabled()) {
QModelIndex index = m_advancedUi->attributesView->currentIndex();
if (index.isValid()) {
QString key = m_attributesModel->keyByIndex(index);
m_advancedUi->attributesEdit->setPlainText(m_entryAttributes->value(key));
m_advancedUi->attributesEdit->setEnabled(true);
}
}
}
@ -730,8 +787,13 @@ void EditEntryWidget::removeCurrentAttachment()
return;
}
QString key = m_attachmentsModel->keyByIndex(index);
m_entryAttachments->remove(key);
QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Remove"),
tr("Are you sure you want to remove this attachment?"),
QMessageBox::Yes | QMessageBox::No);
if (ans == QMessageBox::Yes) {
QString key = m_attachmentsModel->keyByIndex(index);
m_entryAttachments->remove(key);
}
}
void EditEntryWidget::updateAutoTypeEnabled()

View File

@ -76,6 +76,8 @@ private Q_SLOTS:
void editCurrentAttribute();
void removeCurrentAttribute();
void updateCurrentAttribute();
void protectCurrentAttribute(bool state);
void revealCurrentAttribute();
void insertAttachment();
void saveCurrentAttachment();
void openAttachment(const QModelIndex& index);
@ -110,6 +112,8 @@ private:
QMenu* createPresetsMenu();
void updateEntryData(Entry* entry) const;
void displayAttribute(QModelIndex index, bool showProtected);
Entry* m_entry;
Database* m_database;

View File

@ -28,19 +28,50 @@
<property name="title">
<string>Additional attributes</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="AttributesListView" name="attributesView"/>
</item>
<item>
<widget class="QPlainTextEdit" name="attributesEdit">
<property name="enabled">
<widget class="QSplitter" name="attributesSplitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="AttributesListView" name="attributesView">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
</widget>
<widget class="QPlainTextEdit" name="attributesEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>170</width>
<height>0</height>
</size>
</property>
</widget>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<layout class="QVBoxLayout" name="attributesButtonLayout">
<item>
<widget class="QPushButton" name="addAttributeButton">
<property name="text">
@ -48,16 +79,6 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="editAttributeButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removeAttributeButton">
<property name="enabled">
@ -68,6 +89,16 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="editAttributeButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit Name</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -81,6 +112,35 @@
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="protectAttributeButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true">margin-left:50%;margin-right:50%</string>
</property>
<property name="text">
<string>Protect</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="revealAttributeButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Reveal</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -103,7 +163,7 @@
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<layout class="QVBoxLayout" name="attachmentsButtonLayout">
<item>
<widget class="QPushButton" name="addAttachmentButton">
<property name="text">
@ -172,11 +232,12 @@
<tabstop>attributesView</tabstop>
<tabstop>attributesEdit</tabstop>
<tabstop>addAttributeButton</tabstop>
<tabstop>editAttributeButton</tabstop>
<tabstop>removeAttributeButton</tabstop>
<tabstop>editAttributeButton</tabstop>
<tabstop>attachmentsView</tabstop>
<tabstop>addAttachmentButton</tabstop>
<tabstop>removeAttachmentButton</tabstop>
<tabstop>openAttachmentButton</tabstop>
<tabstop>saveAttachmentButton</tabstop>
</tabstops>
<resources/>

View File

@ -181,6 +181,12 @@ void TestEntryModel::testAttributesModel()
QCOMPARE(spyAboutToRemove.count(), 1);
QCOMPARE(spyRemoved.count(), 1);
// test attribute protection
QString value = entryAttributes->value("2nd");
entryAttributes->set("2nd", value, true);
QVERIFY(entryAttributes->isProtected("2nd"));
QCOMPARE(entryAttributes->value("2nd"), value);
QSignalSpy spyReset(model, SIGNAL(modelReset()));
entryAttributes->clear();
model->setEntryAttributes(0);

View File

@ -25,6 +25,7 @@
#include <QMimeData>
#include <QPushButton>
#include <QSpinBox>
#include <QPlainTextEdit>
#include <QTemporaryFile>
#include <QTest>
#include <QToolBar>
@ -242,6 +243,19 @@ void TestGui::testEditEntry()
QLineEdit* titleEdit = editEntryWidget->findChild<QLineEdit*>("titleEdit");
QTest::keyClicks(titleEdit, "_test");
// Test protected attributes
editEntryWidget->setCurrentPage(1);
QPlainTextEdit* attrTextEdit = editEntryWidget->findChild<QPlainTextEdit*>("attributesEdit");
QTest::mouseClick(editEntryWidget->findChild<QAbstractButton*>("addAttributeButton"), Qt::LeftButton);
QString attrText = "TEST TEXT";
QTest::keyClicks(attrTextEdit, attrText);
QCOMPARE(attrTextEdit->toPlainText(), attrText);
QTest::mouseClick(editEntryWidget->findChild<QAbstractButton*>("protectAttributeButton"), Qt::LeftButton);
QVERIFY(attrTextEdit->toPlainText().contains("PROTECTED"));
QTest::mouseClick(editEntryWidget->findChild<QAbstractButton*>("revealAttributeButton"), Qt::LeftButton);
QCOMPARE(attrTextEdit->toPlainText(), attrText);
editEntryWidget->setCurrentPage(0);
// Save the edit
QDialogButtonBox* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);