} else if (action == showSpaceInfoAction) {
const bool visible = showSpaceInfoAction->isChecked();
GeneralSettings::setShowSpaceInfo(visible);
- m_spaceInfo->setVisible(visible);
+ m_spaceInfo->setShown(visible);
}
updateContentsMargins();
}
}
m_spaceInfo->setShown(showSpaceInfo);
- m_spaceInfo->setVisible(showSpaceInfo);
m_zoomSlider->setVisible(showZoomSlider);
m_zoomLabel->setVisible(showZoomSlider);
updateContentsMargins();
: QWidget(parent)
, m_observer(nullptr)
, m_installFilelightWidgetAction{nullptr}
+ , m_hasSpaceInfo{false}
+ , m_shown{false}
{
+ hide(); // Only become visible when we have space info to show. @see StatusBarSpaceInfo::setShown().
+
m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this);
m_textInfoButton = new QToolButton(this);
m_textInfoButton->setAutoRaise(true);
m_shown = shown;
if (!m_shown) {
hide();
- m_ready = false;
+ return;
+ }
+
+ // We only show() this widget in slotValueChanged() when it m_hasSpaceInfo.
+ if (m_observer.isNull()) {
+ m_observer.reset(new SpaceInfoObserver(m_url, this));
+ connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
+ }
+
+ if (m_hasSpaceInfo) {
+ slotValuesChanged();
}
}
{
if (m_url != url) {
m_url = url;
- m_ready = false;
+ m_hasSpaceInfo = false;
if (m_observer) {
m_observer.reset(new SpaceInfoObserver(m_url, this));
connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
void StatusBarSpaceInfo::showEvent(QShowEvent *event)
{
- if (m_shown) {
- if (m_ready) {
- QWidget::showEvent(event);
- }
-
- if (m_observer.isNull()) {
- m_observer.reset(new SpaceInfoObserver(m_url, this));
- connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
- }
+ if (m_shown && m_observer.isNull()) {
+ m_observer.reset(new SpaceInfoObserver(m_url, this));
+ connect(m_observer.data(), &SpaceInfoObserver::valuesChanged, this, &StatusBarSpaceInfo::slotValuesChanged);
}
+ QWidget::showEvent(event);
}
void StatusBarSpaceInfo::hideEvent(QHideEvent *event)
{
- if (m_ready) {
+ if (m_hasSpaceInfo) {
m_observer.reset();
- m_ready = false;
+ m_hasSpaceInfo = false;
}
QWidget::hideEvent(event);
}
return;
}
- m_ready = true;
+ m_hasSpaceInfo = true;
const quint64 available = m_observer->available();
const quint64 used = size - available;
~StatusBarSpaceInfo() override;
/**
- * Use this to set the widget visibility as it can hide itself
+ * Works similar to QWidget::setVisible() except that this will postpone showing the widget until space info has been retrieved. Hiding happens instantly.
+ *
+ * @param shown Whether this widget is supposed to be visible long-term
*/
- void setShown(bool);
+ void setShown(bool shown);
void setUrl(const QUrl &url);
QUrl url() const;
*/
void initialiseInstallFilelightWidgetAction();
+ // The following three methods are only for private use.
+ using QWidget::hide; // Use StatusBarSpaceInfo::setShown() instead.
+ using QWidget::setVisible; // Use StatusBarSpaceInfo::setShown() instead.
+ using QWidget::show; // Use StatusBarSpaceInfo::setShown() instead.
+
private:
QScopedPointer<SpaceInfoObserver> m_observer;
KCapacityBar *m_capacityBar;
/** An action containing a UI to install Filelight. */
QWidgetAction *m_installFilelightWidgetAction;
QUrl m_url;
- bool m_ready;
+ /** Whether m_observer has already retrieved space information for the current url. */
+ bool m_hasSpaceInfo;
+ /** Whether this widget is supposed to be visible long-term. @see StatusBarSpaceInfo::setShown(). */
bool m_shown;
};