┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/statusbar/dolphinstatusbar.h
blob: b4ddcd95efb273d754a87b616acf1f7359dbd1bf (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
/*
 * 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>

#include <QTime>

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;

    QString text() const;

    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;

    /**
     * Replaces the text set by setText() by the text that
     * has been set by setDefaultText(). DolphinStatusBar::text()
     * will return an empty string after the reset has been done.
     */
    void resetToDefaultText();

    /**
     * Sets the default text, which is shown if the status bar
     * is rest by DolphinStatusBar::resetToDefaultText().
     */
    void setDefaultText(const QString &text);
    QString defaultText() const;

    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 setText(const QString &text);
    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();

    /**
     * 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:
    QString m_text;
    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;

    QTimer *m_delayUpdateTimer;
    QTime m_textTimestamp;

    QHBoxLayout *m_topLayout;
};

#endif