diff --git a/MyQrCode/Utils/CalendarManager.swift b/MyQrCode/Utils/CalendarManager.swift index a0ab3ed..52efea5 100644 --- a/MyQrCode/Utils/CalendarManager.swift +++ b/MyQrCode/Utils/CalendarManager.swift @@ -57,6 +57,10 @@ class CalendarManager: ObservableObject { DispatchQueue.main.async { completion(false, "calendar_permission_denied".localized) } + case .fullAccess: + performAddEvent(calendarDetails: calendarDetails, completion: completion) + case .writeOnly: + performAddEvent(calendarDetails: calendarDetails, completion: completion) @unknown default: DispatchQueue.main.async { completion(false, "calendar_permission_unknown".localized) diff --git a/MyQrCode/Views/Generator/QRCodeStyleView.swift b/MyQrCode/Views/Generator/QRCodeStyleView.swift index deb76e4..6756795 100644 --- a/MyQrCode/Views/Generator/QRCodeStyleView.swift +++ b/MyQrCode/Views/Generator/QRCodeStyleView.swift @@ -261,11 +261,6 @@ struct QRCodeStyleView: View { private var dotsContent: some View { ScrollView { VStack(spacing: 16) { - Text("select_dot_type".localized) - .font(.title2) - .fontWeight(.bold) - .padding(.top) - .id(languageManager.refreshTrigger) LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 16) { ForEach(QRCodeDotType.allCases, id: \.self) { dotType in diff --git a/MyQrCode/Views/History/HistoryView.swift b/MyQrCode/Views/History/HistoryView.swift index d0ff4b1..2d09ed7 100644 --- a/MyQrCode/Views/History/HistoryView.swift +++ b/MyQrCode/Views/History/HistoryView.swift @@ -19,6 +19,8 @@ struct HistoryView: View { @State private var refreshTrigger = false @State private var isBatchDeleteMode = false @State private var selectedItemsForDelete: Set = [] + @State private var itemToEdit: HistoryItem? + @State private var showingEditView = false enum HistoryFilter: String, CaseIterable { case all = "all" @@ -195,6 +197,7 @@ Button("delete".localized, role: .destructive) { // 当Core Data数据发生变化时,重新加载历史记录 loadHistoryItems() } + .background(editNavigationLink) } // MARK: - 加载历史记录 @@ -281,6 +284,57 @@ Button("delete".localized, role: .destructive) { showingDeleteAlert = true } + // MARK: - 显示编辑界面 + private func showEditView(for item: HistoryItem) { + itemToEdit = item + showingEditView = true + } + + // MARK: - 获取二维码类型 + private func getQRCodeType(from item: HistoryItem) -> QRCodeType { + if let qrCodeTypeString = item.qrCodeType, + let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) { + return qrCodeType + } + return .text // 默认类型 + } + + // MARK: - 获取样式数据 + private func getStyleData(from item: HistoryItem) -> QRCodeStyleData? { + // 从历史记录项中提取样式数据 + guard let jsonString = item.qrCodeStyleData, + let jsonData = jsonString.data(using: .utf8) else { + return nil + } + + do { + let styleData = try JSONDecoder().decode(QRCodeStyleData.self, from: jsonData) + return styleData + } catch { + print("❌ 样式数据JSON解码失败:\(error)") + return nil + } + } + + // MARK: - 编辑导航链接 + private var editNavigationLink: some View { + NavigationLink( + destination: Group { + if let itemToEdit = itemToEdit { + QRCodeStyleView( + qrCodeContent: itemToEdit.content ?? "", + qrCodeType: getQRCodeType(from: itemToEdit), + existingStyleData: getStyleData(from: itemToEdit), + historyItem: itemToEdit + ) + } + }, + isActive: $showingEditView + ) { + EmptyView() + } + } + // MARK: - 批量删除相关方法 private func enterBatchDeleteMode() { isBatchDeleteMode = true @@ -384,6 +438,9 @@ Button("delete".localized, role: .destructive) { onDelete: { showDeleteConfirmation(for: item) }, + onEdit: { + showEditView(for: item) + }, isBatchDeleteMode: isBatchDeleteMode, isSelected: selectedItemsForDelete.contains(item.id ?? UUID()), onToggleSelection: { @@ -529,6 +586,7 @@ struct HistoryItemRow: View { let item: HistoryItem let onToggleFavorite: () -> Void let onDelete: () -> Void + let onEdit: (() -> Void)? let isBatchDeleteMode: Bool let isSelected: Bool let onToggleSelection: () -> Void @@ -642,9 +700,28 @@ struct HistoryItemRow: View { } .padding(.vertical, 8) .swipeActions(edge: .trailing, allowsFullSwipe: false) { - Button("delete".localized, role: .destructive) { - onDelete() + // 分享按钮 + Button(action: { + shareItem(item) + }) { + Image(systemName: "square.and.arrow.up") + } + .tint(.gray) + + // 为创建类型的二维码条目添加编辑按钮 + if item.dataType == DataType.qrcode.rawValue && + item.dataSource == DataSource.created.rawValue, + let onEdit = onEdit { + Button(action: onEdit) { + Image(systemName: "pencil") + } + .tint(.blue) } + + Button(action: onDelete) { + Image(systemName: "trash") + } + .tint(.red) } .background( // 根据数据类型和数据源添加导航链接 @@ -701,6 +778,32 @@ struct HistoryItemRow: View { ) } + // MARK: - 分享功能 + private func shareItem(_ item: HistoryItem) { + let content = item.content ?? "" + let activityVC = UIActivityViewController( + activityItems: [content], + applicationActivities: nil + ) + + // 在iPad上需要设置popoverPresentationController + if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first { + if let popover = activityVC.popoverPresentationController { + popover.sourceView = window + popover.sourceRect = CGRect(x: window.bounds.midX, y: window.bounds.midY, width: 0, height: 0) + popover.permittedArrowDirections = [] + } + } + + // 获取当前视图控制器并显示分享界面 + if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first, + let rootViewController = window.rootViewController { + rootViewController.present(activityVC, animated: true) + } + } + private func getQRCodeType(from item: HistoryItem) -> QRCodeType { if let qrCodeTypeString = item.qrCodeType, let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) {