diff --git a/src/app/global/local_account_sensitive_settings.nim b/src/app/global/local_account_sensitive_settings.nim index eb257d3ffd..2cd778f3d9 100644 --- a/src/app/global/local_account_sensitive_settings.nim +++ b/src/app/global/local_account_sensitive_settings.nim @@ -53,6 +53,8 @@ const LSS_KEY_DOWNLOAD_CHANNEL_MESSAGES_ENABLED* = "downloadChannelMessagesEnabl const DEFAULT_DOWNLOAD_CHANNEL_MESSAGES_ENABLED = false const LSS_KEY_ACTIVE_SECTION* = "activeSection" const DEFAULT_ACTIVE_SECTION = "" +const LAST_SECTION_CHAT = "LastSectionChat" +const DEFAULT_ACTIVE_CHAT = "" const LSS_KEY_SHOW_BROWSER_SELECTOR* = "showBrowserSelector" const DEFAULT_SHOW_BROWSER_SELECTOR = true const LSS_KEY_OPEN_LINKS_IN_STATUS* = "openLinksInStatus" @@ -149,6 +151,16 @@ QtObject: when T is bool: result = getSettingsPropBool(self, prop, default) + template getSettingsGroupProp[T](self: LocalAccountSensitiveSettings, group: string, prop: string, default: QVariant): untyped = + # This doesn't work in case of QVariant, such properties will be handled in a common way. + if(self.settings.isNil): + return + + self.settings.beginGroup(group); + getSettingsProp[T](self, prop, default) + self.settings.endGroup(); + + template setSettingsProp(self: LocalAccountSensitiveSettings, prop: string, value: QVariant, signal: untyped) = if(self.settings.isNil): return @@ -156,6 +168,30 @@ QtObject: self.settings.setValue(prop, value) signal + template setSettingsGroupProp(self: LocalAccountSensitiveSettings, group: string, key: string, value: QVariant) = + if(self.settings.isNil): + return + + self.settings.beginGroup(group) + self.settings.setValue(key, value) + self.settings.endGroup() + + proc removeSettingsGroupKey(self: LocalAccountSensitiveSettings, group: string, key: string) = + if(self.settings.isNil): + return + + self.settings.beginGroup(group) + self.settings.remove(key) + self.settings.endGroup() + + proc getSectionLastOpenChat*(self: LocalAccountSensitiveSettings, sectionId: string): string = + getSettingsGroupProp[string](self, LAST_SECTION_CHAT, sectionId, newQVariant(DEFAULT_ACTIVE_CHAT)) + + proc setSectionLastOpenChat*(self: LocalAccountSensitiveSettings, sectionId: string, value: string) = + self.setSettingsGroupProp(LAST_SECTION_CHAT, sectionId, newQVariant(value)) + + proc removeSectionChatRecord*(self: LocalAccountSensitiveSettings, sectionId: string) = + self.removeSettingsGroupKey(LAST_SECTION_CHAT, sectionId) proc chatSplitViewChanged*(self: LocalAccountSensitiveSettings) {.signal.} proc getChatSplitView*(self: LocalAccountSensitiveSettings): QVariant {.slot.} = @@ -498,7 +534,6 @@ QtObject: write = setActiveSection notify = activeSectionChanged - proc showBrowserSelectorChanged*(self: LocalAccountSensitiveSettings) {.signal.} proc getShowBrowserSelector*(self: LocalAccountSensitiveSettings): bool {.slot.} = # getSettingsProp[bool](self, LSS_KEY_SHOW_BROWSER_SELECTOR, newQVariant(DEFAULT_SHOW_BROWSER_SELECTOR)) # https://github.com/status-im/status-desktop/issues/8568 diff --git a/src/app/modules/main/chat_section/module.nim b/src/app/modules/main/chat_section/module.nim index 707dfb845d..d8c8368446 100644 --- a/src/app/modules/main/chat_section/module.nim +++ b/src/app/modules/main/chat_section/module.nim @@ -129,6 +129,7 @@ proc buildChatSectionUI( mailserversService: mailservers_service.Service) = var selectedItemId = "" var selectedSubItemId = "" + let sectionLastOpenChat = singletonInstance.localAccountSensitiveSettings.getSectionLastOpenChat(self.controller.getMySectionId()) # handle channels which don't belong to any category for chatDto in channelGroup.chats: @@ -173,8 +174,9 @@ proc buildChatSectionUI( self.addSubmodule(chatDto.id, belongToCommunity, isUsersListAvailable, events, settingsService, nodeConfigurationService, contactService, chatService, communityService, messageService, gifService, mailserversService) - # make the first channel which doesn't belong to any category active when load the app - if(selectedItemId.len == 0): + # restore on a startup last open channel for the section or + # make the first channel which doesn't belong to any category active + if selectedItemId.len == 0 or chatDto.id == sectionLastOpenChat: selectedItemId = channelItem.id # handle categories and channels for each category @@ -203,9 +205,10 @@ proc buildChatSectionUI( settingsService, nodeConfigurationService, contactService, chatService, communityService, messageService, gifService, mailserversService) + # restore on a startup last open channel in the category for the section or # in case there is no channels beyond categories, - # make the first channel of the first category active when load the app - if(selectedItemId.len == 0): + # make the first channel of the first category active + if selectedItemId.len == 0 or channelItem.id == sectionLastOpenChat: selectedItemId = cat.id selectedSubItemId = channelItem.id @@ -331,10 +334,13 @@ method makeChatWithIdActive*(self: Module, chatId: string) = # here, in this step we have appropriate item and subitem assigned self.setActiveItemSubItem(item.BaseItem.id, subItemId) + singletonInstance.localAccountSensitiveSettings.setSectionLastOpenChat(self.controller.getMySectionId(), chatId) method activeItemSubItemSet*(self: Module, itemId: string, subItemId: string) = + let mySectionId = self.controller.getMySectionId() if (itemId == "" and subItemId == ""): self.view.activeItem().resetActiveItemData() + singletonInstance.localAccountSensitiveSettings.removeSectionChatRecord(mySectionId) return let item = self.view.chatsModel().getItemById(itemId) @@ -358,8 +364,13 @@ method activeItemSubItemSet*(self: Module, itemId: string, subItemId: string) = else: chatContentModule.onMadeInactive() + let activeChatId = self.controller.getActiveChatId() + + # save last open chat in settings for restore on the next app launch + singletonInstance.localAccountSensitiveSettings.setSectionLastOpenChat(mySectionId, activeChatId) + # notify parent module about active chat/channel - self.delegate.onActiveChatChange(self.controller.getMySectionId(), self.controller.getActiveChatId()) + self.delegate.onActiveChatChange(mySectionId, activeChatId) method getModuleAsVariant*(self: Module): QVariant = return self.viewVariant diff --git a/src/app/modules/main/module.nim b/src/app/modules/main/module.nim index a5a3f9bf94..888d68eaf5 100644 --- a/src/app/modules/main/module.nim +++ b/src/app/modules/main/module.nim @@ -749,6 +749,8 @@ method communityLeft*[T](self: Module[T], communityId: string) = self.view.model().removeItem(communityId) + singletonInstance.localAccountSensitiveSettings.removeSectionChatRecord(communityId) + if (self.controller.getActiveSectionId() == communityId): let item = self.view.model().getItemById(singletonInstance.userProfile.getPubKey()) self.setActiveSection(item) diff --git a/vendor/DOtherSide b/vendor/DOtherSide index 75b70971ca..d1926ff252 160000 --- a/vendor/DOtherSide +++ b/vendor/DOtherSide @@ -1 +1 @@ -Subproject commit 75b70971caf863629b4af83be254c04a84ef8c1e +Subproject commit d1926ff252c7645b04cfff014d6a6c80313d8628 diff --git a/vendor/nimqml b/vendor/nimqml index c428cf4397..743674eff1 160000 --- a/vendor/nimqml +++ b/vendor/nimqml @@ -1 +1 @@ -Subproject commit c428cf43976be8e647e8cf6412e783b06765b5ee +Subproject commit 743674eff154c49386254d8fbb1fc756fffee09c