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

View File

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

View File

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

View File

@ -89,6 +89,13 @@ void Config::sync()
m_settings->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() void Config::upgrade()
{ {
const auto keys = deprecationMap.keys(); const auto keys = deprecationMap.keys();

View File

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

View File

@ -34,16 +34,21 @@
*/ */
void Translator::installTranslators() 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; QLocale locale;
QString language = config()->get("GUI/Language").toString(); languages = locale.uiLanguages();
if (!language.isEmpty() && language != "system") { } else {
// use actual English translation instead of the English locale source language languages << languageSetting;
if (language == "en") {
language = "en_US";
}
locale = QLocale(language);
} }
// Always try to load english last
languages << "en_US";
const QStringList paths = { const QStringList paths = {
#ifdef QT_DEBUG #ifdef QT_DEBUG
QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR), QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
@ -52,9 +57,10 @@ void Translator::installTranslators()
bool translationsLoaded = false; bool translationsLoaded = false;
for (const QString& path : paths) { for (const QString& path : paths) {
translationsLoaded |= installTranslator(locale, path) || installTranslator(QLocale("en_US"), path); installQtTranslator(languages, path);
if (!installQtTranslator(language, path)) { if (installTranslator(languages, path)) {
installQtTranslator(QLocale("en"), 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 * @return list of pairs of available language codes and names
*/ */
@ -108,38 +156,3 @@ QList<QPair<QString, QString>> Translator::availableLanguages()
return languages; 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(); static QList<QPair<QString, QString>> availableLanguages();
private: private:
static bool installTranslator(const QLocale& locale, const QString& path); static bool installTranslator(const QStringList& languages, const QString& path);
static bool installQtTranslator(const QLocale& locale, const QString& path); static bool installQtTranslator(const QStringList& languages, const QString& path);
}; };
#endif // KEEPASSX_TRANSLATOR_H #endif // KEEPASSX_TRANSLATOR_H

View File

@ -28,6 +28,7 @@
#include "core/Global.h" #include "core/Global.h"
#include "core/Translator.h" #include "core/Translator.h"
#include "MessageBox.h"
#include "touchid/TouchID.h" #include "touchid/TouchID.h"
class ApplicationSettingsWidget::ExtraPage class ApplicationSettingsWidget::ExtraPage
@ -54,6 +55,28 @@ private:
QWidget* widget; 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) ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
: EditWidget(parent) : EditWidget(parent)
, m_secWidget(new QWidget()) , 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->systrayShowCheckBox, SIGNAL(toggled(bool)), SLOT(systrayToggled(bool)));
connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool))); connect(m_generalUi->toolbarHideCheckBox, SIGNAL(toggled(bool)), SLOT(toolbarSettingsToggled(bool)));
connect(m_generalUi->rememberLastDatabasesCheckBox, SIGNAL(toggled(bool)), SLOT(rememberDatabasesToggled(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)), connect(m_secUi->clearClipboardCheckBox, SIGNAL(toggled(bool)),
m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool))); m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
@ -95,6 +119,13 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool))); m_secUi->touchIDResetSpinBox, SLOT(setEnabled(bool)));
// clang-format on // 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 #ifdef WITH_XC_UPDATECHECK
connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool))); connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool)));
#else #else
@ -246,7 +277,6 @@ void ApplicationSettingsWidget::loadSettings()
void ApplicationSettingsWidget::saveSettings() void ApplicationSettingsWidget::saveSettings()
{ {
if (config()->hasAccessError()) { if (config()->hasAccessError()) {
showMessage(tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); 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 // We prevent closing the settings page if we could not write to
@ -330,6 +360,7 @@ void ApplicationSettingsWidget::saveSettings()
config()->set("LastDatabases", {}); config()->set("LastDatabases", {});
config()->set("OpenPreviousDatabasesOnStartup", {}); config()->set("OpenPreviousDatabasesOnStartup", {});
config()->set("LastActiveDatabase", {}); config()->set("LastActiveDatabase", {});
config()->set("LastAttachmentDir", {});
} }
if (!config()->get("RememberLastKeyFiles").toBool()) { 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() void ApplicationSettingsWidget::reject()
{ {
// register the old key again as it might have changed // register the old key again as it might have changed

View File

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

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>684</width> <width>684</width>
<height>860</height> <height>951</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
@ -349,6 +349,12 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Website icon download timeout in seconds</string>
</property>
<property name="suffix"> <property name="suffix">
<string comment="Seconds"> sec</string> <string comment="Seconds"> sec</string>
</property> </property>
@ -437,7 +443,7 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="toolButtonStyleLayout"> <layout class="QHBoxLayout" name="toolButtonStyleLayout" stretch="0,0,0,1">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
@ -487,8 +493,30 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </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> </widget>
</item> </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> </layout>
</item> </item>
<item> <item>
@ -521,7 +549,7 @@
<enum>QLayout::SetMaximumSize</enum> <enum>QLayout::SetMaximumSize</enum>
</property> </property>
<item> <item>
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
@ -609,7 +637,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="languageLabelLayout_2"> <layout class="QHBoxLayout" name="languageLabelLayout_2" stretch="0,0,0,1">
<property name="spacing"> <property name="spacing">
<number>8</number> <number>8</number>
</property> </property>
@ -634,6 +662,12 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="accessibleName">
<string>Language selection</string>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -643,6 +677,68 @@
</property> </property>
</widget> </widget>
</item> </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> </layout>
</item> </item>
</layout> </layout>
@ -715,6 +811,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="accessibleName">
<string>Global auto-type shortcut</string>
</property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
@ -732,6 +831,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="accessibleName">
<string>Auto-type character typing delay milliseconds</string>
</property>
<property name="suffix"> <property name="suffix">
<string comment="Milliseconds"> ms</string> <string comment="Milliseconds"> ms</string>
</property> </property>
@ -761,6 +863,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="accessibleName">
<string>Auto-type start delay milliseconds</string>
</property>
<property name="suffix"> <property name="suffix">
<string comment="Milliseconds"> ms</string> <string comment="Milliseconds"> ms</string>
</property> </property>

View File

@ -28,14 +28,7 @@
<property name="title"> <property name="title">
<string>Timeouts</string> <string>Timeouts</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
<item row="0" column="0">
<widget class="QCheckBox" name="clearClipboardCheckBox">
<property name="text">
<string>Clear clipboard after</string>
</property>
</widget>
</item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QSpinBox" name="clearClipboardSpinBox"> <widget class="QSpinBox" name="clearClipboardSpinBox">
<property name="enabled"> <property name="enabled">
@ -47,6 +40,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="accessibleName">
<string>Clipboard clear seconds</string>
</property>
<property name="suffix"> <property name="suffix">
<string comment="Seconds"> sec</string> <string comment="Seconds"> sec</string>
</property> </property>
@ -61,14 +57,93 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="3" column="0">
<widget class="QCheckBox" name="clearSearchCheckBox"> <widget class="QCheckBox" name="touchIDResetCheckBox">
<property name="text"> <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> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <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"> <widget class="QSpinBox" name="clearSearchSpinBox">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
@ -96,70 +171,17 @@
</property> </property>
</widget> </widget>
</item> </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"> <item row="2" column="0">
<widget class="QCheckBox" name="lockDatabaseIdleCheckBox"> <widget class="QCheckBox" name="clearSearchCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>Lock databases after inactivity of</string> <string>Clear search query after</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>
</property> </property>
</widget> </widget>
</item> </item>
@ -272,6 +294,21 @@
</item> </item>
</layout> </layout>
</widget> </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/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

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

View File

@ -521,7 +521,7 @@
<attribute name="title"> <attribute name="title">
<string>Advanced</string> <string>Advanced</string>
</attribute> </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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -976,7 +976,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="2" colspan="2"> <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"> <property name="spacing">
<number>6</number> <number>6</number>
</property> </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(setMenuActionState()));
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle())); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle()));
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(applySettingsChanges())); 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(accepted()), SLOT(switchToDatabases()));
connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases())); connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases()));
@ -802,12 +802,12 @@ void MainWindow::openBugReportUrl()
void MainWindow::openGettingStartedGuide() void MainWindow::openGettingStartedGuide()
{ {
customOpenUrl(filePath()->dataPath("docs/KeePassXC_GettingStarted.pdf")); customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_GettingStarted.pdf")));
} }
void MainWindow::openUserGuide() void MainWindow::openUserGuide()
{ {
customOpenUrl(filePath()->dataPath("docs/KeePassXC_UserGuide.pdf")); customOpenUrl(QString("file:///%1").arg(filePath()->dataPath("docs/KeePassXC_UserGuide.pdf")));
} }
void MainWindow::openOnlineHelp() void MainWindow::openOnlineHelp()

View File

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

View File

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

View File

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

View File

@ -19,6 +19,7 @@
#include "PasswordEdit.h" #include "PasswordEdit.h"
#include "core/Config.h" #include "core/Config.h"
#include "core/FilePath.h"
#include "gui/Font.h" #include "gui/Font.h"
const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15); const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15);
@ -28,6 +29,16 @@ PasswordEdit::PasswordEdit(QWidget* parent)
: QLineEdit(parent) : QLineEdit(parent)
, m_basePasswordEdit(nullptr) , 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); setEchoMode(QLineEdit::Password);
updateStylesheet(); updateStylesheet();
@ -83,19 +94,23 @@ bool PasswordEdit::passwordsEqual() const
void PasswordEdit::updateStylesheet() void PasswordEdit::updateStylesheet()
{ {
QString stylesheet("QLineEdit { "); QString stylesheet("QLineEdit { background: %1; }");
if (m_basePasswordEdit && !passwordsEqual()) { if (m_basePasswordEdit && !passwordsEqual()) {
stylesheet.append("background: %1; "); bool isCorrect = true;
if (m_basePasswordEdit->text().startsWith(text())) { if (m_basePasswordEdit->text().startsWith(text())) {
stylesheet = stylesheet.arg(CorrectSoFarColor.name()); stylesheet = stylesheet.arg(CorrectSoFarColor.name());
} else { } else {
stylesheet = stylesheet.arg(ErrorColor.name()); 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); setStyleSheet(stylesheet);
} }

View File

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

View File

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

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>249</width> <width>249</width>
<height>248</height> <height>278</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -30,7 +30,14 @@
</widget> </widget>
</item> </item>
<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> </item>
</layout> </layout>
</item> </item>
@ -121,6 +128,9 @@
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QSpinBox" name="stepSpinBox"> <widget class="QSpinBox" name="stepSpinBox">
<property name="accessibleName">
<string>Time step field</string>
</property>
<property name="suffix"> <property name="suffix">
<string comment="Seconds"> sec</string> <string comment="Seconds"> sec</string>
</property> </property>
@ -181,6 +191,16 @@
</item> </item>
</layout> </layout>
</widget> </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/> <resources/>
<connections/> <connections/>
<buttongroups> <buttongroups>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -31,7 +31,11 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <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>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="databaseDescriptionLabel"> <widget class="QLabel" name="databaseDescriptionLabel">
@ -41,7 +45,11 @@
</widget> </widget>
</item> </item>
<item row="1" column="1"> <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> </item>
</layout> </layout>
</widget> </widget>

View File

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

View File

@ -83,6 +83,9 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="accessibleName">
<string>Custom Auto-Type sequence</string>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -91,10 +94,10 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Open AutoType help webpage</string> <string>Open Auto-Type help webpage</string>
</property> </property>
<property name="accessibleName"> <property name="accessibleName">
<string>AutoType help button</string> <string>Open Auto-Type help webpage</string>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
@ -113,6 +116,9 @@
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<widget class="QTreeView" name="assocView"> <widget class="QTreeView" name="assocView">
<property name="accessibleName">
<string>Existing window associations</string>
</property>
<property name="rootIsDecorated"> <property name="rootIsDecorated">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -159,6 +165,12 @@
<height>25</height> <height>25</height>
</size> </size>
</property> </property>
<property name="toolTip">
<string>Add new window association</string>
</property>
<property name="accessibleName">
<string>Add new window association</string>
</property>
<property name="text"> <property name="text">
<string>+</string> <string>+</string>
</property> </property>
@ -181,6 +193,12 @@
<height>25</height> <height>25</height>
</size> </size>
</property> </property>
<property name="toolTip">
<string>Remove selected window association</string>
</property>
<property name="accessibleName">
<string>Remove selected window association</string>
</property>
<property name="text"> <property name="text">
<string>-</string> <string>-</string>
</property> </property>
@ -200,7 +218,17 @@
</widget> </widget>
</item> </item>
<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>
<item> <item>
<spacer name="verticalSpacer_3"> <spacer name="verticalSpacer_3">
@ -248,6 +276,9 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="accessibleName">
<string>Custom Auto-Type sequence for this window</string>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

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

View File

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

View File

@ -37,6 +37,9 @@
</item> </item>
<item> <item>
<widget class="QSpinBox" name="lifetimeSpinBox"> <widget class="QSpinBox" name="lifetimeSpinBox">
<property name="accessibleName">
<string>Remove key from agent after specified seconds</string>
</property>
<property name="suffix"> <property name="suffix">
<string> seconds</string> <string> seconds</string>
</property> </property>
@ -165,6 +168,9 @@
</item> </item>
<item row="3" column="2"> <item row="3" column="2">
<widget class="QPushButton" name="browseButton"> <widget class="QPushButton" name="browseButton">
<property name="accessibleName">
<string>Browser for key file</string>
</property>
<property name="text"> <property name="text">
<string extracomment="Button for opening file dialog">Browse...</string> <string extracomment="Button for opening file dialog">Browse...</string>
</property> </property>
@ -181,7 +187,14 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <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>
<item row="4" column="1"> <item row="4" column="1">
<layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0"> <layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0">
@ -209,6 +222,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="accessibleName">
<string>Select attachment file</string>
</property>
<property name="editable"> <property name="editable">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -270,6 +286,22 @@
</item> </item>
</layout> </layout>
</widget> </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/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

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

View File

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

View File

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

View File

@ -31,7 +31,11 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <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>
<item row="1" column="0" alignment="Qt::AlignRight|Qt::AlignTop"> <item row="1" column="0" alignment="Qt::AlignRight|Qt::AlignTop">
<widget class="QLabel" name="labelNotes"> <widget class="QLabel" name="labelNotes">
@ -54,23 +58,36 @@
<height>120</height> <height>120</height>
</size> </size>
</property> </property>
<property name="accessibleName">
<string>Notes field</string>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="0" alignment="Qt::AlignRight"> <item row="2" column="0" alignment="Qt::AlignRight">
<widget class="QCheckBox" name="expireCheck"> <widget class="QCheckBox" name="expireCheck">
<property name="accessibleName">
<string>Toggle expiration</string>
</property>
<property name="text"> <property name="text">
<string>Expires</string> <string>Expires</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <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>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QDateTimeEdit" name="expireDatePicker"> <widget class="QDateTimeEdit" name="expireDatePicker">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="accessibleName">
<string>Expiration field</string>
</property>
<property name="calendarPopup"> <property name="calendarPopup">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -84,7 +101,11 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <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>
<item row="4" column="0" alignment="Qt::AlignRight"> <item row="4" column="0" alignment="Qt::AlignRight">
<widget class="QLabel" name="autotypeLabel"> <widget class="QLabel" name="autotypeLabel">
@ -130,6 +151,12 @@
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="accessibleName">
<string>Default auto-type sequence field</string>
</property>
<property name="accessibleDescription">
<string/>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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