File indexing completed on 2024-06-02 05:04:55
0001 /* 0002 This file is part of the KDE project. 0003 0004 SPDX-FileCopyrightText: 2009 Dawit Alemayehu <adawit @ kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "passwordbar.h" 0010 0011 #include "settings/webenginesettings.h" 0012 0013 #include <KColorScheme> 0014 #include <KLocalizedString> 0015 0016 #include <QCoreApplication> 0017 #include <QAction> 0018 #include <QPalette> 0019 #include <QToolButton> 0020 #include <QTimer> 0021 0022 #include <algorithm> 0023 0024 PasswordBar::PasswordBar(QWidget *parent) :KMessageWidget(parent), m_detailsVisible(false), m_detailsWidget(new CredentialsDetailsWidget(parent)) 0025 { 0026 setCloseButtonVisible(false); 0027 setMessageType(KMessageWidget::Information); 0028 0029 QAction* action = new QAction(i18nc("@action:remember password", "&Remember"), this); 0030 connect(action, &QAction::triggered, this, &PasswordBar::onRememberButtonClicked); 0031 addAction(action); 0032 0033 action = new QAction(i18nc("@action:never for this site", "Ne&ver for this site"), this); 0034 connect(action, &QAction::triggered, this, &PasswordBar::onNeverButtonClicked); 0035 addAction(action); 0036 0037 action = new QAction(i18nc("@action:not now", "N&ot now"), this); 0038 connect(action, &QAction::triggered, this, &PasswordBar::onNotNowButtonClicked); 0039 addAction(action); 0040 0041 m_detailsAction = new QAction(i18nc("@action:display details about credentials to store", "&Show details"), this); 0042 m_detailsAction->setObjectName("detailsAction"); 0043 connect(m_detailsAction, &QAction::triggered, this, &PasswordBar::onDetailsButtonClicked); 0044 addAction(m_detailsAction); 0045 } 0046 0047 PasswordBar::~PasswordBar() 0048 { 0049 if (m_detailsWidget) { 0050 m_detailsWidget->deleteLater(); 0051 } 0052 } 0053 0054 QUrl PasswordBar::url() const 0055 { 0056 return m_url; 0057 } 0058 0059 QString PasswordBar::requestKey() const 0060 { 0061 return m_requestKey; 0062 } 0063 0064 void PasswordBar::setUrl (const QUrl& url) 0065 { 0066 m_url = url; 0067 } 0068 0069 void PasswordBar::setRequestKey (const QString& key) 0070 { 0071 m_requestKey = key; 0072 } 0073 0074 void PasswordBar::onNotNowButtonClicked() 0075 { 0076 animatedHide(); 0077 emit saveFormDataRejected (m_requestKey); 0078 emit done(); 0079 clear(); 0080 } 0081 0082 void PasswordBar::onNeverButtonClicked() 0083 { 0084 WebEngineSettings::self()->addNonPasswordStorableSite(m_url.host()); 0085 onNotNowButtonClicked(); 0086 } 0087 0088 void PasswordBar::onRememberButtonClicked() 0089 { 0090 animatedHide(); 0091 emit saveFormDataAccepted(m_requestKey); 0092 emit done(); 0093 clear(); 0094 } 0095 0096 void PasswordBar::clear() 0097 { 0098 m_requestKey.clear(); 0099 m_url.clear(); 0100 if (m_detailsWidget) { 0101 m_detailsWidget->clear(); 0102 setDetailsWidgetVisibility(false); 0103 } 0104 } 0105 0106 void PasswordBar::resizeEvent(QResizeEvent* event) 0107 { 0108 KMessageWidget::resizeEvent(event); 0109 if (m_detailsVisible && m_detailsWidget) { 0110 m_detailsWidget->move(computeDetailsWidgetPosition()); 0111 } 0112 } 0113 0114 void PasswordBar::onDetailsButtonClicked() 0115 { 0116 setDetailsWidgetVisibility(!m_detailsVisible); 0117 } 0118 0119 void PasswordBar::setDetailsWidgetVisibility(bool visible) 0120 { 0121 m_detailsVisible = visible; 0122 if (m_detailsVisible) { 0123 m_detailsAction->setText(i18nc("@action:hide details about credentials to store", "&Hide details")); 0124 } else { 0125 m_detailsAction->setText(i18nc("@action:display details about credentials to store", "&Show details")); 0126 } 0127 if (m_detailsWidget) { 0128 m_detailsWidget->setVisible(m_detailsVisible); 0129 if (m_detailsVisible) { 0130 m_detailsWidget->resize(m_detailsWidget->sizeHint()); 0131 m_detailsWidget->move(computeDetailsWidgetPosition()); 0132 } 0133 } 0134 } 0135 0136 void PasswordBar::setForms(const WebEngineWallet::WebFormList& forms) 0137 { 0138 if (m_detailsWidget) { 0139 m_detailsWidget->setForms(forms); 0140 } 0141 } 0142 0143 QPoint PasswordBar::computeDetailsWidgetPosition() const 0144 { 0145 if (!m_detailsWidget) { 0146 return QPoint(); 0147 } 0148 return mapTo(parentWidget(), QPoint{width() - m_detailsWidget->width(), height()}); 0149 }