commit 055b524f0a44599d6e7cb28f9ebf60e3f76fb9f0
parent 186b6438d1b1557d8b8a2edde3ea7d343835a617
Author: Marc Stibane <marc@taler.net>
Date: Fri, 8 Nov 2024 13:39:21 +0100
NavLink
Diffstat:
2 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj
@@ -147,6 +147,8 @@
4E40E0BE29F25ABB00B85369 /* SendAmountV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E40E0BD29F25ABB00B85369 /* SendAmountV.swift */; };
4E448AB72C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */; };
4E448AB82C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */; };
+ 4E4A3F0B2CD4B6CD00CA6A90 /* View+NavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4A3F0A2CD4B6CD00CA6A90 /* View+NavLink.swift */; };
+ 4E4A3F0C2CD4B6CD00CA6A90 /* View+NavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4A3F0A2CD4B6CD00CA6A90 /* View+NavLink.swift */; };
4E4F60A82C3BBF9F003BB669 /* View+Condition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */; };
4E4F60A92C3BBF9F003BB669 /* View+Condition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */; };
4E50B3502A1BEE8000F9F01C /* ManualWithdraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E50B34F2A1BEE8000F9F01C /* ManualWithdraw.swift */; };
@@ -385,6 +387,7 @@
4E3EAEA72AA70157009F1BE8 /* Binding+onChange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Binding+onChange.swift"; sourceTree = "<group>"; };
4E40E0BD29F25ABB00B85369 /* SendAmountV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendAmountV.swift; sourceTree = "<group>"; };
4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalancesPendingRowV.swift; sourceTree = "<group>"; };
+ 4E4A3F0A2CD4B6CD00CA6A90 /* View+NavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+NavLink.swift"; sourceTree = "<group>"; };
4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+Condition.swift"; sourceTree = "<group>"; };
4E50B34F2A1BEE8000F9F01C /* ManualWithdraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManualWithdraw.swift; sourceTree = "<group>"; };
4E53A33629F50B7B00830EC2 /* CurrencyField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencyField.swift; sourceTree = "<group>"; };
@@ -866,6 +869,7 @@
4EFA395F2AA7946B00742548 /* ToSButtonView.swift */,
4EBA82AA2A3EB2CA00E5F39A /* TransactionButton.swift */,
4E983C2B2ADC416800FA9CC5 /* View+fitsSideBySide.swift */,
+ 4E4A3F0A2CD4B6CD00CA6A90 /* View+NavLink.swift */,
4EEBEFAF2C8982180020D340 /* View+innerSize.swift */,
4E847B7E2C9030E0003A164E /* TabBarView.swift */,
4E847B812C9065FD003A164E /* ScopePicker.swift */,
@@ -1226,6 +1230,7 @@
4E3327BA2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */,
4ED80E8E2B8F6212008BD576 /* QuickDataTask.swift in Sources */,
4E3EAE2C2A990778009F1BE8 /* ManualWithdraw.swift in Sources */,
+ 4E4A3F0B2CD4B6CD00CA6A90 /* View+NavLink.swift in Sources */,
4E448AB72C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */,
4E3EAE2D2A990778009F1BE8 /* Model+Exchange.swift in Sources */,
4EBC0F012B7B3CD600C0CB19 /* DepositIbanV.swift in Sources */,
@@ -1360,6 +1365,7 @@
4E3327BB2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */,
4ED80E8F2B8F6212008BD576 /* QuickDataTask.swift in Sources */,
4E50B3502A1BEE8000F9F01C /* ManualWithdraw.swift in Sources */,
+ 4E4A3F0C2CD4B6CD00CA6A90 /* View+NavLink.swift in Sources */,
4E448AB82C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */,
4E3B4BC92A42BC4800CC88B8 /* Model+Exchange.swift in Sources */,
4EBC0F022B7B3CD600C0CB19 /* DepositIbanV.swift in Sources */,
diff --git a/TalerWallet1/Views/HelperViews/View+NavLink.swift b/TalerWallet1/Views/HelperViews/View+NavLink.swift
@@ -0,0 +1,59 @@
+/*
+ * This file is part of GNU Taler, ©2022-24 Taler Systems S.A.
+ * See LICENSE.md
+ */
+/**
+ * @author Marc Stibane
+ */
+
+import SwiftUI
+
+/// invisible NavigationLink triggered by a Bool or Int?
+/// call either like this
+/// .background( NavLink($buttonSelected) { destination } )
+/// or
+/// let actions = Group {
+/// NavLink(1, $actionSelected) { dest1 }
+/// NavLink(2, $actionSelected) { dest2 }
+/// }
+/// and then
+/// .background(actions)
+
+
+struct NavLink <Content : View> : View {
+ let tag: Int
+ @Binding var selection: Int?
+ @Binding var isActive: Bool
+ let content: Content
+
+ init(_ tag: Int,
+ _ selection: Binding<Int?>,
+ _ isActive: Binding<Bool> = .constant(false),
+ @ViewBuilder contentBuilder: () -> Content
+ ) {
+ self.tag = tag
+ self._selection = selection
+ self.content = contentBuilder()
+ self._isActive = isActive
+ }
+
+ init(_ isActive: Binding<Bool>,
+ _ selection: Binding<Int?> = .constant(nil),
+ @ViewBuilder contentBuilder: () -> Content
+ ) {
+ self.tag = 0
+ self._selection = selection
+ self.content = contentBuilder()
+ self._isActive = isActive
+ }
+
+ var body: some View {
+ if tag != 0 {
+ NavigationLink(destination: content, tag: tag, selection: $selection)
+ { EmptyView() }.frame(width: 0).opacity(0).hidden()
+ } else {
+ NavigationLink(destination: content, isActive: $isActive)
+ { EmptyView() }.frame(width: 0).opacity(0).hidden()
+ }
+ }
+}