From 0d3f2937a339260e0c6819fd9a337ef39edb77d3 Mon Sep 17 00:00:00 2001 From: kamaal111 Date: Sun, 3 Oct 2021 12:29:25 +0200 Subject: [PATCH 1/5] Adding a deletable button --- Sources/SalmonUI/Views/KDeletableView.swift | 79 +++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Sources/SalmonUI/Views/KDeletableView.swift diff --git a/Sources/SalmonUI/Views/KDeletableView.swift b/Sources/SalmonUI/Views/KDeletableView.swift new file mode 100644 index 0000000..ea60d0e --- /dev/null +++ b/Sources/SalmonUI/Views/KDeletableView.swift @@ -0,0 +1,79 @@ +// +// KDeletableView.swift +// +// +// Created by Kamaal M Farah on 03/10/2021. +// + +import SwiftUI + +public struct KDeletableView: View { + @Binding var isDeleting: Bool + + public let enabled: Bool + public let deleteText: String + public let onDelete: () -> Void + public let content: () -> Content + + private let deleteButtonSize: CGFloat = 68 + + public init(isDeleting: Binding, + enabled: Bool, + deleteText: String = "Delete", + onDelete: @escaping () -> Void, + content: @escaping () -> Content) { + self._isDeleting = isDeleting + self.enabled = enabled + self.deleteText = deleteText + self.onDelete = onDelete + self.content = content + } + + public var body: some View { + HStack { + if enabled && !isDeleting { + Button(action: { withAnimation { isDeleting = true } }) { + Image(systemName: "minus.circle.fill") + .foregroundColor(.red) + .padding(.leading, 20) + } + .transition(.move(edge: .leading)) + } + content() + if enabled && isDeleting { + Spacer() + Button(action: _onDelete) { + ZStack { + Color.red + Text(deleteText) + .foregroundColor(Color(.systemBackground)) + } + .frame(minWidth: deleteButtonSize, + maxWidth: deleteButtonSize, + minHeight: deleteButtonSize, + maxHeight: deleteButtonSize) + } + .transition(.move(edge: .trailing)) + } + } + .ktakeWidthEagerly(alignment: .leading) + } + + private func _onDelete() { + onDelete() + withAnimation { isDeleting = false } + } +} + +public extension View { + func kDeletableView(isDeleting: Binding, enabled: Bool, onDelete: @escaping () -> Void) -> some View { + KDeletableView(isDeleting: isDeleting, enabled: enabled, onDelete: onDelete, content: { self }) + } +} + +struct KDeletableView_Previews: PreviewProvider { + static var previews: some View { + Text("Yes delete me") + .kDeletableView(isDeleting: .constant(true), enabled: true, onDelete: { }) + } +} From 067cb8418fab4dad0f2b2e54889fda3a7200f92d Mon Sep 17 00:00:00 2001 From: kamaal111 Date: Sun, 3 Oct 2021 12:45:29 +0200 Subject: [PATCH 2/5] Making delete button width dynamic --- .../ViewModifiers/KBindToFrameSize.swift | 32 +++++++++++++++++++ Sources/SalmonUI/Views/KDeletableView.swift | 19 +++++++---- 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift diff --git a/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift b/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift new file mode 100644 index 0000000..7351815 --- /dev/null +++ b/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift @@ -0,0 +1,32 @@ +// +// KBindToFrameSize.swift +// +// +// Created by Kamaal M Farah on 03/10/2021. +// + +import SwiftUI + +extension View { + func kBindToFrameSize(_ size: Binding) -> some View { + self.modifier(KBindToFrameSize(size: size)) + } +} + +private struct KBindToFrameSize: ViewModifier { + @Binding var size: CGSize + + func body(content: Content) -> some View { + content.overlay(GeometryReader(content: overlay(for:))) + } + + func overlay(for geometry: GeometryProxy) -> some View { + let size = geometry.size + if self.size.width != size.width || self.size.height != size.height { + DispatchQueue.main.async { + self.size = geometry.size + } + } + return Text("") + } +} diff --git a/Sources/SalmonUI/Views/KDeletableView.swift b/Sources/SalmonUI/Views/KDeletableView.swift index ea60d0e..c09da23 100644 --- a/Sources/SalmonUI/Views/KDeletableView.swift +++ b/Sources/SalmonUI/Views/KDeletableView.swift @@ -8,14 +8,16 @@ import SwiftUI public struct KDeletableView: View { - @Binding var isDeleting: Bool + @State private var textSize = CGSize(width: 60, height: 60) + + @Binding public var isDeleting: Bool public let enabled: Bool public let deleteText: String public let onDelete: () -> Void public let content: () -> Content - private let deleteButtonSize: CGFloat = 68 + private let deleteButtonHeight: CGFloat = 68 public init(isDeleting: Binding, enabled: Bool, @@ -47,11 +49,12 @@ public struct KDeletableView: View { Color.red Text(deleteText) .foregroundColor(Color(.systemBackground)) + .kBindToFrameSize($textSize) } - .frame(minWidth: deleteButtonSize, - maxWidth: deleteButtonSize, - minHeight: deleteButtonSize, - maxHeight: deleteButtonSize) + .frame(minWidth: deleteButtonWidth, + maxWidth: deleteButtonWidth, + minHeight: deleteButtonHeight, + maxHeight: deleteButtonHeight) } .transition(.move(edge: .trailing)) } @@ -59,6 +62,10 @@ public struct KDeletableView: View { .ktakeWidthEagerly(alignment: .leading) } + private var deleteButtonWidth: CGFloat { + textSize.width + 16 + } + private func _onDelete() { onDelete() withAnimation { isDeleting = false } From 24d42a59c53721b87b4c17b7e04c9701611b2b08 Mon Sep 17 00:00:00 2001 From: kamaal111 Date: Sun, 3 Oct 2021 12:46:42 +0200 Subject: [PATCH 3/5] Making bind to size public --- Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift b/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift index 7351815..069efb5 100644 --- a/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift +++ b/Sources/SalmonUI/ViewModifiers/KBindToFrameSize.swift @@ -7,7 +7,7 @@ import SwiftUI -extension View { +public extension View { func kBindToFrameSize(_ size: Binding) -> some View { self.modifier(KBindToFrameSize(size: size)) } From e12b61bffbeb30534e8da7f728080acd6dedbfe1 Mon Sep 17 00:00:00 2001 From: kamaal111 Date: Sun, 3 Oct 2021 13:01:29 +0200 Subject: [PATCH 4/5] Working on a deletable for each view --- .../SalmonUI/Views/KDeletableForEach.swift | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Sources/SalmonUI/Views/KDeletableForEach.swift diff --git a/Sources/SalmonUI/Views/KDeletableForEach.swift b/Sources/SalmonUI/Views/KDeletableForEach.swift new file mode 100644 index 0000000..316e09c --- /dev/null +++ b/Sources/SalmonUI/Views/KDeletableForEach.swift @@ -0,0 +1,35 @@ +// +// KDeletableForEach.swift +// +// +// Created by Kamaal M Farah on 03/10/2021. +// + +import SwiftUI + +struct KDeletableForEach: View { + let data: Data + let id: KeyPath + let isEditing: Bool + let deleteText: String + let onDelete: (Data.Element) -> Void + let content: (Data.Element) -> Content + + var body: some View { + ForEach(data, id: id) { element in + KDeletableView( + isDeleting: .constant(false), + enabled: isEditing, + deleteText: deleteText, + onDelete: { onDelete(element) }) { + content(element) + } + } + } +} + +//struct KDeletableForEach_Previews: PreviewProvider { +// static var previews: some View { +// KDeletableForEach() +// } +//} From bac1e7210a317e56b8c72ed331b14d2746154181 Mon Sep 17 00:00:00 2001 From: kamaal111 Date: Sun, 3 Oct 2021 13:11:39 +0200 Subject: [PATCH 5/5] Version bump --- SalmonUI.podspec | 2 +- SalmonUI.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SalmonUI.podspec b/SalmonUI.podspec index d24bc11..de873c4 100644 --- a/SalmonUI.podspec +++ b/SalmonUI.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |spec| spec.name = "SalmonUI" - spec.version = "4.2.0" + spec.version = "4.3.0" spec.summary = "Awesome SwiftUI views" spec.description = <<-DESC diff --git a/SalmonUI.xcodeproj/project.pbxproj b/SalmonUI.xcodeproj/project.pbxproj index c415e57..c0af818 100644 --- a/SalmonUI.xcodeproj/project.pbxproj +++ b/SalmonUI.xcodeproj/project.pbxproj @@ -477,7 +477,7 @@ buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -490,7 +490,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 4.2.0; + MARKETING_VERSION = 4.3.0; PRODUCT_BUNDLE_IDENTIFIER = io.kamaal.SalmonUI; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -506,7 +506,7 @@ buildSettings = { CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -519,7 +519,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 4.2.0; + MARKETING_VERSION = 4.3.0; PRODUCT_BUNDLE_IDENTIFIER = io.kamaal.SalmonUI; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = "";