From c04684d5e462698e8f79acf00b9f43fd69e9e0a2 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 27 Sep 2022 08:34:52 +0800 Subject: [PATCH] NotifierUI // Deduplicate messages when necessary. --- .../Sources/NotifierUI/NotifierUI.swift | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Packages/vChewing_NotifierUI/Sources/NotifierUI/NotifierUI.swift b/Packages/vChewing_NotifierUI/Sources/NotifierUI/NotifierUI.swift index 61869cec..cbf7c9f5 100644 --- a/Packages/vChewing_NotifierUI/Sources/NotifierUI/NotifierUI.swift +++ b/Packages/vChewing_NotifierUI/Sources/NotifierUI/NotifierUI.swift @@ -21,17 +21,33 @@ public class Notifier: NSWindowController { } } + private var currentMessage: String // 承載該副本在初期化時被傳入的訊息內容。 + private var isNew = true // 新通知標記。 + // MARK: - Private Declarations private static var instanceStack: [Notifier] = [] private let blankValue = "" @discardableResult private init(_ message: String) { + currentMessage = message let rawMessage = message.replacingOccurrences(of: "\n", with: "") - guard let screenRect = NSScreen.main?.visibleFrame, !rawMessage.isEmpty else { + let isDuplicated: Bool = { + if let firstInstanceExisted = Self.instanceStack.first { + return message == firstInstanceExisted.currentMessage && firstInstanceExisted.isNew + } + return false + }() + guard let screenRect = NSScreen.main?.visibleFrame, !rawMessage.isEmpty, !isDuplicated else { super.init(window: nil) return } + // 正式進入處理環節。 + defer { // 先讓新通知標記自此開始過 0.3 秒自動變為 false。 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + self.isNew = false + } + } let kLargeFontSize: Double = 17 let kSmallFontSize: Double = 15 let messageArray = message.components(separatedBy: "\n")