From 9b9ccf2a869b2fb8ad73feb60a3220a87749937e Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 14 Jul 2024 16:44:21 +0700 Subject: [PATCH] chore: refactor --- Memola.xcodeproj/project.pbxproj | 6 +- Memola/App/Application.swift | 15 ++++- Memola/App/MemolaApp.swift | 7 ++- Memola/Canvas/Contexts/LineGridContext.swift | 2 +- Memola/Canvas/Contexts/PointGridContext.swift | 2 +- Memola/Canvas/Contexts/ViewPortContext.swift | 2 +- Memola/Canvas/Core/PipelineStates.swift | 2 +- .../Canvas/Elements/Core/ElementGroup.swift | 2 +- .../Stroke/Algorithms/MovingAverage.swift | 2 +- Memola/Canvas/History/History.swift | 2 +- Memola/Canvas/RTree/Node.swift | 2 +- Memola/Canvas/RTree/RTree.swift | 2 +- .../Canvas/RenderPasses/CacheRenderPass.swift | 2 +- .../RenderPasses/EraserRenderPass.swift | 2 +- .../RenderPasses/GraphicRenderPass.swift | 2 +- .../PhotoBackgroundRenderPass.swift | 2 +- .../Canvas/RenderPasses/PhotoRenderPass.swift | 2 +- .../RenderPasses/StrokeRenderPass.swift | 2 +- .../RenderPasses/ViewPortRenderPass.swift | 2 +- Memola/Canvas/Tool/Core/Tool.swift | 4 +- .../ViewController/CanvasViewController.swift | 60 +++++++++---------- .../Views/AppKit/NSCenterClipView.swift | 2 +- .../Views/AppKit/NSSyncScrollView.swift | 2 +- .../View/Bridge/Views/DrawingView.swift | 8 +-- Memola/Canvas/View/Canvas/CanvasView.swift | 12 +++- .../ContextMenuViewModifier.swift | 12 +++- .../OnDismissSearchViewModifier.swift | 8 ++- .../ViewModifiers/OnDragViewModifier.swift | 12 +++- .../Views/CameraView/CameraView.swift | 9 ++- .../Views/ColorPicker/ColorPicker.swift | 24 ++++---- .../Views/Placeholder/Placeholder.swift | 8 ++- .../Dashboard/Dashboard/DashboardView.swift | 10 ++-- .../Dashboard/Details/Memos/MemosView.swift | 36 +++++------ .../Dashboard/Details/Shared/MemoCard.swift | 10 ++-- .../Dashboard/Details/Shared/MemoGrid.swift | 16 +++-- .../Details/Shared/MemoPreview.swift | 14 +++-- .../Dashboard/Details/Trash/TrashView.swift | 28 ++++----- .../Features/Dashboard/Sidebar/Sidebar.swift | 13 ++-- .../Memo/ElementToolbar/ElementToolbar.swift | 19 +++--- Memola/Features/Memo/Memo/MemoView.swift | 24 ++++---- Memola/Features/Memo/PenDock/PenDock.swift | 53 ++++++++-------- .../Memo/PenDock/PenDropDelegate.swift | 12 +++- .../Features/Memo/PhotoDock/PhotoDock.swift | 27 +++++---- .../Memo/PhotoPreview/PhotoPreview.swift | 11 +++- Memola/Features/Memo/Toolbar/Toolbar.swift | 28 ++++----- Memola/Persistence/Core/Persistence.swift | 8 --- Memola/Persistence/Objects/PenObject.swift | 2 +- Memola/Persistence/Objects/PhotoObject.swift | 2 +- Memola/Persistence/Objects/ToolObject.swift | 2 +- Memola/Shortcut/Commands/FileCommands.swift | 4 +- Memola/Shortcut/Commands/ViewCommands.swift | 14 ++--- Memola/Shortcut/Core/Shortcut.swift | 14 ++--- .../ShortcutKey.swift | 2 +- Memola/Utilies/AppScene/ActiveSceneKey.swift | 2 +- .../SidebarVisibility/SidebarVisibility.swift | 13 ++++ 55 files changed, 341 insertions(+), 244 deletions(-) rename Memola/Shortcut/{EnvironmentKeys => EnvironmentValues}/ShortcutKey.swift (85%) create mode 100644 Memola/Utilies/SidebarVisibility/SidebarVisibility.swift diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index f2fd160..f442273 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -409,7 +409,7 @@ children = ( EC2002D32C416002002EBD5F /* Commands */, EC2002DF2C416466002EBD5F /* Core */, - EC2002E72C4167B1002EBD5F /* EnvironmentKeys */, + EC2002E72C4167B1002EBD5F /* EnvironmentValues */, ); path = Shortcut; sourceTree = ""; @@ -423,12 +423,12 @@ path = Core; sourceTree = ""; }; - EC2002E72C4167B1002EBD5F /* EnvironmentKeys */ = { + EC2002E72C4167B1002EBD5F /* EnvironmentValues */ = { isa = PBXGroup; children = ( EC2002E82C4167C5002EBD5F /* ShortcutKey.swift */, ); - path = EnvironmentKeys; + path = EnvironmentValues; sourceTree = ""; }; EC2002EE2C417BBF002EBD5F /* AppScene */ = { diff --git a/Memola/App/Application.swift b/Memola/App/Application.swift index fe73936..fd9972f 100644 --- a/Memola/App/Application.swift +++ b/Memola/App/Application.swift @@ -8,8 +8,21 @@ import Combine import SwiftUI -class Application: NSObject, ObservableObject { +final class Application: NSObject, ObservableObject { + +} +extension Application { + func activateSearchBar() { + #if os(macOS) + guard let toolbar = NSApp.keyWindow?.toolbar else { return } + if let search = toolbar.items.first(where: { $0.itemIdentifier.rawValue == "com.apple.SwiftUI.search" }) as? NSSearchToolbarItem { + search.beginSearchInteraction() + } + #else + #warning("TODO: implement for ipad") + #endif + } } #if os(macOS) diff --git a/Memola/App/MemolaApp.swift b/Memola/App/MemolaApp.swift index cf96907..5889ecd 100644 --- a/Memola/App/MemolaApp.swift +++ b/Memola/App/MemolaApp.swift @@ -10,9 +10,9 @@ import SwiftUI @main struct MemolaApp: App { #if os(macOS) - @NSApplicationDelegateAdaptor(Application.self) var application + @NSApplicationDelegateAdaptor(Application.self) private var application #else - @UIApplicationDelegateAdaptor(Application.self) var application + @UIApplicationDelegateAdaptor(Application.self) private var application #endif var body: some Scene { @@ -30,6 +30,7 @@ struct MemolaApp: App { #if os(macOS) .frame(minWidth: 1000, minHeight: 600) #endif + .environmentObject(application) } #if os(macOS) .defaultPosition(.center) @@ -41,7 +42,7 @@ struct MemolaApp: App { AppCommands() FileCommands() EditCommands() - ViewCommands() + ViewCommands(application: application) } } } diff --git a/Memola/Canvas/Contexts/LineGridContext.swift b/Memola/Canvas/Contexts/LineGridContext.swift index 4dc9b09..68ecfd0 100644 --- a/Memola/Canvas/Contexts/LineGridContext.swift +++ b/Memola/Canvas/Contexts/LineGridContext.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class LineGridContext { +final class LineGridContext { var vertices: [LineGridVertex] = [] var vertexCount: Int = 0 var vertexBuffer: MTLBuffer? diff --git a/Memola/Canvas/Contexts/PointGridContext.swift b/Memola/Canvas/Contexts/PointGridContext.swift index 0f94681..2ab9281 100644 --- a/Memola/Canvas/Contexts/PointGridContext.swift +++ b/Memola/Canvas/Contexts/PointGridContext.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class PointGridContext { +final class PointGridContext { var vertices: [PointGridVertex] = [] var vertexCount: Int = 0 var vertexBuffer: MTLBuffer? diff --git a/Memola/Canvas/Contexts/ViewPortContext.swift b/Memola/Canvas/Contexts/ViewPortContext.swift index f74e6b5..c560a68 100644 --- a/Memola/Canvas/Contexts/ViewPortContext.swift +++ b/Memola/Canvas/Contexts/ViewPortContext.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class ViewPortContext { +final class ViewPortContext { var vertices: [ViewPortVertex] = [] let vertexCount: Int = 4 var vertexBuffer: MTLBuffer? diff --git a/Memola/Canvas/Core/PipelineStates.swift b/Memola/Canvas/Core/PipelineStates.swift index b4e02f3..ac22028 100644 --- a/Memola/Canvas/Core/PipelineStates.swift +++ b/Memola/Canvas/Core/PipelineStates.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -struct PipelineStates { +enum PipelineStates { static func createPointGridPipelineState(from renderer: Renderer, pixelFormat: MTLPixelFormat? = nil) -> MTLRenderPipelineState? { let device = renderer.device let library = renderer.library diff --git a/Memola/Canvas/Elements/Core/ElementGroup.swift b/Memola/Canvas/Elements/Core/ElementGroup.swift index 71c8668..d61365b 100644 --- a/Memola/Canvas/Elements/Core/ElementGroup.swift +++ b/Memola/Canvas/Elements/Core/ElementGroup.swift @@ -7,7 +7,7 @@ import Foundation -class ElementGroup { +final class ElementGroup { var elements: [Element] = [] var type: ElementGroupType diff --git a/Memola/Canvas/Elements/Geometries/Stroke/Algorithms/MovingAverage.swift b/Memola/Canvas/Elements/Geometries/Stroke/Algorithms/MovingAverage.swift index ff4d6f1..242194a 100644 --- a/Memola/Canvas/Elements/Geometries/Stroke/Algorithms/MovingAverage.swift +++ b/Memola/Canvas/Elements/Geometries/Stroke/Algorithms/MovingAverage.swift @@ -7,7 +7,7 @@ import Foundation -class MovingAverage { +final class MovingAverage { private var sum: CGPoint private var points: [CGPoint] private var windowSize: Int diff --git a/Memola/Canvas/History/History.swift b/Memola/Canvas/History/History.swift index a23b8eb..9cbf6c8 100644 --- a/Memola/Canvas/History/History.swift +++ b/Memola/Canvas/History/History.swift @@ -8,7 +8,7 @@ import Combine import Foundation -class History: ObservableObject { +final class History: ObservableObject { var memo: MemoObject? init(memo: MemoObject?) { diff --git a/Memola/Canvas/RTree/Node.swift b/Memola/Canvas/RTree/Node.swift index 2321961..f024183 100644 --- a/Memola/Canvas/RTree/Node.swift +++ b/Memola/Canvas/RTree/Node.swift @@ -7,7 +7,7 @@ import Foundation -class Node where T: Equatable & Comparable { +final class Node where T: Equatable & Comparable { var box: Box var value: T? var isLeaf: Bool diff --git a/Memola/Canvas/RTree/RTree.swift b/Memola/Canvas/RTree/RTree.swift index 168520f..3c69ec8 100644 --- a/Memola/Canvas/RTree/RTree.swift +++ b/Memola/Canvas/RTree/RTree.swift @@ -7,7 +7,7 @@ import Foundation -class RTree where T: Equatable & Comparable { +final class RTree where T: Equatable & Comparable { private var root: Node private let maxEntries: Int private let minEntries: Int diff --git a/Memola/Canvas/RenderPasses/CacheRenderPass.swift b/Memola/Canvas/RenderPasses/CacheRenderPass.swift index 75d4e5b..92aaf9f 100644 --- a/Memola/Canvas/RenderPasses/CacheRenderPass.swift +++ b/Memola/Canvas/RenderPasses/CacheRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class CacheRenderPass: RenderPass { +final class CacheRenderPass: RenderPass { var label: String = "Cache Render Pass" var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/RenderPasses/EraserRenderPass.swift b/Memola/Canvas/RenderPasses/EraserRenderPass.swift index 229a452..f06d781 100644 --- a/Memola/Canvas/RenderPasses/EraserRenderPass.swift +++ b/Memola/Canvas/RenderPasses/EraserRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class EraserRenderPass: RenderPass { +final class EraserRenderPass: RenderPass { var label: String = "Eraser Render Pass" var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/RenderPasses/GraphicRenderPass.swift b/Memola/Canvas/RenderPasses/GraphicRenderPass.swift index c13d903..697bb0d 100644 --- a/Memola/Canvas/RenderPasses/GraphicRenderPass.swift +++ b/Memola/Canvas/RenderPasses/GraphicRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class GraphicRenderPass: RenderPass { +final class GraphicRenderPass: RenderPass { var label: String { "Graphic Render Pass" } var descriptor: MTLRenderPassDescriptor? var graphicTexture: MTLTexture? diff --git a/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift b/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift index 86f1eb5..eaf51f3 100644 --- a/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift +++ b/Memola/Canvas/RenderPasses/PhotoBackgroundRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class PhotoBackgroundRenderPass: RenderPass { +final class PhotoBackgroundRenderPass: RenderPass { var label: String = "Photo Background Render Pass" var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/RenderPasses/PhotoRenderPass.swift b/Memola/Canvas/RenderPasses/PhotoRenderPass.swift index 6761a0e..3a08df1 100644 --- a/Memola/Canvas/RenderPasses/PhotoRenderPass.swift +++ b/Memola/Canvas/RenderPasses/PhotoRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class PhotoRenderPass: RenderPass { +final class PhotoRenderPass: RenderPass { var label: String = "Photo Render Pass" var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/RenderPasses/StrokeRenderPass.swift b/Memola/Canvas/RenderPasses/StrokeRenderPass.swift index f319616..cdbb77a 100644 --- a/Memola/Canvas/RenderPasses/StrokeRenderPass.swift +++ b/Memola/Canvas/RenderPasses/StrokeRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class StrokeRenderPass: RenderPass { +final class StrokeRenderPass: RenderPass { var label: String = "Stroke Render Pass" var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/RenderPasses/ViewPortRenderPass.swift b/Memola/Canvas/RenderPasses/ViewPortRenderPass.swift index d939bb1..cafbb60 100644 --- a/Memola/Canvas/RenderPasses/ViewPortRenderPass.swift +++ b/Memola/Canvas/RenderPasses/ViewPortRenderPass.swift @@ -8,7 +8,7 @@ import MetalKit import Foundation -class ViewPortRenderPass: RenderPass { +final class ViewPortRenderPass: RenderPass { var label: String { "View Port Render Pass"} var descriptor: MTLRenderPassDescriptor? diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 8a413b3..244f3dc 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -10,8 +10,8 @@ import SwiftUI import CoreData import Foundation -public class Tool: NSObject, ObservableObject { - let object: ToolObject +final class Tool: NSObject, ObservableObject { + private let object: ToolObject @Published var pens: [Pen] = [] diff --git a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift index 819a7c1..5c045d5 100644 --- a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift +++ b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift @@ -10,21 +10,21 @@ import SwiftUI import MetalKit import Foundation -class CanvasViewController: Platform.ViewController { - let drawingView: DrawingView - let scrollView: Platform.ScrollView = Platform.ScrollView() - var renderView: MTKView { +final class CanvasViewController: Platform.ViewController { + private let drawingView: DrawingView + private let scrollView: Platform.ScrollView = Platform.ScrollView() + private var renderView: MTKView { drawingView.renderView } - var photoInsertGesture: Platform.TapGestureRecognizer? + private var photoInsertGesture: Platform.TapGestureRecognizer? - let tool: Tool - let canvas: Canvas - let history: History - let renderer: Renderer + private let tool: Tool + private let canvas: Canvas + private let history: History + private let renderer: Renderer - var cancellables: Set = [] + private var cancellables: Set = [] init(tool: Tool, canvas: Canvas, history: History) { self.tool = tool @@ -94,7 +94,7 @@ class CanvasViewController: Platform.ViewController { } extension CanvasViewController { - func configureViews() { + private func configureViews() { #if os(macOS) view.wantsLayer = true view.layer?.backgroundColor = NSColor.white.cgColor @@ -153,7 +153,7 @@ extension CanvasViewController { #endif } - func resizeDocumentView(to newSize: CGSize? = nil) { + private func resizeDocumentView(to newSize: CGSize? = nil) { #if os(macOS) scrollView.layoutSubtreeIfNeeded() #else @@ -193,7 +193,7 @@ extension CanvasViewController { } #if os(iOS) - func centerDocumentView(to newSize: CGSize? = nil) { + private func centerDocumentView(to newSize: CGSize? = nil) { let documentViewSize = drawingView.frame.size let scrollViewSize = newSize ?? view.frame.size let verticalPadding = documentViewSize.height < scrollViewSize.height ? (scrollViewSize.height - documentViewSize.height) / 2 : 0 @@ -202,7 +202,7 @@ extension CanvasViewController { } #endif - func updateDocumentBounds() { + private func updateDocumentBounds() { #if os(macOS) let ratio = drawingView.ratio var bounds = scrollView.convert(scrollView.bounds, to: drawingView) @@ -225,7 +225,7 @@ extension CanvasViewController { } extension CanvasViewController { - func configureListeners() { + private func configureListeners() { #if os(macOS) NotificationCenter.default.publisher(for: NSScrollView.didEndLiveMagnifyNotification, object: scrollView) .sink { [weak self] _ in @@ -292,12 +292,12 @@ extension CanvasViewController { } extension CanvasViewController { - func loadMemo() { + private func loadMemo() { tool.load() canvas.load() } - func canvasStateChanged(_ state: Canvas.State) { + private func canvasStateChanged(_ state: Canvas.State) { guard state == .loaded else { return } renderView.delegate = self renderer.resize(on: renderView, to: renderView.drawableSize) @@ -318,7 +318,7 @@ extension CanvasViewController: MTKViewDelegate { } extension CanvasViewController { - func configureGestures() { + private func configureGestures() { let photoInsertGesture = Platform.TapGestureRecognizer(target: self, action: #selector(recognizeTapGesture)) #if os(macOS) photoInsertGesture.numberOfClicksRequired = 1 @@ -329,7 +329,7 @@ extension CanvasViewController { scrollView.addGestureRecognizer(photoInsertGesture) } - @objc func recognizeTapGesture(_ gesture: Platform.TapGestureRecognizer) { + @objc private func recognizeTapGesture(_ gesture: Platform.TapGestureRecognizer) { guard let photoItem = tool.selectedPhotoItem else { return } withAnimation { tool.selectedPhotoItem = nil @@ -406,7 +406,7 @@ extension CanvasViewController: UIScrollViewDelegate { #endif extension CanvasViewController { - func magnificationStarted() { + private func magnificationStarted() { guard !renderer.updatesViewPort else { return } drawingView.touchCancelled() canvas.updateClipBounds(scrollView, on: drawingView) @@ -414,21 +414,21 @@ extension CanvasViewController { renderer.setUpdatesViewPort(true) } - func magnificationEnded() { + private func magnificationEnded() { renderer.setUpdatesViewPort(false) renderer.setRedrawsGraphicRender() renderView.draw() drawingView.enableUserInteraction() } - func draggingStarted() { + private func draggingStarted() { guard !renderer.updatesViewPort else { return } canvas.updateClipBounds(scrollView, on: drawingView) drawingView.disableUserInteraction() renderer.setUpdatesViewPort(true) } - func draggingEnded() { + private func draggingEnded() { renderer.setUpdatesViewPort(false) renderer.setRedrawsGraphicRender() renderView.draw() @@ -437,13 +437,13 @@ extension CanvasViewController { } extension CanvasViewController { - func penChanged(to pen: Pen?) { + private func penChanged(to pen: Pen?) { if let pen, let device = drawingView.renderView.device { pen.style.loadTexture(on: device) } } - func toolSelectionChanged(to selection: ToolSelection) { + private func toolSelectionChanged(to selection: ToolSelection) { let enablesScrolling: Bool let enablesDrawing: Bool let enablesPhotoInsertion: Bool @@ -474,7 +474,7 @@ extension CanvasViewController { } extension CanvasViewController { - func zoomChanged(_ zoomScale: CGFloat) { + private func zoomChanged(_ zoomScale: CGFloat) { #if os(macOS) let rect = scrollView.documentVisibleRect scrollView.setMagnification(zoomScale, centeredAt: CGPoint(x: rect.midX, y: rect.midY)) @@ -483,7 +483,7 @@ extension CanvasViewController { #endif } - func lockModeChanged(_ state: Bool) { + private func lockModeChanged(_ state: Bool) { #if os(macOS) #warning("TODO: implement for macos") #else @@ -491,7 +491,7 @@ extension CanvasViewController { #endif } - func gridModeChanged(_ mode: GridMode) { + private func gridModeChanged(_ mode: GridMode) { drawingView.disableUserInteraction() renderer.setRedrawsGraphicRender() renderView.draw() @@ -500,7 +500,7 @@ extension CanvasViewController { } extension CanvasViewController { - func historyUndid() { + private func historyUndid() { guard let event = history.undo() else { return } drawingView.disableUserInteraction() canvas.graphicContext.undoGraphic(for: event) @@ -509,7 +509,7 @@ extension CanvasViewController { drawingView.enableUserInteraction() } - func historyRedid() { + private func historyRedid() { guard let event = history.redo() else { return } drawingView.disableUserInteraction() canvas.graphicContext.redoGraphic(for: event) diff --git a/Memola/Canvas/View/Bridge/Views/AppKit/NSCenterClipView.swift b/Memola/Canvas/View/Bridge/Views/AppKit/NSCenterClipView.swift index a9c48dd..94d785a 100644 --- a/Memola/Canvas/View/Bridge/Views/AppKit/NSCenterClipView.swift +++ b/Memola/Canvas/View/Bridge/Views/AppKit/NSCenterClipView.swift @@ -8,7 +8,7 @@ #if canImport(AppKit) import AppKit -class NSCenterClipView: NSClipView { +final class NSCenterClipView: NSClipView { override func constrainBoundsRect(_ proposedBounds: NSRect) -> NSRect { var rect = super.constrainBoundsRect(proposedBounds) if let containerView = self.documentView { diff --git a/Memola/Canvas/View/Bridge/Views/AppKit/NSSyncScrollView.swift b/Memola/Canvas/View/Bridge/Views/AppKit/NSSyncScrollView.swift index 280cfc4..4ca1a55 100644 --- a/Memola/Canvas/View/Bridge/Views/AppKit/NSSyncScrollView.swift +++ b/Memola/Canvas/View/Bridge/Views/AppKit/NSSyncScrollView.swift @@ -13,7 +13,7 @@ protocol NSSyncScrollViewDelegate: AnyObject { func scrollViewDidScroll(_ scrollView: NSSyncScrollView) } -class NSSyncScrollView: NSScrollView { +final class NSSyncScrollView: NSScrollView { weak var delegate: NSSyncScrollViewDelegate? override func magnify(with event: NSEvent) { diff --git a/Memola/Canvas/View/Bridge/Views/DrawingView.swift b/Memola/Canvas/View/Bridge/Views/DrawingView.swift index 73e7ff2..71833c2 100644 --- a/Memola/Canvas/View/Bridge/Views/DrawingView.swift +++ b/Memola/Canvas/View/Bridge/Views/DrawingView.swift @@ -9,10 +9,10 @@ import SwiftUI import MetalKit import Foundation -class DrawingView: Platform.View { - let tool: Tool - let canvas: Canvas - let history: History +final class DrawingView: Platform.View { + private let tool: Tool + private let canvas: Canvas + private let history: History let renderView: MTKView var ratio: CGFloat { canvas.size.width / bounds.width } diff --git a/Memola/Canvas/View/Canvas/CanvasView.swift b/Memola/Canvas/View/Canvas/CanvasView.swift index 9c03657..ba1f52e 100644 --- a/Memola/Canvas/View/Canvas/CanvasView.swift +++ b/Memola/Canvas/View/Canvas/CanvasView.swift @@ -8,9 +8,15 @@ import SwiftUI struct CanvasView: Platform.ViewControllerRepresentable { - @ObservedObject var tool: Tool - @ObservedObject var canvas: Canvas - @ObservedObject var history: History + @ObservedObject private var tool: Tool + @ObservedObject private var canvas: Canvas + @ObservedObject private var history: History + + init(tool: Tool, canvas: Canvas, history: History) { + self.tool = tool + self.canvas = canvas + self.history = history + } #if os(macOS) func makeNSViewController(context: Context) -> CanvasViewController { diff --git a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift index 34f458c..3b0e4d0 100644 --- a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift +++ b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift @@ -9,9 +9,15 @@ import SwiftUI import Foundation private struct ContextMenuViewModifier: ViewModifier { - let condition: Bool - let menuItems: () -> MenuContent - let preview: () -> Preview + private let condition: Bool + private let menuItems: () -> MenuContent + private let preview: () -> Preview + + init(condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent, @ViewBuilder preview: @escaping () -> Preview) { + self.condition = condition + self.menuItems = menuItems + self.preview = preview + } @ViewBuilder func body(content: Content) -> some View { diff --git a/Memola/Components/ViewModifiers/OnDismissSearchViewModifier.swift b/Memola/Components/ViewModifiers/OnDismissSearchViewModifier.swift index 10c74f6..6f5f973 100644 --- a/Memola/Components/ViewModifiers/OnDismissSearchViewModifier.swift +++ b/Memola/Components/ViewModifiers/OnDismissSearchViewModifier.swift @@ -8,9 +8,13 @@ import SwiftUI private struct OnDismissSearchViewModifier: ViewModifier { - @Environment(\.dismissSearch) var dismissSearch + @Environment(\.dismissSearch) private var dismissSearch - @Binding var isActive: Bool + @Binding private var isActive: Bool + + init(isActive: Binding) { + self._isActive = isActive + } func body(content: Content) -> some View { content diff --git a/Memola/Components/ViewModifiers/OnDragViewModifier.swift b/Memola/Components/ViewModifiers/OnDragViewModifier.swift index c31c141..1305779 100644 --- a/Memola/Components/ViewModifiers/OnDragViewModifier.swift +++ b/Memola/Components/ViewModifiers/OnDragViewModifier.swift @@ -9,9 +9,15 @@ import SwiftUI import Foundation private struct OnDragViewModifier: ViewModifier { - let condition: Bool - let data: () -> NSItemProvider - let preview: () -> Preview + private let condition: Bool + private let data: () -> NSItemProvider + private let preview: () -> Preview + + init(condition: Bool, data: @escaping () -> NSItemProvider, @ViewBuilder preview: @escaping () -> Preview) { + self.condition = condition + self.data = data + self.preview = preview + } @ViewBuilder func body(content: Content) -> some View { diff --git a/Memola/Components/Views/CameraView/CameraView.swift b/Memola/Components/Views/CameraView/CameraView.swift index 523a4ea..25abccd 100644 --- a/Memola/Components/Views/CameraView/CameraView.swift +++ b/Memola/Components/Views/CameraView/CameraView.swift @@ -9,12 +9,17 @@ import SwiftUI #if os(iOS) struct CameraView: UIViewControllerRepresentable { - @Binding var image: UIImage? + @Binding private var image: UIImage? - @ObservedObject var canvas: Canvas + @ObservedObject private var canvas: Canvas @Environment(\.dismiss) private var dismiss + init(image: Binding, canvas: Canvas) { + self._image = image + self.canvas = canvas + } + func makeUIViewController(context: Context) -> UIImagePickerController { let picker = UIImagePickerController() picker.sourceType = .camera diff --git a/Memola/Components/Views/ColorPicker/ColorPicker.swift b/Memola/Components/Views/ColorPicker/ColorPicker.swift index fe29a9e..5346e61 100644 --- a/Memola/Components/Views/ColorPicker/ColorPicker.swift +++ b/Memola/Components/Views/ColorPicker/ColorPicker.swift @@ -9,14 +9,18 @@ import SwiftUI import Foundation struct ColorPicker: View { - @State var hue: Double = 1 - @State var saturation: Double = 0 - @State var brightness: Double = 1 - @State var alpha: Double = 1 + @State private var hue: Double = 1 + @State private var saturation: Double = 0 + @State private var brightness: Double = 1 + @State private var alpha: Double = 1 - @Binding var color: Color + @Binding private var color: Color - let size: CGFloat = 20 + private let size: CGFloat = 20 + + init(color: Binding) { + self._color = color + } var body: some View { VStack(spacing: 10) { @@ -43,7 +47,7 @@ struct ColorPicker: View { } @ViewBuilder - var colorPicker: some View { + private var colorPicker: some View { GeometryReader { proxy in ZStack { Color(hue: hue, saturation: 1, brightness: 1) @@ -92,7 +96,7 @@ struct ColorPicker: View { } @ViewBuilder - var hueSlider: some View { + private var hueSlider: some View { GeometryReader { proxy in ZStack(alignment: .leading) { LinearGradient( @@ -138,7 +142,7 @@ struct ColorPicker: View { } @ViewBuilder - var alphaSlider: some View { + private var alphaSlider: some View { GeometryReader { proxy in let color = Color(hue: hue, saturation: saturation, brightness: brightness) ZStack(alignment: .leading) { @@ -190,7 +194,7 @@ struct ColorPicker: View { .frame(height: size) } - func updateColor() { + private func updateColor() { color = Color(hue: hue, saturation: saturation, brightness: brightness).opacity(0.7 * alpha + 0.3) } } diff --git a/Memola/Components/Views/Placeholder/Placeholder.swift b/Memola/Components/Views/Placeholder/Placeholder.swift index c2d2828..e74cb23 100644 --- a/Memola/Components/Views/Placeholder/Placeholder.swift +++ b/Memola/Components/Views/Placeholder/Placeholder.swift @@ -8,9 +8,13 @@ import SwiftUI struct Placeholder: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - let info: Info + private let info: Info + + init(info: Info) { + self.info = info + } var body: some View { VStack(spacing: 15) { diff --git a/Memola/Features/Dashboard/Dashboard/DashboardView.swift b/Memola/Features/Dashboard/Dashboard/DashboardView.swift index a319f08..bfccddf 100644 --- a/Memola/Features/Dashboard/Dashboard/DashboardView.swift +++ b/Memola/Features/Dashboard/Dashboard/DashboardView.swift @@ -8,14 +8,14 @@ import SwiftUI struct DashboardView: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @StateObject var memoManager: MemoManager = .shared + @StateObject private var memoManager: MemoManager = .shared - @State var sidebarItem: SidebarItem? = .memos - @AppStorage("memola.app.scene.side-bar.column-visibility") var columnVisibility: NavigationSplitViewVisibility = .all + @State private var sidebarItem: SidebarItem? = .memos + @AppStorage("memola.app.scene.side-bar.column-visibility") private var columnVisibility: NavigationSplitViewVisibility = .all - @Namespace var namespace + @Namespace private var namespace var body: some View { #if os(macOS) diff --git a/Memola/Features/Dashboard/Details/Memos/MemosView.swift b/Memola/Features/Dashboard/Details/Memos/MemosView.swift index 9e9569a..78c597b 100644 --- a/Memola/Features/Dashboard/Details/Memos/MemosView.swift +++ b/Memola/Features/Dashboard/Details/Memos/MemosView.swift @@ -8,21 +8,21 @@ import SwiftUI struct MemosView: View { - @Environment(\.shortcut) var shortcut - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.shortcut) private var shortcut + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @FetchRequest var memoObjects: FetchedResults + @FetchRequest private var memoObjects: FetchedResults - @State var query: String = "" - @State var currentDate: Date = .now - @State var isActiveSearch: Bool = false + @State private var query: String = "" + @State private var currentDate: Date = .now + @State private var isActiveSearch: Bool = false - @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.sort") private var sort: Sort = .recent + @AppStorage("memola.memo-objects.memos.filter") private var filter: Filter = .none - let timer = Timer.publish(every: 60, on: .main, in: .common).autoconnect() + private let timer = Timer.publish(every: 60, on: .main, in: .common).autoconnect() - var placeholder: Placeholder.Info { + private var placeholder: Placeholder.Info { query.isEmpty ? .memoEmpty : .memoNotFound } @@ -157,12 +157,12 @@ struct MemosView: View { .onReceive(timer) { date in currentDate = date } - .onReceive(shortcut.publisher()) { shortcut in + .onReceive(shortcut.publisher) { shortcut in handleShortcut(for: shortcut) } } - func memoCard(_ memoObject: MemoObject, _ cellWidth: CGFloat) -> some View { + private func memoCard(_ memoObject: MemoObject, _ cellWidth: CGFloat) -> some View { MemoCard(memoObject: memoObject, cellWidth: cellWidth) { card in card .contextMenu { @@ -208,7 +208,7 @@ struct MemosView: View { } } - func createMemo(title: String) { + private func createMemo(title: String) { let memoObject = MemoObject(\.viewContext) memoObject.title = title memoObject.createdAt = .now @@ -258,11 +258,11 @@ struct MemosView: View { } } - func openMemo(for memo: MemoObject) { + private func openMemo(for memo: MemoObject) { MemoManager.shared.openMemo(memo) } - func updatePredicate() { + private func updatePredicate() { var predicates: [NSPredicate] = [NSPredicate(format: "isTrash = NO")] if !query.isEmpty { predicates.append(NSPredicate(format: "title contains[c] %@", query)) @@ -273,14 +273,14 @@ struct MemosView: View { memoObjects.nsPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates) } - func toggleFavorite(for memo: MemoObject) { + private func toggleFavorite(for memo: MemoObject) { memo.isFavorite.toggle() withPersistence(\.viewContext) { context in try context.saveIfNeeded() } } - func markAsTrash(for memo: MemoObject) { + private func markAsTrash(for memo: MemoObject) { memo.isTrash = true memo.deletedAt = .now withPersistence(\.viewContext) { context in @@ -288,7 +288,7 @@ struct MemosView: View { } } - func handleShortcut(for shortcut: Shortcuts) { + private func handleShortcut(for shortcut: Shortcuts) { switch shortcut { case .newMemo: if MemoManager.shared.memoObject == nil { diff --git a/Memola/Features/Dashboard/Details/Shared/MemoCard.swift b/Memola/Features/Dashboard/Details/Shared/MemoCard.swift index 9f75ee5..dfde35f 100644 --- a/Memola/Features/Dashboard/Details/Shared/MemoCard.swift +++ b/Memola/Features/Dashboard/Details/Shared/MemoCard.swift @@ -8,12 +8,12 @@ import SwiftUI struct MemoCard: View { - let memoObject: MemoObject - let cellWidth: CGFloat - let modifyPreview: ((MemoPreview) -> Preview)? - let details: () -> Detail + private let memoObject: MemoObject + private let cellWidth: CGFloat + private let modifyPreview: ((MemoPreview) -> Preview)? + private let details: () -> Detail - init(memoObject: MemoObject, cellWidth: CGFloat, @ViewBuilder modifyPreview: @escaping (MemoPreview) -> Preview, @ViewBuilder details: @escaping () -> Detail) { + init(memoObject: MemoObject, cellWidth: CGFloat, modifyPreview: ((MemoPreview) -> Preview)?, @ViewBuilder details: @escaping () -> Detail) { self.memoObject = memoObject self.cellWidth = cellWidth self.modifyPreview = modifyPreview diff --git a/Memola/Features/Dashboard/Details/Shared/MemoGrid.swift b/Memola/Features/Dashboard/Details/Shared/MemoGrid.swift index 2b4fa69..e3b5315 100644 --- a/Memola/Features/Dashboard/Details/Shared/MemoGrid.swift +++ b/Memola/Features/Dashboard/Details/Shared/MemoGrid.swift @@ -8,12 +8,18 @@ import SwiftUI struct MemoGrid: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass - let memoObjects: FetchedResults - let placeholder: Placeholder.Info - @ViewBuilder let card: (MemoObject, CGFloat) -> Card + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + private let memoObjects: FetchedResults + private let placeholder: Placeholder.Info + @ViewBuilder private let card: (MemoObject, CGFloat) -> Card - var maxCellWidth: CGFloat { + init(memoObjects: FetchedResults, placeholder: Placeholder.Info, @ViewBuilder card: @escaping (MemoObject, CGFloat) -> Card) { + self.memoObjects = memoObjects + self.placeholder = placeholder + self.card = card + } + + private var maxCellWidth: CGFloat { if horizontalSizeClass == .compact { return 180 } diff --git a/Memola/Features/Dashboard/Details/Shared/MemoPreview.swift b/Memola/Features/Dashboard/Details/Shared/MemoPreview.swift index b57f80f..6609f59 100644 --- a/Memola/Features/Dashboard/Details/Shared/MemoPreview.swift +++ b/Memola/Features/Dashboard/Details/Shared/MemoPreview.swift @@ -8,11 +8,17 @@ import SwiftUI struct MemoPreview: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - let preview: Data? - let cellWidth: CGFloat - var cellHeight: CGFloat { + private let preview: Data? + private let cellWidth: CGFloat + + init(preview: Data?, cellWidth: CGFloat) { + self.preview = preview + self.cellWidth = cellWidth + } + + private var cellHeight: CGFloat { if horizontalSizeClass == .compact { return 120 } diff --git a/Memola/Features/Dashboard/Details/Trash/TrashView.swift b/Memola/Features/Dashboard/Details/Trash/TrashView.swift index bda573c..3336c90 100644 --- a/Memola/Features/Dashboard/Details/Trash/TrashView.swift +++ b/Memola/Features/Dashboard/Details/Trash/TrashView.swift @@ -8,19 +8,19 @@ import SwiftUI struct TrashView: View { - @Environment(\.shortcut) var shortcut - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.shortcut) private var shortcut + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @FetchRequest var memoObjects: FetchedResults + @FetchRequest private var memoObjects: FetchedResults - @State var query: String = "" - @State var restoredMemo: MemoObject? - @State var deletedMemo: MemoObject? - @State var isActiveSearch: Bool = false + @State private var query: String = "" + @State private var restoredMemo: MemoObject? + @State private var deletedMemo: MemoObject? + @State private var isActiveSearch: Bool = false - @Binding var sidebarItem: SidebarItem? + @Binding private var sidebarItem: SidebarItem? - var placeholder: Placeholder.Info { + private var placeholder: Placeholder.Info { query.isEmpty ? .trashEmpty : .trashNotFound } @@ -102,7 +102,7 @@ struct TrashView: View { } } - func memoCard(_ memoObject: MemoObject, _ cellWidth: CGFloat) -> some View { + private func memoCard(_ memoObject: MemoObject, _ cellWidth: CGFloat) -> some View { MemoCard(memoObject: memoObject, cellWidth: cellWidth) { card in card .contextMenu { @@ -131,7 +131,7 @@ struct TrashView: View { } } - func updatePredicate() { + private func updatePredicate() { var predicates: [NSPredicate] = [NSPredicate(format: "isTrash = YES")] if !query.isEmpty { predicates.append(NSPredicate(format: "title contains[c] %@", query)) @@ -139,7 +139,7 @@ struct TrashView: View { memoObjects.nsPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates) } - func restoreMemo(for memo: MemoObject?) { + private func restoreMemo(for memo: MemoObject?) { guard let memo else { return } memo.isTrash = false memo.deletedAt = nil @@ -148,7 +148,7 @@ struct TrashView: View { } } - func restoreAndOpenMemo(for memo: MemoObject?) { + private func restoreAndOpenMemo(for memo: MemoObject?) { restoreMemo(for: memo) self.sidebarItem = .memos if let memo { @@ -156,7 +156,7 @@ struct TrashView: View { } } - func deleteMemo(for memo: MemoObject?) { + private func deleteMemo(for memo: MemoObject?) { guard let memo else { return } withPersistenceSync(\.viewContext) { context in context.delete(memo) diff --git a/Memola/Features/Dashboard/Sidebar/Sidebar.swift b/Memola/Features/Dashboard/Sidebar/Sidebar.swift index 0314677..3d1794f 100644 --- a/Memola/Features/Dashboard/Sidebar/Sidebar.swift +++ b/Memola/Features/Dashboard/Sidebar/Sidebar.swift @@ -8,10 +8,15 @@ import SwiftUI struct Sidebar: View { - let sidebarItems: [SidebarItem] = [.memos, .trash] - @Binding var sidebarItem: SidebarItem? + private let sidebarItems: [SidebarItem] = [.memos, .trash] + @Binding private var sidebarItem: SidebarItem? - let horizontalSizeClass: UserInterfaceSizeClass? + private let horizontalSizeClass: UserInterfaceSizeClass? + + init(sidebarItem: Binding, horizontalSizeClass: UserInterfaceSizeClass?) { + self._sidebarItem = sidebarItem + self.horizontalSizeClass = horizontalSizeClass + } var body: some View { List(selection: $sidebarItem) { @@ -51,7 +56,7 @@ struct Sidebar: View { } extension Sidebar { - struct SidebarItemButtonStyle: ButtonStyle { + fileprivate struct SidebarItemButtonStyle: ButtonStyle { let state: State func makeBody(configuration: Configuration) -> some View { diff --git a/Memola/Features/Memo/ElementToolbar/ElementToolbar.swift b/Memola/Features/Memo/ElementToolbar/ElementToolbar.swift index 9c352b6..b8f3387 100644 --- a/Memola/Features/Memo/ElementToolbar/ElementToolbar.swift +++ b/Memola/Features/Memo/ElementToolbar/ElementToolbar.swift @@ -10,12 +10,17 @@ import PhotosUI import AVFoundation struct ElementToolbar: View { - @Environment(\.colorScheme) var colorScheme - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.colorScheme) private var colorScheme + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - let size: CGFloat = 40 - @ObservedObject var tool: Tool - @ObservedObject var canvas: Canvas + private let size: CGFloat = 40 + @ObservedObject private var tool: Tool + @ObservedObject private var canvas: Canvas + + init(tool: Tool, canvas: Canvas) { + self.tool = tool + self.canvas = canvas + } var body: some View { Group { @@ -41,7 +46,7 @@ struct ElementToolbar: View { .foregroundStyle(Color.accentColor) } - var regularToolbar: some View { + private var regularToolbar: some View { HStack(spacing: 0) { Button { withAnimation { @@ -124,7 +129,7 @@ struct ElementToolbar: View { .transition(.move(edge: .top).combined(with: .blurReplace)) } - var compactToolbar: some View { + private var compactToolbar: some View { HStack(spacing: 0) { Button { withAnimation { diff --git a/Memola/Features/Memo/Memo/MemoView.swift b/Memola/Features/Memo/Memo/MemoView.swift index 1891047..3d28666 100644 --- a/Memola/Features/Memo/Memo/MemoView.swift +++ b/Memola/Features/Memo/Memo/MemoView.swift @@ -9,17 +9,17 @@ import SwiftUI import CoreData struct MemoView: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @StateObject var tool: Tool - @StateObject var canvas: Canvas - @StateObject var history: History + @StateObject private var tool: Tool + @StateObject private var canvas: Canvas + @StateObject private var history: History - @State var title: String - @FocusState var textFieldState: Bool + @State private var title: String + @FocusState private var textFieldState: Bool - let memo: MemoObject - let size: CGFloat = 40 + private let memo: MemoObject + private let size: CGFloat = 40 init(memo: MemoObject) { self.memo = memo @@ -63,7 +63,7 @@ struct MemoView: View { } } - var canvasView: some View { + private var canvasView: some View { CanvasView(tool: tool, canvas: canvas, history: history) .ignoresSafeArea() .overlay(alignment: .trailing) { @@ -88,7 +88,7 @@ struct MemoView: View { } } - var compactCanvasView: some View { + private var compactCanvasView: some View { CanvasView(tool: tool, canvas: canvas, history: history) .ignoresSafeArea() .overlay(alignment: .bottom) { @@ -115,7 +115,7 @@ struct MemoView: View { } @ViewBuilder - var zoomControl: some View { + private var zoomControl: some View { let upperBound: CGFloat = 400 let lowerBound: CGFloat = 10 let zoomScale: CGFloat = (((canvas.zoomScale - canvas.minimumZoomScale) * (upperBound - lowerBound) / (canvas.maximumZoomScale - canvas.minimumZoomScale)) + lowerBound).rounded() @@ -187,7 +187,7 @@ struct MemoView: View { #endif } - func loadingIndicator(_ title: String) -> some View { + private func loadingIndicator(_ title: String) -> some View { ProgressView { Text(title) } diff --git a/Memola/Features/Memo/PenDock/PenDock.swift b/Memola/Features/Memo/PenDock/PenDock.swift index 0f2d2e0..f11f4d1 100644 --- a/Memola/Features/Memo/PenDock/PenDock.swift +++ b/Memola/Features/Memo/PenDock/PenDock.swift @@ -8,25 +8,30 @@ import SwiftUI struct PenDock: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass - @ObservedObject var tool: Tool - @ObservedObject var canvas: Canvas + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + @ObservedObject private var tool: Tool + @ObservedObject private var canvas: Canvas - let size: CGFloat = 40 - let penPropertySize: CGFloat = 32 - var width: CGFloat { + private let size: CGFloat = 40 + private let penPropertySize: CGFloat = 32 + private var width: CGFloat { horizontalSizeClass == .compact ? size / 2 : size } - var height: CGFloat { + private var height: CGFloat { horizontalSizeClass == .compact ? size : size / 2 } - @State var refreshScrollId: UUID = UUID() - @State var opensColorPicker: Bool = false + @State private var refreshScrollId: UUID = UUID() + @State private var opensColorPicker: Bool = false #if os(macOS) - @State var showsThinknessPicker: Bool = false + @State private var showsThinknessPicker: Bool = false #endif + init(tool: Tool, canvas: Canvas) { + self.tool = tool + self.canvas = canvas + } + var body: some View { #if os(macOS) GeometryReader { proxy in @@ -101,7 +106,7 @@ struct PenDock: View { } @ViewBuilder - var penItemList: some View { + private var penItemList: some View { VStack(alignment: .trailing, spacing: 0) { ScrollViewReader { proxy in ScrollView(.vertical, showsIndicators: false) { @@ -139,7 +144,7 @@ struct PenDock: View { } @ViewBuilder - var compactPenItemList: some View { + private var compactPenItemList: some View { ScrollViewReader { proxy in ScrollView(.horizontal, showsIndicators: false) { LazyHStack(spacing: 0) { @@ -165,7 +170,7 @@ struct PenDock: View { } } - func penItem(_ pen: Pen) -> some View { + private func penItem(_ pen: Pen) -> some View { ZStack { penShadow(pen) if let tip = pen.style.icon.tip { @@ -242,7 +247,7 @@ struct PenDock: View { } } - func compactPenItem(_ pen: Pen) -> some View { + private func compactPenItem(_ pen: Pen) -> some View { ZStack { compactPenShadow(pen) if let tip = pen.style.compactIcon.tip { @@ -319,7 +324,7 @@ struct PenDock: View { } @ViewBuilder - var penPropertyTool: some View { + private var penPropertyTool: some View { if let pen = tool.selectedPen { VStack(spacing: 5) { if pen.strokeStyle == .marker { @@ -340,7 +345,7 @@ struct PenDock: View { } @ViewBuilder - var compactPenPropertyTool: some View { + private var compactPenPropertyTool: some View { if let pen = tool.selectedPen { HStack(spacing: 8) { penThicknessPicker(pen) @@ -356,7 +361,7 @@ struct PenDock: View { } } - func penColorPicker(_ pen: Pen) -> some View { + private func penColorPicker(_ pen: Pen) -> some View { Button { opensColorPicker = true } label: { @@ -409,7 +414,7 @@ struct PenDock: View { } @ViewBuilder - func penThicknessPicker(_ pen: Pen) -> some View { + private func penThicknessPicker(_ pen: Pen) -> some View { let minimum: CGFloat = pen.style.thickness.min let maximum: CGFloat = pen.style.thickness.max let start: CGFloat = 4 @@ -453,7 +458,7 @@ struct PenDock: View { } } - var newPenButton: some View { + private var newPenButton: some View { Button { createNewPen() } label: { @@ -474,7 +479,7 @@ struct PenDock: View { #endif } - func penPreview(_ pen: Pen) -> some View { + private func penPreview(_ pen: Pen) -> some View { ZStack { if let tip = pen.style.icon.tip { Image(tip) @@ -490,7 +495,7 @@ struct PenDock: View { .padding(.leading, 10) } - func compactPenPreview(_ pen: Pen) -> some View { + private func compactPenPreview(_ pen: Pen) -> some View { ZStack { if let tip = pen.style.compactIcon.tip { Image(tip) @@ -506,7 +511,7 @@ struct PenDock: View { .padding(.horizontal, 5) } - func penShadow(_ pen: Pen) -> some View { + private func penShadow(_ pen: Pen) -> some View { ZStack { Group { if let tip = pen.style.icon.tip { @@ -530,7 +535,7 @@ struct PenDock: View { } } - func compactPenShadow(_ pen: Pen) -> some View { + private func compactPenShadow(_ pen: Pen) -> some View { ZStack { Group { if let tip = pen.style.compactIcon.tip { @@ -554,7 +559,7 @@ struct PenDock: View { } } - func createNewPen() { + private func createNewPen() { let pen = PenObject.createObject(\.viewContext, penStyle: .marker) var selectedPen = tool.selectedPen selectedPen = (selectedPen?.strokeStyle == .marker ? (selectedPen ?? tool.pens.last) : tool.pens.last) diff --git a/Memola/Features/Memo/PenDock/PenDropDelegate.swift b/Memola/Features/Memo/PenDock/PenDropDelegate.swift index 8557f34..e5dfc31 100644 --- a/Memola/Features/Memo/PenDock/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenDock/PenDropDelegate.swift @@ -9,9 +9,15 @@ import SwiftUI import Foundation struct PenDropDelegate: DropDelegate { - let id: String - @ObservedObject var tool: Tool - let action: () -> Void + private let id: String + @ObservedObject private var tool: Tool + private let action: () -> Void + + init(id: String, tool: Tool, action: @escaping () -> Void) { + self.id = id + self.tool = tool + self.action = action + } func performDrop(info: DropInfo) -> Bool { tool.draggedPen = nil diff --git a/Memola/Features/Memo/PhotoDock/PhotoDock.swift b/Memola/Features/Memo/PhotoDock/PhotoDock.swift index bdc0983..66f4116 100644 --- a/Memola/Features/Memo/PhotoDock/PhotoDock.swift +++ b/Memola/Features/Memo/PhotoDock/PhotoDock.swift @@ -9,16 +9,21 @@ import SwiftUI import PhotosUI struct PhotoDock: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass - - let size: CGFloat = 40 + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @ObservedObject var tool: Tool - @ObservedObject var canvas: Canvas + private let size: CGFloat = 40 - @State var opensCamera: Bool = false - @State var isCameraAccessDenied: Bool = false - @State var photosPickerItem: PhotosPickerItem? + @ObservedObject private var tool: Tool + @ObservedObject private var canvas: Canvas + + @State private var opensCamera: Bool = false + @State private var isCameraAccessDenied: Bool = false + @State private var photosPickerItem: PhotosPickerItem? + + init(tool: Tool, canvas: Canvas) { + self.tool = tool + self.canvas = canvas + } var body: some View { Group { @@ -71,7 +76,7 @@ struct PhotoDock: View { } } - var photoOption: some View { + private var photoOption: some View { VStack(spacing: 0) { #if os(iOS) Button { @@ -126,7 +131,7 @@ struct PhotoDock: View { .transition(.move(edge: .trailing).combined(with: .blurReplace)) } - var compactPhotoOption: some View { + private var compactPhotoOption: some View { HStack(spacing: 0) { #if os(iOS) Button { @@ -181,7 +186,7 @@ struct PhotoDock: View { .transition(.move(edge: .bottom).combined(with: .blurReplace)) } - func openCamera() { + private func openCamera() { let status = AVCaptureDevice.authorizationStatus(for: .video) switch status { case .notDetermined: diff --git a/Memola/Features/Memo/PhotoPreview/PhotoPreview.swift b/Memola/Features/Memo/PhotoPreview/PhotoPreview.swift index 440d2f1..35e7a17 100644 --- a/Memola/Features/Memo/PhotoPreview/PhotoPreview.swift +++ b/Memola/Features/Memo/PhotoPreview/PhotoPreview.swift @@ -8,10 +8,15 @@ import SwiftUI struct PhotoPreview: View { - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - let photoItem: PhotoItem - @ObservedObject var tool: Tool + private let photoItem: PhotoItem + @ObservedObject private var tool: Tool + + init(photoItem: PhotoItem, tool: Tool) { + self.photoItem = photoItem + self.tool = tool + } var body: some View { Image(image: photoItem.previewImage) diff --git a/Memola/Features/Memo/Toolbar/Toolbar.swift b/Memola/Features/Memo/Toolbar/Toolbar.swift index b6f0d59..fb4be13 100644 --- a/Memola/Features/Memo/Toolbar/Toolbar.swift +++ b/Memola/Features/Memo/Toolbar/Toolbar.swift @@ -9,19 +9,19 @@ import SwiftUI import Foundation struct Toolbar: View { - @Environment(\.dismiss) var dismiss - @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.dismiss) private var dismiss + @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @ObservedObject var tool: Tool - @ObservedObject var canvas: Canvas - @ObservedObject var history: History + @ObservedObject private var tool: Tool + @ObservedObject private var canvas: Canvas + @ObservedObject private var history: History - @State var title: String + @State private var title: String - @FocusState var textFieldState: Bool + @FocusState private var textFieldState: Bool - let size: CGFloat = 40 - let memo: MemoObject + private let size: CGFloat = 40 + private let memo: MemoObject init(memo: MemoObject, tool: Tool, canvas: Canvas, history: History) { self.memo = memo @@ -57,7 +57,7 @@ struct Toolbar: View { .foregroundStyle(Color.accentColor) } - var closeButton: some View { + private var closeButton: some View { Button { closeMemo() } label: { @@ -76,7 +76,7 @@ struct Toolbar: View { .transition(.move(edge: .top).combined(with: .blurReplace)) } - var titleField: some View { + private var titleField: some View { TextField("", text: $title) .focused($textFieldState) .textFieldStyle(.plain) @@ -100,7 +100,7 @@ struct Toolbar: View { .transition(.move(edge: .top).combined(with: .blurReplace)) } - var historyControl: some View { + private var historyControl: some View { HStack(spacing: 0) { Button { history.historyPublisher.send(.undo) @@ -135,7 +135,7 @@ struct Toolbar: View { .transition(.move(edge: .top).combined(with: .blurReplace)) } - var gridModeControl: some View { + private var gridModeControl: some View { #if os(macOS) Button { switch canvas.gridMode { @@ -183,7 +183,7 @@ struct Toolbar: View { #endif } - func closeMemo() { + private func closeMemo() { canvas.save(for: memo) { #if os(macOS) MemoManager.shared.closeMemo() diff --git a/Memola/Persistence/Core/Persistence.swift b/Memola/Persistence/Core/Persistence.swift index df7c3a2..e34a888 100644 --- a/Memola/Persistence/Core/Persistence.swift +++ b/Memola/Persistence/Core/Persistence.swift @@ -77,14 +77,6 @@ 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 diff --git a/Memola/Persistence/Objects/PenObject.swift b/Memola/Persistence/Objects/PenObject.swift index 4c51ad6..9be5f86 100644 --- a/Memola/Persistence/Objects/PenObject.swift +++ b/Memola/Persistence/Objects/PenObject.swift @@ -9,7 +9,7 @@ import CoreData import Foundation @objc(PenObject) -class PenObject: NSManagedObject { +final class PenObject: NSManagedObject { @NSManaged var color: [CGFloat] @NSManaged var style: Int16 @NSManaged var thickness: CGFloat diff --git a/Memola/Persistence/Objects/PhotoObject.swift b/Memola/Persistence/Objects/PhotoObject.swift index 10283e8..ac697c8 100644 --- a/Memola/Persistence/Objects/PhotoObject.swift +++ b/Memola/Persistence/Objects/PhotoObject.swift @@ -9,7 +9,7 @@ import CoreData import Foundation @objc(PhotoObject) -class PhotoObject: NSManagedObject { +final class PhotoObject: NSManagedObject { @NSManaged var width: CGFloat @NSManaged var originY: CGFloat @NSManaged var originX: CGFloat diff --git a/Memola/Persistence/Objects/ToolObject.swift b/Memola/Persistence/Objects/ToolObject.swift index 757d4c2..c5468d4 100644 --- a/Memola/Persistence/Objects/ToolObject.swift +++ b/Memola/Persistence/Objects/ToolObject.swift @@ -9,7 +9,7 @@ import CoreData import Foundation @objc(ToolObject) -class ToolObject: NSManagedObject { +final class ToolObject: NSManagedObject { @NSManaged var selection: Int16 @NSManaged var pens: NSMutableSet @NSManaged var memo: MemoObject? diff --git a/Memola/Shortcut/Commands/FileCommands.swift b/Memola/Shortcut/Commands/FileCommands.swift index 389205d..3a602ba 100644 --- a/Memola/Shortcut/Commands/FileCommands.swift +++ b/Memola/Shortcut/Commands/FileCommands.swift @@ -8,8 +8,8 @@ import SwiftUI struct FileCommands: Commands { - @Environment(\.shortcut) var shortcut - @FocusedValue(\.activeSceneKey) var appScene + @Environment(\.shortcut) private var shortcut + @FocusedValue(\.activeSceneKey) private var appScene var body: some Commands { CommandGroup(replacing: .newItem) { diff --git a/Memola/Shortcut/Commands/ViewCommands.swift b/Memola/Shortcut/Commands/ViewCommands.swift index aa4240f..2a0fecc 100644 --- a/Memola/Shortcut/Commands/ViewCommands.swift +++ b/Memola/Shortcut/Commands/ViewCommands.swift @@ -8,18 +8,18 @@ import SwiftUI struct ViewCommands: Commands { - @FocusedValue(\.activeSceneKey) var appScene + @ObservedObject private var application: Application + @FocusedValue(\.activeSceneKey) private var appScene + + init(application: Application) { + self.application = application + } var body: some Commands { CommandGroup(replacing: .toolbar) { if appScene == .trash || appScene == .memos { Button { - #if os(macOS) - guard let toolbar = NSApp.keyWindow?.toolbar else { return } - if let search = toolbar.items.first(where: { $0.itemIdentifier.rawValue == "com.apple.SwiftUI.search" }) as? NSSearchToolbarItem { - search.beginSearchInteraction() - } - #endif + application.activateSearchBar() } label: { Text("Find Memo") } diff --git a/Memola/Shortcut/Core/Shortcut.swift b/Memola/Shortcut/Core/Shortcut.swift index 57c4043..24c00ef 100644 --- a/Memola/Shortcut/Core/Shortcut.swift +++ b/Memola/Shortcut/Core/Shortcut.swift @@ -8,18 +8,18 @@ import Combine import Foundation -class Shortcut { +final class Shortcut { static let shared: Shortcut = .init() - private let shortcutPublisher = PassthroughSubject() + private let _publisher = PassthroughSubject() + + lazy var publisher: AnyPublisher = { + _publisher.eraseToAnyPublisher() + }() private init() { } func trigger(_ shortcut: Shortcuts) { - shortcutPublisher.send(shortcut) - } - - func publisher() -> AnyPublisher { - shortcutPublisher.eraseToAnyPublisher() + _publisher.send(shortcut) } } diff --git a/Memola/Shortcut/EnvironmentKeys/ShortcutKey.swift b/Memola/Shortcut/EnvironmentValues/ShortcutKey.swift similarity index 85% rename from Memola/Shortcut/EnvironmentKeys/ShortcutKey.swift rename to Memola/Shortcut/EnvironmentValues/ShortcutKey.swift index 6d9d2c9..4d1f1ab 100644 --- a/Memola/Shortcut/EnvironmentKeys/ShortcutKey.swift +++ b/Memola/Shortcut/EnvironmentValues/ShortcutKey.swift @@ -7,7 +7,7 @@ import SwiftUI -struct ShortcutKey: EnvironmentKey { +private struct ShortcutKey: EnvironmentKey { static var defaultValue: Shortcut = .shared } diff --git a/Memola/Utilies/AppScene/ActiveSceneKey.swift b/Memola/Utilies/AppScene/ActiveSceneKey.swift index 7e323b5..b27d6d7 100644 --- a/Memola/Utilies/AppScene/ActiveSceneKey.swift +++ b/Memola/Utilies/AppScene/ActiveSceneKey.swift @@ -7,7 +7,7 @@ import SwiftUI -struct ActiveSceneKey: FocusedValueKey { +private struct ActiveSceneKey: FocusedValueKey { typealias Value = AppScene } diff --git a/Memola/Utilies/SidebarVisibility/SidebarVisibility.swift b/Memola/Utilies/SidebarVisibility/SidebarVisibility.swift new file mode 100644 index 0000000..7125d01 --- /dev/null +++ b/Memola/Utilies/SidebarVisibility/SidebarVisibility.swift @@ -0,0 +1,13 @@ +// +// SidebarVisibility.swift +// Memola +// +// Created by Dscyre Scotti on 7/14/24. +// + +import Foundation + +enum SidebarVisibility { + case shown + case hidden +}