mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
Various improvements
This commit is contained in:
@@ -37,6 +37,9 @@ public final class TextFieldComponent: Component {
|
||||
public var currentEmojiSuggestion: EmojiSuggestion?
|
||||
public var dismissedEmojiSuggestionPosition: EmojiSuggestion.Position?
|
||||
|
||||
public var currentEmojiSearch: EmojiSearch?
|
||||
public var dismissedEmojiSearchPosition: EmojiSearch.Position?
|
||||
|
||||
public init() {
|
||||
}
|
||||
}
|
||||
@@ -60,6 +63,25 @@ public final class TextFieldComponent: Component {
|
||||
}
|
||||
}
|
||||
|
||||
public final class EmojiSearch {
|
||||
public struct Position: Equatable {
|
||||
public var range: NSRange
|
||||
public var value: String
|
||||
}
|
||||
|
||||
public var localPosition: CGPoint
|
||||
public var position: Position
|
||||
public var disposable: Disposable?
|
||||
public var value: Any?
|
||||
|
||||
init(localPosition: CGPoint, position: Position) {
|
||||
self.localPosition = localPosition
|
||||
self.position = position
|
||||
self.disposable = nil
|
||||
self.value = nil
|
||||
}
|
||||
}
|
||||
|
||||
public enum PasteData {
|
||||
case sticker(image: UIImage, isMemoji: Bool)
|
||||
case images([UIImage])
|
||||
@@ -1248,6 +1270,51 @@ public final class TextFieldComponent: Component {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if let index = selectedSubstring.string.range(of: ":", options: .backwards) {
|
||||
let queryRange = index.upperBound ..< selectedSubstring.string.endIndex
|
||||
let query = String(selectedSubstring.string[queryRange])
|
||||
if !query.isEmpty && !query.contains(where: { c in
|
||||
for s in c.unicodeScalars {
|
||||
if CharacterSet.whitespacesAndNewlines.contains(s) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}) {
|
||||
let beginning = self.textView.beginningOfDocument
|
||||
let characterRange = NSRange(queryRange, in: selectedSubstring.string)
|
||||
|
||||
let start = self.textView.position(from: beginning, offset: characterRange.location)
|
||||
let end = self.textView.position(from: beginning, offset: characterRange.location + characterRange.length)
|
||||
|
||||
if let start = start, let end = end, let textRange = self.textView.textRange(from: start, to: end) {
|
||||
let selectionRects = self.textView.selectionRects(for: textRange)
|
||||
let emojiSearchPosition = EmojiSearch.Position(range: characterRange, value: query)
|
||||
|
||||
hasTracking = true
|
||||
|
||||
if let trackingRect = selectionRects.first?.rect {
|
||||
let trackingPosition = CGPoint(x: trackingRect.midX, y: trackingRect.minY)
|
||||
if component.externalState.dismissedEmojiSearchPosition == emojiSearchPosition {
|
||||
} else {
|
||||
hasTrackingView = true
|
||||
|
||||
let emojiSearch: EmojiSearch
|
||||
if let current = component.externalState.currentEmojiSearch, current.position.value == emojiSearchPosition.value {
|
||||
emojiSearch = current
|
||||
} else {
|
||||
emojiSearch = EmojiSearch(localPosition: trackingPosition, position: emojiSearchPosition)
|
||||
component.externalState.currentEmojiSearch = emojiSearch
|
||||
}
|
||||
emojiSearch.localPosition = trackingPosition
|
||||
emojiSearch.position = emojiSearchPosition
|
||||
component.externalState.dismissedEmojiSearchPosition = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if !hasTracking {
|
||||
|
||||
Reference in New Issue
Block a user