Add TravelAlbum, ProfileSpace, and wired camera transfer modules.

Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-30 09:41:05 +08:00
parent 5692134efc
commit d2fe5d71e4
48 changed files with 6477 additions and 11 deletions

View File

@ -0,0 +1,23 @@
import Foundation
struct CameraAsset: Identifiable, Equatable, Hashable {
let id: String
let filename: String
let fileSize: Int64
let creationDate: Date?
let isMovie: Bool
init(
id: String,
filename: String,
fileSize: Int64,
creationDate: Date? = nil,
isMovie: Bool = false
) {
self.id = id
self.filename = filename
self.fileSize = fileSize
self.creationDate = creationDate
self.isMovie = isMovie
}
}

View File

@ -0,0 +1,17 @@
import Foundation
enum CameraBrand: String, CaseIterable, Identifiable {
case sony
case canon
case nikon
var id: String { rawValue }
var displayName: String {
switch self {
case .sony: "Sony"
case .canon: "Canon"
case .nikon: "Nikon"
}
}
}

View File

@ -0,0 +1,29 @@
import Foundation
enum CameraConnectionState: Equatable {
case disconnected
case searching
case connecting
case connected(deviceName: String)
case error(String)
var displayText: String {
switch self {
case .disconnected:
"未连接"
case .searching:
"正在搜索相机…"
case .connecting:
"正在连接…"
case .connected(let name):
"已连接:\(name)"
case .error(let message):
"错误:\(message)"
}
}
var isConnected: Bool {
if case .connected = self { return true }
return false
}
}