Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F36622944
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
24 KB
Subscribers
None
View Options
diff --git a/src/conf/generalconfigurationpage.cpp b/src/conf/generalconfigurationpage.cpp
index 9bbd357..1602141 100644
--- a/src/conf/generalconfigurationpage.cpp
+++ b/src/conf/generalconfigurationpage.cpp
@@ -1,97 +1,93 @@
// SPDX-FileCopyrightText: 2024 g10 Code GmbH
// SPDX-FileContributor: Carl Schwan <carl@carlschwan.eu>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "generalconfigurationpage.h"
#include "config.h"
#include "ui_generalconfigurationpage.h"
using namespace GpgPass::Config;
GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent)
: GpgPassConfigModule(parent)
, ui(new Ui::GeneralConfigurationPage)
{
ui->setupUi(this);
ui->mainLayout->insertStretch(0);
ui->mainLayout->insertStretch(2);
connect(ui->checkBoxAutoclearPanel, &QAbstractButton::toggled, this, &GeneralConfigurationPage::setAutoClearPanelSubentries);
connect(ui->checkBoxAutoclear, &QAbstractButton::toggled, this, &GeneralConfigurationPage::setAutoClearSubentries);
// Changed
connect(ui->checkBoxAutoclear, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
connect(ui->checkBoxAutoclearPanel, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
- connect(ui->checkBoxDisplayAsIs, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
connect(ui->checkBoxNoLineWrapping, &QAbstractButton::toggled, this, &GeneralConfigurationPage::changed);
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
connect(ui->spinBoxAutoclearPanelSeconds, &QSpinBox::valueChanged, this, &GeneralConfigurationPage::changed);
connect(ui->spinBoxAutoclearPanelSeconds, &QSpinBox::valueChanged, this, &GeneralConfigurationPage::changed);
#else
connect(ui->spinBoxAutoclearPanelSeconds, QOverload<int>::of(&QSpinBox::valueChanged), this, &GeneralConfigurationPage::changed);
connect(ui->spinBoxAutoclearPanelSeconds, QOverload<int>::of(&QSpinBox::valueChanged), this, &GeneralConfigurationPage::changed);
#endif
}
void GeneralConfigurationPage::save()
{
auto config = ::Config::self();
config->setClipboardAutoClearEnabled(ui->checkBoxAutoclear->isChecked());
config->setClipboardAutoClearTime(ui->spinBoxAutoclearSeconds->value());
config->setViewerAutoClearEnabled(ui->checkBoxAutoclearPanel->isChecked());
config->setViewerAutoClearTime(ui->spinBoxAutoclearPanelSeconds->value());
- config->setDisplayAsIs(ui->checkBoxDisplayAsIs->isChecked());
config->setNoLineWrapping(ui->checkBoxNoLineWrapping->isChecked());
config->save();
}
void GeneralConfigurationPage::load()
{
const auto config = ::Config::self();
ui->spinBoxAutoclearSeconds->setValue(config->clipboardAutoClearTime());
setAutoclear(config->clipboardAutoClearEnabled());
ui->spinBoxAutoclearPanelSeconds->setValue(config->viewerAutoClearTime());
setAutoclearPanel(config->viewerAutoClearEnabled());
- ui->checkBoxDisplayAsIs->setChecked(config->displayAsIs());
ui->checkBoxNoLineWrapping->setChecked(config->noLineWrapping());
}
void GeneralConfigurationPage::defaults()
{
auto config = ::Config::self();
ui->spinBoxAutoclearSeconds->setValue(config->defaultClipboardAutoClearTimeValue());
setAutoclear(config->defaultClipboardAutoClearEnabledValue());
ui->spinBoxAutoclearPanelSeconds->setValue(config->defaultViewerAutoClearTimeValue());
setAutoclearPanel(config->defaultViewerAutoClearEnabledValue());
- ui->checkBoxDisplayAsIs->setChecked(config->defaultDisplayAsIsValue());
ui->checkBoxNoLineWrapping->setChecked(config->defaultNoLineWrappingValue());
Q_EMIT changed();
}
void GeneralConfigurationPage::setAutoClearSubentries(bool autoclear)
{
ui->spinBoxAutoclearSeconds->setEnabled(autoclear);
}
void GeneralConfigurationPage::setAutoclear(bool autoclear)
{
ui->checkBoxAutoclear->setChecked(autoclear);
setAutoClearSubentries(autoclear);
}
void GeneralConfigurationPage::setAutoclearPanel(bool autoclear)
{
ui->checkBoxAutoclearPanel->setChecked(autoclear);
setAutoClearPanelSubentries(autoclear);
}
void GeneralConfigurationPage::setAutoClearPanelSubentries(bool autoclear)
{
ui->spinBoxAutoclearPanelSeconds->setEnabled(autoclear);
ui->labelPanelSeconds->setEnabled(autoclear);
}
diff --git a/src/conf/generalconfigurationpage.ui b/src/conf/generalconfigurationpage.ui
index 667bc71..d750810 100644
--- a/src/conf/generalconfigurationpage.ui
+++ b/src/conf/generalconfigurationpage.ui
@@ -1,148 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<!--
SPDX-FileCopyrightText: 2024 g10 Code GmbH
SPDX-Contributor: Carl Schwan <carl.schwan@gnupg.com>
SPDX-License-Identifier: GPL-2.0-or-later
-->
<class>GeneralConfigurationPage</class>
<widget class="QWidget" name="GeneralConfigurationPage">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QHBoxLayout" name="mainLayout">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel">
<property name="text">
<string>Clipboard:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="checkBoxAutoclear">
<property name="text">
<string>Automatically clear after:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxAutoclearSeconds">
<property name="minimum">
<number>5</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelSeconds">
<property name="text">
<string>Seconds</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<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 row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Content panel:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QCheckBox" name="checkBoxAutoclearPanel">
<property name="text">
<string>Automatically close after:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxAutoclearPanelSeconds">
<property name="minimum">
<number>5</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelPanelSeconds">
<property name="minimumSize">
<size>
<width>55</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Seconds</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<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 row="2" column="1">
- <widget class="QCheckBox" name="checkBoxDisplayAsIs">
- <property name="text">
- <string>Display the file content as-is</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
<widget class="QCheckBox" name="checkBoxNoLineWrapping">
<property name="text">
<string>Ignore line wrapping</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</ui>
diff --git a/src/config.kcfg b/src/config.kcfg
index a9ac1e4..96d384c 100644
--- a/src/config.kcfg
+++ b/src/config.kcfg
@@ -1,156 +1,152 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<!--
SPDX-FileCopyrightText: 2024 g10 Code GmbH
SPDX-FileContributor: Carl Schwan <carl@carlschwan.eu>
SPDX-License-Identifier: GPL-2.0-or-later
-->
<kcfgfile name="gpgpassrc" />
<group name="Clipboard">
<entry name="ClipboardAutoClearEnabled" type="bool">
<label>Autoclear clipboard</label>
<default>false</default>
</entry>
<entry name="ClipboardAutoClearTime" type="int">
<label>Autoclear delay in seconds for the clipboard</label>
<default>10</default>
<min>5</min>
</entry>
</group>
<group name="Template">
<entry name="TemplateEnabled" type="bool">
<label>Template feature is enabled</label>
<default>true</default>
</entry>
<entry name="PassTemplate" type="StringList">
<label>Templates</label>
<default>login,URL</default>
</entry>
<entry name="TemplateAllFields" type="bool">
<label>Template all fields</label>
<default>false</default>
</entry>
</group>
<group name="PasswordViewer">
<entry name="ViewerAutoClearEnabled" type="bool">
<label>Autoclear the password viewer</label>
<default>false</default>
</entry>
<entry name="ViewerAutoClearTime" type="int">
<label>Autoclear delay in seconds for the password viewer</label>
<default>10</default>
<min>5</min>
</entry>
- <entry name="DisplayAsIs" type="bool">
- <label>Display the content as is</label>
- <default>false</default>
- </entry>
<entry name="NoLineWrapping" type="bool">
<label>No line wrapping</label>
<default>false</default>
</entry>
</group>
<group name="PasswordGenerator">
<entry name="PasswordLength" type="int">
<label>Password length</label>
<default>20</default>
<min>5</min>
</entry>
<entry name="LowerCase" type="bool">
<label>Lower case</label>
<default>true</default>
</entry>
<entry name="UpperCase" type="bool">
<label>Upper case</label>
<default>true</default>
</entry>
<entry name="Numbers" type="bool">
<label>Number</label>
<default>true</default>
</entry>
<entry name="AdditionalChars" type="String">
<label>Additional Characters</label>
<default></default>
</entry>
<entry name="ExcludedChars" type="String">
<label>Excluded Characters</label>
<default></default>
</entry>
<entry name="Logograms" type="bool">
<label>Logograms</label>
<default>true</default>
</entry>
<entry name="SpecialCharacters" type="bool">
<label>Special Characters</label>
<default>true</default>
</entry>
<entry name="GeneratorAdvanced" type="bool">
<label>Advanced password generator options</label>
<default>false</default>
</entry>
<entry name="Eascii" type="bool">
<label>EASCII</label>
<default>false</default>
</entry>
<entry name="Braces" type="bool">
<label>Braces</label>
<default>false</default>
</entry>
<entry name="Quotes" type="bool">
<label>Quotes</label>
<default>false</default>
</entry>
<entry name="Punctuation" type="bool">
<label>Punctuation</label>
<default>false</default>
</entry>
<entry name="Dashes" type="bool">
<label>Dashes</label>
<default>false</default>
</entry>
<entry name="Math" type="bool">
<label>Math</label>
<default>false</default>
</entry>
<entry name="ExcludeAlike" type="bool">
<label>Exclude look alike characters</label>
<default>true</default>
</entry>
<entry name="EnsureEvery" type="bool">
<label>Pick characters from every group</label>
<default>true</default>
</entry>
<entry name="WordCount" type="int">
<label>Passphrase word's count</label>
<default>7</default>
</entry>
<entry name="WordSeparator" type="string">
<label>Passphrase word separator</label>
<default>QStringLiteral("-")</default>
</entry>
<entry name="WordList" type="string">
<label>Passphrase word list</label>
<default></default>
</entry>
<entry name="WordCase" type="int">
<label>Passphrase word case</label>
<default>0</default>
</entry>
<entry name="GeneratorType" type="Enum">
<label>Passphrase word case</label>
<choices>
<choice name="Password">
<label>Password</label>
</choice>
<choice name="Passphrase">
<label>Passphrase</label>
</choice>
</choices>
<default>EnumGeneratorType::Password</default>
</entry>
</group>
</kcfg>
diff --git a/src/widgets/passwordviewerwidget.cpp b/src/widgets/passwordviewerwidget.cpp
index e2c4496..fa0be5b 100644
--- a/src/widgets/passwordviewerwidget.cpp
+++ b/src/widgets/passwordviewerwidget.cpp
@@ -1,296 +1,294 @@
// SPDX-FileCopyrightText: 2014-2023 Anne Jan Brouwer <brouwer@annejan.com>
// SPDX-FileCopyrightText: 2016-2017 tezeb <tezeb+github@outoftheblue.pl>
// SPDX-FileCopyrightText: 2018 Lukas Vogel <lukedirtwalker@gmail.com>
// SPDX-FileCopyrightText: 2018 Claudio Maradonna <penguyman@stronzi.org>
// SPDX-FileCopyrightText: 2019 Maciej S. Szmigiero <mail@maciej.szmigiero.name>
// SPDX-FileCopyrightText: 2023 g10 Code GmbH
// SPDX-FileContributor: Sune Stolborg Vuorela <sune@vuorela.dk>
// SPDX-License-Identifier: GPL-3.0-or-later
#include "passwordviewerwidget.h"
#include "clipboardhelper.h"
#include "config.h"
#include "job/filedecryptjob.h"
#include "passentry.h"
#include "qpushbuttonfactory.h"
#include "qrcodepopup.h"
#include "util.h"
#include <QAction>
#include <QApplication>
#include <QDialog>
#include <QFormLayout>
#include <QLabel>
#include <QMainWindow>
#include <QPushButton>
#include <QStatusBar>
#include <QStyle>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <KLocalizedString>
#include <KMessageWidget>
#include <KPasswordLineEdit>
#include <KTitleWidget>
namespace
{
std::unique_ptr<QLabel> createTextBrowserForNotes()
{
auto textBrowser = std::make_unique<QLabel>();
textBrowser->setWordWrap(!Config::self()->noLineWrapping());
textBrowser->setOpenExternalLinks(true);
textBrowser->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
textBrowser->setContextMenuPolicy(Qt::DefaultContextMenu);
textBrowser->setContentsMargins(0, 8, 0, 0);
return textBrowser;
}
}
PasswordViewerWidget::PasswordViewerWidget(ClipboardHelper *clipboardHelper, QWidget *parent)
: QWidget(parent)
, m_errorMessage(new KMessageWidget(this))
, m_titleWidget(new KTitleWidget(this))
, m_clipboardHelper(clipboardHelper)
, m_contentLayout(new QFormLayout)
, m_copyPasswordNameButton(new QPushButton(QIcon::fromTheme(QStringLiteral("edit-copy-symbolic")), {}, this))
{
auto layout = new QVBoxLayout(this);
layout->setContentsMargins({});
layout->setSpacing(0);
m_errorMessage->setMessageType(KMessageWidget::Error);
m_errorMessage->hide();
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
m_errorMessage->setPosition(KMessageWidget::Position::Header);
#endif
layout->addWidget(m_errorMessage);
auto scrollArea = new Kleo::AdjustingScrollArea(this);
layout->addWidget(scrollArea);
auto widget = new QWidget;
scrollArea->setWidget(widget);
auto hbox = new QVBoxLayout(widget);
auto mainLayout = new QVBoxLayout;
hbox->addLayout(mainLayout);
mainLayout->setContentsMargins(style()->pixelMetric(QStyle::PM_LayoutLeftMargin),
style()->pixelMetric(QStyle::PM_LayoutTopMargin),
style()->pixelMetric(QStyle::PM_LayoutRightMargin),
style()->pixelMetric(QStyle::PM_LayoutBottomMargin));
// Setup ui
m_copyPasswordNameButton->setAccessibleName(i18nc("@action:button", "Copy to clipboard"));
m_copyPasswordNameButton->setToolTip(i18nc("@info:tooltip", "Copy title to clipboard"));
auto titleLayout = new QHBoxLayout;
titleLayout->addWidget(m_titleWidget);
titleLayout->insertStretch(1);
titleLayout->addWidget(m_copyPasswordNameButton);
connect(m_copyPasswordNameButton, &QPushButton::clicked, this, [this]() {
m_clipboardHelper->copyTextToClipboard(m_titleWidget->text().trimmed());
});
mainLayout->addLayout(titleLayout);
mainLayout->addLayout(m_contentLayout);
setPanelTimer();
clearPanelTimer.setSingleShot(true);
connect(&clearPanelTimer, &QTimer::timeout, this, &PasswordViewerWidget::clear);
hbox->addStretch();
auto statusBar = new QStatusBar;
statusBar->setProperty("_breeze_statusbar_separator", true);
statusBar->setVisible(false);
layout->addWidget(statusBar);
connect(m_clipboardHelper, &ClipboardHelper::showMessage, statusBar, &QStatusBar::showMessage);
connect(statusBar, &QStatusBar::messageChanged, this, [statusBar](const QString &message) {
statusBar->setVisible(!message.isEmpty());
});
}
QString PasswordViewerWidget::filePath() const
{
return m_filePath;
}
QString PasswordViewerWidget::rawContent() const
{
return m_rawContent;
}
void PasswordViewerWidget::setFilePath(const QString &entryName, const QString &filePath)
{
m_entryName = entryName;
m_filePath = filePath;
auto decryptJob = new FileDecryptJob(filePath);
connect(decryptJob, &FileDecryptJob::result, this, &PasswordViewerWidget::fileDecryptedSlot);
decryptJob->start();
}
void PasswordViewerWidget::fileDecryptedSlot(KJob *job)
{
auto decryptJob = qobject_cast<FileDecryptJob *>(job);
Q_ASSERT(decryptJob);
if (decryptJob->error() != KJob::NoError) {
m_errorMessage->setText(decryptJob->errorText());
m_errorMessage->animatedShow();
} else {
m_errorMessage->animatedHide();
}
setRawContent(decryptJob->content());
}
void PasswordViewerWidget::setRawContent(const QString &rawContent)
{
m_rawContent = rawContent;
const PassEntry entry(m_entryName, m_rawContent);
setPassEntry(entry, m_rawContent);
Q_EMIT loaded();
}
void PasswordViewerWidget::setPassEntry(const PassEntry &entry, const QString &content)
{
QString password = entry.password();
QString output = content;
m_clipboardHelper->setClippedText(password);
// first clear the current view:
clear();
m_titleWidget->setText(entry.name());
m_titleWidget->show();
m_copyPasswordNameButton->show();
// show what is needed:
- if (!Config::self()->displayAsIs()) {
- if (!password.isEmpty()) {
- // set the password, it is hidden if needed in addToGridLayout
- addToGridLayout(i18n("Password:"), password);
- }
-
- const auto namedValues = entry.namedValues();
- for (const auto &nv : namedValues) {
- addToGridLayout(i18nc("Field label", "%1:", nv.name), nv.value);
- }
-
- output = entry.remainingDataForDisplay();
+ if (!password.isEmpty()) {
+ // set the password, it is hidden if needed in addToGridLayout
+ addToGridLayout(i18n("Password:"), password);
}
+ const auto namedValues = entry.namedValues();
+ for (const auto &nv : namedValues) {
+ addToGridLayout(i18nc("Field label", "%1:", nv.name), nv.value);
+ }
+
+ output = entry.remainingDataForDisplay();
+
if (Config::self()->viewerAutoClearEnabled()) {
clearPanelTimer.start();
}
if (!output.isEmpty()) {
output = output.toHtmlEscaped();
output.replace(Util::protocolRegex(), QStringLiteral(R"(<a href="\1">\1</a>)"));
output.replace(QLatin1Char('\n'), QStringLiteral("<br />"));
auto textBrowser = createTextBrowserForNotes();
textBrowser->setText(output);
m_contentLayout->addRow(new QLabel(i18nc("@label", "Notes:")), textBrowser.release());
}
}
void PasswordViewerWidget::clearTemplateWidgets()
{
while (m_contentLayout->count() > 0) {
m_contentLayout->removeRow(m_contentLayout->rowCount() - 1);
}
}
void PasswordViewerWidget::addToGridLayout(const QString &field, const QString &value)
{
QString trimmedField = field.trimmed();
QString trimmedValue = value.trimmed();
// Combine the Copy button and the line edit in one widget
auto rowLayout = new QHBoxLayout();
if (trimmedField == i18n("Password:")) {
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
auto *line = new KPasswordLineEdit();
line->setRevealPasswordMode(KPassword::RevealMode::Always);
line->setReadOnly(true);
line->setPassword(trimmedValue);
#else
auto *line = new QLineEdit();
line->setText(trimmedValue);
auto iconOn = QIcon::fromTheme(QStringLiteral("password-show-on"));
auto iconOff = QIcon::fromTheme(QStringLiteral("password-show-off"));
auto action = line->addAction(iconOn, QLineEdit::TrailingPosition);
action->setCheckable(true);
action->setText(i18n("Toggle password visibility"));
connect(action, &QAction::triggered, this, [line, action, iconOn, iconOff]() {
if (line->echoMode() == QLineEdit::Password) {
line->setEchoMode(QLineEdit::Normal);
action->setIcon(iconOff);
} else {
line->setEchoMode(QLineEdit::Password);
action->setIcon(iconOn);
}
});
#endif
line->setObjectName(trimmedField);
line->setContentsMargins(0, 0, 0, 0);
line->setEchoMode(QLineEdit::Password);
rowLayout->addWidget(line);
} else {
auto *line = new QLabel();
line->setOpenExternalLinks(true);
line->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard);
line->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
line->setObjectName(trimmedField);
trimmedValue.replace(Util::protocolRegex(), QStringLiteral(R"(<a href="\1">\1</a>)"));
line->setText(trimmedValue);
line->setContentsMargins(0, 0, 0, 0);
rowLayout->addWidget(line);
}
auto fieldName = trimmedField;
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
fieldName.removeLast(); // remove ':' from the end of the label
#else
fieldName.remove(fieldName.count() - 1, 1); // remove ':' from the end of the label
#endif
auto qrButton =
createPushButton(QIcon::fromTheme(QStringLiteral("view-barcode-qr")), i18n("View '%1' QR Code", fieldName), m_clipboardHelper, [trimmedValue]() {
const auto topLevelWidgets = QApplication::topLevelWidgets();
for (const auto widget : topLevelWidgets) {
if (qobject_cast<QMainWindow *>(widget)) {
auto popup = new QrCodePopup(trimmedValue, widget);
popup->show();
break;
}
}
});
rowLayout->addWidget(qrButton.release());
auto fieldLabel =
createPushButton(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("Copy '%1' to clipboard", fieldName), m_clipboardHelper, [this, trimmedValue] {
m_clipboardHelper->copyTextToClipboard(trimmedValue);
});
rowLayout->addWidget(fieldLabel.release());
// set into the layout
m_contentLayout->addRow(trimmedField, rowLayout);
}
void PasswordViewerWidget::clear()
{
clearTemplateWidgets();
m_filePath.clear();
m_titleWidget->setText(QString{});
m_copyPasswordNameButton->hide();
}
void PasswordViewerWidget::setPanelTimer()
{
clearPanelTimer.setInterval(1000 * Config::self()->viewerAutoClearTime());
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Feb 26, 6:27 PM (8 h, 15 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
f6/30/162b2a0ae2c27450b41b1272acfa
Attached To
rGPGPASS GnuPG Password Manager
Event Timeline
Log In to Comment