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 }