summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Stibane <marc@taler.net>2023-11-19 13:32:01 +0100
committerMarc Stibane <marc@taler.net>2023-11-19 13:35:34 +0100
commita1a5c84611d67dc4818944c223106cb1c76a0e2e (patch)
tree733ec6824c1c4055435e873d4075564a1532418d
parent0df6b05f1b40650f12517d11636e669cc439d530 (diff)
downloadtaler-ios-a1a5c84611d67dc4818944c223106cb1c76a0e2e.tar.gz
taler-ios-a1a5c84611d67dc4818944c223106cb1c76a0e2e.tar.bz2
taler-ios-a1a5c84611d67dc4818944c223106cb1c76a0e2e.zip
ViewThatFits instead of own computations, iconBadge
-rw-r--r--TalerWallet1/Views/Balances/PendingRowView.swift143
-rw-r--r--TalerWallet1/Views/Transactions/TransactionRowView.swift34
2 files changed, 68 insertions, 109 deletions
diff --git a/TalerWallet1/Views/Balances/PendingRowView.swift b/TalerWallet1/Views/Balances/PendingRowView.swift
index 903740e..4b3ce6e 100644
--- a/TalerWallet1/Views/Balances/PendingRowView.swift
+++ b/TalerWallet1/Views/Balances/PendingRowView.swift
@@ -5,35 +5,26 @@
import SwiftUI
import taler_swift
-struct PendingRowContentV: View {
- let titles: (String, String?)
- let isHorizontal: Bool
+/// This view shows a pending transaction row in a currency section
+struct PendingRowView: View {
+ let amount: Amount
let incoming: Bool
let shouldConfirm: Bool
let needsKYC: Bool
- public static func width(titles: (String, String?), isHorizontal: Bool,
- sizeCategory: ContentSizeCategory) -> CGFloat {
- let imageFont = TalerFont.uiFont(.largeTitle)
- let uiFont = TalerFont.uiFont(.body)
+ @Environment(\.sizeCategory) var sizeCategory
+ @EnvironmentObject private var controller: Controller
+ @AppStorage("iconOnly") var iconOnly: Bool = false
- let image = "++"
- let imageWidth = image.widthOfString(usingUIFont: imageFont, sizeCategory) + 8.0 // spacing: 8
- let (title1, title2) = titles
- let title1Width = title1.widthOfString(usingUIFont: uiFont, sizeCategory)
- var title2Width = 0.0
- var totalWidth = title1Width
- if let title2 {
- title2Width = title2.widthOfString(usingUIFont: uiFont, sizeCategory)
- let totalStr = title1 + " " + title2
- totalWidth = totalStr.widthOfString(usingUIFont: uiFont, sizeCategory)
- }
+ let inTitle0 = String(localized: "TitleIncoming_Short", defaultValue: "Incoming",
+ comment: "Abbreviation of `Pending incoming´ in Balances")
+ let inTitle1 = String(localized: "TitleIncoming_Full", defaultValue: "Pending\tincoming",
+ comment: "`Pending incoming´ in Balances - set exactly 1 \t for line break")
-// let logStr = String(format: "image: %.2f title: %.2f total: %.2f", imageWidth, max(title1Width, title2Width), totalWidth)
-// print(logStr)
- return imageWidth + (isHorizontal ? totalWidth
- : max(title1Width, title2Width))
- }
+ let outTitle0 = String(localized: "TitleOutgoing_Short", defaultValue: "Outgoing",
+ comment: "Abbreviation of `Pending outgoing´ in Balances")
+ let outTitle1 = String(localized: "TitleOutgoing_Full", defaultValue: "Pending\toutgoing",
+ comment: "`Pending outgoing´ in Balances - set exactly 1 \t for line break")
var body: some View {
let pendingColor = WalletColors().pendingColor(incoming)
@@ -41,87 +32,45 @@ struct PendingRowContentV: View {
: "minus.diamond" //
let badgeName = needsKYC ? "star.fill"
: "circle.fill"
- HStack(spacing: 8) {
- HStack(alignment: .top, spacing: -8) { // TODO: adapt spacing to dynamic fontsize
- Image(systemName: imageName)
- .foregroundColor(pendingColor)
- .accessibilityFont(.largeTitle)
- .accessibility(hidden: true)
- Image(systemName: badgeName)
- .accessibilityFont(.caption)
- .foregroundColor((needsKYC || shouldConfirm) ? .red : .clear)
- }
- let pendingAccTitles = accessTitles(titles, isHorizontal)
- Text(pendingAccTitles.0)
- .accessibilityLabel(Text(pendingAccTitles.1))
- .lineLimit(4)
- .accessibilityFont(.body)
- }
- .accessibilityElement(children: .combine)
- .accessibilityValue(needsKYC ? ". Needs K Y C" :
- shouldConfirm ? ". Needs bank confirmation" : EMPTYSTRING)
- .accessibilityHint("Will go to pending transaction list.")
-
- }
-}
-
-/// This view shows a pending transaction row in a currency section
-struct PendingRowView: View {
- let amount: Amount
- let incoming: Bool
- let shouldConfirm: Bool
- let needsKYC: Bool
+ let iconBadge = IconBadge(imageName: imageName, foreColor: pendingColor, shouldConfirm: shouldConfirm, needsKYC: needsKYC)
- @Environment(\.sizeCategory) var sizeCategory
- @EnvironmentObject private var controller: Controller
- @AppStorage("iconOnly") var iconOnly: Bool = false
+ let inTitle = iconOnly ? inTitle0 : inTitle1
+ let outTitle = iconOnly ? outTitle0 : outTitle1
+ let pendingTitle = incoming ? inTitle : outTitle
- let inTitle0 = String(localized: "TitleIncoming_Short", defaultValue: "Incoming",
- comment: "Abbreviation of `Pending incoming´ in Balances")
- let inTitle1 = String(localized: "TitleIncoming_Top", defaultValue: "Pending",
- comment: "Top (first half) of line `Pending incoming´ in Balances")
- let inTitle2 = String(localized: "TitleIncoming_Bottom", defaultValue: "incoming",
- comment: "Bottom (second half) of line `Pending incoming´ in Balances")
- let outTitle0 = String(localized: "TitleOutgoing_Short", defaultValue: "Outgoing",
- comment: "Abbreviation of `Pending outgoing´ in Balances")
- let outTitle1 = String(localized: "TitleOutgoing_Top", defaultValue: "Pending",
- comment: "Top (first half) of line `Pending outgoing´ in Balances")
- let outTitle2 = String(localized: "TitleOutgoing_Bottom", defaultValue: "outgoing",
- comment: "Bottom (second half) of line `Pending outgoing´ in Balances")
+ let currencyInfo = controller.info(for: amount.currencyStr, controller.currencyTicker)
+ let amountText = Text(amount.string(currencyInfo))
+ .foregroundColor(pendingColor)
+ .accessibilityFont(.title2)
+ .monospacedDigit()
- func needVStack(available: CGFloat, contentWidth: CGFloat, valueWidth: CGFloat) -> Bool {
- if available > 20 {
- let logStr = String(format: "available: %.2f sum: %.2f = content: %.2f + value: %.2f",
- available, contentWidth + valueWidth, contentWidth, valueWidth)
- print(logStr)
+ // this is the default view for iOS 15
+ let vStack = VStack {
+ Text(pendingTitle.tabbed(oneLine: true))
+ HStack {
+ iconBadge
+ Spacer(minLength: 0)
+ amountText
+ }
}
- return available < (contentWidth + valueWidth + 20)
- }
- var body: some View {
- let pendingColor = WalletColors().pendingColor(incoming)
- SingleAxisGeometryReader { width in
- Group {
- let currencyInfo = controller.info(for: amount.currencyStr, controller.currencyTicker)
- let amountStr = amount.string(currencyInfo)
- let amountWidth = amountStr.width(largeAmountFont: false, sizeCategory)
- let inTitles = iconOnly ? (inTitle0, nil)
- : (inTitle1, inTitle2)
- let outTitles = iconOnly ? (outTitle0, nil)
- : (outTitle1, outTitle2)
- let titles = incoming ? inTitles
- : outTitles
- let contentWidth = PendingRowContentV.width(titles: titles,
- isHorizontal: false,
- sizeCategory: sizeCategory)
- let needVStack = needVStack(available: width, contentWidth: contentWidth, valueWidth: amountWidth)
- AmountRowV(amountStr: amountStr, amountColor: pendingColor, largeAmountFont: false,
- fitsHorizontal: !needVStack, vertAlignment: .center) {
- // isHorizontal=true to try to fit "- Pending outgoing" + amount in 1 line
- PendingRowContentV(titles: titles, isHorizontal: true, incoming: incoming,
- shouldConfirm: shouldConfirm, needsKYC: needsKYC)
+ if #available(iOS 16.0, *) {
+ ViewThatFits(in: .horizontal) {
+ HStack {
+ iconBadge
+ Text(pendingTitle.tabbed(oneLine: false))
+ Spacer(minLength: 0)
+ amountText
+ }
+ vStack
+ VStack {
+ Text(pendingTitle.tabbed(oneLine: true))
+ iconBadge
+ amountText
}
}
+ } else {
+ vStack
}
}
}
diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift
index bbdb250..79fc46b 100644
--- a/TalerWallet1/Views/Transactions/TransactionRowView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionRowView.swift
@@ -5,6 +5,26 @@
import SwiftUI
import taler_swift
+struct IconBadge: View {
+ let imageName: String
+ let foreColor:Color
+ let shouldConfirm: Bool
+ let needsKYC: Bool
+
+ var body: some View {
+ let badgeName = needsKYC ? "star.fill"
+ : "circle.fill"
+ HStack(alignment: .top, spacing: -8) { // TODO: adapt spacing to dynamic fontsize
+ Image(systemName: imageName)
+ .foregroundColor(foreColor)
+ .accessibilityFont(.largeTitle)
+ .accessibility(hidden: true)
+ Image(systemName: badgeName)
+ .accessibilityFont(.caption)
+ .foregroundColor((needsKYC || shouldConfirm) ? .red : .clear)
+ }.accessibilityHidden(true)
+ }
+}
struct TransactionRowContentV: View {
var centerTop: String
var centerBottom: String
@@ -41,19 +61,9 @@ struct TransactionRowContentV: View {
var body: some View {
let imageName = incoming ? "plus.circle.fill"
: "minus.circle.fill"
- let badgeName = needsKYC ? "star.fill"
- : "circle.fill"
+ let iconBadge = IconBadge(imageName: imageName, foreColor: foreColor, shouldConfirm: shouldConfirm, needsKYC: needsKYC)
HStack(spacing: 8) {
- HStack(alignment: .top, spacing: -8) { // TODO: adapt spacing to dynamic fontsize
- Image(systemName: imageName)
- .foregroundColor(foreColor)
- .accessibilityFont(.largeTitle)
- .accessibility(hidden: true)
- Image(systemName: badgeName)
- .accessibilityFont(.caption)
- .foregroundColor((needsKYC || shouldConfirm) ? .red : .clear)
- }.accessibilityHidden(true)
-
+ iconBadge
VStack(alignment: .leading) {
Text(centerTop)
.accessibilityFont(.headline)