浏览代码

implement basic search forward and backward behavior

cyberta 3 年之前
父节点
当前提交
cd2e7ff649
共有 1 个文件被更改,包括 31 次插入1 次删除
  1. 31 1
      deltachat-ios/Chat/ChatViewController.swift

+ 31 - 1
deltachat-ios/Chat/ChatViewController.swift

@@ -26,7 +26,11 @@ class ChatViewController: UITableViewController {
     private var ignoreInputBarChange = false
     private var isVisibleToUser: Bool = false
     private var keepKeyboard: Bool = false
+
+    // search related
     private var isSearchActive: Bool = false
+    private var searchMessageIds: [Int] = []
+    private var searchResultIndex: Int = 0
 
     lazy var isGroupChat: Bool = {
         return dcContext.getChat(chatId: chatId).isGroup
@@ -1780,11 +1784,24 @@ extension ChatViewController: ChatEditingDelegate {
 extension ChatViewController: ChatSearchDelegate {
     func onSearchPreviousPressed() {
         logger.debug("onSearch Previous Pressed")
+        let searchResult = searchMessageIds
+        if searchResultIndex == 0 && !searchResult.isEmpty {
+            searchResultIndex = searchResult.count - 1
+        } else {
+            searchResultIndex -= 1
+        }
+        scrollToMessage(msgId: searchResult[searchResultIndex])
     }
 
     func onSearchNextPressed() {
         logger.debug("onSearch Next Pressed")
-
+        let searchResult = searchMessageIds
+        if searchResultIndex == searchResult.count - 1 {
+            searchResultIndex = 0
+        } else {
+            searchResultIndex += 1
+        }
+        scrollToMessage(msgId: searchResult[searchResultIndex])
     }
 }
 
@@ -1792,6 +1809,19 @@ extension ChatViewController: ChatSearchDelegate {
 extension ChatViewController: UISearchBarDelegate {
     func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
         logger.debug("searchbar: \(searchText)")
+        DispatchQueue.global(qos: .userInteractive).async { [weak self] in
+            guard let self = self else { return }
+            let resultIds = self.dcContext.searchMessages(chatId: self.chatId, searchText: searchText)
+            DispatchQueue.main.async { [weak self] in
+                guard let self = self else { return }
+                self.searchMessageIds = resultIds
+                self.searchResultIndex = self.searchMessageIds.isEmpty ? 0 : self.searchMessageIds.count - 1
+                self.searchAccessoryBar.isEnabled = !resultIds.isEmpty
+                if let lastId = resultIds.last {
+                    self.scrollToMessage(msgId: lastId)
+                }
+            }
+        }
     }
 
     func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {