┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/statusbar/dolphinstatusbar.h
blob: 232a4ba077f0b9d46a005e3f5e7c9cd00fbdb0fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
 * SPDX-FileCopyrightText: 2006-2012 Peter Penz <[email protected]>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef DOLPHINSTATUSBAR_H
#define DOLPHINSTATUSBAR_H

#include "animatedheightwidget.h"

#include <KMessageWidget>

class QUrl;
class StatusBarSpaceInfo;
class QLabel;
class QProgressBar;
class QToolButton;
class QSlider;
class QTimer;
class KSqueezedTextLabel;
class QHBoxLayout;

/**
 * @brief Represents the statusbar of a Dolphin view.
 *
 * The statusbar allows to show messages, progress
 * information and space-information of a disk.
 */
class DolphinStatusBar : public AnimatedHeightWidget
{
    Q_OBJECT

public:
    explicit DolphinStatusBar(QWidget *parent);
    ~DolphinStatusBar() override;

    enum class CancelLoading {
        Allowed,
        Disallowed
    };
    /**
     * Shows progress for a task on the status bar.
     *
     * Allows us to inform the user about various tasks progressing in the background.
     * This method can be called from various places in any order but only the most recent call will be displayed.
     * @param currentlyRunningTaskTitle The task that is currently progressing.
     * @param progressPercent           The percent value shown in a progress bar next to the @p currentlyRunningTaskTitle.
     *                                  A negative @p progressPercent value will be interpreted as indeterminate/unknown progress.
     *                                  The progress is shown delayed by 500 milliseconds: If the progress does reach 100 % within 500 milliseconds,
     *                                  the progress is not shown at all.
     * @param cancelLoading             Whether a "Stop" button for cancelling the task should be available next to the progress reporting.
     *
     * @note Make sure you also hide the progress information by calling this with a @p progressPercent equal or greater than 100.
     */
    void showProgress(const QString &currentlyRunningTaskTitle, int progressPercent, CancelLoading cancelLoading = CancelLoading::Allowed);
    QString progressText() const;
    int progress() const;

    /**
     * Sets a text that is shown with priority as a Qt::RichText for a short amount of time.
     */
    void setTemporaryRichText(const QString &temporaryRichText);
    /**
     * Sets a text describing the hovered item. This text is immediately shown if no m_temporaryRichText is currently shown.
     * When no item is hovered, call this method with an empty string so the m_defaultText is shown.
     * @see setTemporaryRichText()
     * @see setDefaultText()
     */
    void setHoveredItemText(const QString &hoveredItemText);
    /**
     * Sets the default text. This text is immediately shown if no m_temporaryRichText is currently shown.
     * @see setTemporaryRichText()
     */
    void setDefaultText(const QString &text);

    QUrl url() const;
    int zoomLevel() const;

    /**
     * Refreshes the status bar to get synchronized with the (updated) Dolphin settings.
     */
    void readSettings();

    /**
     * Refreshes the disk space information.
     */
    void updateSpaceInfo();

    /**
     * Changes the statusbar between disabled, small, and full width
     * depending on settings enabled.
     */
    void updateMode();

    /**
     * Updates the statusbar width to fit all content.
     */
    void updateWidthToContent();

    /**
     * @return The amount of clipping done to the small statusbar side and bottom.
     */
    int clippingAmount() const;

public Q_SLOTS:
    void setUrl(const QUrl &url);
    void setZoomLevel(int zoomLevel);

Q_SIGNALS:
    /**
     * Is emitted if the stop-button has been pressed during showing a progress.
     */
    void stopPressed();

    void zoomLevelChanged(int zoomLevel);

    /**
     * Requests for @p message with the given @p messageType to be shown to the user in a non-modal way.
     */
    void showMessage(const QString &message, KMessageWidget::MessageType messageType);

    /**
     * Emitted when statusbar mode is changed.
     */
    void modeUpdated();

    /**
     * Emitted when statusbar width is updated to fit content.
     */
    void widthUpdated();

    /**
     * Emitted when statusbar url has changed.
     */
    void urlChanged();

protected:
    void contextMenuEvent(QContextMenuEvent *event) override;
    void paintEvent(QPaintEvent *paintEvent) override;

private Q_SLOTS:
    void showZoomSliderToolTip(int zoomLevel);

    void updateProgressInfo();

    /**
     * Replaces the text set by setTemporaryRichText() by the text set by setHoveredItemText() or setDefaultText().
     * Is only called when m_clearTemporaryRichTextTimer times out.
     */
    void clearTemporaryRichText();

    /**
     * Updates the text for m_label and does an eliding in
     * case if the text does not fit into the available width.
     */
    void updateLabelText();

    /**
     * Updates the text of the zoom slider tooltip to show
     * the currently used size.
     */
    void updateZoomSliderToolTip(int zoomLevel);

private:
    /**
     * Makes the space information widget and zoom slider widget
     * visible, if \a visible is true and the settings allow to show
     * the widgets. showUnknownProgressIf \a visible is false, it is assured that both
     * widgets are hidden.
     */
    void setExtensionsVisible(bool visible);

    void updateContentsMargins();

    /** @see AnimatedHeightWidget::preferredHeight() */
    int preferredHeight() const override;

private:
    /** @see setTemporaryRichText() */
    QString m_temporaryRichText;
    /** @see setHoveredItemText() */
    QString m_hoveredItemText;
    /** @see setDefaultText() */
    QString m_defaultText;
    KSqueezedTextLabel *m_label;
    QLabel *m_zoomLabel;
    StatusBarSpaceInfo *m_spaceInfo;

    QSlider *m_zoomSlider;

    QLabel *m_progressTextLabel;
    CancelLoading m_cancelLoading = CancelLoading::Allowed;
    QProgressBar *m_progressBar;
    QToolButton *m_stopButton;
    int m_progress;
    QTimer *m_showProgressBarTimer;

    /** Clears the temporary rich text from the status bar and shows a non-temporary text instead. */
    QTimer *m_clearTemporaryRichTextTimer;
    /** Very frequent updates to the status bar text look ugly. Most updates go through this timer to avoid this. */
    QTimer *m_updateLabelTextTimer;

    QHBoxLayout *m_topLayout;
};

#endif