diff --git a/src/app/modules/main/chat_section/controller.nim b/src/app/modules/main/chat_section/controller.nim index bff2729a05..88fd513273 100644 --- a/src/app/modules/main/chat_section/controller.nim +++ b/src/app/modules/main/chat_section/controller.nim @@ -172,12 +172,12 @@ proc init*(self: Controller) = self.events.on(SIGNAL_COMMUNITY_CHANNEL_REORDERED) do(e:Args): let args = CommunityChatOrderArgs(e) if (args.communityId == self.sectionId): - self.delegate.onReorderChat(args.chatId, args.position, args.categoryId) + self.delegate.onReorderChat(args.chatId, args.position, args.categoryId, args.prevCategoryId, false) self.events.on(SIGNAL_COMMUNITY_CHANNEL_CATEGORY_CHANGED) do(e:Args): let args = CommunityChatOrderArgs(e) if (args.communityId == self.sectionId): - self.delegate.onCommunityCategoryChannelChanged(args.chatId, args.categoryId) + self.delegate.onReorderChat(args.chatId, args.position, args.categoryId, args.prevCategoryId, args.prevCategoryDeleted) self.events.on(SIGNAL_RELOAD_MESSAGES) do(e: Args): let args = ReloadMessagesArgs(e) diff --git a/src/app/modules/main/chat_section/io_interface.nim b/src/app/modules/main/chat_section/io_interface.nim index 418255cecc..e3e77c8015 100644 --- a/src/app/modules/main/chat_section/io_interface.nim +++ b/src/app/modules/main/chat_section/io_interface.nim @@ -124,7 +124,7 @@ method onGroupChatDetailsUpdated*(self: AccessInterface, chatId: string, newName method onCommunityChannelEdited*(self: AccessInterface, chat: ChatDto) {.base.} = raise newException(ValueError, "No implementation available") -method onReorderChat*(self: AccessInterface, chattId: string, position: int, newCategoryIdForChat: string) {.base.} = +method onReorderChat*(self: AccessInterface, chattId: string, position: int, newCategoryIdForChat: string, prevCategoryId: string, prevCategoryDeleted: bool) {.base.} = raise newException(ValueError, "No implementation available") method onReorderCategory*(self: AccessInterface, catId: string, position: int) {.base.} = @@ -327,4 +327,4 @@ method switchToChannel*(self: AccessInterface, channelName: string) = raise newException(ValueError, "No implementation available") method joinSpectatedCommunity*(self: AccessInterface) = - raise newException(ValueError, "No implementation available") \ No newline at end of file + raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/chat_section/model.nim b/src/app/modules/main/chat_section/model.nim index 290870ae63..87b00d250c 100644 --- a/src/app/modules/main/chat_section/model.nim +++ b/src/app/modules/main/chat_section/model.nim @@ -185,6 +185,12 @@ QtObject: idx.inc return -1 + proc hasEmptyChatItem*(self: Model, categoryId: string): bool = + for it in self.items: + if it.id == categoryId: + return true + return false + proc getCategoryNameForCategoryId*(self: Model, categoryId: string): string {.slot.} = let index = self.getItemIdxByCategory(categoryId) if index == -1: @@ -391,7 +397,7 @@ QtObject: continue item.categoryName = newName let modelIndex = self.createIndex(i, 0, nil) - self.dataChanged(modelIndex, modelIndex, @[ModelRole.CategoryName.int]) + self.dataChanged(modelIndex, modelIndex, @[ModelRole.CategoryId.int, ModelRole.CategoryName.int]) proc renameItemById*(self: Model, id, name: string) = let index = self.getItemIdxById(id) diff --git a/src/app/modules/main/chat_section/module.nim b/src/app/modules/main/chat_section/module.nim index 5cf53d5a45..88d96e8833 100644 --- a/src/app/modules/main/chat_section/module.nim +++ b/src/app/modules/main/chat_section/module.nim @@ -29,6 +29,8 @@ import ../../../../app_service/service/contacts/dto/contacts as contacts_dto export io_interface +const CATEGORY_ID_PREFIX = "cat-" + logScope: topics = "chat-section-module" @@ -130,7 +132,7 @@ proc removeSubmodule(self: Module, chatId: string) = proc addEmptyChatItemForCategory(self: Module, category: Category) = # Add an empty chat item that has the category info let emptyChatItem = chat_item.initItem( - id = "cat-" & category.id, + id = CATEGORY_ID_PREFIX & category.id, name = "", icon = "", color = "", @@ -599,6 +601,8 @@ method onCommunityCategoryDeleted*(self: Module, cat: Category, chats: seq[ChatD newCategoryName = "", newCategoryPosition = -1, ) + self.view.chatsModel().removeItemById(CATEGORY_ID_PREFIX & cat.id) + method setFirstChannelAsActive*(self: Module) = if(self.view.chatsModel().getCount() == 0): @@ -614,7 +618,7 @@ method onCommunityCategoryChannelChanged*(self: Module, channelId: string, newCa else: self.setActiveItem(channelId) -method onReorderChat*(self: Module, chatId: string, position: int, newCategoryIdForChat: string) = +method onReorderChat*(self: Module, chatId: string, position: int, newCategoryIdForChat: string, prevCategoryId: string, prevCategoryDeleted: bool) = var newCategoryName = "" var newCategoryPos = -1 if newCategoryIdForChat != "": @@ -622,6 +626,10 @@ method onReorderChat*(self: Module, chatId: string, position: int, newCategoryId newCategoryName = newCategory.name newCategoryPos = newCategory.position self.view.chatsModel().reorderChatById(chatId, position, newCategoryIdForChat, newCategoryName, newCategoryPos) + if prevCategoryId != "" and not prevCategoryDeleted: + if not self.view.chatsModel().hasEmptyChatItem(CATEGORY_ID_PREFIX & prevCategoryId): + let category = self.controller.getCommunityCategoryDetails(self.controller.getMySectionId(), prevCategoryId) + self.addEmptyChatItemForCategory(category) method onReorderCategory*(self: Module, catId: string, position: int) = self.view.chatsModel().reorderCategoryById(catId, position) diff --git a/src/app_service/service/community/service.nim b/src/app_service/service/community/service.nim index 0adf365fbe..0bb38241bb 100644 --- a/src/app_service/service/community/service.nim +++ b/src/app_service/service/community/service.nim @@ -52,6 +52,8 @@ type chatId*: string categoryId*: string position*: int + prevCategoryId*: string + prevCategoryDeleted*: bool CommunityCategoryOrderArgs* = ref object of Args communityId*: string @@ -371,10 +373,14 @@ QtObject: if community.settings.id == "": community.settings = prev_community.settings + var deletedCategories: seq[string] = @[] + # category was added if(community.categories.len > prev_community.categories.len): for category in community.categories: if findIndexById(category.id, prev_community.categories) == -1: + self.allCommunities[community.id].categories.add(category) + self.joinedCommunities[community.id].categories.add(category) let chats = self.getChatsInCategory(community, category.id) self.events.emit(SIGNAL_COMMUNITY_CATEGORY_CREATED, @@ -384,6 +390,7 @@ QtObject: elif(community.categories.len < prev_community.categories.len): for prv_category in prev_community.categories: if findIndexById(prv_category.id, community.categories) == -1: + deletedCategories.add(prv_category.id) self.events.emit(SIGNAL_COMMUNITY_CATEGORY_DELETED, CommunityCategoryArgs(communityId: community.id, category: Category(id: prv_category.id))) @@ -440,8 +447,16 @@ QtObject: # Handle channel was added/removed to/from category if chat.categoryId != prev_chat.categoryId: + + var prevCategoryDeleted = false + if chat.categoryId == "": + for catId in deletedCategories: + if prev_chat.categoryId == catId: + prevCategoryDeleted = true + break + self.events.emit(SIGNAL_COMMUNITY_CHANNEL_CATEGORY_CHANGED, CommunityChatOrderArgs(communityId: community.id, - chatId: chat.id, categoryId: chat.categoryId, position: chat.position)) + chatId: chat.id, categoryId: chat.categoryId, position: chat.position, prevCategoryId: prev_chat.categoryId, prevCategoryDeleted: prevCategoryDeleted)) # Handle name/description changes if chat.name != prev_chat.name or chat.description != prev_chat.description or chat.color != prev_chat.color: