2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2024 Felix Ernst <felixernst@kde.org>
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
10 #include "dolphinviewcontainer.h"
11 #include "workerintegration.h"
13 #include <KColorScheme>
14 #include <KContextualHelpButton>
15 #include <KIO/JobUiDelegateFactory>
16 #include <KIO/SimpleJob>
17 #include <KLocalizedString>
20 #include <QGuiApplication>
21 #include <QHBoxLayout>
24 #include <QPushButton>
26 #include <QToolButton>
27 #include <QWidgetAction>
29 using namespace Admin
;
33 QPointer
<KIO::SimpleJob
> waitingForExpirationOfAuthorization
;
36 Bar::Bar(DolphinViewContainer
*parentViewContainer
)
37 : AnimatedHeightWidget
{parentViewContainer
}
38 , m_parentViewContainer
{parentViewContainer
}
40 setAutoFillBackground(true);
43 QWidget
*contenntsContainer
= prepareContentsContainer();
45 m_fullLabelString
= i18nc("@info label above the view explaining the state", "Acting as an Administrator — Be careful!");
46 m_shortLabelString
= i18nc("@info label above the view explaining the state, keep short", "Acting as Admin");
47 m_label
= new QLabel(contenntsContainer
);
48 m_label
->setMinimumWidth(0);
49 m_label
->setTextInteractionFlags(Qt::TextSelectableByMouse
| Qt::TextSelectableByKeyboard
| Qt::LinksAccessibleByKeyboard
); // for keyboard accessibility
51 m_warningButton
= new KContextualHelpButton(warningMessage(), nullptr, contenntsContainer
);
52 m_warningButton
->setIcon(QIcon::fromTheme(QStringLiteral("emblem-warning")));
54 m_closeButton
= new QPushButton(QIcon::fromTheme(QStringLiteral("window-close-symbolic")),
55 i18nc("@action:button Finish/Stop/Done acting as an admin", "Finish"),
57 m_closeButton
->setToolTip(i18nc("@info:tooltip", "Finish acting as an administrator"));
58 m_closeButton
->setFlat(true);
59 connect(m_closeButton
, &QAbstractButton::clicked
, m_parentViewContainer
, [this]() {
60 m_parentViewContainer
->setActive(true); // Make sure the view connected to this bar is active before exiting admin mode.
61 QAction
*actAsAdminAction
= WorkerIntegration::FriendAccess::actAsAdminAction();
62 if (actAsAdminAction
->isChecked()) {
63 actAsAdminAction
->trigger();
66 connect(m_parentViewContainer
->view(), &DolphinView::urlChanged
, this, [this](const QUrl
&url
) {
67 // The bar is closely related to administrative rights, so we want to hide it instantly when we are no longer using the admin protocol.
68 if (url
.scheme() != QStringLiteral("admin")) {
69 setVisible(false, WithAnimation
);
73 QHBoxLayout
*layout
= new QHBoxLayout(contenntsContainer
);
74 auto contentsMargins
= layout
->contentsMargins();
75 m_preferredHeight
= contentsMargins
.top() + m_label
->sizeHint().height() + contentsMargins
.bottom();
76 m_warningButton
->setFixedHeight(m_preferredHeight
);
77 m_closeButton
->setFixedHeight(m_preferredHeight
);
78 layout
->setContentsMargins(0, 0, 0, 0);
81 layout
->addWidget(m_label
);
82 layout
->addWidget(m_warningButton
);
84 layout
->addWidget(m_closeButton
);
87 bool Bar::event(QEvent
*event
)
89 switch (event
->type()) {
90 case QEvent::PaletteChange
:
94 hideTheNextTimeAuthorizationExpires();
99 return AnimatedHeightWidget::event(event
);
102 void Bar::resizeEvent(QResizeEvent
*resizeEvent
)
105 return QWidget::resizeEvent(resizeEvent
);
108 void Bar::hideTheNextTimeAuthorizationExpires()
110 if (waitingForExpirationOfAuthorization
.isNull()) {
111 QByteArray packedArgs
;
112 QDataStream
stream(&packedArgs
, QIODevice::WriteOnly
);
114 waitingForExpirationOfAuthorization
= KIO::special(QUrl(QStringLiteral("admin:/")), packedArgs
, KIO::HideProgressInfo
);
115 waitingForExpirationOfAuthorization
->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoWarningHandlingEnabled
, m_parentViewContainer
));
117 connect(waitingForExpirationOfAuthorization
, &KJob::finished
, this, [](KJob
*job
) {
119 job
->uiDelegate()->showErrorMessage();
124 connect(waitingForExpirationOfAuthorization
, &KJob::finished
, this, [this](KJob
*job
) {
128 // We exit admin mode now to avoid random password prompts popping up.
129 QUrl viewContainerUrl
= m_parentViewContainer
->url();
130 if (viewContainerUrl
.scheme() != QStringLiteral("admin")) {
133 viewContainerUrl
.setScheme("file");
134 m_parentViewContainer
->setUrl(viewContainerUrl
);
136 // Explain to users that their admin authorization expired.
137 if (!m_reenableActAsAdminAction
) { // This code is similar to parts of DolphinViewContainer::slotViewErrorMessage().
138 auto actAsAdminAction
= WorkerIntegration::FriendAccess::actAsAdminAction();
139 m_reenableActAsAdminAction
=
140 new QAction
{actAsAdminAction
->icon(), i18nc("@action:button shown after acting as admin ended", "Act as Administrator Again"), this};
141 m_reenableActAsAdminAction
->setToolTip(actAsAdminAction
->toolTip());
142 m_reenableActAsAdminAction
->setWhatsThis(actAsAdminAction
->whatsThis());
143 connect(m_reenableActAsAdminAction
, &QAction::triggered
, this, [this, actAsAdminAction
]() {
144 m_parentViewContainer
->setActive(true);
145 actAsAdminAction
->trigger();
148 m_parentViewContainer
->showMessage(i18nc("@info", "Administrator authorization has expired."),
149 KMessageWidget::Information
,
150 {m_reenableActAsAdminAction
});
154 void Bar::updateColors()
156 QPalette palette
= parentWidget()->palette();
157 KColorScheme colorScheme
{QPalette::Normal
, KColorScheme::ColorSet::Window
};
158 colorScheme
.adjustBackground(palette
, KColorScheme::NegativeBackground
, QPalette::Window
, KColorScheme::ColorSet::Window
);
159 colorScheme
.adjustForeground(palette
, KColorScheme::NegativeText
, QPalette::WindowText
, KColorScheme::ColorSet::Window
);
163 void Bar::updateLabelString()
165 QFontMetrics fontMetrics
= m_label
->fontMetrics();
166 if (fontMetrics
.horizontalAdvance(m_fullLabelString
) + m_warningButton
->sizeHint().width() + m_closeButton
->sizeHint().width()
167 + style()->pixelMetric(QStyle::PM_LayoutLeftMargin
) * 2 + style()->pixelMetric(QStyle::PM_LayoutRightMargin
) * 2
169 m_label
->setText(m_fullLabelString
);
171 m_label
->setText(m_shortLabelString
);
175 #include "moc_bar.cpp"