summaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/common/widgetstateindicator.h
blob: eee49d518011a53b4b0e85301db7ad6c6e44edc2 (plain) (blame)
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
#ifndef WIDGETSTATEINDICATOR_H
#define WIDGETSTATEINDICATOR_H

#include "guiSQLiteStudio_global.h"
#include <QObject>

class QLabel;
class QGraphicsDropShadowEffect;
class QGraphicsColorizeEffect;
class QSequentialAnimationGroup;

class GUI_API_EXPORT WidgetStateIndicator : public QObject
{
        Q_OBJECT
    public:
        enum class Mode
        {
            INFO,
            ERROR,
            WARNING,
            HINT
        };

        enum class PositionMode
        {
            DEFAULT,
            GROUP_BOX,
            LABEL,
            CHECK_BOX,
        };

        ~WidgetStateIndicator();

        void setMode(Mode mode);
        void show(const QString& msg = QString(), bool animated = true);
        void hide();
        void setVisible(bool visible, const QString& msg = QString());
        void release();
        void info(const QString& msg, bool animated = true);
        void warn(const QString& msg, bool animated = true);
        void error(const QString& msg, bool animated = true);
        void hint(const QString& msg, bool animated = true);

        static bool exists(QWidget* widget);
        static WidgetStateIndicator* getInstance(QWidget* widget);

        PositionMode getPositionMode() const;
        void setPositionMode(const PositionMode& value);

    protected:
        bool eventFilter(QObject *obj, QEvent *ev);

    private:
        explicit WidgetStateIndicator(QWidget *widget);

        void initLabel();
        void initEffects();
        void initGlowEffects();
        void initHighlightingEffects();
        void initAnimations();
        void initPositionMode();
        void finalInit();
        void setMessage(const QString& msg);
        void clearMessage();
        void detectWindowParent();
        QWidget* findParentWindow(QWidget* w);
        bool shouldHide();
        bool shouldShow();

        QWidget* labelParent = nullptr;
        QLabel* label = nullptr;
        Mode mode = Mode::ERROR;
        QWidget* widget = nullptr;
        QString message;
        QGraphicsColorizeEffect* highlightingEffect = nullptr;
        QGraphicsDropShadowEffect* glowEffect = nullptr;
        QSequentialAnimationGroup* animation = nullptr;
        bool widgetVisible = false;
        bool visibilityRequested = false;
        QWidget* windowParent = nullptr;
        PositionMode positionMode = PositionMode::DEFAULT;

        static QHash<QWidget*,WidgetStateIndicator*> instances;

    private slots:
        void updateMode();
        void updatePosition();
        void updatePositionDefault();
        void updatePositionGroupBox();
        void updatePositionLabel();
        void updatePositionCheckBox();
        void updateVisibility();

};

#define INDICATOR(w) WidgetStateIndicator::getInstance(w)
#define EXISTS_INDICATOR(w) WidgetStateIndicator::exists(w)

#endif // WIDGETSTATEINDICATOR_H