ImagingTools Core SDK
CPopupControllerComp.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
16// ImtCore includes
17#include <imtbase/TModelUpdateBinder.h>
18#include <imtgui/IClientAreaProvider.h>
19#include <imtgui/IPopupController.h>
20#include <imtgui/IPopupEventHandler.h>
21#include <imtgui/IPopupWidget.h>
22
23
24namespace imtgui
25{
26
27
28class CPopupControllerComp:
29 public QObject,
30 public icomp::CComponentBase,
31 virtual public IPopupController
32{
33 Q_OBJECT
34public:
35 typedef icomp::CComponentBase BaseClass;
36
37 I_BEGIN_COMPONENT(CPopupControllerComp);
38 I_REGISTER_INTERFACE(IPopupController);
39 I_REGISTER_INTERFACE(ilog::IMessageConsumer);
40 I_ASSIGN(m_clientAreaProviderCompPtr, "ClientArea", "Desktop area for organizing popups", false, "ClientAreaProvider");
41 I_ASSIGN(m_popupWidgetFactoryCompPtr, "PopupWidgetFactory", "Widget factory for popup messages and content widgets", false, "StandardPopupWidgetFactory");
42 I_ASSIGN_MULTI_0(m_popupEventHandlerCompPtr, "PopupEventHandler", "Popup event handlers", false);
43 I_ASSIGN(m_anchorAttrPtr, "AnchorCorner", "0 - TopLeft\n1 - TopRight\n2 - BottomLeft\n3 - BottomRight", true, 3);
44 I_ASSIGN(m_xRatioAttrPtr, "HorizontalRatio", "Horizontal ratio", true, 0.25);
45 I_ASSIGN(m_yRatioAttrPtr, "VerticalRatio", "Vertical ratio", true, 1);
46 I_ASSIGN(m_spacingAttrPtr, "Spacing", "Spacing between adjacent popups", true, 5);
47 I_ASSIGN(m_defaultTimeoutAttrPtr, "DefaultTimeout", "Timeout value in msecs before the popup closes, a zero or negative value requires user action to close", true, 3000);
48 I_END_COMPONENT;
49
50 CPopupControllerComp();
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
65 // reimplemented (icomp::CComponentBase)
66 virtual void OnComponentCreated() override;
67 virtual void OnComponentDestroyed() override;
68
69private Q_SLOTS:
70 void OnPrimaryScreenChanged();
71 void OnScreenGeometryChanged(const QRect& geometry);
72 void OnClientAreaUpdated(const istd::IChangeable::ChangeSet& changeSet, const IClientAreaProvider* objectPtr);
73
74 void OnHoverEnter(QEvent* event);
75 void OnHoverLeave(QEvent* event);
76 void OnCloseRequest();
77 void OnPopupTimeout();
78 void OnFadeFinished();
79
80private:
81 struct PopupItem;
82
83 void CalculatePopupAreaFromScreen();
84 QByteArray CreatePopupItem(const MessagePtr& messagePtr, int timeout, bool isClosingOnMouseClickAllowed, QWidget* contentWidgetPtr);
85 void RemovePopupItem(int index);
86 int GetVisibleItemIndex(const QByteArray& id);
87 int GetVisibleItemIndex(const QObject* memberPtr);
88
89 void ValidateVisibleItems();
90 void ArrangeVisibleItems();
91 void ShowItems();
92
93private:
94 struct PopupItem
95 {
96 PopupItem()
97 :widgetPtr(nullptr),
98 timeout(-1)
99 {
100 fadeAnimation.setTargetObject(&effect);
101 fadeAnimation.setPropertyName("opacity");
102 fadeAnimation.setDuration(500);
103 fadeAnimation.setStartValue(0);
104 fadeAnimation.setEndValue(1);
105 }
106
107 ~PopupItem()
108 {
109 timeoutTimer.stop();
110 fadeAnimation.stop();
111 widgetPtr->hide();
112 widgetPtr->deleteLater();
113 }
114
115 QByteArray id;
116 QWidget* widgetPtr;
117 int timeout;
118 QTimer timeoutTimer;
119 QGraphicsOpacityEffect effect;
120 QPropertyAnimation fadeAnimation;
121 };
122 typedef istd::TSmartPtr<PopupItem> PopupItemPtr;
123
124private:
125 I_REF(IClientAreaProvider, m_clientAreaProviderCompPtr);
126 I_REF(IPopupWidgetFactory, m_popupWidgetFactoryCompPtr);
127 I_MULTIREF(IPopupEventHandler, m_popupEventHandlerCompPtr);
128 I_ATTR(int, m_anchorAttrPtr);
129 I_ATTR(double, m_xRatioAttrPtr);
130 I_ATTR(double, m_yRatioAttrPtr);
131 I_ATTR(int, m_spacingAttrPtr);
132 I_ATTR(int, m_defaultTimeoutAttrPtr);
133
134 QPoint m_anchor;
135 QSize m_size;
136
138
139 QList<PopupItemPtr> m_items;
140 QList<PopupItemPtr> m_visibleItems;
141
142 bool m_mouseOnPopup;
143};
144
145
146} // namespace imtgui
147
148