ImagingTools Core SDK
CPopupController.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QTimer>
7#include <QtWidgets/QGraphicsOpacityEffect>
8#include <QtWidgets/QWidget>
9#include <QtCore/QParallelAnimationGroup>
10#include <QtCore/QPropertyAnimation>
11#include <QtCore/QVariantAnimation>
12
13// ACF includes
14#include <icomp/CComponentBase.h>
15#include <ilog/CMessageContainer.h>
16#include <ilog/IMessageConsumer.h>
17
18// ImtCore includes
19#include <imtbase/TModelUpdateBinder.h>
20#include <imtgui/IClientAreaProvider.h>
21#include <imtgui/IPopupController.h>
22#include <imtgui/IPopupEventHandler.h>
23#include <imtgui/IPopupWidget.h>
24
25
26namespace imtgui
27{
28
29
30class CPopupController:
31 public QObject,
32 virtual public IPopupController
33{
34 Q_OBJECT
35public:
36 typedef icomp::CComponentBase BaseClass;
37
38 CPopupController();
39
40 void SetAnchorCorner(Qt::Corner corner);
41 void SetParentWidget(QWidget* parentPtr);
42 void SetScreen(QScreen* screenPtr);
43 void SetRatioX(double ratio);
44 void SetRatioY(double ratio);
45 void SetSpacing(double spacing);
46 void SetDefaultTimeOut(int msec);
47 void SetPopupWidgetFactory(IPopupWidgetFactory* factoryPtr);
48 void SetExclusiveMessageSources(const QStringList& exclusiveMessageSources);
49
50 void SetEnabled(bool enable);
51
52 // reimplemented (IPopupController)
53 virtual QByteArray AddPopup(const MessagePtr& messagePtr, int timeout = -1, bool isClosingOnMouseClickAllowed = true, QWidget* contentWidgetPtr = nullptr) override;
54 virtual void ClosePopup(const QByteArray& popupId) override;
55 virtual void RegisterEventHandler(IPopupEventHandler* handlerPtr) override;
56 virtual void UnRegisterEventHandler(IPopupEventHandler* handlerPtr) override;
57
58 // reimplemented (ilog::IMessageConsumer)
59 virtual bool IsMessageSupported(
60 int messageCategory = -1,
61 int messageId = -1,
62 const istd::IInformationProvider* messagePtr = NULL) const override;
63 virtual void AddMessage(const MessagePtr& messagePtr) override;
64
65Q_SIGNALS:
66 void EmitAddMessage(const QByteArray& id, const MessagePtr& messagePtr);
67 void EmitAddPopup(
68 const QByteArray& id,
69 const MessagePtr& messagePtr,
70 int timeout,
71 bool isClosingOnMouseClickAllowed,
72 QWidget* contentWidgetPtr);
73 void EmitClosePopup(const QByteArray& popupId);
74
75private Q_SLOTS:
76 void OnAddMessage(const QByteArray& id, const MessagePtr& messagePtr);
77 void OnAddPopup(
78 const QByteArray& id,
79 const MessagePtr& messagePtr,
80 int timeout,
81 bool isClosingOnMouseClickAllowed,
82 QWidget* contentWidgetPtr);
83 void OnClosePopup(const QByteArray& popupId);
84
85 void OnScreenGeometryChanged(const QRect& rect);
86
87 void OnHoverEnter(QEvent* event);
88 void OnHoverLeave(QEvent* event);
89 void OnCloseRequest();
90 void OnPopupTimeout();
91 void OnFadeFinished();
92
93private:
94 struct PopupItem;
95
96 void CreatePopupItem(
97 const QByteArray& id,
98 const MessagePtr& messagePtr,
99 int timeout,
100 bool isClosingOnMouseClickAllowed,
101 QWidget* contentWidgetPtr);
102 void RemovePopupItem(int index);
103 int GetVisibleItemIndex(const QByteArray& id);
104 int GetVisibleItemIndex(const QObject* memberPtr);
105 int GetInvisibleItemIndex(const QByteArray& id);
106
107 PopupItem* GetPopupItem(const QByteArray& popupId);
108 PopupItem* GetPopupItem(const QString& source);
109
110 void ValidateVisibleItems();
111 void ArrangeVisibleItems();
112 void ShowItems();
113 void HideItems();
114
115 virtual bool eventFilter(QObject* watched, QEvent* event) override;
116
117private:
118 struct PopupItem
119 {
120 PopupItem()
121 :widgetPtr(nullptr),
122 timeout(-1)
123 {
124 fadeAnimation.setTargetObject(&effect);
125 fadeAnimation.setPropertyName("opacity");
126 fadeAnimation.setDuration(500);
127 fadeAnimation.setStartValue(0);
128 fadeAnimation.setEndValue(1);
129 }
130
131 ~PopupItem()
132 {
133 timeoutTimer.stop();
134 fadeAnimation.stop();
135 widgetPtr->hide();
136 widgetPtr->deleteLater();
137 }
138
139 QByteArray id;
140 QWidget* widgetPtr;
141 int timeout;
142 QTimer timeoutTimer;
143 QGraphicsOpacityEffect effect;
144 QPropertyAnimation fadeAnimation;
145 };
146 typedef istd::TSmartPtr<PopupItem> PopupItemPtr;
147
148private:
149 bool m_enabled;
150 QRect m_rect;
151 Qt::Corner m_corner;
152 QWidget* m_parentPtr;
153 QScreen* m_screenPtr;
154 double m_ratioX;
155 double m_ratioY;
156 double m_spacing;
157 int m_timeout;
158 IPopupWidgetFactory* m_widgetFactoryPtr;
159
160 QList<IPopupEventHandler*> m_eventHandlers;
161 QMutex m_eventHandlersMutex;
162
163 QStringList m_exclusiveMessageSources;
164
165 QList<PopupItemPtr> m_items;
166 QList<PopupItemPtr> m_visibleItems;
167
168 bool m_mouseOnPopup;
169};
170
171
172} // namespace imtgui
173
174