mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-29 21:58:57 +00:00
show percent
This commit is contained in:
@@ -269,6 +269,8 @@ struct SubsStatusIndicator: View {
|
||||
@State private var timer: Timer? = nil
|
||||
@State private var timerCounter = 0
|
||||
@State private var showServersSummary = false
|
||||
|
||||
@AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false
|
||||
|
||||
// Constants for the intervals
|
||||
let initialInterval: TimeInterval = 1.0
|
||||
@@ -279,7 +281,12 @@ struct SubsStatusIndicator: View {
|
||||
Button {
|
||||
showServersSummary = true
|
||||
} label: {
|
||||
SubscriptionStatusView(subs: subs, sess: sess)
|
||||
HStack(spacing: 4) {
|
||||
ConnectionStatusIndicatorView(subs: subs, sess: sess)
|
||||
if showConnectionStatusPercent {
|
||||
ConnectionStatusPercentView(subs: subs, sess: sess)
|
||||
}
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
startInitialTimer()
|
||||
|
||||
@@ -18,6 +18,8 @@ struct ServersSummaryView: View {
|
||||
@State private var timer: Timer? = nil
|
||||
@State private var alert: SomeAlert?
|
||||
|
||||
@AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false
|
||||
|
||||
enum PresentedUserCategory {
|
||||
case currentUser
|
||||
case allUsers
|
||||
@@ -218,16 +220,15 @@ struct ServersSummaryView: View {
|
||||
.navigationBarTitleDisplayMode(.large)
|
||||
} label: {
|
||||
HStack {
|
||||
if srvSumm.connected {
|
||||
SubscriptionStatusView(
|
||||
subs: srvSumm.subsOrNew,
|
||||
sess: srvSumm.sessionsOrNew
|
||||
)
|
||||
.frame(width: 16, alignment: .center)
|
||||
.padding(.trailing, 4)
|
||||
}
|
||||
Text(serverAddress(srvSumm.smpServer))
|
||||
.lineLimit(1)
|
||||
if srvSumm.connected {
|
||||
Spacer()
|
||||
if showConnectionStatusPercent {
|
||||
ConnectionStatusPercentView(subs: srvSumm.subsOrNew, sess: srvSumm.sessionsOrNew)
|
||||
}
|
||||
ConnectionStatusIndicatorView(subs: srvSumm.subsOrNew, sess: srvSumm.sessionsOrNew)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -314,13 +315,12 @@ struct ServersSummaryView: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct SubscriptionStatusView: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
struct ConnectionStatusIndicatorView: View {
|
||||
var subs: SMPServerSubs
|
||||
var sess: ServerSessions
|
||||
|
||||
var body: some View {
|
||||
let (color, variableValue, opacity) = iconColor
|
||||
let (color, variableValue, opacity, _) = connectionStatusColorAndPercent(subs, sess)
|
||||
if #available(iOS 16.0, *) {
|
||||
Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue)
|
||||
.foregroundColor(color)
|
||||
@@ -329,39 +329,49 @@ struct SubscriptionStatusView: View {
|
||||
.foregroundColor(color.opacity(opacity))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var iconColor: (Color, Double, Double) {
|
||||
m.networkInfo.online && (subs.total > 0 || sess.total > 0)
|
||||
? ( // Status to be displayed based on subs
|
||||
subs.total > 0
|
||||
? (
|
||||
subs.ssActive == 0
|
||||
? (
|
||||
sess.ssConnected == 0 ? noConnColor : (.accentColor, activeSubsRounded, subs.shareOfActive)
|
||||
)
|
||||
: ( // ssActive > 0
|
||||
sess.ssConnected == 0
|
||||
? (.orange, activeSubsRounded, subs.shareOfActive) // This would mean implementation error
|
||||
: (.accentColor, activeSubsRounded, subs.shareOfActive)
|
||||
)
|
||||
)
|
||||
// subs.total == 0 and sess.total > 0; Status to be displayed based on sessions
|
||||
: (.accentColor, connectedSessRounded, sess.shareOfConnected)
|
||||
)
|
||||
: noConnColor
|
||||
struct ConnectionStatusPercentView: View {
|
||||
var subs: SMPServerSubs
|
||||
var sess: ServerSessions
|
||||
|
||||
var body: some View {
|
||||
let (_, _, _, statusPercent) = connectionStatusColorAndPercent(subs, sess)
|
||||
Text("\(Int(floor(statusPercent * 100)))%")
|
||||
.foregroundColor(.secondary)
|
||||
.font(.caption)
|
||||
}
|
||||
}
|
||||
|
||||
private var noConnColor: (Color, Double, Double) { (Color(uiColor: .tertiaryLabel), 1, 1) }
|
||||
|
||||
private var activeSubsRounded: Double { roundedToQuarter(subs.shareOfActive) }
|
||||
|
||||
private var connectedSessRounded: Double { roundedToQuarter(sess.shareOfConnected) }
|
||||
|
||||
private func roundedToQuarter(_ n: Double) -> Double {
|
||||
func connectionStatusColorAndPercent(_ subs: SMPServerSubs, _ sess: ServerSessions) -> (Color, Double, Double, Double) {
|
||||
func roundedToQuarter(_ n: Double) -> Double {
|
||||
n >= 1 ? 1
|
||||
: n <= 0 ? 0
|
||||
: (n * 4).rounded() / 4
|
||||
}
|
||||
|
||||
let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0)
|
||||
let activeSubsRounded = roundedToQuarter(subs.shareOfActive)
|
||||
let connectedSessRounded = roundedToQuarter(sess.shareOfConnected)
|
||||
|
||||
return ChatModel.shared.networkInfo.online && (subs.total > 0 || sess.total > 0)
|
||||
? ( // Status to be displayed based on subs
|
||||
subs.total > 0
|
||||
? (
|
||||
subs.ssActive == 0
|
||||
? (
|
||||
sess.ssConnected == 0 ? noConnColorAndPercent : (.accentColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive)
|
||||
)
|
||||
: ( // ssActive > 0
|
||||
sess.ssConnected == 0
|
||||
? (.orange, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) // This would mean implementation error
|
||||
: (.accentColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive)
|
||||
)
|
||||
)
|
||||
// subs.total == 0 and sess.total > 0; Status to be displayed based on sessions
|
||||
: (.accentColor, connectedSessRounded, sess.shareOfConnected, sess.shareOfConnected)
|
||||
)
|
||||
: noConnColorAndPercent
|
||||
}
|
||||
|
||||
struct SMPServerSummaryView: View {
|
||||
@@ -370,6 +380,8 @@ struct SMPServerSummaryView: View {
|
||||
var statsStartedAt: Date
|
||||
@State private var alert: SomeAlert?
|
||||
|
||||
@AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false
|
||||
|
||||
var body: some View {
|
||||
List {
|
||||
Section {
|
||||
@@ -422,10 +434,10 @@ struct SMPServerSummaryView: View {
|
||||
HStack {
|
||||
Text("Connection status")
|
||||
Spacer()
|
||||
SubscriptionStatusView(
|
||||
subs: summary.subsOrNew,
|
||||
sess: summary.sessionsOrNew
|
||||
)
|
||||
if showConnectionStatusPercent {
|
||||
ConnectionStatusPercentView(subs: summary.subsOrNew, sess: summary.sessionsOrNew)
|
||||
}
|
||||
ConnectionStatusIndicatorView(subs: summary.subsOrNew, sess: summary.sessionsOrNew)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ private enum NetworkAlert: Identifiable {
|
||||
struct NetworkAndServers: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = true
|
||||
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
|
||||
@AppStorage(DEFAULT_SHOW_CONNECTION_STATUS_PERCENT) private var showConnectionStatusPercent = false
|
||||
@State private var cfgLoaded = false
|
||||
@State private var currentNetCfg = NetCfg.defaults
|
||||
@State private var netCfg = NetCfg.defaults
|
||||
@@ -58,6 +59,8 @@ struct NetworkAndServers: View {
|
||||
Text("XFTP servers")
|
||||
}
|
||||
|
||||
Toggle("Show connection status %", isOn: $showConnectionStatusPercent)
|
||||
|
||||
Picker("Use .onion hosts", selection: $onionHosts) {
|
||||
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ let DEFAULT_CONFIRM_REMOTE_SESSIONS = "confirmRemoteSessions"
|
||||
let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST = "connectRemoteViaMulticast"
|
||||
let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "connectRemoteViaMulticastAuto"
|
||||
let DEFAULT_SHOW_SENT_VIA_RPOXY = "showSentViaProxy"
|
||||
let DEFAULT_SHOW_CONNECTION_STATUS_PERCENT = "showConnectionStatusPercent"
|
||||
|
||||
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
|
||||
|
||||
@@ -101,6 +102,7 @@ let appDefaults: [String: Any] = [
|
||||
DEFAULT_CONNECT_REMOTE_VIA_MULTICAST: true,
|
||||
DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO: true,
|
||||
DEFAULT_SHOW_SENT_VIA_RPOXY: false,
|
||||
DEFAULT_SHOW_CONNECTION_STATUS_PERCENT: false,
|
||||
ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN: AppSettingsLockScreenCalls.show.rawValue
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user