mirror of
https://github.com/XITRIX/iTorrent.git
synced 2026-04-30 11:42:27 +00:00
Share tint color with progress widget
This commit is contained in:
@@ -4,6 +4,10 @@
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.itorrent.life-activity</string>
|
||||
</array>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
</dict>
|
||||
|
||||
@@ -10,6 +10,14 @@ import SwiftUI
|
||||
import WidgetKit
|
||||
|
||||
struct ProgressWidgetLiveActivity: Widget {
|
||||
static var userDefaults: UserDefaults { UserDefaults(suiteName: "group.itorrent.life-activity") ?? .standard }
|
||||
|
||||
var tintColor: UIColor {
|
||||
guard let data = Self.userDefaults.data(forKey: "preferencesTintColor")
|
||||
else { return .tintColor }
|
||||
return (try? NSKeyedUnarchiver.unarchivedObject(ofClass: UIColor.self, from: data)) ?? .tintColor
|
||||
}
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
ActivityConfiguration(for: ProgressWidgetAttributes.self) { context in
|
||||
// Lock screen/banner UI goes here
|
||||
@@ -32,7 +40,7 @@ struct ProgressWidgetLiveActivity: Widget {
|
||||
.progressViewStyle(.linear)
|
||||
}
|
||||
.widgetURL(URL(string: "iTorrent:hash:\(context.attributes.hash)"))
|
||||
.tint(Color(uiColor: .tintColor))
|
||||
.tint(Color(uiColor: tintColor))
|
||||
.padding()
|
||||
} dynamicIsland: { context in
|
||||
DynamicIsland {
|
||||
@@ -55,21 +63,21 @@ struct ProgressWidgetLiveActivity: Widget {
|
||||
.progressViewStyle(.linear)
|
||||
.padding([.leading, .trailing], 8)
|
||||
}
|
||||
.tint(Color(uiColor: .tintColor))
|
||||
.tint(Color(uiColor: tintColor))
|
||||
}
|
||||
} compactLeading: {
|
||||
Text("\(context.state.downSpeed.bitrateToHumanReadable)/s")
|
||||
} compactTrailing: {
|
||||
ProgressView(value: context.state.progress)
|
||||
.progressViewStyle(.circular)
|
||||
.tint(Color(uiColor: .tintColor))
|
||||
.tint(Color(uiColor: tintColor))
|
||||
} minimal: {
|
||||
ProgressView(value: context.state.progress)
|
||||
.progressViewStyle(.circular)
|
||||
.tint(Color(uiColor: .tintColor))
|
||||
.tint(Color(uiColor: tintColor))
|
||||
}
|
||||
.widgetURL(URL(string: "iTorrent:hash:\(context.attributes.hash)"))
|
||||
.keylineTint(Color(uiColor: .tintColor))
|
||||
.keylineTint(Color(uiColor: tintColor))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Submodule Submodules/LibTorrent-Swift updated: fe2347e9c0...abdd73e626
Submodule Submodules/MVVMFoundation updated: 408f07ba60...73e08e0107
@@ -1347,6 +1347,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_ENTITLEMENTS = iTorrent/Core/iTorrent.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = D59DHVRS87;
|
||||
@@ -1367,6 +1368,7 @@
|
||||
MARKETING_VERSION = "2.0-alpha";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xitrix.iTorrent2;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@@ -1385,6 +1387,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_ENTITLEMENTS = iTorrent/Core/iTorrent.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = D59DHVRS87;
|
||||
@@ -1405,6 +1408,7 @@
|
||||
MARKETING_VERSION = "2.0-alpha";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xitrix.iTorrent2;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@@ -1486,6 +1490,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_ENTITLEMENTS = iTorrent/Core/iTorrent.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = D59DHVRS87;
|
||||
@@ -1506,6 +1511,7 @@
|
||||
MARKETING_VERSION = "2.0-alpha";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xitrix.iTorrent2;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"%lld" : {
|
||||
|
||||
},
|
||||
"%lld / %lld items" : {
|
||||
"localizations" : {
|
||||
@@ -979,6 +982,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Leechs" : {
|
||||
|
||||
},
|
||||
"list.add.files" : {
|
||||
"localizations" : {
|
||||
@@ -1203,6 +1209,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Message: %@" : {
|
||||
|
||||
},
|
||||
"mime.audio" : {
|
||||
"extractionState" : "manual",
|
||||
@@ -1322,6 +1331,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Peers" : {
|
||||
|
||||
},
|
||||
"preferences" : {
|
||||
"localizations" : {
|
||||
@@ -2378,6 +2390,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Seeds" : {
|
||||
|
||||
},
|
||||
"time.infinity" : {
|
||||
"localizations" : {
|
||||
|
||||
@@ -2,8 +2,14 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.developer.devicecheck.appattest-environment</key>
|
||||
<string>development</string>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>group.itorrent.life-activity</string>
|
||||
</array>
|
||||
<key>com.apple.security.files.user-selected.read-write</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
|
||||
@@ -12,13 +12,32 @@ struct TrackerCellView: MvvmSwiftUICellProtocol {
|
||||
@ObservedObject var viewModel: TrackerCellViewModel
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
VStack(alignment: .leading) {
|
||||
Text(viewModel.title)
|
||||
.fontWeight(.semibold)
|
||||
HStack {
|
||||
HStack {
|
||||
Text("Peers")
|
||||
Text("\(viewModel.peers)")
|
||||
}
|
||||
Spacer()
|
||||
HStack {
|
||||
Text("Seeds")
|
||||
Text("\(viewModel.seeds)")
|
||||
}
|
||||
Spacer()
|
||||
HStack {
|
||||
Text("Leechs")
|
||||
Text("\(viewModel.leechs)")
|
||||
}
|
||||
}
|
||||
if let message = viewModel.message,
|
||||
!message.isEmpty
|
||||
{
|
||||
Text("Message: \(message)")
|
||||
}
|
||||
}
|
||||
#if os(visionOS)
|
||||
.frame(minHeight: 44)
|
||||
#endif
|
||||
.systemMinimumHeight()
|
||||
}
|
||||
|
||||
static let registration: UICollectionView.CellRegistration<UICollectionViewListCell, ViewModel> = .init { cell, _, itemIdentifier in
|
||||
@@ -30,5 +49,14 @@ struct TrackerCellView: MvvmSwiftUICellProtocol {
|
||||
}
|
||||
|
||||
#Preview {
|
||||
TrackerCellView(viewModel: .init())
|
||||
let vm = TrackerCellViewModel()
|
||||
vm.title = "Top tracker"
|
||||
vm.peers = 390
|
||||
vm.leechs = 230
|
||||
vm.seeds = 5200
|
||||
|
||||
vm.message = "Top tracker"
|
||||
return TrackerCellView(viewModel: vm)
|
||||
.frame(maxWidth: .infinity)
|
||||
// .border(Color.blue)
|
||||
}
|
||||
|
||||
@@ -11,8 +11,16 @@ import LibTorrent
|
||||
|
||||
class TrackerCellViewModel: BaseViewModelWith<TorrentTracker>, ObservableObject {
|
||||
@Published var title: String = ""
|
||||
@Published var message: String?
|
||||
@Published var seeds: Int = 0
|
||||
@Published var peers: Int = 0
|
||||
@Published var leechs: Int = 0
|
||||
|
||||
override func prepare(with model: TorrentTracker) {
|
||||
title = model.trackerUrl
|
||||
message = model.messages
|
||||
seeds = model.seeders
|
||||
peers = model.peers
|
||||
leechs = model.leechs
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,10 @@ struct NSUserDefaultItem<Value: NSObject & NSCoding> {
|
||||
}
|
||||
|
||||
private extension NSUserDefaultItem {
|
||||
static var userDefaults: UserDefaults { UserDefaults(suiteName: "group.itorrent.life-activity") ?? .standard }
|
||||
|
||||
static func value(for key: String) -> Value? {
|
||||
guard let data = UserDefaults.standard.data(forKey: key)
|
||||
guard let data = userDefaults.data(forKey: key)
|
||||
else { return nil }
|
||||
return try? NSKeyedUnarchiver.unarchivedObject(ofClass: Value.self, from: data)
|
||||
}
|
||||
@@ -42,7 +44,7 @@ private extension NSUserDefaultItem {
|
||||
static func setValue(_ value: Value, for key: String) {
|
||||
do {
|
||||
let data = try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
|
||||
UserDefaults.standard.set(data, forKey: key)
|
||||
userDefaults.set(data, forKey: key)
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,8 +39,10 @@ struct UserDefaultItem<T: Codable> {
|
||||
}
|
||||
|
||||
private extension UserDefaultItem {
|
||||
static var userDefaults: UserDefaults { UserDefaults(suiteName: "group.itorrent.life-activity") ?? .standard }
|
||||
|
||||
static func get(by key: String) -> T? {
|
||||
guard let decoded = UserDefaults.standard.data(forKey: key),
|
||||
guard let decoded = userDefaults.data(forKey: key),
|
||||
let res = try? JSONDecoder().decode(T.self, from: decoded)
|
||||
else { return nil }
|
||||
return res
|
||||
@@ -48,9 +50,9 @@ private extension UserDefaultItem {
|
||||
|
||||
static func set(by key: String, _ value: T?) {
|
||||
if let value, let encodedData: Data = try? JSONEncoder().encode(value) {
|
||||
UserDefaults.standard.set(encodedData, forKey: key)
|
||||
userDefaults.set(encodedData, forKey: key)
|
||||
} else {
|
||||
UserDefaults.standard.set(nil, forKey: key)
|
||||
userDefaults.set(nil, forKey: key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user