From 3c88b810bcfc868ac1f023b7e46c1e495cbc6a83 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 9 Nov 2022 17:41:38 +0800 Subject: [PATCH] SwiftExtension // Add String.charDescriptions: [String], etc. (#249) * SwiftExtension // Add String.charDescriptions: [String]. * SwiftExtension // Including certain SwiftUI extensions. --- .../SwiftExtension/SwiftExtension.swift | 15 +++- .../SwiftExtension/SwiftUIExtension.swift | 82 +++++++++++++++++++ .../Modules/UIModules/PrefUI/CtlPrefUI.swift | 70 +--------------- .../PrefUI/VwrPrefPaneCassette.swift | 1 + .../UIModules/PrefUI/VwrPrefPaneDevZone.swift | 1 + .../PrefUI/VwrPrefPaneDictionary.swift | 1 + .../PrefUI/VwrPrefPaneExperience.swift | 1 + .../UIModules/PrefUI/VwrPrefPaneGeneral.swift | 1 + .../PrefUI/VwrPrefPaneKeyboard.swift | 1 + 9 files changed, 102 insertions(+), 71 deletions(-) create mode 100644 Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftUIExtension.swift diff --git a/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftExtension.swift b/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftExtension.swift index 98843b46..de2f1fdf 100644 --- a/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftExtension.swift +++ b/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftExtension.swift @@ -136,11 +136,11 @@ public struct AppProperty { } } -// MARK: - String Extension +// MARK: - String RegReplace Extension +// Ref: https://stackoverflow.com/a/40993403/4162914 && https://stackoverflow.com/a/71291137/4162914 extension String { public mutating func regReplace(pattern: String, replaceWith: String = "") { - // Ref: https://stackoverflow.com/a/40993403/4162914 && https://stackoverflow.com/a/71291137/4162914 do { let regex = try NSRegularExpression( pattern: pattern, options: [.caseInsensitive, .anchorsMatchLines] @@ -152,3 +152,14 @@ extension String { } catch { return } } } + +// MARK: - String CharName Extension + +extension String { + public var charDescriptions: [String] { + flatMap(\.unicodeScalars).compactMap { + let theName: String = $0.properties.name ?? "" + return String(format: "U+%02X %@", $0.value, theName) + } + } +} diff --git a/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftUIExtension.swift b/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftUIExtension.swift new file mode 100644 index 00000000..fa3ab1fc --- /dev/null +++ b/Packages/vChewing_SwiftExtension/Sources/SwiftExtension/SwiftUIExtension.swift @@ -0,0 +1,82 @@ +// (c) 2021 and onwards The vChewing Project (MIT-NTL License). +// ==================== +// This code is released under the MIT license (SPDX-License-Identifier: MIT) +// ... with NTL restriction stating that: +// No trademark license is granted to use the trade names, trademarks, service +// marks, or product names of Contributor, except as required to fulfill notice +// requirements defined in MIT License. + +import SwiftUI + +// MARK: - Add "onChange" support. + +// Ref: https://mjeld.com/swiftui-macos-10-15-toggle-onchange/ + +@available(macOS 10.15, *) +extension Binding { + public func onChange(_ action: @escaping () -> Void) -> Binding { + Binding( + get: { + wrappedValue + }, + set: { newValue in + wrappedValue = newValue + action() + } + ) + } +} + +// MARK: - Add ".tooltip" support. + +// Ref: https://stackoverflow.com/a/63217861 + +@available(macOS 10.15, *) +@available(macOS, obsoleted: 11) +struct Tooltip: NSViewRepresentable { + let tooltip: String + + func makeNSView(context _: NSViewRepresentableContext) -> NSView { + let view = NSView() + view.toolTip = tooltip + + return view + } + + func updateNSView(_: NSView, context _: NSViewRepresentableContext) {} +} + +@available(macOS 10.15, *) +@available(macOS, obsoleted: 11) +extension View { + public func help(_ tooltip: String) -> some View { + overlay(Tooltip(tooltip: tooltip)) + } +} + +// MARK: - Windows Aero in Swift UI + +// Ref: https://stackoverflow.com/questions/62461957 + +@available(macOS 10.15, *) +public struct VisualEffectView: NSViewRepresentable { + let material: NSVisualEffectView.Material + let blendingMode: NSVisualEffectView.BlendingMode + public init(material: NSVisualEffectView.Material, blendingMode: NSVisualEffectView.BlendingMode) { + self.material = material + self.blendingMode = blendingMode + } + + public func makeNSView(context _: Context) -> NSVisualEffectView { + let visualEffectView = NSVisualEffectView() + visualEffectView.material = material + visualEffectView.blendingMode = blendingMode + visualEffectView.state = NSVisualEffectView.State.active + return visualEffectView + } + + public func updateNSView(_ visualEffectView: NSVisualEffectView, context _: Context) { + visualEffectView.material = material + visualEffectView.blendingMode = blendingMode + } +} diff --git a/Source/Modules/UIModules/PrefUI/CtlPrefUI.swift b/Source/Modules/UIModules/PrefUI/CtlPrefUI.swift index 0195563b..54373048 100644 --- a/Source/Modules/UIModules/PrefUI/CtlPrefUI.swift +++ b/Source/Modules/UIModules/PrefUI/CtlPrefUI.swift @@ -7,6 +7,7 @@ // requirements defined in MIT License. import SSPreferences +import SwiftExtension import SwiftUI extension NSImage { @@ -127,72 +128,3 @@ class CtlPrefUI { ) static let shared = CtlPrefUI() } - -// MARK: - Add "onChange" support. - -// Ref: https://mjeld.com/swiftui-macos-10-15-toggle-onchange/ - -@available(macOS 10.15, *) -extension Binding { - public func onChange(_ action: @escaping () -> Void) -> Binding { - Binding( - get: { - wrappedValue - }, - set: { newValue in - wrappedValue = newValue - action() - } - ) - } -} - -// MARK: - Add ".tooltip" support. - -// Ref: https://stackoverflow.com/a/63217861 - -@available(macOS 10.15, *) -@available(macOS, obsoleted: 11) -struct Tooltip: NSViewRepresentable { - let tooltip: String - - func makeNSView(context _: NSViewRepresentableContext) -> NSView { - let view = NSView() - view.toolTip = tooltip - - return view - } - - func updateNSView(_: NSView, context _: NSViewRepresentableContext) {} -} - -@available(macOS 10.15, *) -@available(macOS, obsoleted: 11) -extension View { - public func help(_ tooltip: String) -> some View { - overlay(Tooltip(tooltip: tooltip)) - } -} - -// MARK: - Windows Aero in Swift UI - -// Ref: https://stackoverflow.com/questions/62461957 - -@available(macOS 10.15, *) -struct VisualEffectView: NSViewRepresentable { - let material: NSVisualEffectView.Material - let blendingMode: NSVisualEffectView.BlendingMode - - func makeNSView(context _: Context) -> NSVisualEffectView { - let visualEffectView = NSVisualEffectView() - visualEffectView.material = material - visualEffectView.blendingMode = blendingMode - visualEffectView.state = NSVisualEffectView.State.active - return visualEffectView - } - - func updateNSView(_ visualEffectView: NSVisualEffectView, context _: Context) { - visualEffectView.material = material - visualEffectView.blendingMode = blendingMode - } -} diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneCassette.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneCassette.swift index 94f59d8b..10395369 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneCassette.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneCassette.swift @@ -9,6 +9,7 @@ import BookmarkManager import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *) diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneDevZone.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneDevZone.swift index 61d48cfc..db05c9d3 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneDevZone.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneDevZone.swift @@ -8,6 +8,7 @@ import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *) diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneDictionary.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneDictionary.swift index a0a2aa7d..642e15d3 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneDictionary.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneDictionary.swift @@ -9,6 +9,7 @@ import BookmarkManager import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *) diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneExperience.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneExperience.swift index c66ebdf9..be8ad55c 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneExperience.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneExperience.swift @@ -8,6 +8,7 @@ import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *) diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneGeneral.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneGeneral.swift index 70d40f2d..640c3c56 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneGeneral.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneGeneral.swift @@ -8,6 +8,7 @@ import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *) diff --git a/Source/Modules/UIModules/PrefUI/VwrPrefPaneKeyboard.swift b/Source/Modules/UIModules/PrefUI/VwrPrefPaneKeyboard.swift index 4e4d6a1d..6f064da8 100644 --- a/Source/Modules/UIModules/PrefUI/VwrPrefPaneKeyboard.swift +++ b/Source/Modules/UIModules/PrefUI/VwrPrefPaneKeyboard.swift @@ -9,6 +9,7 @@ import IMKUtils import SSPreferences import Shared +import SwiftExtension import SwiftUI @available(macOS 10.15, *)