diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index f442273..7f19d8e 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ EC6E3BD72C43C6A400DD20F3 /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6E3BD62C43C6A400DD20F3 /* Application.swift */; }; EC6E3BD92C43C6C000DD20F3 /* OnDismissSearchViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6E3BD82C43C6C000DD20F3 /* OnDismissSearchViewModifier.swift */; }; EC6E3BDB2C43C78700DD20F3 /* NavigationSplitViewVisibility++.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6E3BDA2C43C78700DD20F3 /* NavigationSplitViewVisibility++.swift */; }; + EC6E3BDE2C43D5A500DD20F3 /* SidebarVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6E3BDC2C43D5A500DD20F3 /* SidebarVisibility.swift */; }; EC7F6BEC2BE5E6E300A34A7B /* MemolaApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */; }; EC7F6BF02BE5E6E400A34A7B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BEF2BE5E6E400A34A7B /* Assets.xcassets */; }; EC7F6BF32BE5E6E400A34A7B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC7F6BF22BE5E6E400A34A7B /* Preview Assets.xcassets */; }; @@ -185,6 +186,7 @@ EC6E3BD62C43C6A400DD20F3 /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = ""; }; EC6E3BD82C43C6C000DD20F3 /* OnDismissSearchViewModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnDismissSearchViewModifier.swift; sourceTree = ""; }; EC6E3BDA2C43C78700DD20F3 /* NavigationSplitViewVisibility++.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NavigationSplitViewVisibility++.swift"; sourceTree = ""; }; + EC6E3BDC2C43D5A500DD20F3 /* SidebarVisibility.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SidebarVisibility.swift; sourceTree = ""; }; EC7F6BE82BE5E6E300A34A7B /* Memola.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Memola.app; sourceTree = BUILT_PRODUCTS_DIR; }; EC7F6BEB2BE5E6E300A34A7B /* MemolaApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemolaApp.swift; sourceTree = ""; }; EC7F6BEF2BE5E6E400A34A7B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -519,6 +521,14 @@ path = Algorithms; sourceTree = ""; }; + EC6E3BDD2C43D5A500DD20F3 /* SidebarVisibility */ = { + isa = PBXGroup; + children = ( + EC6E3BDC2C43D5A500DD20F3 /* SidebarVisibility.swift */, + ); + path = SidebarVisibility; + sourceTree = ""; + }; EC7F6BDF2BE5E6E300A34A7B = { isa = PBXGroup; children = ( @@ -989,6 +999,7 @@ ECF7B2E52C391DFA004D2C57 /* Utilies */ = { isa = PBXGroup; children = ( + EC6E3BDD2C43D5A500DD20F3 /* SidebarVisibility */, EC2002EE2C417BBF002EBD5F /* AppScene */, ECF7B2CF2C39169C004D2C57 /* Extensions */, ECF7B2E22C39172D004D2C57 /* Platform */, @@ -1133,6 +1144,7 @@ ECA738DA2BE60FF100A4542E /* CacheRenderPass.swift in Sources */, ECF7B2DA2C39169C004D2C57 /* Float++.swift in Sources */, ECA738CD2BE60F2F00A4542E /* PointGridContext.swift in Sources */, + EC6E3BDE2C43D5A500DD20F3 /* SidebarVisibility.swift in Sources */, ECFA15202BEF21EF00455818 /* MemoObject.swift in Sources */, ECE883C12C00C9CB0045C53D /* StrokeStyle.swift in Sources */, EC37FB122C1B2DD90008D976 /* ToolSelection.swift in Sources */, diff --git a/Memola/App/Application.swift b/Memola/App/Application.swift index fd9972f..acbbaf5 100644 --- a/Memola/App/Application.swift +++ b/Memola/App/Application.swift @@ -9,7 +9,7 @@ import Combine import SwiftUI final class Application: NSObject, ObservableObject { - + @Published private(set) var sidebarVisibility: SidebarVisibility = .shown } extension Application { @@ -23,6 +23,18 @@ extension Application { #warning("TODO: implement for ipad") #endif } + + func toggleSidebar() { + #if os(macOS) + NSApp.sendAction(#selector(NSSplitViewController.toggleSidebar(_:)), to: nil, from: nil) + #else + #warning("TODO: implement for ipad") + #endif + } + + func changeSidebarVisibility(_ visibility: SidebarVisibility) { + self.sidebarVisibility = visibility + } } #if os(macOS) diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 244f3dc..f7911c2 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -11,7 +11,7 @@ import CoreData import Foundation final class Tool: NSObject, ObservableObject { - private let object: ToolObject + let object: ToolObject @Published var pens: [Pen] = [] diff --git a/Memola/Features/Dashboard/Dashboard/DashboardView.swift b/Memola/Features/Dashboard/Dashboard/DashboardView.swift index bfccddf..05a0ece 100644 --- a/Memola/Features/Dashboard/Dashboard/DashboardView.swift +++ b/Memola/Features/Dashboard/Dashboard/DashboardView.swift @@ -11,6 +11,7 @@ struct DashboardView: View { @Environment(\.horizontalSizeClass) private var horizontalSizeClass @StateObject private var memoManager: MemoManager = .shared + @EnvironmentObject private var application: Application @State private var sidebarItem: SidebarItem? = .memos @AppStorage("memola.app.scene.side-bar.column-visibility") private var columnVisibility: NavigationSplitViewVisibility = .all @@ -45,6 +46,9 @@ struct DashboardView: View { .transition(.move(edge: .bottom)) } } + .onChange(of: columnVisibility) { oldValue, newValue in + application.changeSidebarVisibility(newValue == .all ? .shown : .hidden) + } #else NavigationSplitView(columnVisibility: $columnVisibility) { Sidebar(sidebarItem: $sidebarItem, horizontalSizeClass: horizontalSizeClass) diff --git a/Memola/Shortcut/Commands/ViewCommands.swift b/Memola/Shortcut/Commands/ViewCommands.swift index 2a0fecc..beb2bc0 100644 --- a/Memola/Shortcut/Commands/ViewCommands.swift +++ b/Memola/Shortcut/Commands/ViewCommands.swift @@ -17,7 +17,7 @@ struct ViewCommands: Commands { var body: some Commands { CommandGroup(replacing: .toolbar) { - if appScene == .trash || appScene == .memos { + if appScene == .memos || appScene == .trash { Button { application.activateSearchBar() } label: { @@ -25,6 +25,19 @@ struct ViewCommands: Commands { } .keyboardShortcut("f", modifiers: [.command]) } + if appScene == .memos || appScene == .trash { + Button { + application.toggleSidebar() + } label: { + switch application.sidebarVisibility { + case .shown: + Text("Hide Sidebar") + case .hidden: + Text("Show Sidebar") + } + } + .keyboardShortcut("o", modifiers: [.command]) + } } } }