Improve accessibility (#3409)

* Add application settings reset button
 - Corrects accessibility findings GP.2

* Use icons in addition to color to indicate password mismatch
 - Corrects accessibility finding CN.2

* Announce begin/end of list navigation
 - Corrects accessibility finding KF.4

* Fixes for keyboard navigation
 - Add Ctrl+F10 keyboard shortcut to show group/entry context menus. Fixes #3140
 - Improve movement between form fields

* Fix loading system-defined language in translator
 - Fixes #3202
 - Bypass built-in Qt loading of QLocale for translations. The order of loading languages doesn't consider all file names prior to moving to the next language in the list. This resulted in English being chosen no matter what language is the top priority.

* Improve message box defaults and fix documentation links

* Better support for screen readers

* Add accessible names on form fields

* Prevent changing values during settings widget scrolling
 - Add an event filter to combo boxes and spin boxes on the settings page to prevent the mouse wheel from changing the values without having focus
 - Add horizontal stretch to the security settings to make the spin boxes more manageable.
This commit is contained in:
Jonathan White 2019-08-30 20:18:41 -04:00 committed by GitHub
parent 58d357e9ce
commit 3b330ee2d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 1073 additions and 202 deletions

View File

@ -48,6 +48,9 @@
</item>
<item>
<widget class="QPushButton" name="allowButton">
<property name="accessibleName">
<string>Allow access</string>
</property>
<property name="text">
<string>Allow</string>
</property>
@ -55,6 +58,9 @@
</item>
<item>
<widget class="QPushButton" name="denyButton">
<property name="accessibleName">
<string>Deny access</string>
</property>
<property name="text">
<string>Deny</string>
</property>

View File

@ -365,6 +365,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="customProxyLocation">
<property name="accessibleName">
<string>Custom proxy location field</string>
</property>
<property name="maxLength">
<number>999</number>
</property>
@ -375,6 +378,9 @@
</item>
<item>
<widget class="QPushButton" name="customProxyLocationBrowseButton">
<property name="accessibleName">
<string>Browser for custom proxy file</string>
</property>
<property name="text">
<string extracomment="Button for opening file dialog">Browse...</string>
</property>

View File

@ -17,12 +17,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QCheckBox>
#include <QInputDialog>
#include <QJsonArray>
#include <QMessageBox>
#include <QProgressDialog>
#include <QUuid>
#include <QCheckBox>
#include "BrowserAccessControlDialog.h"
#include "BrowserEntryConfig.h"

View File

@ -89,6 +89,13 @@ void Config::sync()
m_settings->sync();
}
void Config::resetToDefaults()
{
for (const auto& setting : m_defaults.keys()) {
m_settings->setValue(setting, m_defaults.value(setting));
}
}
void Config::upgrade()
{
const auto keys = deprecationMap.keys();

View File

@ -38,6 +38,7 @@ public:
void set(const QString& key, const QVariant& value);
bool hasAccessError();
void sync();
void resetToDefaults();
static Config* instance();
static void createConfigFromFile(const QString& file);

View File

@ -34,16 +34,21 @@
*/
void Translator::installTranslators()
{
QStringList languages;
QString languageSetting = config()->get("GUI/Language").toString();
if (languageSetting.isEmpty() || languageSetting == "system") {
// NOTE: this is a workaround for the terrible way Qt loads languages
// using the QLocale::uiLanguages() approach. Instead, we search each
// language and all country variants in order before moving to the next.
QLocale locale;
QString language = config()->get("GUI/Language").toString();
if (!language.isEmpty() && language != "system") {
// use actual English translation instead of the English locale source language
if (language == "en") {
language = "en_US";
}
locale = QLocale(language);
languages = locale.uiLanguages();
} else {
languages << languageSetting;
}
// Always try to load english last
languages << "en_US";
const QStringList paths = {
#ifdef QT_DEBUG
QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
@ -52,9 +57,10 @@ void Translator::installTranslators()
bool translationsLoaded = false;
for (const QString& path : paths) {
translationsLoaded |= installTranslator(locale, path) || installTranslator(QLocale("en_US"), path);
if (!installQtTranslator(language, path)) {
installQtTranslator(QLocale("en"), path);
installQtTranslator(languages, path);
if (installTranslator(languages, path)) {
translationsLoaded = true;
break;
}
}
@ -64,6 +70,48 @@ void Translator::installTranslators()
}
}
/**
* Install KeePassXC translator.
*
* @param languages priority-ordered list of languages
* @param path absolute search path
* @return true on success
*/
bool Translator::installTranslator(const QStringList& languages, const QString& path)
{
for (const auto& language : languages) {
QLocale locale(language);
QScopedPointer<QTranslator> translator(new QTranslator(qApp));
if (translator->load(locale, "keepassx_", "", path)) {
return QCoreApplication::installTranslator(translator.take());
}
}
return false;
}
/**
* Install Qt5 base translator from the specified local search path or the default system path
* if no qtbase_* translations were found at the local path.
*
* @param languages priority-ordered list of languages
* @param path absolute search path
* @return true on success
*/
bool Translator::installQtTranslator(const QStringList& languages, const QString& path)
{
for (const auto& language : languages) {
QLocale locale(language);
QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
if (qtTranslator->load(locale, "qtbase_", "", path)) {
return QCoreApplication::installTranslator(qtTranslator.take());
} else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
return QCoreApplication::installTranslator(qtTranslator.take());
}
}
return false;
}
/**
* @return list of pairs of available language codes and names
*/
@ -108,38 +156,3 @@ QList<QPair<QString, QString>> Translator::availableLanguages()
return languages;
}
/**
* Install KeePassXC translator.
*
* @param language translator language
* @param path local search path
* @return true on success
*/
bool Translator::installTranslator(const QLocale& locale, const QString& path)
{
QScopedPointer<QTranslator> translator(new QTranslator(qApp));
if (translator->load(locale, "keepassx_", "", path)) {
return QCoreApplication::installTranslator(translator.take());
}
return false;
}
/**
* Install Qt5 base translator from the specified local search path or the default system path
* if no qtbase_* translations were found at the local path.
*
* @param language translator language
* @param path local search path
* @return true on success
*/
bool Translator::installQtTranslator(const QLocale& locale, const QString& path)
{
QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
if (qtTranslator->load(locale, "qtbase_", "", path)) {
return QCoreApplication::installTranslator(qtTranslator.take());
} else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
return QCoreApplication::installTranslator(qtTranslator.take());
}
return false;
}

View File

@ -29,8 +29,8 @@ public:
static QList<QPair<QString, QString>> availableLanguages();
private:
static bool installTranslator(const QLocale& locale, const QString& path);
static bool installQtTranslator(const QLocale& locale, const QString& path);
static bool installTranslator(const QStringList& languages, const QString& path);
static bool installQtTranslator(const QStringList& languages, const QString& path);
};
#endif // KEEPASSX_TRANSLATOR_H

View File

@ -28,6 +28,7 @@
#include "core/Global.h"
#include "core/Translator.h"
#include "MessageBox.h"
#include "touchid/TouchID.h"
class ApplicationSettingsWidget::ExtraPage
@ -54,6 +55,28 @@ private:
QWidget* widget;
};
/**
* Helper class to ignore mouse wheel events on non-focused widgets
* NOTE: The widget must NOT have a focus policy of "WHEEL"
*/
class MouseWheelEventFilter : public QObject
{
public:
explicit MouseWheelEventFilter(QObject* parent)
: QObject(parent){};
protected:
bool eventFilter(QObject* obj, QEvent* event) override
{
const auto* widget = qobject_cast<QWidget*>(obj);
if (event->type() == QEvent::Wheel && widget && !widget->hasFocus()) {
event->ignore();
return true;
}
return QObject::eventFilter(obj, event);
}
};
ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
: EditWidget(parent)
, m_secWidget(new QWidget())
@ -84,6 +107,7 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
connect(m_generalUi->systrayShowCheckBox, SIGNAL(toggled(bool)), SLOT(systrayToggled(bool)));
connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool)));
connect(m_generalUi->rememberLastDatabasesCheckBox, SIGNAL(toggled(bool)), SLOT(rememberDatabasesToggled(bool)));
connect(m_generalUi->resetSettingsButton, SIGNAL(clicked()), SLOT(resetSettings()));
connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)),
m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
@ -95,6 +119,13 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool)));
// clang-format on
// Disable mouse wheel grab when scrolling
// This prevents combo box and spinner values from changing without explicit focus
auto mouseWheelFilter = new MouseWheelEventFilter(this);
m_generalUi->faviconTimeoutSpinBox->installEventFilter(mouseWheelFilter);
m_generalUi->toolButtonStyleComboBox->installEventFilter(mouseWheelFilter);
m_generalUi->languageComboBox->installEventFilter(mouseWheelFilter);
#ifdef WITH_XC_UPDATECHECK
connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool)));
#else
@ -246,7 +277,6 @@ void ApplicationSettingsWidget::loadSettings()
void ApplicationSettingsWidget::saveSettings()
{
if (config()->hasAccessError()) {
showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error);
// We prevent closing the settings page if we could not write to
@ -330,6 +360,7 @@ void ApplicationSettingsWidget::saveSettings()
config()->set("LastDatabases", {});
config()->set("OpenPreviousDatabasesOnStartup", {});
config()->set("LastActiveDatabase", {});
config()->set("LastAttachmentDir", {});
}
if (!config()->get("RememberLastKeyFiles").toBool()) {
@ -342,6 +373,48 @@ void ApplicationSettingsWidget::saveSettings()
}
}
void ApplicationSettingsWidget::resetSettings()
{
// Confirm reset
auto ans = MessageBox::question(this,
tr("Reset Settings?"),
tr("Are you sure you want to reset all general and security settings to default?"),
MessageBox::Reset | MessageBox::Cancel,
MessageBox::Cancel);
if (ans == MessageBox::Cancel) {
return;
}
if (config()->hasAccessError()) {
showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error);
// We prevent closing the settings page if we could not write to
// the config file.
return;
}
// Reset general and security settings to default
config()->resetToDefaults();
// Clear recently used data
config()->set("LastDatabases", {});
config()->set("OpenPreviousDatabasesOnStartup", {});
config()->set("LastActiveDatabase", {});
config()->set("LastAttachmentDir", {});
config()->set("LastKeyFiles", {});
config()->set("LastDir", "");
// Save the Extra Pages (these are NOT reset)
for (const ExtraPage& page : asConst(m_extraPages)) {
page.saveSettings();
}
config()->sync();
// Refresh the settings widget and notify listeners
loadSettings();
emit settingsReset();
}
void ApplicationSettingsWidget::reject()
{
// register the old key again as it might have changed

View File

@ -50,8 +50,12 @@ public:
void addSettingsPage(ISettingsPage* page);
void loadSettings();
signals:
void settingsReset();
private slots:
void saveSettings();
void resetSettings();
void reject();
void autoSaveToggled(bool checked);
void hideWindowOnCopyCheckBoxToggled(bool checked);

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>684</width>
<height>860</height>
<height>951</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
@ -349,6 +349,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Website icon download timeout in seconds</string>
</property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@ -437,7 +443,7 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="toolButtonStyleLayout">
<layout class="QHBoxLayout" name="toolButtonStyleLayout" stretch="0,0,0,1">
<property name="spacing">
<number>0</number>
</property>
@ -487,8 +493,30 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Toolbar button style</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
@ -521,7 +549,7 @@
<enum>QLayout::SetMaximumSize</enum>
</property>
<item>
<spacer name="horizontalSpacer_3">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -609,7 +637,7 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="languageLabelLayout_2">
<layout class="QHBoxLayout" name="languageLabelLayout_2" stretch="0,0,0,1">
<property name="spacing">
<number>8</number>
</property>
@ -634,6 +662,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Language selection</string>
</property>
</widget>
</item>
<item>
@ -643,6 +677,68 @@
</property>
</widget>
</item>
<item>
<spacer name="spacer3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>15</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="resetSettingsSubLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
<item>
<widget class="QPushButton" name="resetSettingsButton">
<property name="text">
<string>Reset Settings to Default</string>
</property>
</widget>
</item>
<item>
<spacer name="spacer4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>50</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
@ -715,6 +811,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Global auto-type shortcut</string>
</property>
</widget>
</item>
<item row="3" column="0">
@ -732,6 +831,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Auto-type character typing delay milliseconds</string>
</property>
<property name="suffix">
<string comment="Milliseconds"> ms</string>
</property>
@ -761,6 +863,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Auto-type start delay milliseconds</string>
</property>
<property name="suffix">
<string comment="Milliseconds"> ms</string>
</property>

View File

@ -28,14 +28,7 @@
<property name="title">
<string>Timeouts</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="clearClipboardCheckBox">
<property name="text">
<string>Clear clipboard after</string>
</property>
</widget>
</item>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
<item row="0" column="1">
<widget class="QSpinBox" name="clearClipboardSpinBox">
<property name="enabled">
@ -47,6 +40,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Clipboard clear seconds</string>
</property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@ -61,14 +57,93 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="clearSearchCheckBox">
<item row="3" column="0">
<widget class="QCheckBox" name="touchIDResetCheckBox">
<property name="text">
<string>Clear search query after</string>
<string>Forget TouchID after inactivity of</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="touchIDResetSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Touch ID inactivity reset</string>
</property>
<property name="suffix">
<string> min</string>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="value">
<number>30</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="lockDatabaseIdleCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Lock databases after inactivity of</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="lockDatabaseIdleSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Database lock timeout seconds</string>
</property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>43200</number>
</property>
<property name="value">
<number>240</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="clearSearchSpinBox">
<property name="enabled">
<bool>false</bool>
@ -96,70 +171,17 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="clearClipboardCheckBox">
<property name="text">
<string>Clear clipboard after</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="lockDatabaseIdleCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<widget class="QCheckBox" name="clearSearchCheckBox">
<property name="text">
<string>Lock databases after inactivity of</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="lockDatabaseIdleSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>43200</number>
</property>
<property name="value">
<number>240</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="touchIDResetCheckBox">
<property name="text">
<string>Forget TouchID after inactivity of</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="touchIDResetSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="suffix">
<string> min</string>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="value">
<number>30</number>
<string>Clear search query after</string>
</property>
</widget>
</item>
@ -272,6 +294,21 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>clearClipboardCheckBox</tabstop>
<tabstop>clearClipboardSpinBox</tabstop>
<tabstop>touchIDResetSpinBox</tabstop>
<tabstop>lockDatabaseOnScreenLockCheckBox</tabstop>
<tabstop>touchIDResetOnScreenLockCheckBox</tabstop>
<tabstop>lockDatabaseMinimizeCheckBox</tabstop>
<tabstop>relockDatabaseAutoTypeCheckBox</tabstop>
<tabstop>passwordRepeatCheckBox</tabstop>
<tabstop>passwordCleartextCheckBox</tabstop>
<tabstop>passwordShowDotsCheckBox</tabstop>
<tabstop>passwordPreviewCleartextCheckBox</tabstop>
<tabstop>hideNotesCheckBox</tabstop>
<tabstop>fallbackToSearch</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -46,6 +46,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Datetime created</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -66,6 +69,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Datetime modified</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -80,6 +86,9 @@
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="accessedEdit">
<property name="accessibleName">
<string>Datetime accessed</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -94,6 +103,9 @@
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="uuidEdit">
<property name="accessibleName">
<string>Unique ID</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -109,6 +121,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="customDataTable">
<property name="accessibleName">
<string>Plugin data</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@ -130,6 +145,9 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="removeCustomDataButton">
<property name="accessibleName">
<string>Remove selected plugin data</string>
</property>
<property name="text">
<string>Remove</string>
</property>

View File

@ -521,7 +521,7 @@
<attribute name="title">
<string>Advanced</string>
</attribute>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0" columnstretch="0,1,0,2,0">
<layout class="QGridLayout" name="gridLayout_1" rowstretch="0,0" columnstretch="0,1,0,2,0">
<property name="leftMargin">
<number>0</number>
</property>
@ -976,7 +976,7 @@
</widget>
</item>
<item row="3" column="2" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,0">
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,0">
<property name="spacing">
<number>6</number>
</property>

View File

@ -343,7 +343,7 @@ MainWindow::MainWindow()
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState()));
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle()));
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(applySettingsChanges()));
connect(m_ui->settingsWidget, SIGNAL(apply()), SLOT(applySettingsChanges()));
connect(m_ui->settingsWidget, SIGNAL(settingsReset()), SLOT(applySettingsChanges()));
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(switchToDatabases()));
connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases()));
@ -802,12 +802,12 @@ void MainWindow::openBugReportUrl()
void MainWindow::openGettingStartedGuide()
{
customOpenUrl(filePath()->dataPath("docs/KeePassXC_GettingStarted.pdf"));
customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_GettingStarted.pdf")));
}
void MainWindow::openUserGuide()
{
customOpenUrl(filePath()->dataPath("docs/KeePassXC_UserGuide.pdf"));
customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_UserGuide.pdf")));
}
void MainWindow::openOnlineHelp()

View File

@ -69,6 +69,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="currentIndex">
<number>2</number>
</property>
@ -116,7 +119,11 @@
<number>0</number>
</property>
<item>
<widget class="ApplicationSettingsWidget" name="settingsWidget" native="true"/>
<widget class="ApplicationSettingsWidget" name="settingsWidget" native="true">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
@ -141,7 +148,11 @@
</spacer>
</item>
<item>
<widget class="WelcomeWidget" name="welcomeWidget" native="true"/>
<widget class="WelcomeWidget" name="welcomeWidget" native="true">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
@ -166,7 +177,11 @@
<widget class="QWidget" name="pagePasswordGenerator">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="PasswordGeneratorWidget" name="passwordGeneratorWidget" native="true"/>
<widget class="PasswordGeneratorWidget" name="passwordGeneratorWidget" native="true">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
@ -183,6 +198,9 @@
<height>21</height>
</rect>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
</property>
@ -316,6 +334,9 @@
<addaction name="menuHelp"/>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
</property>

View File

@ -18,8 +18,8 @@
#include "MessageBox.h"
#include <QWindow>
#include <QCheckBox>
#include <QWindow>
QWindow* MessageBox::m_overrideParent(nullptr);
@ -63,6 +63,7 @@ void MessageBox::initializeButtonDefs()
{Skip, {QMessageBox::tr("Skip"), QMessageBox::ButtonRole::AcceptRole}},
{Disable, {QMessageBox::tr("Disable"), QMessageBox::ButtonRole::AcceptRole}},
{Merge, {QMessageBox::tr("Merge"), QMessageBox::ButtonRole::AcceptRole}},
{Continue, {QMessageBox::tr("Continue"), QMessageBox::ButtonRole::AcceptRole}},
};
}
@ -146,6 +147,17 @@ MessageBox::Button MessageBox::critical(QWidget* parent,
return messageBox(parent, QMessageBox::Critical, title, text, buttons, defaultButton, action, checkbox);
}
MessageBox::Button MessageBox::warning(QWidget* parent,
const QString& title,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
MessageBox::Action action,
QCheckBox* checkbox)
{
return messageBox(parent, QMessageBox::Warning, title, text, buttons, defaultButton, action, checkbox);
}
MessageBox::Button MessageBox::information(QWidget* parent,
const QString& title,
const QString& text,
@ -168,17 +180,6 @@ MessageBox::Button MessageBox::question(QWidget* parent,
return messageBox(parent, QMessageBox::Question, title, text, buttons, defaultButton, action, checkbox);
}
MessageBox::Button MessageBox::warning(QWidget* parent,
const QString& title,
const QString& text,
MessageBox::Buttons buttons,
MessageBox::Button defaultButton,
MessageBox::Action action,
QCheckBox* checkbox)
{
return messageBox(parent, QMessageBox::Warning, title, text, buttons, defaultButton, action, checkbox);
}
void MessageBox::setNextAnswer(MessageBox::Button button)
{
m_nextAnswer = button;

View File

@ -59,10 +59,11 @@ public:
Skip = 1 << 24,
Disable = 1 << 25,
Merge = 1 << 26,
Continue = 1 << 27,
// Internal loop markers. Update Last when new KeePassXC button is added
First = Ok,
Last = Merge,
Last = Continue,
};
enum Action
@ -80,28 +81,28 @@ public:
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::NoButton,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);
static Button information(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::NoButton,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);
static Button question(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::NoButton,
Button defaultButton = MessageBox::Ok,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);
static Button warning(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::NoButton,
Button defaultButton = MessageBox::Ok,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);
static Button information(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Ok,
Button defaultButton = MessageBox::Ok,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);
static Button question(QWidget* parent,
const QString& title,
const QString& text,
Buttons buttons = MessageBox::Yes | MessageBox::Cancel,
Button defaultButton = MessageBox::Cancel,
Action action = MessageBox::None,
QCheckBox* checkbox = nullptr);

View File

@ -19,6 +19,7 @@
#include "PasswordEdit.h"
#include "core/Config.h"
#include "core/FilePath.h"
#include "gui/Font.h"
const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15);
@ -28,6 +29,16 @@ PasswordEdit::PasswordEdit(QWidget* parent)
: QLineEdit(parent)
, m_basePasswordEdit(nullptr)
{
const QIcon errorIcon = filePath()->icon("status", "dialog-error");
m_errorAction = addAction(errorIcon, QLineEdit::TrailingPosition);
m_errorAction->setVisible(false);
m_errorAction->setToolTip(tr("Passwords do not match"));
const QIcon correctIcon = filePath()->icon("actions", "dialog-ok");
m_correctAction = addAction(correctIcon, QLineEdit::TrailingPosition);
m_correctAction->setVisible(false);
m_correctAction->setToolTip(tr("Passwords match so far"));
setEchoMode(QLineEdit::Password);
updateStylesheet();
@ -83,19 +94,23 @@ bool PasswordEdit::passwordsEqual() const
void PasswordEdit::updateStylesheet()
{
QString stylesheet("QLineEdit { ");
QString stylesheet("QLineEdit { background: %1; }");
if (m_basePasswordEdit && !passwordsEqual()) {
stylesheet.append("background: %1; ");
bool isCorrect = true;
if (m_basePasswordEdit->text().startsWith(text())) {
stylesheet = stylesheet.arg(CorrectSoFarColor.name());
} else {
stylesheet = stylesheet.arg(ErrorColor.name());
isCorrect = false;
}
m_correctAction->setVisible(isCorrect);
m_errorAction->setVisible(!isCorrect);
} else {
m_correctAction->setVisible(false);
m_errorAction->setVisible(false);
}
stylesheet.append("}");
setStyleSheet(stylesheet);
}

View File

@ -19,6 +19,7 @@
#ifndef KEEPASSX_PASSWORDEDIT_H
#define KEEPASSX_PASSWORDEDIT_H
#include <QAction>
#include <QLineEdit>
#include <QPointer>
@ -47,6 +48,8 @@ private slots:
private:
bool passwordsEqual() const;
QPointer<QAction> m_errorAction;
QPointer<QAction> m_correctAction;
QPointer<PasswordEdit> m_basePasswordEdit;
};

View File

@ -160,6 +160,9 @@ QProgressBar::chunk {
</item>
<item row="0" column="1">
<widget class="PasswordEdit" name="editNewPassword">
<property name="accessibleName">
<string>Generated password</string>
</property>
<property name="maxLength">
<number>999</number>
</property>
@ -167,6 +170,12 @@ QProgressBar::chunk {
</item>
<item row="0" column="2">
<widget class="QToolButton" name="togglePasswordButton">
<property name="accessibleName">
<string>Toggle password visibiity</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -253,7 +262,13 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Upper Case Letters</string>
<string>Upper-case letters</string>
</property>
<property name="accessibleName">
<string>Upper-case letters</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string notr="true">A-Z</string>
@ -278,7 +293,13 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Lower Case Letters</string>
<string>Lower-case letters</string>
</property>
<property name="accessibleName">
<string>Lower-case letters</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string notr="true">a-z</string>
@ -305,6 +326,12 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Numbers</string>
</property>
<property name="accessibleName">
<string>Numbers</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string notr="true">0-9</string>
</property>
@ -331,7 +358,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Special Characters</string>
<string>Special characters</string>
</property>
<property name="accessibleName">
<string>Special characters</string>
</property>
<property name="text">
<string notr="true">/*_&amp; ...</string>
@ -364,6 +394,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Extended ASCII</string>
</property>
<property name="accessibleName">
<string>Extended ASCII</string>
</property>
<property name="text">
<string>ExtendedASCII</string>
</property>
@ -447,7 +480,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Upper Case Letters A to F</string>
<string>Upper-case letters</string>
</property>
<property name="accessibleName">
<string>Upper-case letters</string>
</property>
<property name="text">
<string>A-Z</string>
@ -472,7 +508,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Lower Case Letters A to F</string>
<string>Lower-case letters</string>
</property>
<property name="accessibleName">
<string>Lower-case letters</string>
</property>
<property name="text">
<string>a-z</string>
@ -531,6 +570,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Braces</string>
</property>
<property name="accessibleName">
<string>Braces</string>
</property>
<property name="text">
<string>{[(</string>
</property>
@ -563,6 +605,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Punctuation</string>
</property>
<property name="accessibleName">
<string>Punctuation</string>
</property>
<property name="text">
<string>.,:;</string>
</property>
@ -618,7 +663,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Math</string>
<string>Math Symbols</string>
</property>
<property name="accessibleName">
<string>Math Symbols</string>
</property>
<property name="text">
<string>&lt;*+!?=</string>
@ -643,7 +691,10 @@ QProgressBar::chunk {
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Dashes</string>
<string>Dashes and Slashes</string>
</property>
<property name="accessibleName">
<string>Dashes and Slashes</string>
</property>
<property name="text">
<string>\_|-/</string>
@ -677,6 +728,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Logograms</string>
</property>
<property name="accessibleName">
<string>Logograms</string>
</property>
<property name="text">
<string>#$%&amp;&amp;@^`~</string>
</property>
@ -786,6 +840,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Character set to exclude from generated password</string>
</property>
<property name="accessibleName">
<string>Excluded characters</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
@ -809,6 +866,9 @@ QProgressBar::chunk {
<property name="toolTip">
<string>Add non-hex letters to &quot;do not include&quot; list</string>
</property>
<property name="accessibleName">
<string>Hex Passwords</string>
</property>
<property name="text">
<string>Hex</string>
</property>
@ -881,6 +941,9 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QSlider" name="sliderLength">
<property name="accessibleName">
<string>Password length</string>
</property>
<property name="minimum">
<number>1</number>
</property>
@ -903,6 +966,9 @@ QProgressBar::chunk {
</item>
<item alignment="Qt::AlignRight">
<widget class="QSpinBox" name="spinBoxLength">
<property name="accessibleName">
<string>Password length</string>
</property>
<property name="minimum">
<number>1</number>
</property>
@ -1084,6 +1150,12 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QPushButton" name="buttonGenerate">
<property name="toolTip">
<string>Regenerate password</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string>Regenerate</string>
</property>
@ -1091,6 +1163,12 @@ QProgressBar::chunk {
</item>
<item>
<widget class="QPushButton" name="buttonCopy">
<property name="toolTip">
<string>Copy password</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string>Copy</string>
</property>
@ -1101,6 +1179,12 @@ QProgressBar::chunk {
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Accept password</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
<property name="text">
<string>Accept</string>
</property>
@ -1136,6 +1220,7 @@ QProgressBar::chunk {
<tabstops>
<tabstop>editNewPassword</tabstop>
<tabstop>togglePasswordButton</tabstop>
<tabstop>tabWidget</tabstop>
<tabstop>sliderLength</tabstop>
<tabstop>spinBoxLength</tabstop>
<tabstop>checkBoxUpper</tabstop>
@ -1149,15 +1234,16 @@ QProgressBar::chunk {
<tabstop>checkBoxPunctuation</tabstop>
<tabstop>checkBoxMath</tabstop>
<tabstop>checkBoxLogograms</tabstop>
<tabstop>checkBoxLowerAdv</tabstop>
<tabstop>checkBoxBraces</tabstop>
<tabstop>checkBoxQuotes</tabstop>
<tabstop>checkBoxDashes</tabstop>
<tabstop>checkBoxExtASCIIAdv</tabstop>
<tabstop>editExcludedChars</tabstop>
<tabstop>buttonSimpleMode</tabstop>
<tabstop>buttonAddHex</tabstop>
<tabstop>checkBoxExcludeAlike</tabstop>
<tabstop>checkBoxEnsureEvery</tabstop>
<tabstop>tabWidget</tabstop>
<tabstop>buttonSimpleMode</tabstop>
<tabstop>comboBoxWordList</tabstop>
<tabstop>sliderWordCount</tabstop>
<tabstop>spinBoxWordCount</tabstop>

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>249</width>
<height>248</height>
<height>278</height>
</rect>
</property>
<property name="windowTitle">
@ -30,7 +30,14 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="seedEdit"/>
<widget class="QLineEdit" name="seedEdit">
<property name="toolTip">
<string>Secret key in Base32 format</string>
</property>
<property name="accessibleName">
<string>Secret key field</string>
</property>
</widget>
</item>
</layout>
</item>
@ -121,6 +128,9 @@
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="stepSpinBox">
<property name="accessibleName">
<string>Time step field</string>
</property>
<property name="suffix">
<string comment="Seconds"> sec</string>
</property>
@ -181,6 +191,16 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>seedEdit</tabstop>
<tabstop>radioDefault</tabstop>
<tabstop>radioSteam</tabstop>
<tabstop>radioCustom</tabstop>
<tabstop>stepSpinBox</tabstop>
<tabstop>radio6Digits</tabstop>
<tabstop>radio7Digits</tabstop>
<tabstop>radio8Digits</tabstop>
</tabstops>
<resources/>
<connections/>
<buttongroups>

View File

@ -185,10 +185,21 @@
<height>110</height>
</size>
</property>
<property name="accessibleName">
<string>Open a recent database</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>buttonNewDatabase</tabstop>
<tabstop>buttonOpenDatabase</tabstop>
<tabstop>buttonImportKeePass1</tabstop>
<tabstop>buttonImportOpVault</tabstop>
<tabstop>buttonImportCSV</tabstop>
<tabstop>recentListWidget</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -143,6 +143,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>Codec</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
@ -184,6 +187,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>Text qualification</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
@ -225,6 +231,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>Field seperation</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
@ -266,6 +275,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>Comments start with</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
@ -308,7 +320,7 @@
</font>
</property>
<property name="text">
<string>Number of headers line to discard</string>
<string>Number of header lines to discard</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@ -323,6 +335,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>Number of header lines to discard</string>
</property>
</widget>
</item>
</layout>
@ -417,6 +432,9 @@
<bold>false</bold>
</font>
</property>
<property name="accessibleName">
<string>CSV import preview</string>
</property>
<attribute name="horizontalHeaderVisible">
<bool>true</bool>
</attribute>

View File

@ -112,6 +112,9 @@
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QTableView" name="customDataTable">
<property name="accessibleName">
<string>Stored browser keys</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@ -133,6 +136,9 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="removeCustomDataButton">
<property name="accessibleName">
<string>Remove selected key</string>
</property>
<property name="text">
<string>Remove</string>
</property>

View File

@ -77,6 +77,9 @@
</item>
<item>
<widget class="QPushButton" name="activateChangeDecryptionTimeButton">
<property name="accessibleName">
<string>Change existing decryption time</string>
</property>
<property name="text">
<string>Change</string>
</property>
@ -89,6 +92,9 @@
<layout class="QVBoxLayout" name="decryptionTimeSliderLayout">
<item>
<widget class="QSlider" name="decryptionTimeSlider">
<property name="accessibleName">
<string>Decryption time in seconds</string>
</property>
<property name="minimum">
<number>1</number>
</property>
@ -198,6 +204,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Database format</string>
</property>
</widget>
</item>
</layout>
@ -240,6 +249,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Encryption algorithm</string>
</property>
<item>
<property name="text">
<string>AES: 256 Bit (default)</string>
@ -267,6 +279,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Key derivation function</string>
</property>
</widget>
</item>
<item row="2" column="0">
@ -292,6 +307,9 @@
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Transform rounds</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
@ -349,6 +367,9 @@
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Memory usage</string>
</property>
<property name="minimum">
<number>1</number>
</property>
@ -378,6 +399,9 @@
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Parallelism</string>
</property>
<property name="minimum">
<number>1</number>
</property>

View File

@ -49,7 +49,11 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="dbNameEdit"/>
<widget class="QLineEdit" name="dbNameEdit">
<property name="accessibleName">
<string>Database name field</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="dbDescriptionLabel">
@ -59,7 +63,11 @@
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="dbDescriptionEdit"/>
<widget class="QLineEdit" name="dbDescriptionEdit">
<property name="accessibleName">
<string>Database description field</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="defaultUsernameLabel">
@ -73,6 +81,9 @@
<property name="enabled">
<bool>true</bool>
</property>
<property name="accessibleName">
<string>Default username field</string>
</property>
</widget>
</item>
</layout>
@ -88,6 +99,9 @@
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="historyMaxItemsCheckBox">
<property name="toolTip">
<string>Maximum number of history items per entry</string>
</property>
<property name="text">
<string>Max. history items:</string>
</property>
@ -95,6 +109,9 @@
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="historyMaxSizeCheckBox">
<property name="toolTip">
<string>Maximum size of history per entry</string>
</property>
<property name="text">
<string>Max. history size:</string>
</property>
@ -102,6 +119,12 @@
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="historyMaxSizeSpinBox">
<property name="toolTip">
<string>Maximum size of history per entry</string>
</property>
<property name="accessibleName">
<string>Maximum size of history per entry</string>
</property>
<property name="suffix">
<string> MiB</string>
</property>
@ -115,6 +138,12 @@
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="historyMaxItemsSpinBox">
<property name="toolTip">
<string>Maximum number of history items per entry</string>
</property>
<property name="accessibleName">
<string>Maximum number of history items per entry</string>
</property>
<property name="maximum">
<number>2000000000</number>
</property>

View File

@ -31,7 +31,11 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="databaseName"/>
<widget class="QLineEdit" name="databaseName">
<property name="accessibleName">
<string>Database name field</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="databaseDescriptionLabel">
@ -41,7 +45,11 @@
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="databaseDescription"/>
<widget class="QLineEdit" name="databaseDescription">
<property name="accessibleName">
<string>Database description field</string>
</property>
</widget>
</item>
</layout>
</widget>

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>532</width>
<height>364</height>
<height>374</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
@ -32,6 +32,9 @@
<height>0</height>
</size>
</property>
<property name="accessibleName">
<string>Attribute selection</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
@ -55,6 +58,9 @@
<height>0</height>
</size>
</property>
<property name="accessibleName">
<string>Attribute value</string>
</property>
</widget>
</widget>
</item>
@ -62,6 +68,9 @@
<layout class="QVBoxLayout" name="attributesButtonLayout">
<item>
<widget class="QPushButton" name="addAttributeButton">
<property name="accessibleName">
<string>Add a new attribute</string>
</property>
<property name="text">
<string>Add</string>
</property>
@ -72,6 +81,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Remove selected attribute</string>
</property>
<property name="text">
<string>Remove</string>
</property>
@ -82,6 +94,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Edit attribute name</string>
</property>
<property name="text">
<string>Edit Name</string>
</property>
@ -105,6 +120,9 @@
<property name="enabled">
<bool>true</bool>
</property>
<property name="accessibleName">
<string>Toggle attribute protection</string>
</property>
<property name="styleSheet">
<string notr="true">margin-left:50%;margin-right:50%</string>
</property>
@ -121,6 +139,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Show a protected attribute</string>
</property>
<property name="text">
<string>Reveal</string>
</property>
@ -177,6 +198,9 @@
<height>25</height>
</size>
</property>
<property name="accessibleName">
<string>Foreground color selection</string>
</property>
<property name="text">
<string/>
</property>
@ -219,6 +243,9 @@
<height>25</height>
</size>
</property>
<property name="accessibleName">
<string>Background color selection</string>
</property>
<property name="text">
<string/>
</property>
@ -264,6 +291,12 @@
<tabstop>addAttributeButton</tabstop>
<tabstop>removeAttributeButton</tabstop>
<tabstop>editAttributeButton</tabstop>
<tabstop>protectAttributeButton</tabstop>
<tabstop>revealAttributeButton</tabstop>
<tabstop>fgColorCheckBox</tabstop>
<tabstop>fgColorButton</tabstop>
<tabstop>bgColorCheckBox</tabstop>
<tabstop>bgColorButton</tabstop>
</tabstops>
<resources/>
<connections/>

View File

@ -83,6 +83,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Custom Auto-Type sequence</string>
</property>
</widget>
</item>
<item>
@ -91,10 +94,10 @@
<bool>false</bool>
</property>
<property name="toolTip">
<string>Open AutoType help webpage</string>
<string>Open Auto-Type help webpage</string>
</property>
<property name="accessibleName">
<string>AutoType help button</string>
<string>Open Auto-Type help webpage</string>
</property>
<property name="text">
<string/>
@ -113,6 +116,9 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTreeView" name="assocView">
<property name="accessibleName">
<string>Existing window associations</string>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
@ -159,6 +165,12 @@
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>Add new window association</string>
</property>
<property name="accessibleName">
<string>Add new window association</string>
</property>
<property name="text">
<string>+</string>
</property>
@ -181,6 +193,12 @@
<height>25</height>
</size>
</property>
<property name="toolTip">
<string>Remove selected window association</string>
</property>
<property name="accessibleName">
<string>Remove selected window association</string>
</property>
<property name="text">
<string>-</string>
</property>
@ -200,7 +218,17 @@
</widget>
</item>
<item>
<widget class="WindowSelectComboBox" name="windowTitleCombo"/>
<widget class="WindowSelectComboBox" name="windowTitleCombo">
<property name="toolTip">
<string>You can use an asterisk (*) to match everything</string>
</property>
<property name="accessibleName">
<string>Set the window association title</string>
</property>
<property name="accessibleDescription">
<string>You can use an asterisk to match everything</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
@ -248,6 +276,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Custom Auto-Type sequence for this window</string>
</property>
</widget>
</item>
</layout>

View File

@ -25,6 +25,9 @@
</property>
<item>
<widget class="QTreeView" name="historyView">
<property name="accessibleName">
<string>Entry history selection</string>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
@ -43,6 +46,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Show entry at selected history state</string>
</property>
<property name="accessibleName">
<string>Show entry at selected history state</string>
</property>
<property name="text">
<string>Show</string>
</property>
@ -53,6 +62,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Restore entry to selected history state</string>
</property>
<property name="accessibleName">
<string>Restore entry to selected history state</string>
</property>
<property name="text">
<string>Restore</string>
</property>
@ -63,6 +78,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Delete selected history state</string>
</property>
<property name="accessibleName">
<string>Delete selected history state</string>
</property>
<property name="text">
<string>Delete</string>
</property>
@ -73,6 +94,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Delete all history</string>
</property>
<property name="accessibleName">
<string>Delete all history</string>
</property>
<property name="text">
<string>Delete all</string>
</property>

View File

@ -2,6 +2,14 @@
<ui version="4.0">
<class>EditEntryWidgetMain</class>
<widget class="QWidget" name="EditEntryWidgetMain">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>329</width>
<height>381</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
@ -22,10 +30,20 @@
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLineEdit" name="urlEdit"/>
<widget class="QLineEdit" name="urlEdit">
<property name="accessibleName">
<string>Url field</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="fetchFaviconButton">
<property name="toolTip">
<string>Download favicon for URL</string>
</property>
<property name="accessibleName">
<string>Download favicon for URL</string>
</property>
</widget>
</item>
</layout>
@ -44,6 +62,9 @@
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="PasswordEdit" name="passwordRepeatEdit">
<property name="accessibleName">
<string>Repeat password field</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@ -51,6 +72,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordGeneratorButton">
<property name="accessibleName">
<string>Toggle password generator</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -62,6 +86,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="PasswordEdit" name="passwordEdit">
<property name="accessibleName">
<string>Password field</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@ -69,6 +96,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
<property name="accessibleName">
<string>Toggle password visibility</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -92,6 +122,9 @@
</item>
<item row="9" column="0" alignment="Qt::AlignLeft|Qt::AlignTop">
<widget class="QCheckBox" name="notesEnabled">
<property name="accessibleName">
<string>Toggle notes visible</string>
</property>
<property name="text">
<string>Notes</string>
</property>
@ -104,6 +137,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Expiration field</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
@ -117,6 +153,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Expiration presets</string>
</property>
<property name="text">
<string>Presets</string>
</property>
@ -138,6 +177,9 @@
<height>100</height>
</size>
</property>
<property name="accessibleName">
<string>Notes field</string>
</property>
</widget>
</item>
<item row="9" column="1">
@ -161,13 +203,24 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="titleEdit"/>
<widget class="QLineEdit" name="titleEdit">
<property name="accessibleName">
<string>Title field</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="usernameComboBox"/>
<widget class="QComboBox" name="usernameComboBox">
<property name="accessibleName">
<string>Username field</string>
</property>
</widget>
</item>
<item row="7" column="0" alignment="Qt::AlignRight">
<widget class="QCheckBox" name="expireCheck">
<property name="accessibleName">
<string>Toggle expiration</string>
</property>
<property name="text">
<string>Expires</string>
</property>
@ -193,12 +246,15 @@
<tabstop>titleEdit</tabstop>
<tabstop>usernameComboBox</tabstop>
<tabstop>passwordEdit</tabstop>
<tabstop>passwordRepeatEdit</tabstop>
<tabstop>togglePasswordButton</tabstop>
<tabstop>passwordRepeatEdit</tabstop>
<tabstop>togglePasswordGeneratorButton</tabstop>
<tabstop>urlEdit</tabstop>
<tabstop>fetchFaviconButton</tabstop>
<tabstop>expireCheck</tabstop>
<tabstop>expireDatePicker</tabstop>
<tabstop>expirePresets</tabstop>
<tabstop>notesEnabled</tabstop>
<tabstop>notesEdit</tabstop>
</tabstops>
<resources/>

View File

@ -37,6 +37,9 @@
</item>
<item>
<widget class="QSpinBox" name="lifetimeSpinBox">
<property name="accessibleName">
<string>Remove key from agent after specified seconds</string>
</property>
<property name="suffix">
<string> seconds</string>
</property>
@ -165,6 +168,9 @@
</item>
<item row="3" column="2">
<widget class="QPushButton" name="browseButton">
<property name="accessibleName">
<string>Browser for key file</string>
</property>
<property name="text">
<string extracomment="Button for opening file dialog">Browse...</string>
</property>
@ -181,7 +187,14 @@
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="externalFileEdit"/>
<widget class="QLineEdit" name="externalFileEdit">
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="accessibleName">
<string>External key file</string>
</property>
</widget>
</item>
<item row="4" column="1">
<layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0">
@ -209,6 +222,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Select attachment file</string>
</property>
<property name="editable">
<bool>false</bool>
</property>
@ -270,6 +286,22 @@
</item>
</layout>
</widget>
<tabstops>
<tabstop>addKeyToAgentCheckBox</tabstop>
<tabstop>removeKeyFromAgentCheckBox</tabstop>
<tabstop>requireUserConfirmationCheckBox</tabstop>
<tabstop>lifetimeCheckBox</tabstop>
<tabstop>lifetimeSpinBox</tabstop>
<tabstop>attachmentRadioButton</tabstop>
<tabstop>attachmentComboBox</tabstop>
<tabstop>externalFileRadioButton</tabstop>
<tabstop>browseButton</tabstop>
<tabstop>addToAgentButton</tabstop>
<tabstop>removeFromAgentButton</tabstop>
<tabstop>decryptButton</tabstop>
<tabstop>publicKeyEdit</tabstop>
<tabstop>copyToClipboardButton</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -2,6 +2,14 @@
<ui version="4.0">
<class>EntryAttachmentsWidget</class>
<widget class="QWidget" name="EntryAttachmentsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>337</width>
<height>289</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
@ -19,7 +27,11 @@
<number>0</number>
</property>
<item>
<widget class="QTableView" name="attachmentsView"/>
<widget class="QTableView" name="attachmentsView">
<property name="accessibleName">
<string>Attachments</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="actionsWidget" native="true">
@ -41,6 +53,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Add new attachment</string>
</property>
<property name="text">
<string>Add</string>
</property>
@ -51,6 +66,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Remove selected attachment</string>
</property>
<property name="text">
<string>Remove</string>
</property>
@ -61,6 +79,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Open selected attachment</string>
</property>
<property name="text">
<string>Open</string>
</property>
@ -71,6 +92,9 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Save selected attachment to disk</string>
</property>
<property name="text">
<string>Save</string>
</property>

View File

@ -18,9 +18,11 @@
#include "EntryView.h"
#include <QAccessible>
#include <QHeaderView>
#include <QKeyEvent>
#include <QMenu>
#include <QShortcut>
#include "core/FilePath.h"
#include "gui/SortFilterHideProxyModel.h"
@ -56,6 +58,8 @@ EntryView::EntryView(QWidget* parent)
connect(m_model, SIGNAL(passwordsHiddenChanged()), SIGNAL(viewStateChanged()));
// clang-format on
new QShortcut(Qt::CTRL + Qt::Key_F10, this, SLOT(contextMenuShortcutPressed()), nullptr, Qt::WidgetShortcut);
m_headerMenu = new QMenu(this);
m_headerMenu->setTitle(tr("Customize View"));
m_headerMenu->addSection(tr("Customize View"));
@ -128,6 +132,14 @@ EntryView::EntryView(QWidget* parent)
m_model->setPaperClipPixmap(filePath()->icon("actions", "paperclip").pixmap(16));
}
void EntryView::contextMenuShortcutPressed()
{
auto index = currentIndex();
if (hasFocus() && index.isValid()) {
emit customContextMenuRequested(visualRect(index).bottomLeft());
}
}
void EntryView::keyPressEvent(QKeyEvent* event)
{
if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) && currentIndex().isValid()) {
@ -140,15 +152,18 @@ void EntryView::keyPressEvent(QKeyEvent* event)
int last = m_model->rowCount() - 1;
if (last > 0) {
QAccessibleEvent accessibleEvent(this, QAccessible::PageChanged);
if (event->key() == Qt::Key_Up && currentIndex().row() == 0) {
QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(last, 0));
setCurrentEntry(m_model->entryFromIndex(index));
QAccessible::updateAccessibility(&accessibleEvent);
return;
}
if (event->key() == Qt::Key_Down && currentIndex().row() == last) {
QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0));
setCurrentEntry(m_model->entryFromIndex(index));
QAccessible::updateAccessibility(&accessibleEvent);
return;
}
}

View File

@ -72,6 +72,7 @@ private slots:
void fitColumnsToWindow();
void fitColumnsToContents();
void resetViewToDefaults();
void contextMenuShortcutPressed();
private:
void fillRemainingWidth(bool lastColumnOnly);

View File

@ -31,7 +31,11 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="editName"/>
<widget class="QLineEdit" name="editName">
<property name="accessibleName">
<string>Name field</string>
</property>
</widget>
</item>
<item row="1" column="0" alignment="Qt::AlignRight|Qt::AlignTop">
<widget class="QLabel" name="labelNotes">
@ -54,23 +58,36 @@
<height>120</height>
</size>
</property>
<property name="accessibleName">
<string>Notes field</string>
</property>
</widget>
</item>
<item row="2" column="0" alignment="Qt::AlignRight">
<widget class="QCheckBox" name="expireCheck">
<property name="accessibleName">
<string>Toggle expiration</string>
</property>
<property name="text">
<string>Expires</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="autotypeComboBox"/>
<widget class="QComboBox" name="autotypeComboBox">
<property name="accessibleName">
<string>Auto-Type toggle for this and sub groups</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDateTimeEdit" name="expireDatePicker">
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Expiration field</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
@ -84,7 +101,11 @@
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="searchComboBox"/>
<widget class="QComboBox" name="searchComboBox">
<property name="accessibleName">
<string>Search toggle for this and sub groups</string>
</property>
</widget>
</item>
<item row="4" column="0" alignment="Qt::AlignRight">
<widget class="QLabel" name="autotypeLabel">
@ -130,6 +151,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="accessibleName">
<string>Default auto-type sequence field</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
</widget>
</item>
</layout>

View File

@ -20,6 +20,7 @@
#include <QDragMoveEvent>
#include <QMetaObject>
#include <QMimeData>
#include <QShortcut>
#include "core/Database.h"
#include "core/Group.h"
@ -42,6 +43,8 @@ GroupView::GroupView(Database* db, QWidget* parent)
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(emitGroupChanged()));
// clang-format on
new QShortcut(Qt::CTRL + Qt::Key_F10, this, SLOT(contextMenuShortcutPressed()), nullptr, Qt::WidgetShortcut);
modelReset();
setDragEnabled(true);
@ -50,6 +53,14 @@ GroupView::GroupView(Database* db, QWidget* parent)
setDefaultDropAction(Qt::MoveAction);
}
void GroupView::contextMenuShortcutPressed()
{
auto index = currentIndex();
if (hasFocus() && index.isValid()) {
emit customContextMenuRequested(visualRect(index).bottomLeft());
}
}
void GroupView::changeDatabase(const QSharedPointer<Database>& newDb)
{
m_model->changeDatabase(newDb.data());

View File

@ -45,6 +45,7 @@ private slots:
void emitGroupChanged();
void syncExpandedState(const QModelIndex& parent, int start, int end);
void modelReset();
void contextMenuShortcutPressed();
protected:
void dragMoveEvent(QDragMoveEvent* event) override;

View File

@ -31,6 +31,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Key file selection</string>
</property>
<property name="editable">
<bool>true</bool>
</property>
@ -38,13 +41,19 @@
</item>
<item row="0" column="1">
<widget class="QPushButton" name="browseKeyFileButton">
<property name="accessibleName">
<string>Browse for key file</string>
</property>
<property name="text">
<string>Browse</string>
<string>Browse...</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="createKeyFileButton">
<property name="accessibleName">
<string>Generate a new key file</string>
</property>
<property name="text">
<string>Generate</string>
</property>

View File

@ -34,6 +34,9 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="PasswordEdit" name="enterPasswordEdit">
<property name="accessibleName">
<string>Password field</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@ -41,6 +44,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
<property name="accessibleName">
<string>Toggle password visibility</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -52,13 +58,20 @@
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="PasswordEdit" name="repeatPasswordEdit">
<property name="accessibleName">
<string>Repeat password field</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="passwordGeneratorButton"/>
<widget class="QToolButton" name="passwordGeneratorButton">
<property name="accessibleName">
<string>Toggle password generator</string>
</property>
</widget>
</item>
</layout>
</item>

View File

@ -30,6 +30,9 @@
</property>
<item row="0" column="1">
<widget class="QPushButton" name="buttonRedetectYubikey">
<property name="accessibleName">
<string>Refresh hardware tokens</string>
</property>
<property name="text">
<string>Refresh</string>
</property>
@ -43,6 +46,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="accessibleName">
<string>Hardware key slot selection</string>
</property>
</widget>
</item>
<item row="1" column="0">

View File

@ -31,6 +31,12 @@
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QCheckBox" name="enableImportCheckBox">
<property name="toolTip">
<string>Allow KeeShare imports</string>
</property>
<property name="accessibleName">
<string>Allow KeeShare imports</string>
</property>
<property name="text">
<string>Allow import</string>
</property>
@ -38,6 +44,12 @@
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="enableExportCheckBox">
<property name="toolTip">
<string>Allow KeeShare exports</string>
</property>
<property name="accessibleName">
<string>Allow KeeShare exports</string>
</property>
<property name="text">
<string>Allow export</string>
</property>
@ -77,6 +89,9 @@
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificatePrivateKeyEdit">
<property name="accessibleName">
<string>Key</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -105,16 +120,26 @@
</item>
<item row="4" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificatePublicKeyEdit">
<property name="accessibleName">
<string>Certificate</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificateSignerEdit"/>
<widget class="QLineEdit" name="ownCertificateSignerEdit">
<property name="accessibleName">
<string>Signer name field</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QLineEdit" name="ownCertificateFingerprintEdit">
<property name="accessibleName">
<string>Fingerprint</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -137,6 +162,9 @@
</item>
<item>
<widget class="QPushButton" name="generateOwnCerticateButton">
<property name="accessibleName">
<string>Generate new certificate</string>
</property>
<property name="text">
<string>Generate</string>
</property>
@ -144,6 +172,9 @@
</item>
<item>
<widget class="QPushButton" name="importOwnCertificateButton">
<property name="accessibleName">
<string>Import existing certificate</string>
</property>
<property name="text">
<string>Import</string>
</property>
@ -151,6 +182,9 @@
</item>
<item>
<widget class="QPushButton" name="exportOwnCertificateButton">
<property name="accessibleName">
<string>Export own certificate</string>
</property>
<property name="text">
<string>Export</string>
</property>
@ -169,6 +203,9 @@
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0" rowspan="2">
<widget class="QTableView" name="importedCertificateTableView">
<property name="accessibleName">
<string>Known shares</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
@ -215,6 +252,9 @@
</item>
<item>
<widget class="QPushButton" name="trustImportedCertificateButton">
<property name="accessibleName">
<string>Trust selected certificate</string>
</property>
<property name="text">
<string>Trust</string>
</property>
@ -222,6 +262,9 @@
</item>
<item>
<widget class="QPushButton" name="askImportedCertificateButton">
<property name="accessibleName">
<string>Ask whether to trust the selected certificate every time</string>
</property>
<property name="text">
<string>Ask</string>
</property>
@ -229,6 +272,9 @@
</item>
<item>
<widget class="QPushButton" name="untrustImportedCertificateButton">
<property name="accessibleName">
<string>Untrust selected certificate</string>
</property>
<property name="text">
<string>Untrust</string>
</property>
@ -236,6 +282,9 @@
</item>
<item>
<widget class="QPushButton" name="removeImportedCertificateButton">
<property name="accessibleName">
<string>Remove selected certificate</string>
</property>
<property name="text">
<string>Remove</string>
</property>

View File

@ -39,7 +39,11 @@
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="typeComboBox"/>
<widget class="QComboBox" name="typeComboBox">
<property name="accessibleName">
<string>Sharing mode field</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="pathLabel">
@ -51,10 +55,17 @@
<item row="3" column="1">
<layout class="QHBoxLayout" name="pathLayout">
<item>
<widget class="QLineEdit" name="pathEdit"/>
<widget class="QLineEdit" name="pathEdit">
<property name="accessibleName">
<string>Path to share file field</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="pathSelectionButton">
<property name="accessibleName">
<string>Browser for share file</string>
</property>
<property name="text">
<string>...</string>
</property>
@ -73,6 +84,9 @@
<layout class="QHBoxLayout" name="passwordLayout">
<item>
<widget class="PasswordEdit" name="passwordEdit">
<property name="accessibleName">
<string>Password field</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
@ -80,6 +94,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordButton">
<property name="accessibleName">
<string>Toggle password visibility</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -87,6 +104,9 @@
</item>
<item>
<widget class="QToolButton" name="togglePasswordGeneratorButton">
<property name="accessibleName">
<string>Toggle password generator</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -99,6 +119,9 @@
</item>
<item row="6" column="1">
<widget class="QPushButton" name="clearButton">
<property name="accessibleName">
<string>Clear fields</string>
</property>
<property name="text">
<string>Clear</string>
</property>