mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-05-07 05:23:06 +00:00
feat(src/components/notifier/Notifier): better handlers & supports correctly mac os
This commit is contained in:
parent
214809ecce
commit
eda5ee5940
6 changed files with 52 additions and 43 deletions
|
|
@ -44,7 +44,7 @@
|
|||
|
||||
#define NOTIFICATION_TIMEOUT_RECEIVED_MESSAGE 10000
|
||||
#define NOTIFICATION_TIMEOUT_RECEIVED_FILE_MESSAGE 10000
|
||||
#define NOTIFICATION_TIMEOUT_RECEIVED_CALL 10000
|
||||
#define NOTIFICATION_TIMEOUT_RECEIVED_CALL 30000
|
||||
|
||||
// Arbitrary hardcoded values.
|
||||
#define NOTIFICATION_SPACING 10
|
||||
|
|
@ -135,47 +135,55 @@ QObject *Notifier::createNotification (Notifier::NotificationType type) {
|
|||
}
|
||||
|
||||
void Notifier::showNotification (QObject *notification, int timeout) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
timeout = MAX_TIMEOUT;
|
||||
}
|
||||
|
||||
// Display notification.
|
||||
QMetaObject::invokeMethod(
|
||||
notification, NOTIFICATION_SHOW_METHOD_NAME,
|
||||
Qt::DirectConnection
|
||||
);
|
||||
QMetaObject::invokeMethod(notification, NOTIFICATION_SHOW_METHOD_NAME, Qt::DirectConnection);
|
||||
|
||||
QQuickWindow *window = notification->findChild<QQuickWindow *>();
|
||||
|
||||
if (!window)
|
||||
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)
|
||||
// or when single shot happen and if notification is visible.
|
||||
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.";
|
||||
|
||||
if (visible)
|
||||
qWarning("A notification cannot be visible twice!");
|
||||
|
||||
m_mutex.lock();
|
||||
|
||||
m_n_instances--;
|
||||
|
||||
if (m_n_instances == 0)
|
||||
m_offset = 0;
|
||||
|
||||
m_mutex.unlock();
|
||||
notification->property("__timer").value<QTimer *>()->stop();
|
||||
deleteNotification(notification);
|
||||
}
|
||||
);
|
||||
|
||||
// Destroy it after timeout.
|
||||
QTimer::singleShot(
|
||||
timeout, this, [notification]() {
|
||||
delete notification;
|
||||
}
|
||||
);
|
||||
timer->start();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void Notifier::deleteNotification (QObject *notification) {
|
||||
m_mutex.lock();
|
||||
|
||||
m_n_instances--;
|
||||
|
||||
if (m_n_instances == 0)
|
||||
m_offset = 0;
|
||||
|
||||
m_mutex.unlock();
|
||||
|
||||
notification->deleteLater();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -52,8 +52,8 @@ public:
|
|||
|
||||
private:
|
||||
QObject *createNotification (NotificationType type);
|
||||
void handleNotificationHidden ();
|
||||
void showNotification (QObject *notification, int timeout);
|
||||
void deleteNotification (QObject *notification);
|
||||
|
||||
QQmlComponent *m_components[MaxNbTypes];
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,16 @@ DesktopPopup {
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function _close (cb) {
|
||||
window.visibility = Window.Hidden
|
||||
|
||||
if (cb) {
|
||||
cb()
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
flags: Qt.Popup
|
||||
|
||||
Component.onCompleted: {
|
||||
|
|
|
|||
|
|
@ -18,13 +18,6 @@ Notification {
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function _close (cb) {
|
||||
notification.window.setVisible(false)
|
||||
cb()
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Rectangle {
|
||||
color: NotificationReceivedCallStyle.color
|
||||
height: NotificationReceivedCallStyle.height
|
||||
|
|
|
|||
|
|
@ -70,10 +70,9 @@ Notification {
|
|||
cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
hoverEnabled: true
|
||||
|
||||
onClicked: {
|
||||
notification.window.setVisible(false)
|
||||
onClicked: notification._close(function () {
|
||||
Qt.openUrlExternally('file://' + Utils.dirname(notification._fileUri))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,12 +89,11 @@ Notification {
|
|||
cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
hoverEnabled: true
|
||||
|
||||
onClicked: {
|
||||
notification.window.setVisible(false)
|
||||
onClicked: notification._close(function () {
|
||||
notification.notificationData.window.setView('Conversation', {
|
||||
sipAddress: notification._sipAddress
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue