mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-07-08 22:05:09 +02:00
feat: set up window group for memo view
This commit is contained in:
@@ -30,5 +30,18 @@ struct MemolaApp: App {
|
|||||||
.windowResizability(.contentSize)
|
.windowResizability(.contentSize)
|
||||||
.defaultSize(width: 1200, height: 800)
|
.defaultSize(width: 1200, height: 800)
|
||||||
#endif
|
#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 {
|
struct DashboardView: View {
|
||||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
@State var memo: MemoObject?
|
@State var memo: MemoObject?
|
||||||
|
#endif
|
||||||
@State var sidebarItem: SidebarItem? = .memos
|
@State var sidebarItem: SidebarItem? = .memos
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -19,11 +21,23 @@ struct DashboardView: View {
|
|||||||
} detail: {
|
} detail: {
|
||||||
switch sidebarItem {
|
switch sidebarItem {
|
||||||
case .memos:
|
case .memos:
|
||||||
|
#if os(macOS)
|
||||||
|
MemosView()
|
||||||
|
#else
|
||||||
MemosView(memo: $memo)
|
MemosView(memo: $memo)
|
||||||
|
#endif
|
||||||
case .trash:
|
case .trash:
|
||||||
|
#if os(macOS)
|
||||||
|
TrashView(sidebarItem: $sidebarItem)
|
||||||
|
#else
|
||||||
TrashView(memo: $memo, sidebarItem: $sidebarItem)
|
TrashView(memo: $memo, sidebarItem: $sidebarItem)
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
|
#if os(macOS)
|
||||||
|
MemosView()
|
||||||
|
#else
|
||||||
MemosView(memo: $memo)
|
MemosView(memo: $memo)
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct MemosView: View {
|
struct MemosView: View {
|
||||||
|
#if os(macOS)
|
||||||
|
@Environment(\.openWindow) var openWindow
|
||||||
|
#endif
|
||||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||||
|
|
||||||
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
||||||
@@ -15,7 +18,9 @@ struct MemosView: View {
|
|||||||
@State var query: String = ""
|
@State var query: String = ""
|
||||||
@State var currentDate: Date = .now
|
@State var currentDate: Date = .now
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
@Binding var memo: MemoObject?
|
@Binding var memo: MemoObject?
|
||||||
|
#endif
|
||||||
|
|
||||||
@AppStorage("memola.memo-objects.memos.sort") var sort: Sort = .recent
|
@AppStorage("memola.memo-objects.memos.sort") var sort: Sort = .recent
|
||||||
@AppStorage("memola.memo-objects.memos.filter") var filter: Filter = .none
|
@AppStorage("memola.memo-objects.memos.filter") var filter: Filter = .none
|
||||||
@@ -26,6 +31,21 @@ struct MemosView: View {
|
|||||||
query.isEmpty ? .memoEmpty : .memoNotFound
|
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?>) {
|
init(memo: Binding<MemoObject?>) {
|
||||||
_memo = memo
|
_memo = memo
|
||||||
let standard = UserDefaults.standard
|
let standard = UserDefaults.standard
|
||||||
@@ -40,6 +60,7 @@ struct MemosView: View {
|
|||||||
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
let predicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
||||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
MemoGrid(memoObjects: memoObjects, placeholder: placeholder) { memoObject, cellWidth in
|
MemoGrid(memoObjects: memoObjects, placeholder: placeholder) { memoObject, cellWidth in
|
||||||
@@ -252,7 +273,11 @@ struct MemosView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func openMemo(for memo: MemoObject) {
|
func openMemo(for memo: MemoObject) {
|
||||||
|
#if os(macOS)
|
||||||
|
openWindow(id: "memo-view", value: memo.objectID.uriRepresentation())
|
||||||
|
#else
|
||||||
self.memo = memo
|
self.memo = memo
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func updatePredicate() {
|
func updatePredicate() {
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct TrashView: View {
|
struct TrashView: View {
|
||||||
|
#if os(macOS)
|
||||||
|
@Environment(\.openWindow) var openWindow
|
||||||
|
#endif
|
||||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
||||||
|
|
||||||
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
@FetchRequest var memoObjects: FetchedResults<MemoObject>
|
||||||
@@ -16,13 +19,23 @@ struct TrashView: View {
|
|||||||
@State var restoredMemo: MemoObject?
|
@State var restoredMemo: MemoObject?
|
||||||
@State var deletedMemo: MemoObject?
|
@State var deletedMemo: MemoObject?
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
@Binding var memo: MemoObject?
|
@Binding var memo: MemoObject?
|
||||||
|
#endif
|
||||||
@Binding var sidebarItem: SidebarItem?
|
@Binding var sidebarItem: SidebarItem?
|
||||||
|
|
||||||
var placeholder: Placeholder.Info {
|
var placeholder: Placeholder.Info {
|
||||||
query.isEmpty ? .trashEmpty : .trashNotFound
|
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?>) {
|
init(memo: Binding<MemoObject?>, sidebarItem: Binding<SidebarItem?>) {
|
||||||
_memo = memo
|
_memo = memo
|
||||||
_sidebarItem = sidebarItem
|
_sidebarItem = sidebarItem
|
||||||
@@ -30,6 +43,7 @@ struct TrashView: View {
|
|||||||
let predicate = NSPredicate(format: "isTrash = YES")
|
let predicate = NSPredicate(format: "isTrash = YES")
|
||||||
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let restoresMemo = Binding<Bool> {
|
let restoresMemo = Binding<Bool> {
|
||||||
@@ -146,7 +160,13 @@ struct TrashView: View {
|
|||||||
func restoreAndOpenMemo(for memo: MemoObject?) {
|
func restoreAndOpenMemo(for memo: MemoObject?) {
|
||||||
restoreMemo(for: memo)
|
restoreMemo(for: memo)
|
||||||
self.sidebarItem = .memos
|
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?) {
|
func deleteMemo(for memo: MemoObject?) {
|
||||||
|
|||||||
@@ -77,6 +77,14 @@ final class Persistence {
|
|||||||
fatalError("[Memola]: \(error.localizedDescription)")
|
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
|
// MARK: - Global Method
|
||||||
|
|||||||
Reference in New Issue
Block a user