mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-03-23 18:01:14 +01:00
feat: set up window group for memo view
This commit is contained in:
@@ -30,5 +30,18 @@ struct MemolaApp: App {
|
||||
.windowResizability(.contentSize)
|
||||
.defaultSize(width: 1200, height: 800)
|
||||
#endif
|
||||
WindowGroup(id: "memo-view", for: URL.self) { url in
|
||||
if let url = url.wrappedValue, let memo = Persistence.loadMemo(of: url) {
|
||||
MemoView(memo: memo)
|
||||
#if os(macOS)
|
||||
.frame(minWidth: 1000, minHeight: 600)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if os(macOS)
|
||||
.defaultPosition(.center)
|
||||
.windowResizability(.contentSize)
|
||||
.defaultSize(width: 1200, height: 800)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,9 @@ import SwiftUI
|
||||
struct DashboardView: View {
|
||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||
|
||||
#if os(iOS)
|
||||
@State var memo: MemoObject?
|
||||
#endif
|
||||
@State var sidebarItem: SidebarItem? = .memos
|
||||
|
||||
var body: some View {
|
||||
@@ -19,11 +21,23 @@ struct DashboardView: View {
|
||||
} detail: {
|
||||
switch sidebarItem {
|
||||
case .memos:
|
||||
#if os(macOS)
|
||||
MemosView()
|
||||
#else
|
||||
MemosView(memo: $memo)
|
||||
#endif
|
||||
case .trash:
|
||||
#if os(macOS)
|
||||
TrashView(sidebarItem: $sidebarItem)
|
||||
#else
|
||||
TrashView(memo: $memo, sidebarItem: $sidebarItem)
|
||||
#endif
|
||||
default:
|
||||
#if os(macOS)
|
||||
MemosView()
|
||||
#else
|
||||
MemosView(memo: $memo)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if os(iOS)
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
import SwiftUI
|
||||
|
||||
struct MemosView: View {
|
||||
#if os(macOS)
|
||||
@Environment(\.openWindow) var openWindow
|
||||
#endif
|
||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||
|
||||
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
||||
@@ -15,7 +18,9 @@ struct MemosView: View {
|
||||
@State var query: String = ""
|
||||
@State var currentDate: Date = .now
|
||||
|
||||
#if os(iOS)
|
||||
@Binding var memo: MemoObject?
|
||||
#endif
|
||||
|
||||
@AppStorage("memola.memo-objects.memos.sort") var sort: Sort = .recent
|
||||
@AppStorage("memola.memo-objects.memos.filter") var filter: Filter = .none
|
||||
@@ -26,6 +31,21 @@ struct MemosView: View {
|
||||
query.isEmpty ? .memoEmpty : .memoNotFound
|
||||
}
|
||||
|
||||
#if os(macOS)
|
||||
init() {
|
||||
let standard = UserDefaults.standard
|
||||
var descriptors: [SortDescriptor<MemoObject>] = []
|
||||
var predicates: [NSPredicate] = [NSPredicate(format: "isTrash = NO")]
|
||||
let sort = Sort(rawValue: standard.value(forKey: "memola.memo-objects.memos.sort") as? String ?? "") ?? .recent
|
||||
let filter = Filter(rawValue: standard.value(forKey: "memola.memo-objects.memos.filter") as? String ?? "") ?? .none
|
||||
if filter == .favorites {
|
||||
predicates.append(NSPredicate(format: "isFavorite = YES"))
|
||||
}
|
||||
descriptors = sort.memoSortDescriptors
|
||||
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||
}
|
||||
#else
|
||||
init(memo: Binding<MemoObject?>) {
|
||||
_memo = memo
|
||||
let standard = UserDefaults.standard
|
||||
@@ -40,6 +60,7 @@ struct MemosView: View {
|
||||
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||
}
|
||||
#endif
|
||||
|
||||
var body: some View {
|
||||
MemoGrid(memoObjects: memoObjects, placeholder: placeholder) { memoObject, cellWidth in
|
||||
@@ -252,7 +273,11 @@ struct MemosView: View {
|
||||
}
|
||||
|
||||
func openMemo(for memo: MemoObject) {
|
||||
#if os(macOS)
|
||||
openWindow(id: "memo-view", value: memo.objectID.uriRepresentation())
|
||||
#else
|
||||
self.memo = memo
|
||||
#endif
|
||||
}
|
||||
|
||||
func updatePredicate() {
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
import SwiftUI
|
||||
|
||||
struct TrashView: View {
|
||||
#if os(macOS)
|
||||
@Environment(\.openWindow) var openWindow
|
||||
#endif
|
||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||
|
||||
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
||||
@@ -16,13 +19,23 @@ struct TrashView: View {
|
||||
@State var restoredMemo: MemoObject?
|
||||
@State var deletedMemo: MemoObject?
|
||||
|
||||
#if os(iOS)
|
||||
@Binding var memo: MemoObject?
|
||||
#endif
|
||||
@Binding var sidebarItem: SidebarItem?
|
||||
|
||||
var placeholder: Placeholder.Info {
|
||||
query.isEmpty ? .trashEmpty : .trashNotFound
|
||||
}
|
||||
|
||||
#if os(macOS)
|
||||
init(sidebarItem: Binding<SidebarItem?>) {
|
||||
_sidebarItem = sidebarItem
|
||||
let descriptors = [SortDescriptor(\MemoObject.deletedAt, order: .reverse)]
|
||||
let predicate = NSPredicate(format: "isTrash = YES")
|
||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||
}
|
||||
#else
|
||||
init(memo: Binding<MemoObject?>, sidebarItem: Binding<SidebarItem?>) {
|
||||
_memo = memo
|
||||
_sidebarItem = sidebarItem
|
||||
@@ -30,6 +43,7 @@ struct TrashView: View {
|
||||
let predicate = NSPredicate(format: "isTrash = YES")
|
||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||
}
|
||||
#endif
|
||||
|
||||
var body: some View {
|
||||
let restoresMemo = Binding<Bool> {
|
||||
@@ -146,7 +160,13 @@ struct TrashView: View {
|
||||
func restoreAndOpenMemo(for memo: MemoObject?) {
|
||||
restoreMemo(for: memo)
|
||||
self.sidebarItem = .memos
|
||||
self.memo = memo
|
||||
if let memo {
|
||||
#if os(macOS)
|
||||
openWindow(id: "memo-view", value: memo.objectID.uriRepresentation())
|
||||
#else
|
||||
self.memo = memo
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
func deleteMemo(for memo: MemoObject?) {
|
||||
|
||||
@@ -77,6 +77,14 @@ final class Persistence {
|
||||
fatalError("[Memola]: \(error.localizedDescription)")
|
||||
}
|
||||
}()
|
||||
|
||||
static func loadMemo(of url: URL) -> MemoObject? {
|
||||
let viewContext = shared.viewContext
|
||||
guard let objectID = viewContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: url) else {
|
||||
return nil
|
||||
}
|
||||
return viewContext.object(with: objectID) as? MemoObject
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Global Method
|
||||
|
||||
Reference in New Issue
Block a user