Commit eda5ee59 authored by Ronan Abhamon's avatar Ronan Abhamon

feat(src/components/notifier/Notifier): better handlers & supports correctly mac os

parent 214809ec
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#define NOTIFICATION_TIMEOUT_RECEIVED_MESSAGE 10000 #define NOTIFICATION_TIMEOUT_RECEIVED_MESSAGE 10000
#define NOTIFICATION_TIMEOUT_RECEIVED_FILE_MESSAGE 10000 #define NOTIFICATION_TIMEOUT_RECEIVED_FILE_MESSAGE 10000
#define NOTIFICATION_TIMEOUT_RECEIVED_CALL 10000 #define NOTIFICATION_TIMEOUT_RECEIVED_CALL 30000
// Arbitrary hardcoded values. // Arbitrary hardcoded values.
#define NOTIFICATION_SPACING 10 #define NOTIFICATION_SPACING 10
...@@ -135,47 +135,55 @@ QObject *Notifier::createNotification (Notifier::NotificationType type) { ...@@ -135,47 +135,55 @@ QObject *Notifier::createNotification (Notifier::NotificationType type) {
} }
void Notifier::showNotification (QObject *notification, int timeout) { void Notifier::showNotification (QObject *notification, int timeout) {
if (timeout > MAX_TIMEOUT) {
timeout = MAX_TIMEOUT;
}
// Display notification. // Display notification.
QMetaObject::invokeMethod( QMetaObject::invokeMethod(notification, NOTIFICATION_SHOW_METHOD_NAME, Qt::DirectConnection);
notification, NOTIFICATION_SHOW_METHOD_NAME,
Qt::DirectConnection
);
QQuickWindow *window = notification->findChild<QQuickWindow *>(); QQuickWindow *window = notification->findChild<QQuickWindow *>();
if (!window) if (!window)
qFatal("Cannot found a `QQuickWindow` instance in `notification`."); qFatal("Cannot found a `QQuickWindow` instance in `notification`.");
QTimer *timer = new QTimer(window);
timer->setInterval(timeout > MAX_TIMEOUT ? MAX_TIMEOUT : timeout);
timer->setSingleShot(true);
notification->setProperty("__timer", QVariant::fromValue(timer));
// Destroy it after timeout.
QObject::connect(
timer, &QTimer::timeout, this, [this, notification]() {
notification->property("__timer").value<QTimer *>()->stop();
deleteNotification(notification);
}
);
// Called explicitly (by a click on notification for example) // Called explicitly (by a click on notification for example)
// or when single shot happen and if notification is visible. // or when single shot happen and if notification is visible.
QObject::connect( QObject::connect(
window, &QQuickWindow::visibleChanged, [this](const bool &visible) { window, &QQuickWindow::visibilityChanged, [this, notification](QWindow::Visibility visibility) {
if (visibility != QWindow::Visibility::Hidden)
return;
qInfo() << "Update notifications counter, hidden notification detected."; qInfo() << "Update notifications counter, hidden notification detected.";
notification->property("__timer").value<QTimer *>()->stop();
deleteNotification(notification);
}
);
if (visible) timer->start();
qWarning("A notification cannot be visible twice!"); }
m_mutex.lock(); // -----------------------------------------------------------------------------
m_n_instances--; void Notifier::deleteNotification (QObject *notification) {
m_mutex.lock();
if (m_n_instances == 0) m_n_instances--;
m_offset = 0;
m_mutex.unlock(); if (m_n_instances == 0)
} m_offset = 0;
);
// Destroy it after timeout. m_mutex.unlock();
QTimer::singleShot(
timeout, this, [notification]() { notification->deleteLater();
delete notification;
}
);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -52,8 +52,8 @@ public: ...@@ -52,8 +52,8 @@ public:
private: private:
QObject *createNotification (NotificationType type); QObject *createNotification (NotificationType type);
void handleNotificationHidden ();
void showNotification (QObject *notification, int timeout); void showNotification (QObject *notification, int timeout);
void deleteNotification (QObject *notification);
QQmlComponent *m_components[MaxNbTypes]; QQmlComponent *m_components[MaxNbTypes];
......
...@@ -24,6 +24,16 @@ DesktopPopup { ...@@ -24,6 +24,16 @@ DesktopPopup {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
function _close (cb) {
window.visibility = Window.Hidden
if (cb) {
cb()
}
}
// ---------------------------------------------------------------------------
flags: Qt.Popup flags: Qt.Popup
Component.onCompleted: { Component.onCompleted: {
......
...@@ -18,13 +18,6 @@ Notification { ...@@ -18,13 +18,6 @@ Notification {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
function _close (cb) {
notification.window.setVisible(false)
cb()
}
// ---------------------------------------------------------------------------
Rectangle { Rectangle {
color: NotificationReceivedCallStyle.color color: NotificationReceivedCallStyle.color
height: NotificationReceivedCallStyle.height height: NotificationReceivedCallStyle.height
......
...@@ -70,10 +70,9 @@ Notification { ...@@ -70,10 +70,9 @@ Notification {
cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: notification._close(function () {
notification.window.setVisible(false)
Qt.openUrlExternally('file://' + Utils.dirname(notification._fileUri)) Qt.openUrlExternally('file://' + Utils.dirname(notification._fileUri))
} })
} }
} }
} }
......
...@@ -89,12 +89,11 @@ Notification { ...@@ -89,12 +89,11 @@ Notification {
cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: notification._close(function () {
notification.window.setVisible(false)
notification.notificationData.window.setView('Conversation', { notification.notificationData.window.setView('Conversation', {
sipAddress: notification._sipAddress sipAddress: notification._sipAddress
}) })
} })
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment