feature(desktop/general): Display mentions number on tray icon badge.

Count all mentions from all chats and communities.
Send it to notifications object.

Issue #4922
This commit is contained in:
Michal Iskierko 2022-04-01 18:14:48 +02:00 committed by Michał Iskierko
parent 0b0fa51c89
commit 8acb3c386a
7 changed files with 34 additions and 6 deletions

View File

@ -137,7 +137,7 @@ ifneq ($(detected_OS),Windows)
QT5_LIBDIR := $(QTDIR)/lib QT5_LIBDIR := $(QTDIR)/lib
# some manually installed Qt5 instances have wrong paths in their *.pc files, so we pass the right one to the linker here # some manually installed Qt5 instances have wrong paths in their *.pc files, so we pass the right one to the linker here
ifeq ($(detected_OS),Darwin) ifeq ($(detected_OS),Darwin)
NIM_PARAMS += -L:"-framework Foundation -framework Security -framework IOKit -framework CoreServices -framework LocalAuthentication" NIM_PARAMS += -L:"-framework Foundation -framework AppKit -framework Security -framework IOKit -framework CoreServices -framework LocalAuthentication"
# Fix for failures due to 'can't allocate code signature data for' # Fix for failures due to 'can't allocate code signature data for'
NIM_PARAMS += --passL:"-headerpad_max_install_names" NIM_PARAMS += --passL:"-headerpad_max_install_names"
NIM_PARAMS += --passL:"-F$(QT5_LIBDIR)" NIM_PARAMS += --passL:"-F$(QT5_LIBDIR)"

View File

@ -79,6 +79,9 @@ QtObject:
self, "onMyRequestToJoinCommunityAcccepted(QString, QString, QString)", 2) self, "onMyRequestToJoinCommunityAcccepted(QString, QString, QString)", 2)
signalConnect(singletonInstance.globalEvents, "myRequestToJoinCommunityRejected(QString, QString, QString)", signalConnect(singletonInstance.globalEvents, "myRequestToJoinCommunityRejected(QString, QString, QString)",
self, "onMyRequestToJoinCommunityRejected(QString, QString, QString)", 2) self, "onMyRequestToJoinCommunityRejected(QString, QString, QString)", 2)
signalConnect(singletonInstance.globalEvents, "meMentionedIconBadgeNotification(int)",
self, "onMeMentionedIconBadgeNotification(int)", 2)
self.notificationSetUp = true self.notificationSetUp = true
proc showOSNotification(self: NotificationsManager, title: string, message: string, identifier: string) = proc showOSNotification(self: NotificationsManager, title: string, message: string, identifier: string) =
@ -148,6 +151,9 @@ QtObject:
sectionId: sectionId) sectionId: sectionId)
self.processNotification(title, message, details) self.processNotification(title, message, details)
proc onMeMentionedIconBadgeNotification(self: NotificationsManager, allMentions: int) {.slot.} =
self.osNotification.showIconBadgeNotification(allMentions)
proc notificationCheck(self: NotificationsManager, title: string, message: string, details: NotificationDetails, proc notificationCheck(self: NotificationsManager, title: string, message: string, details: NotificationDetails,
notificationWay: string) = notificationWay: string) =
var data = NotificationArgs(title: title, message: message, details: details) var data = NotificationArgs(title: title, message: message, details: details)

View File

@ -27,6 +27,8 @@ QtObject:
proc myRequestToJoinCommunityAcccepted*(self: GlobalEvents, title: string, message: string, proc myRequestToJoinCommunityAcccepted*(self: GlobalEvents, title: string, message: string,
sectionId: string) {.signal.} sectionId: string) {.signal.}
proc myRequestToJoinCommunityRejected*(self: GlobalEvents, title: string, message: string, proc myRequestToJoinCommunityRejected*(self: GlobalEvents, title: string, message: string,
sectionId: string) {.signal.} sectionId: string) {.signal.}
proc meMentionedIconBadgeNotification*(self: GlobalEvents, allMentions: int) {.signal.}

View File

@ -132,6 +132,9 @@ method newCommunityMembershipRequestReceived*(self: AccessInterface, membershipR
{.base.} = {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method meMentionedCountChanged*(self: AccessInterface, allMentions: int) {.base.} =
raise newException(ValueError, "No implementation available")
method onNetworkConnected*(self: AccessInterface) {.base.} = method onNetworkConnected*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")

View File

@ -539,7 +539,7 @@ method onActiveChatChange*[T](self: Module[T], sectionId: string, chatId: string
method onNotificationsUpdated[T](self: Module[T], sectionId: string, sectionHasUnreadMessages: bool, method onNotificationsUpdated[T](self: Module[T], sectionId: string, sectionHasUnreadMessages: bool,
sectionNotificationCount: int) = sectionNotificationCount: int) =
self.view.model().udpateNotifications(sectionId, sectionHasUnreadMessages, sectionNotificationCount) self.view.model().updateNotifications(sectionId, sectionHasUnreadMessages, sectionNotificationCount)
method onNetworkConnected[T](self: Module[T]) = method onNetworkConnected[T](self: Module[T]) =
self.view.setConnected(true) self.view.setConnected(true)
@ -672,7 +672,7 @@ method calculateProfileSectionHasNotification*[T](self: Module[T]): bool =
return not self.controller.isMnemonicBackedUp() return not self.controller.isMnemonicBackedUp()
method mnemonicBackedUp*[T](self: Module[T]) = method mnemonicBackedUp*[T](self: Module[T]) =
self.view.model().udpateNotifications( self.view.model().updateNotifications(
conf.SETTINGS_SECTION_ID, conf.SETTINGS_SECTION_ID,
self.calculateProfileSectionHasNotification(), self.calculateProfileSectionHasNotification(),
notificationsCount = 0) notificationsCount = 0)
@ -694,3 +694,6 @@ method newCommunityMembershipRequestReceived*[T](self: Module[T], membershipRequ
let community = self.controller.getCommunityById(membershipRequest.communityId) let community = self.controller.getCommunityById(membershipRequest.communityId)
singletonInstance.globalEvents.newCommunityMembershipRequestNotification("New membership request", singletonInstance.globalEvents.newCommunityMembershipRequestNotification("New membership request",
fmt "{contactName} asks to join {community.name}", community.id) fmt "{contactName} asks to join {community.name}", community.id)
method meMentionedCountChanged*[T](self: Module[T], allMentions: int) =
singletonInstance.globalEvents.meMentionedIconBadgeNotification(allMentions)

View File

@ -38,6 +38,8 @@ QtObject:
result.activeSectionVariant = newQVariant(result.activeSection) result.activeSectionVariant = newQVariant(result.activeSection)
result.chatSearchModel = chat_search_model.newModel() result.chatSearchModel = chat_search_model.newModel()
result.chatSearchModelVariant = newQVariant(result.chatSearchModel) result.chatSearchModelVariant = newQVariant(result.chatSearchModel)
signalConnect(result.model, "notificationsCountChanged()", result,
"onNotificationsCountChanged()", 2)
proc load*(self: View) = proc load*(self: View) =
# In some point, here, we will setup some exposed main module related things. # In some point, here, we will setup some exposed main module related things.
@ -72,6 +74,9 @@ QtObject:
proc rebuildChatSearchModel*(self: View) {.slot.} = proc rebuildChatSearchModel*(self: View) {.slot.} =
self.delegate.rebuildChatSearchModel() self.delegate.rebuildChatSearchModel()
proc onNotificationsCountChanged*(self: View) {.slot.} =
self.delegate.meMentionedCountChanged(self.model.allMentionsCount())
QtProperty[QVariant] chatSearchModel: QtProperty[QVariant] chatSearchModel:
read = getChatSearchModel read = getChatSearchModel
notify = chatSearchModelChanged notify = chatSearchModelChanged

View File

@ -248,6 +248,8 @@ QtObject:
proc sectionVisibilityUpdated*(self: SectionModel) {.signal.} proc sectionVisibilityUpdated*(self: SectionModel) {.signal.}
proc notificationsCountChanged*(self: SectionModel) {.signal.}
proc enableDisableSection(self: SectionModel, sectionType: SectionType, value: bool) = proc enableDisableSection(self: SectionModel, sectionType: SectionType, value: bool) =
if(sectionType != SectionType.Community): if(sectionType != SectionType.Community):
for i in 0 ..< self.items.len: for i in 0 ..< self.items.len:
@ -280,13 +282,20 @@ QtObject:
proc disableSection*(self: SectionModel, sectionType: SectionType) = proc disableSection*(self: SectionModel, sectionType: SectionType) =
self.enableDisableSection(sectionType, false) self.enableDisableSection(sectionType, false)
proc udpateNotifications*(self: SectionModel, id: string, hasNotification: bool, notificationsCount: int) = # Count all mentions from all chat&community sections
proc allMentionsCount*(self: SectionModel): int =
for item in self.items:
if item.sectionType == SectionType.Chat or item.sectionType == SectionType.Community:
result += item.notificationsCount
proc updateNotifications*(self: SectionModel, id: string, hasNotification: bool, notificationsCount: int) =
for i in 0 ..< self.items.len: for i in 0 ..< self.items.len:
if(self.items[i].id == id): if(self.items[i].id == id):
let index = self.createIndex(i, 0, nil) let index = self.createIndex(i, 0, nil)
self.items[i].hasNotification = hasNotification self.items[i].hasNotification = hasNotification
self.items[i].notificationsCount = notificationsCount self.items[i].notificationsCount = notificationsCount
self.dataChanged(index, index, @[ModelRole.HasNotification.int, ModelRole.NotificationsCount.int]) self.dataChanged(index, index, @[ModelRole.HasNotification.int, ModelRole.NotificationsCount.int])
self.notificationsCountChanged()
return return
proc getSectionNameById*(self: SectionModel, sectionId: string): string {.slot.} = proc getSectionNameById*(self: SectionModel, sectionId: string): string {.slot.} =