File indexing completed on 2024-06-16 04:56:14

0001 /*  view/infofield.cpp
0002 
0003     This file is part of Kleopatra, the KDE keymanager
0004     SPDX-FileCopyrightText: 2022 g10 Code GmbH
0005     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include <config-kleopatra.h>
0011 
0012 #include "infofield.h"
0013 
0014 #include "utils/accessibility.h"
0015 
0016 #include <QAction>
0017 #include <QHBoxLayout>
0018 #include <QIcon>
0019 #include <QLabel>
0020 #include <QLayout>
0021 #include <QPushButton>
0022 #include <QStyle>
0023 
0024 using namespace Kleo;
0025 
0026 InfoField::InfoField(const QString &label, QWidget *parent)
0027     : mLabel{new QLabel{label, parent}}
0028     , mLayout{new QHBoxLayout}
0029     , mIcon{new QLabel{parent}}
0030     , mValue{new QLabel{parent}}
0031     , mButton{new QPushButton{parent}}
0032 {
0033     mLabel->setObjectName(QLatin1StringView("InfoField.label"));
0034     mIcon->setObjectName(QLatin1StringView("InfoField.icon"));
0035     mValue->setObjectName(QLatin1StringView("InfoField.value"));
0036     mButton->setObjectName(QLatin1StringView("InfoField.button"));
0037 
0038     mLabel->setBuddy(mValue);
0039     mLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
0040     mIcon->setVisible(false);
0041     mLayout->addWidget(mIcon);
0042     mValue->setTextInteractionFlags(Qt::TextSelectableByMouse);
0043     mValue->setFocusPolicy(Qt::TabFocus);
0044 #ifdef Q_OS_WIN
0045     Kleo::setRepresentAsAccessibleValueWidget(mValue, true);
0046 #endif
0047     mLayout->addWidget(mValue);
0048     mButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
0049     mButton->setVisible(false);
0050     mLayout->addWidget(mButton);
0051     mLayout->addStretch();
0052 }
0053 
0054 QLabel *InfoField::label() const
0055 {
0056     return mLabel;
0057 }
0058 
0059 QLayout *InfoField::layout() const
0060 {
0061     return mLayout;
0062 }
0063 
0064 void InfoField::setValue(const QString &value, const QString &accessibleValue)
0065 {
0066     mValue->setText(value);
0067 #ifdef Q_OS_WIN
0068     Kleo::setAccessibleValue(mValue, accessibleValue);
0069 #else
0070     mValue->setAccessibleName(accessibleValue);
0071 #endif
0072 }
0073 
0074 QString InfoField::value() const
0075 {
0076     return mValue->text();
0077 }
0078 
0079 void InfoField::setIcon(const QIcon &icon)
0080 {
0081     if (!icon.isNull()) {
0082         const int iconSize = mIcon->style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, mIcon);
0083         mIcon->setPixmap(icon.pixmap(iconSize));
0084         mIcon->setVisible(true);
0085     } else {
0086         mIcon->setVisible(false);
0087         mIcon->clear();
0088     }
0089 }
0090 
0091 void InfoField::setAction(const QAction *action)
0092 {
0093     if (action == mAction) {
0094         return;
0095     }
0096     if (mAction) {
0097         QObject::disconnect(mButton, {}, mAction, {});
0098         QObject::disconnect(mAction, {}, mButton, {});
0099     }
0100     mAction = action;
0101     if (mAction) {
0102         QObject::connect(mButton, &QPushButton::clicked, action, &QAction::trigger);
0103         QObject::connect(mAction, &QAction::changed, mButton, [this]() {
0104             onActionChanged();
0105         });
0106         onActionChanged();
0107         mButton->setAccessibleName(getAccessibleName(mAction));
0108         mButton->setVisible(true);
0109     } else {
0110         mButton->setVisible(false);
0111         mButton->setText({});
0112         mButton->setIcon({});
0113     }
0114 }
0115 
0116 void InfoField::setToolTip(const QString &toolTip)
0117 {
0118     mValue->setToolTip(toolTip);
0119 }
0120 
0121 void InfoField::setVisible(bool visible)
0122 {
0123     mLabel->setVisible(visible);
0124     mIcon->setVisible(visible && !mIcon->pixmap().isNull());
0125     mValue->setVisible(visible);
0126     mButton->setVisible(visible && mAction);
0127 }
0128 
0129 void InfoField::onActionChanged()
0130 {
0131     if (!mAction) {
0132         return;
0133     }
0134     if (mAction->text() != mButton->text()) {
0135         mButton->setText(mAction->text());
0136     }
0137     mButton->setIcon(mAction->icon());
0138     if (mAction->toolTip() != mButton->toolTip()) {
0139         mButton->setToolTip(mAction->toolTip());
0140     }
0141     if (mAction->isEnabled() != mButton->isEnabled()) {
0142         mButton->setEnabled(mAction->isEnabled());
0143     }
0144 }