aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Utility
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2023-12-06 22:52:09 -0800
committerDustin Mierau <dustin@mierau.me>2023-12-06 22:52:09 -0800
commite3392bb948ad53889ad334140952f2acf614668e (patch)
tree74937a9202b3bb71f28ef9d8e0b3560bdd195b49 /Hotline/Utility
parent195af38221d1a4358455ba8501b87e4098da101b (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.swift38
-rw-r--r--Hotline/Utility/SwiftUIExtensions.swift7
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)
+ }
+}