]> cloud.milkyroute.net Git - dolphin.git/blob - src/statusbar/statusbarspaceinfo.cpp
KItemListView: Don't allow starting role editing when animation is running
[dolphin.git] / src / statusbar / statusbarspaceinfo.cpp
1 /*
2 * SPDX-FileCopyrightText: 2006 Peter Penz (peter.penz@gmx.at) and Patrice Tremblay
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "statusbarspaceinfo.h"
8
9 #include "config-dolphin.h"
10 #include "diskspaceusagemenu.h"
11 #include "spaceinfoobserver.h"
12
13 #include <KCapacityBar>
14 #include <KIO/Global>
15 #include <KLocalizedString>
16
17 #include <QHBoxLayout>
18 #include <QToolButton>
19
20 StatusBarSpaceInfo::StatusBarSpaceInfo(QWidget *parent)
21 : QWidget(parent)
22 , m_observer(nullptr)
23 , m_hasSpaceInfo{false}
24 , m_shown{false}
25 {
26 hide(); // Only become visible when we have space info to show. @see StatusBarSpaceInfo::setShown().
27
28 m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this);
29 m_textInfoButton = new QToolButton(this);
30 m_textInfoButton->setAutoRaise(true);
31 m_textInfoButton->setPopupMode(QToolButton::InstantPopup);
32 auto menu = new DiskSpaceUsageMenu{this};
33 connect(menu, &DiskSpaceUsageMenu::showMessage, this, &StatusBarSpaceInfo::showMessage);
34 connect(menu, &DiskSpaceUsageMenu::showInstallationProgress, this, &StatusBarSpaceInfo::showInstallationProgress);
35 m_textInfoButton->setMenu(menu);
36
37 auto layout = new QHBoxLayout(this);
38 // We reduce the outside margin of the flat button so it visually has the same margin as the status bar text label on the other end of the bar.
39 layout->setContentsMargins(2, -1, 0, -1); // "-1" makes it so the fixed height won't be ignored.
40 layout->addWidget(m_capacityBar);
41 layout->addWidget(m_textInfoButton);
42 }
43
44 StatusBarSpaceInfo::~StatusBarSpaceInfo()
45 {
46 }
47
48 void StatusBarSpaceInfo::setShown(bool shown)
49 {
50 m_shown = shown;
51 if (!m_shown) {
52 hide();
53 return;
54 }
55
56 // We only show() this widget in slotValueChanged() when it m_hasSpaceInfo.
57 if (m_observer.isNull()) {
58 m_observer.reset(new SpaceInfoObserver(m_url, this));
59 connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
60 }
61
62 if (m_hasSpaceInfo) {
63 slotValuesChanged();
64 }
65 }
66
67 void StatusBarSpaceInfo::setUrl(const QUrl &url)
68 {
69 if (m_url != url) {
70 m_url = url;
71 static_cast<DiskSpaceUsageMenu *>(m_textInfoButton->menu())->setUrl(url);
72 m_hasSpaceInfo = false;
73 if (m_observer) {
74 m_observer.reset(new SpaceInfoObserver(m_url, this));
75 connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
76 }
77 }
78 }
79
80 QUrl StatusBarSpaceInfo::url() const
81 {
82 return m_url;
83 }
84
85 void StatusBarSpaceInfo::update()
86 {
87 if (m_observer) {
88 m_observer->update();
89 }
90 }
91
92 void StatusBarSpaceInfo::showEvent(QShowEvent *event)
93 {
94 if (m_shown && m_observer.isNull()) {
95 m_observer.reset(new SpaceInfoObserver(m_url, this));
96 connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
97 }
98 QWidget::showEvent(event);
99 }
100
101 void StatusBarSpaceInfo::hideEvent(QHideEvent *event)
102 {
103 if (m_hasSpaceInfo) {
104 m_observer.reset();
105 m_hasSpaceInfo = false;
106 }
107 QWidget::hideEvent(event);
108 }
109
110 QSize StatusBarSpaceInfo::minimumSizeHint() const
111 {
112 return QSize();
113 }
114
115 void StatusBarSpaceInfo::slotValuesChanged()
116 {
117 Q_ASSERT(m_observer);
118 const quint64 size = m_observer->size();
119
120 if (!m_shown || size == 0) {
121 hide();
122 return;
123 }
124
125 m_hasSpaceInfo = true;
126
127 const quint64 available = m_observer->available();
128 const quint64 used = size - available;
129 const int percentUsed = qRound(100.0 * qreal(used) / qreal(size));
130
131 m_textInfoButton->setText(i18nc("@info:status Free disk space", "%1 free", KIO::convertSize(available)));
132 setToolTip(i18nc("tooltip:status Free disk space", "%1 free out of %2 (%3% used)", KIO::convertSize(available), KIO::convertSize(size), percentUsed));
133 m_textInfoButton->setToolTip(i18nc("@info:tooltip for the free disk space button",
134 "%1 free out of %2 (%3% used)\nPress to manage disk space usage.",
135 KIO::convertSize(available),
136 KIO::convertSize(size),
137 percentUsed));
138 setUpdatesEnabled(false);
139 m_capacityBar->setValue(percentUsed);
140 setUpdatesEnabled(true);
141
142 if (!isVisible()) {
143 show();
144 } else {
145 update();
146 }
147 }
148
149 #include "moc_statusbarspaceinfo.cpp"