aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/infobar.h
blob: 4be0bc36daee1fe72a44d290944a6695475da92b (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
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include "utils_global.h"

#include "id.h"
#include "infolabel.h"
#include "qtcsettings.h"

#include <QObject>
#include <QSet>
#include <QVariant>

#include <functional>

QT_BEGIN_NAMESPACE
class QBoxLayout;
class QSettings;
QT_END_NAMESPACE

namespace Utils {

class Icon;
class InfoBar;
class InfoBarDisplay;
class Theme;

class QTCREATOR_UTILS_EXPORT InfoBarEntry
{
public:
    enum class GlobalSuppression
    {
        Disabled,
        Enabled
    };
    enum class ButtonAction
    {
        None,
        Hide,
        Suppress,
        SuppressPersistently
    };

    InfoBarEntry() = default;
    InfoBarEntry(Id _id, const QString &_infoText, GlobalSuppression _globalSuppression = GlobalSuppression::Disabled);

    Id id() const;
    QString text() const;
    QString title() const;
    GlobalSuppression globalSuppression() const;

    void setTitle(const QString &title);

    using CallBack = std::function<void()>;
    struct Button
    {
        QString text;
        CallBack callback;
        QString tooltip;
        ButtonAction action = ButtonAction::None;
        bool enabled = true;
    };
    void addCustomButton(const QString &_buttonText, CallBack callBack, const QString &tooltip = {},
                         ButtonAction action = ButtonAction::None, bool enabled = true);
    void setCancelButtonInfo(CallBack callBack);
    void setCancelButtonInfo(const QString &_cancelButtonText, CallBack callBack);
    void removeCancelButton();
    QList<Button> buttons() const;
    bool hasCancelButton() const;
    CallBack cancelButtonCallback() const;
    QString cancelButtonText() const;

    struct ComboInfo
    {
        QString displayText;
        QVariant data;
    };
    using ComboCallBack = std::function<void(const ComboInfo &)>;
    struct Combo
    {
        ComboCallBack callback;
        QList<ComboInfo> entries;
        QString tooltip;
        int currentIndex = -1;
    };
    void setComboInfo(
        const QStringList &list,
        ComboCallBack callBack,
        const QString &tooltip = {},
        int currentIndex = -1);
    void setComboInfo(const QList<ComboInfo> &infos, ComboCallBack callBack, const QString &tooltip = {}, int currentIndex = -1);
    Combo combo() const;

    using DetailsWidgetCreator = std::function<QWidget*()>;
    void setDetailsWidgetCreator(const DetailsWidgetCreator &creator);
    DetailsWidgetCreator detailsWidgetCreator() const;

    void setInfoType(InfoLabel::InfoType infoType);
    InfoLabel::InfoType infoType() const;

    static const Icon &icon(InfoLabel::InfoType infoType);

private:
    Id m_id;
    QString m_infoText;
    QString m_title;
    InfoLabel::InfoType m_infoType = InfoLabel::None;
    QList<Button> m_buttons;
    QString m_cancelButtonText;
    CallBack m_cancelButtonCallBack;
    GlobalSuppression m_globalSuppression = GlobalSuppression::Disabled;
    DetailsWidgetCreator m_detailsWidgetCreator;
    bool m_useCancelButton = true;
    Combo m_combo;
};

class QTCREATOR_UTILS_EXPORT InfoBar : public QObject
{
    Q_OBJECT

public:
    void addInfo(const InfoBarEntry &info);
    void removeInfo(Id id);
    bool containsInfo(Id id) const;
    void suppressInfo(Id id);
    bool canInfoBeAdded(Id id) const;
    void unsuppressInfo(Id id);
    void clear();
    static void globallySuppressInfo(Id id);
    static void globallyUnsuppressInfo(Id id);
    static void clearGloballySuppressed();
    static bool anyGloballySuppressed();

    static void initialize(QtcSettings *settings);
    static QtcSettings *settings();

    QList<InfoBarEntry> entries() const;

    // for InfoBarDisplay implementations
    void triggerButton(const Id &entryId, const InfoBarEntry::Button &button);

signals:
    void changed();

private:
    static void writeGloballySuppressedToSettings();

private:
    QList<InfoBarEntry> m_infoBarEntries;
    QSet<Id> m_suppressed;

    static QSet<Id> globallySuppressed;
    static QtcSettings *m_settings;
};

class QTCREATOR_UTILS_EXPORT InfoBarDisplay : public QObject
{
public:
    InfoBarDisplay(QObject *parent = nullptr);
    void setTarget(QBoxLayout *layout, int index);
    void setInfoBar(InfoBar *infoBar);
    void setEdge(Qt::Edge edge);

    InfoBar *infoBar() const;

private:
    void update();
    void infoBarDestroyed();

    QList<QWidget *> m_infoWidgets;
    InfoBar *m_infoBar = nullptr;
    QBoxLayout *m_boxLayout = nullptr;
    Qt::Edge m_edge = Qt::TopEdge;
    int m_boxIndex = 0;
    bool m_isShowingDetailsWidget = false;
};

} // namespace Utils