diff options
| author | Dustin Mierau <dustin@mierau.me> | 2023-12-06 22:52:09 -0800 |
|---|---|---|
| committer | Dustin Mierau <dustin@mierau.me> | 2023-12-06 22:52:09 -0800 |
| commit | e3392bb948ad53889ad334140952f2acf614668e (patch) | |
| tree | 74937a9202b3bb71f28ef9d8e0b3560bdd195b49 /Hotline/Utility | |
| parent | 195af38221d1a4358455ba8501b87e4098da101b (diff) | |
Some work on news. More UI tweaks across the board.
Diffstat (limited to 'Hotline/Utility')
| -rw-r--r-- | Hotline/Utility/FoundationExtensions.swift (renamed from Hotline/Utility/DataExtensions.swift) | 10 | ||||
| -rw-r--r-- | Hotline/Utility/ObservableScrollView.swift | 38 | ||||
| -rw-r--r-- | Hotline/Utility/SwiftUIExtensions.swift | 7 |
3 files changed, 55 insertions, 0 deletions
diff --git a/Hotline/Utility/DataExtensions.swift b/Hotline/Utility/FoundationExtensions.swift index aefd204..c6ca251 100644 --- a/Hotline/Utility/DataExtensions.swift +++ b/Hotline/Utility/FoundationExtensions.swift @@ -62,6 +62,16 @@ extension Data { return str } + func readPString(at offset: Int) -> (String?, Int) { + let len = Int(self.readUInt8(at: offset)!) + return (self.readString(at: offset+1, length: len), 1 + len) + } + + func readLongPString(at offset: Int) -> (String?, Int) { + let len = Int(self.readUInt16(at: offset)!) + return (self.readString(at: offset+2, length: len), 2 + len) + } + mutating func appendUInt8(_ value: UInt8, endianness: Endianness = .big) { var val = endianness == .big ? value.bigEndian : value.littleEndian diff --git a/Hotline/Utility/ObservableScrollView.swift b/Hotline/Utility/ObservableScrollView.swift new file mode 100644 index 0000000..a6f46cc --- /dev/null +++ b/Hotline/Utility/ObservableScrollView.swift @@ -0,0 +1,38 @@ +import SwiftUI + +struct ScrollViewOffsetPreferenceKey: PreferenceKey { + typealias Value = CGFloat + static var defaultValue = CGFloat.zero + static func reduce(value: inout Value, nextValue: () -> Value) { + value += nextValue() + } +} + +struct ObservableScrollView<Content>: View where Content : View { + @Namespace var scrollSpace + @Binding var scrollOffset: CGFloat + let content: () -> Content + + init(scrollOffset: Binding<CGFloat>, + @ViewBuilder content: @escaping () -> Content) { + _scrollOffset = scrollOffset + self.content = content + } + + var body: some View { + ScrollView { + content() + .background(GeometryReader { geo in + let offset = -geo.frame(in: .named(scrollSpace)).minY + Color.clear + .preference(key: ScrollViewOffsetPreferenceKey.self, + value: offset) + }) + + } + .coordinateSpace(name: scrollSpace) + .onPreferenceChange(ScrollViewOffsetPreferenceKey.self) { value in + scrollOffset = value + } + } +} diff --git a/Hotline/Utility/SwiftUIExtensions.swift b/Hotline/Utility/SwiftUIExtensions.swift new file mode 100644 index 0000000..3b850e0 --- /dev/null +++ b/Hotline/Utility/SwiftUIExtensions.swift @@ -0,0 +1,7 @@ +import SwiftUI + +extension Color { + init(hex: Int, opacity: Double = 1.0) { + self.init(red: Double((hex >> 16) & 0xFF) / 255.0, green: Double((hex >> 8) & 0xFF) / 255.0, blue: Double(hex & 0xFF) / 255.0, opacity: opacity) + } +} |