From ed5449ac22e6e66bd380bba80115767fdfc6260e Mon Sep 17 00:00:00 2001 From: glushchenko Date: Fri, 28 Jul 2023 01:04:07 +0300 Subject: [PATCH] #1434 --- FSNotes.xcodeproj/project.pbxproj | 8 +- FSNotes/Base.lproj/Main.storyboard | 6 +- FSNotes/EditorViewController.swift | 495 +++++++++++++++--- FSNotes/NoteViewController.swift | 11 - FSNotes/ViewController+Web.swift | 24 +- FSNotes/ViewController.swift | 310 +---------- .../Shared/ViewController+WebApi.swift | 4 +- 7 files changed, 438 insertions(+), 420 deletions(-) diff --git a/FSNotes.xcodeproj/project.pbxproj b/FSNotes.xcodeproj/project.pbxproj index 138257129..90f3df704 100644 --- a/FSNotes.xcodeproj/project.pbxproj +++ b/FSNotes.xcodeproj/project.pbxproj @@ -5438,7 +5438,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 580; + CURRENT_PROJECT_VERSION = 581; DEVELOPMENT_TEAM = 866P6MTE92; EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; ENABLE_NS_ASSERTIONS = NO; @@ -5454,7 +5454,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 6.4.0; + MARKETING_VERSION = 6.4.1; OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = co.fluder.FSNotes; PRODUCT_NAME = FSNotes; @@ -5476,7 +5476,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 580; + CURRENT_PROJECT_VERSION = 581; DEPLOYMENT_LOCATION = NO; DEVELOPMENT_TEAM = 866P6MTE92; EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; @@ -5493,7 +5493,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; - MARKETING_VERSION = 6.4.0; + MARKETING_VERSION = 6.4.1; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = co.fluder.FSNotes; PRODUCT_NAME = FSNotes; diff --git a/FSNotes/Base.lproj/Main.storyboard b/FSNotes/Base.lproj/Main.storyboard index a44a24e8f..f169e4d96 100644 --- a/FSNotes/Base.lproj/Main.storyboard +++ b/FSNotes/Base.lproj/Main.storyboard @@ -124,7 +124,7 @@ CA - + @@ -132,7 +132,7 @@ CA CA - + @@ -141,7 +141,7 @@ CA - + diff --git a/FSNotes/EditorViewController.swift b/FSNotes/EditorViewController.swift index 4ee50219e..5e673045a 100644 --- a/FSNotes/EditorViewController.swift +++ b/FSNotes/EditorViewController.swift @@ -11,7 +11,7 @@ import AppKit import LocalAuthentication import WebKit -class EditorViewController: NSViewController, NSTextViewDelegate, WebFrameLoadDelegate { +class EditorViewController: NSViewController, NSTextViewDelegate, WebFrameLoadDelegate, NSMenuItemValidation { public var alert: NSAlert? public var noteLoading: ProgressState = .none @@ -45,6 +45,283 @@ class EditorViewController: NSViewController, NSTextViewDelegate, WebFrameLoadDe vcEditor?.delegate = self } + func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { + guard let vc = ViewController.shared() else { return false} + + // Current note + var note = vc.editor.note + + if note == nil { + note = vc.getSelectedNotes()?.first + } + + let ident = menuItem.identifier?.rawValue + + if let title = menuItem.menu?.identifier?.rawValue { + switch title { + case "fsnotesMenu": + if menuItem.identifier?.rawValue == "emptyTrashMenu" { + menuItem.keyEquivalentModifierMask = UserDefaultsManagement.focusInEditorOnNoteSelect + ? [.command, .option, .shift] + : [.command, .shift] + return true + } + case "fileMenu": + + if vc.notesTableView.selectedRowIndexes.count > 1, + let id = menuItem.identifier?.rawValue, vc.notesTableView.limitedActionsList.contains(id) { + + return false + } + + if menuItem.identifier?.rawValue == "note.saveRevision" + || menuItem.identifier?.rawValue == "note.history" { + if let note = note { + let hasCommits = note.project.hasCommitsDiffsCache() + menuItem.isHidden = !hasCommits + return hasCommits + } + } + + if menuItem.identifier?.rawValue == "fileMenu.removeEncryption" { + if let note = note, note.isEncrypted() { + menuItem.isHidden = false + return true + } else { + menuItem.isHidden = true + return false + } + } + + if menuItem.identifier?.rawValue == "fileMenu.print" { + if let note = note, note.isEncryptedAndLocked() { + return false + } + + if vc.notesTableView.selectedRowIndexes.count > 1 { + return false + } + + if vcEditor?.note != nil { + return true + } + } + + if menuItem.identifier?.rawValue == "fileMenu.newInNewWindow" { + return true + } + + if menuItem.identifier?.rawValue == "fileMenu.rename" { + if let cvc = NSApplication.shared.keyWindow?.contentViewController, cvc.isKind(of: NoteViewController.self) { + menuItem.isHidden = true + return false + } + + menuItem.isHidden = false + } + + if menuItem.identifier?.rawValue == "fileMenu.delete" { + guard vc.view.window?.firstResponder == vc.notesTableView, + let cvc = NSApplication.shared.keyWindow?.contentViewController, + cvc.isKind(of: ViewController.self) + else { + return false + } + + menuItem.keyEquivalentModifierMask = + UserDefaultsManagement.focusInEditorOnNoteSelect + ? [.command, .option] + : [.command] + } + + if menuItem.identifier?.rawValue == "fileMenu.changeCreationDate" { + menuItem.title = NSLocalizedString("Change Creation Date", comment: "Menu") + } + + if menuItem.identifier?.rawValue == "fileMenu.toggleContainer" { + if let note = note, note.container != .encryptedTextPack { + menuItem.title = note.container == .none + ? NSLocalizedString("Convert to TextBundle", comment: "") + : NSLocalizedString("Convert to Plain", comment: "") + + menuItem.isEnabled = true + } else { + menuItem.isEnabled = false + } + } + + if menuItem.identifier?.rawValue == "fileMenu.tags" { + if UserDefaultsManagement.inlineTags { + menuItem.isHidden = true + return false + } else { + menuItem.isHidden = false + } + } + + if menuItem.identifier?.rawValue == "fileMenu.history" { + if vc.notesTableView.selectedRowIndexes.count > 1 { + return false + } + + if vcEditor?.note != nil { + return true + } + } + + if menuItem.identifier?.rawValue == "fileMenu.move" { + if vcEditor?.note != nil { + return true + } + } + + if menuItem.identifier?.rawValue == "fileMenu.togglePin" { + if let note = note { + menuItem.title = note.isPinned + ? NSLocalizedString("Unpin", comment: "") + : NSLocalizedString("Pin", comment: "") + + return true + } + + return false + } + + if menuItem.identifier?.rawValue == "fileMenu.toggleLock" { + if let note = note { + menuItem.title = note.isEncryptedAndLocked() + ? NSLocalizedString("Unlock", comment: "") + : NSLocalizedString("Lock", comment: "") + + return true + } + + return false + } + + if ["fileMenu.new", + "fileMenu.searchAndCreate", + "fileMenu.import" + ].contains(menuItem.identifier?.rawValue) + { + return true + } + + if menuItem.identifier?.rawValue == "fileMenu.removeOverSSH" { + if let note = vcEditor?.note, !note.isEncrypted(), note.uploadPath != nil || note.apiId != nil { + menuItem.isHidden = false + return true + } else { + menuItem.isHidden = true + return false + } + } + + if menuItem.identifier?.rawValue == "fileMenu.uploadOverSSH" { + if let note = vc.editor.note, !note.isEncrypted() { + if note.uploadPath != nil || note.apiId != nil { + menuItem.title = NSLocalizedString("Update Web Page", comment: "") + } else { + menuItem.title = NSLocalizedString("Create Web Page", comment: "") + } + + menuItem.isHidden = false + + return true + } else { + menuItem.isHidden = true + + return false + } + } + + if vc.notesTableView.selectedRow == -1 { + return false + } + + break + case "folderMenu": + if ["folderMenu.attachStorage"].contains(menuItem.identifier?.rawValue) { + return true + } + + guard let p = vc.getSidebarProject(), !p.isTrash else { + return false + } + case "findMenu": + if ["findMenu.find", + "findMenu.findAndReplace", + "findMenu.next", + "findMenu.prev" + ].contains(menuItem.identifier?.rawValue), vc.notesTableView.selectedRow > -1 { + return true + } + + return vc.editAreaScroll.isFindBarVisible || vc.editor.hasFocus() + case "showInSidebar": + switch menuItem.tag { + case 1: + menuItem.state = UserDefaultsManagement.sidebarVisibilityInbox ? .on : .off + case 2: + menuItem.state = UserDefaultsManagement.sidebarVisibilityNotes ? .on : .off + case 3: + menuItem.state = UserDefaultsManagement.sidebarVisibilityTodo ? .on : .off + case 4: + menuItem.state = UserDefaultsManagement.sidebarVisibilityArchive ? .on : .off + case 5: + menuItem.state = UserDefaultsManagement.sidebarVisibilityTrash ? .on : .off + case 6: + menuItem.state = UserDefaultsManagement.sidebarVisibilityUntagged ? .on : .off + default: + break + } + case "viewMenu": + + switch ident { + case "previewMathJax": + menuItem.state = UserDefaultsManagement.mathJaxPreview ? .on : .off + break + + case "viewMenu.previewSoulver": + menuItem.state = UserDefaultsManagement.soulverPreview ? .on : .off + break + + case "viewMenu.historyBack": + if vc.notesTableView.historyPosition == 0 { + return false + } + break + + case "viewMenu.historyForward": + if vc.notesTableView.historyPosition == vc.notesTableView.history.count - 1 { + return false + } + break + + case "view.toggleNoteList": + menuItem.title = vc.isVisibleNoteList() + ? NSLocalizedString("Hide Note List", comment: "") + : NSLocalizedString("Show Note List", comment: "") + break + + case "view.toggleSidebar": + menuItem.title = vc.isVisibleSidebar() + ? NSLocalizedString("Hide Sidebar", comment: "") + : NSLocalizedString("Show Sidebar", comment: "") + break + + default: + break + } + + default: + break + } + } + + return true + } + public func getSelectedNotes() -> [Note]? { // Active main window @@ -320,87 +597,6 @@ class EditorViewController: NSViewController, NSTextViewDelegate, WebFrameLoadDe field.becomeFirstResponder() } - // MARK: Move menu - - @IBAction func deleteNote(_ sender: Any) { - var forceRemove = false - - if let menuItem = sender as? NSMenuItem, - menuItem.identifier?.rawValue == "fileMenu.forceRemove" || - menuItem.identifier?.rawValue == "context.fileMenu.forceRemove" { - forceRemove = true - } - - guard let vc = ViewController.shared() else { return } - guard let notes = getSelectedNotes() else { return } - - let si = vc.getSidebarItem() - if si?.isTrash() == true || forceRemove { - vc.removeForever() - - // Call from window, close it! - if let cvc = NSApplication.shared.keyWindow?.contentViewController, - cvc.isKind(of: NoteViewController.self) { - DispatchQueue.main.async { - self.view.window?.close() - } - } - - return - } - - let selectedRow = vc.notesTableView.selectedRowIndexes.min() - - UserDataService.instance.searchTrigger = true - - vc.notesTableView.removeByNotes(notes: notes) - - // Delete tags - for note in notes { - let tags = note.tags - note.tags.removeAll() - vc.sidebarOutlineView.removeTags(tags) - } - - vc.storage.removeNotes(notes: notes) { urls in - if let md = AppDelegate.mainWindowController { - let undoManager = md.notesListUndoManager - - if let ntv = vc.notesTableView { - undoManager.registerUndo(withTarget: ntv, selector: #selector(ntv.unDelete), object: urls) - undoManager.setActionName(NSLocalizedString("Delete", comment: "")) - } - - if let i = selectedRow, i > -1 { - if vc.notesTableView.noteList.count > i { - vc.notesTableView.selectRow(i) - } else { - vc.notesTableView.selectRow(vc.notesTableView.noteList.count - 1) - } - } - - UserDataService.instance.searchTrigger = false - } - - vc.editor.clear() - } - - // Call from window, close it! - if let cvc = NSApplication.shared.keyWindow?.contentViewController, - cvc.isKind(of: NoteViewController.self) { - DispatchQueue.main.async { - self.view.window?.close() - } - return - } - - // If is main window – focus to notes list - if let cvc = NSApplication.shared.keyWindow?.contentViewController, - cvc.isKind(of: ViewController.self) { - NSApp.mainWindow?.makeFirstResponder(vc.notesTableView) - } - } - @IBAction func archiveNote(_ sender: Any) { guard let vc = ViewController.shared() else { return } guard let notes = getSelectedNotes() else { return } @@ -546,6 +742,141 @@ class EditorViewController: NSViewController, NSTextViewDelegate, WebFrameLoadDe } } + @IBAction func toggleContainer(_ sender: NSMenuItem) { + guard let notes = getSelectedNotes() else { return } + + var newContainer: NoteContainer = .textBundleV2 + if notes.first?.container == .textBundle || notes.first?.container == .textBundleV2 { + newContainer = .none + } + + for note in notes { + if note.container == .encryptedTextPack { + continue + } + + note.convertContainer(to: newContainer) + } + } + + @IBAction func openWindow(_ sender: Any) { + guard let currentNote = ViewController.shared()?.notesTableView.getSelectedNote() else { return } + + openInNewWindow(note: currentNote) + } + + @IBAction func moveMenu(_ sender: Any) { + guard let vc = ViewController.shared() else { return } + + // Move menu right from notes table view + + if let cvc = NSApplication.shared.keyWindow?.contentViewController, cvc.isKind(of: ViewController.self) { + if vc.notesTableView.selectedRow >= 0 { + vc.loadMoveMenu() + + let moveTitle = NSLocalizedString("Move", comment: "Menu") + let moveMenu = vc.noteMenu.item(withTitle: moveTitle) + let view = vc.notesTableView.rect(ofRow: vc.notesTableView.selectedRow) + let x = vc.splitView.subviews[0].frame.width + 5 + let general = moveMenu?.submenu?.item(at: 0) + + moveMenu?.submenu?.popUp(positioning: general, at: NSPoint(x: x, y: view.origin.y + 8), in: vc.notesTableView) + } + + return + + // Move menu right from window + + } else { + vc.loadMoveMenu() + + let moveTitle = NSLocalizedString("Move", comment: "Menu") + let moveMenu = vc.noteMenu.item(withTitle: moveTitle) + let general = moveMenu?.submenu?.item(at: 0) + + moveMenu?.submenu?.popUp(positioning: general, at: NSPoint(x: view.frame.width + 10, y: view.frame.height - 5), in: view) + } + } + + @IBAction func deleteNote(_ sender: Any) { + var forceRemove = false + + if let menuItem = sender as? NSMenuItem, + menuItem.identifier?.rawValue == "fileMenu.forceRemove" || + menuItem.identifier?.rawValue == "context.fileMenu.forceRemove" { + forceRemove = true + } + + guard let vc = ViewController.shared() else { return } + guard let notes = getSelectedNotes() else { return } + + let si = vc.getSidebarItem() + if si?.isTrash() == true || forceRemove { + vc.removeForever() + + // Call from window, close it! + if let cvc = NSApplication.shared.keyWindow?.contentViewController, + cvc.isKind(of: NoteViewController.self) { + DispatchQueue.main.async { + self.view.window?.close() + } + } + + return + } + + let selectedRow = vc.notesTableView.selectedRowIndexes.min() + + UserDataService.instance.searchTrigger = true + + vc.notesTableView.removeByNotes(notes: notes) + + // Delete tags + for note in notes { + let tags = note.tags + note.tags.removeAll() + vc.sidebarOutlineView.removeTags(tags) + } + + vc.storage.removeNotes(notes: notes) { urls in + if let md = AppDelegate.mainWindowController { + let undoManager = md.notesListUndoManager + + if let ntv = vc.notesTableView { + undoManager.registerUndo(withTarget: ntv, selector: #selector(ntv.unDelete), object: urls) + undoManager.setActionName(NSLocalizedString("Delete", comment: "")) + } + + if let i = selectedRow, i > -1 { + if vc.notesTableView.noteList.count > i { + vc.notesTableView.selectRow(i) + } else { + vc.notesTableView.selectRow(vc.notesTableView.noteList.count - 1) + } + } + + UserDataService.instance.searchTrigger = false + } + + vc.editor.clear() + } + + // Call from window, close it! + if let cvc = NSApplication.shared.keyWindow?.contentViewController, + cvc.isKind(of: NoteViewController.self) { + DispatchQueue.main.async { + self.view.window?.close() + } + return + } + + // If is main window – focus to notes list + if let cvc = NSApplication.shared.keyWindow?.contentViewController, + cvc.isKind(of: ViewController.self) { + NSApp.mainWindow?.makeFirstResponder(vc.notesTableView) + } + } + // MARK: Dep methods public func openInNewWindow(note: Note, frame: NSRect? = nil, preview: Bool = false) { diff --git a/FSNotes/NoteViewController.swift b/FSNotes/NoteViewController.swift index b0d5c29c0..bb4e82cf4 100644 --- a/FSNotes/NoteViewController.swift +++ b/FSNotes/NoteViewController.swift @@ -63,15 +63,4 @@ class NoteViewController: EditorViewController, NSWindowDelegate { return nil } - - @IBAction func moveMenu(_ sender: Any) { - guard let vc = ViewController.shared() else { return } - vc.loadMoveMenu() - - let moveTitle = NSLocalizedString("Move", comment: "Menu") - let moveMenu = vc.noteMenu.item(withTitle: moveTitle) - let general = moveMenu?.submenu?.item(at: 0) - - moveMenu?.submenu?.popUp(positioning: general, at: NSPoint(x: view.frame.width + 10, y: view.frame.height - 5), in: view) - } } diff --git a/FSNotes/ViewController+Web.swift b/FSNotes/ViewController+Web.swift index 27ff3c0fe..28de00f82 100644 --- a/FSNotes/ViewController+Web.swift +++ b/FSNotes/ViewController+Web.swift @@ -9,12 +9,16 @@ import Cocoa import Shout -extension ViewController { +extension EditorViewController { + + public func getCurrentNote() -> Note? { + return vcEditor?.note + } @IBAction func removeWebNote(_ sender: NSMenuItem) { if !UserDefaultsManagement.customWebServer, let note = getCurrentNote() { - deleteAPI(note: note, completion: { - self.notesTableView.reloadRow(note: note) + ViewController.shared()?.deleteAPI(note: note, completion: { + ViewController.shared()?.notesTableView.reloadRow(note: note) }) return } @@ -29,10 +33,10 @@ extension ViewController { note.uploadPath = nil - self.storage.saveUploadPaths() + Storage.shared().saveUploadPaths() DispatchQueue.main.async { - self.notesTableView.reloadRow(note: note) + ViewController.shared()?.notesTableView.reloadRow(note: note) } } catch { print(error, error.localizedDescription) @@ -42,9 +46,9 @@ extension ViewController { @IBAction func uploadWebNote(_ sender: NSMenuItem) { if !UserDefaultsManagement.customWebServer, let note = getCurrentNote() { - createAPI(note: note, completion: { url in + ViewController.shared()?.createAPI(note: note, completion: { url in DispatchQueue.main.async { - self.notesTableView.reloadRow(note: note) + ViewController.shared()?.notesTableView.reloadRow(note: note) guard let url = url else { return } let pasteboard = NSPasteboard.general @@ -114,8 +118,8 @@ extension ViewController { if #available(macOS 10.14, *) { DispatchQueue.main.async { - self.sendNotification() - self.notesTableView.reloadRow(note: note) + ViewController.shared()?.sendNotification() + ViewController.shared()?.notesTableView.reloadRow(note: note) NSWorkspace.shared.open(URL(string: resultUrl)!) } @@ -125,7 +129,7 @@ extension ViewController { note.uploadPath = remoteDir - self.storage.saveUploadPaths() + Storage.shared().saveUploadPaths() } catch { print(error, error.localizedDescription) } diff --git a/FSNotes/ViewController.swift b/FSNotes/ViewController.swift index 5d992a16a..85ac649f7 100644 --- a/FSNotes/ViewController.swift +++ b/FSNotes/ViewController.swift @@ -17,7 +17,6 @@ class ViewController: EditorViewController, NSSplitViewDelegate, NSOutlineViewDelegate, NSOutlineViewDataSource, - NSMenuItemValidation, NSTextFieldDelegate, UNUserNotificationCenterDelegate { @@ -223,267 +222,6 @@ class ViewController: EditorViewController, } } } - - func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { - guard let vc = ViewController.shared() else { return false} - - // Current note - var note = vc.editor.note - - if note == nil { - note = vc.getSelectedNotes()?.first - } - - let ident = menuItem.identifier?.rawValue - - if let title = menuItem.menu?.identifier?.rawValue { - switch title { - case "fsnotesMenu": - if menuItem.identifier?.rawValue == "emptyTrashMenu" { - menuItem.keyEquivalentModifierMask = UserDefaultsManagement.focusInEditorOnNoteSelect - ? [.command, .option, .shift] - : [.command, .shift] - return true - } - case "fileMenu": - - if vc.notesTableView.selectedRowIndexes.count > 1, - let id = menuItem.identifier?.rawValue, vc.notesTableView.limitedActionsList.contains(id) { - - return false - } - - if menuItem.identifier?.rawValue == "note.saveRevision" - || menuItem.identifier?.rawValue == "note.history" { - if let note = note { - let hasCommits = note.project.hasCommitsDiffsCache() - menuItem.isHidden = !hasCommits - return hasCommits - } - } - - if menuItem.identifier?.rawValue == "fileMenu.removeEncryption" { - if let note = note, note.isEncrypted() { - menuItem.isHidden = false - return true - } else { - menuItem.isHidden = true - return false - } - } - - if menuItem.identifier?.rawValue == "fileMenu.print" { - return true - } - - if menuItem.identifier?.rawValue == "fileMenu.newInNewWindow" { - return true - } - - if menuItem.identifier?.rawValue == "fileMenu.rename", let cvc = NSApplication.shared.keyWindow?.contentViewController { - if cvc.isKind(of: NoteViewController.self) { - return false - } - } - - if menuItem.identifier?.rawValue == "fileMenu.delete", let cvc = NSApplication.shared.keyWindow?.contentViewController { - if cvc.isKind(of: NoteViewController.self) { - return false - } - - guard vc.view.window?.firstResponder == vc.notesTableView else { return false } - - menuItem.keyEquivalentModifierMask = - UserDefaultsManagement.focusInEditorOnNoteSelect - ? [.command, .option] - : [.command] - } - - if menuItem.identifier?.rawValue == "fileMenu.changeCreationDate" { - menuItem.title = NSLocalizedString("Change Creation Date", comment: "Menu") - } - - if menuItem.identifier?.rawValue == "fileMenu.toggleContainer" { - if let note = note, note.container != .encryptedTextPack { - menuItem.title = note.container == .none - ? NSLocalizedString("Convert to TextBundle", comment: "") - : NSLocalizedString("Convert to Plain", comment: "") - - menuItem.isEnabled = true - } else { - menuItem.isEnabled = false - } - } - - if menuItem.identifier?.rawValue == "fileMenu.tags" { - if UserDefaultsManagement.inlineTags { - menuItem.isHidden = true - return false - } else { - menuItem.isHidden = false - } - } - - if menuItem.identifier?.rawValue == "fileMenu.history" { - if vc.notesTableView.selectedRowIndexes.count > 1 { - return false - } - - if editor.note != nil { - return true - } - } - - if menuItem.identifier?.rawValue == "fileMenu.move", let vc = NSApplication.shared.keyWindow?.contentViewController { - return vc.isKind(of: ViewController.self) - } - - if menuItem.identifier?.rawValue == "fileMenu.togglePin" { - if let note = note { - menuItem.title = note.isPinned - ? NSLocalizedString("Unpin", comment: "") - : NSLocalizedString("Pin", comment: "") - - return true - } - - return false - } - - if menuItem.identifier?.rawValue == "fileMenu.toggleLock" { - if let note = note { - menuItem.title = note.isEncryptedAndLocked() - ? NSLocalizedString("Unlock", comment: "") - : NSLocalizedString("Lock", comment: "") - - return true - } - - return false - } - - if ["fileMenu.new", - "fileMenu.searchAndCreate", - "fileMenu.import" - ].contains(menuItem.identifier?.rawValue) - { - return true - } - - if menuItem.identifier?.rawValue == "fileMenu.removeOverSSH" { - if let note = editor.note, !note.isEncrypted(), note.uploadPath != nil || note.apiId != nil { - menuItem.isHidden = false - return true - } else { - menuItem.isHidden = true - return false - } - } - - if menuItem.identifier?.rawValue == "fileMenu.uploadOverSSH" { - if let note = vc.editor.note, !note.isEncrypted() { - if note.uploadPath != nil || note.apiId != nil { - menuItem.title = NSLocalizedString("Update Web Page", comment: "") - } else { - menuItem.title = NSLocalizedString("Create Web Page", comment: "") - } - - menuItem.isHidden = false - - return true - } else { - menuItem.isHidden = true - - return false - } - } - - if vc.notesTableView.selectedRow == -1 { - return false - } - - break - case "folderMenu": - if ["folderMenu.attachStorage"].contains(menuItem.identifier?.rawValue) { - return true - } - - guard let p = vc.getSidebarProject(), !p.isTrash else { - return false - } - case "findMenu": - if ["findMenu.find", - "findMenu.findAndReplace", - "findMenu.next", - "findMenu.prev" - ].contains(menuItem.identifier?.rawValue), vc.notesTableView.selectedRow > -1 { - return true - } - - return vc.editAreaScroll.isFindBarVisible || vc.editor.hasFocus() - case "showInSidebar": - switch menuItem.tag { - case 1: - menuItem.state = UserDefaultsManagement.sidebarVisibilityInbox ? .on : .off - case 2: - menuItem.state = UserDefaultsManagement.sidebarVisibilityNotes ? .on : .off - case 3: - menuItem.state = UserDefaultsManagement.sidebarVisibilityTodo ? .on : .off - case 4: - menuItem.state = UserDefaultsManagement.sidebarVisibilityArchive ? .on : .off - case 5: - menuItem.state = UserDefaultsManagement.sidebarVisibilityTrash ? .on : .off - case 6: - menuItem.state = UserDefaultsManagement.sidebarVisibilityUntagged ? .on : .off - default: - break - } - case "viewMenu": - - switch ident { - case "previewMathJax": - menuItem.state = UserDefaultsManagement.mathJaxPreview ? .on : .off - break - - case "viewMenu.previewSoulver": - menuItem.state = UserDefaultsManagement.soulverPreview ? .on : .off - break - - case "viewMenu.historyBack": - if vc.notesTableView.historyPosition == 0 { - return false - } - break - - case "viewMenu.historyForward": - if vc.notesTableView.historyPosition == vc.notesTableView.history.count - 1 { - return false - } - break - - case "view.toggleNoteList": - menuItem.title = vc.isVisibleNoteList() - ? NSLocalizedString("Hide Note List", comment: "") - : NSLocalizedString("Show Note List", comment: "") - break - - case "view.toggleSidebar": - menuItem.title = vc.isVisibleSidebar() - ? NSLocalizedString("Hide Sidebar", comment: "") - : NSLocalizedString("Show Sidebar", comment: "") - break - - default: - break - } - - default: - break - } - } - - return true - } // MARK: - Initial configuration @@ -1186,23 +924,7 @@ class ViewController: EditorViewController, _ = vc.createNote(type: .RichText) } - - @IBAction func moveMenu(_ sender: Any) { - guard let vc = ViewController.shared() else { return } - if vc.notesTableView.selectedRow >= 0 { - vc.loadMoveMenu() - - let moveTitle = NSLocalizedString("Move", comment: "Menu") - let moveMenu = vc.noteMenu.item(withTitle: moveTitle) - let view = vc.notesTableView.rect(ofRow: vc.notesTableView.selectedRow) - let x = vc.splitView.subviews[0].frame.width + 5 - let general = moveMenu?.submenu?.item(at: 0) - - moveMenu?.submenu?.popUp(positioning: general, at: NSPoint(x: x, y: view.origin.y + 8), in: vc.notesTableView) - } - } - @IBAction func fileName(_ sender: NSTextField) { guard let note = notesTableView.getNoteFromSelectedRow() else { return } @@ -1264,8 +986,7 @@ class ViewController: EditorViewController, @IBAction func renameMenu(_ sender: Any) { guard let vc = ViewController.shared() else { return } vc.titleLabel.restoreResponder = vc.view.window?.firstResponder - - switchTitleToEditMode() + vc.switchTitleToEditMode() } @objc func switchTitleToEditMode() { @@ -1400,13 +1121,7 @@ class ViewController: EditorViewController, center.add(request) { error in } } - - @IBAction func openWindow(_ sender: Any) { - guard let currentNote = notesTableView.getSelectedNote() else { return } - - openInNewWindow(note: currentNote) - } - + func controlTextDidEndEditing(_ obj: Notification) { guard let textField = obj.object as? NSTextField, textField == titleLabel else { return } @@ -1439,10 +1154,6 @@ class ViewController: EditorViewController, rowUpdaterTimer = Timer.scheduledTimer(timeInterval: 1.2, target: self, selector: #selector(updateTableViews), userInfo: nil, repeats: false) } - public func getCurrentNote() -> Note? { - return editor.note - } - public func removeForever() { guard let vc = ViewController.shared() else { return } guard let notes = vc.notesTableView.getSelectedNotes() else { return } @@ -2355,23 +2066,6 @@ class ViewController: EditorViewController, return size != 0 } - @IBAction func toggleContainer(_ sender: NSMenuItem) { - guard let notes = getSelectedNotes() else { return } - - var newContainer: NoteContainer = .textBundleV2 - if notes.first?.container == .textBundle || notes.first?.container == .textBundleV2 { - newContainer = .none - } - - for note in notes { - if note.container == .encryptedTextPack { - continue - } - - note.convertContainer(to: newContainer) - } - } - #if os(macOS) private func settingsMigation() { diff --git a/FSNotesCore/Shared/ViewController+WebApi.swift b/FSNotesCore/Shared/ViewController+WebApi.swift index 3b60291cb..998fdc818 100644 --- a/FSNotesCore/Shared/ViewController+WebApi.swift +++ b/FSNotesCore/Shared/ViewController+WebApi.swift @@ -54,7 +54,7 @@ extension ViewController { self.showAlert(message: msg) } else if let _ = api.id { note.apiId = nil - self.storage.saveAPIIds() + Storage.shared().saveAPIIds() completion?() } @@ -123,7 +123,7 @@ extension ViewController { self.showAlert(message: msg) } else if let noteId = api.id { note.apiId = noteId - self.storage.saveAPIIds() + Storage.shared().saveAPIIds() let resultUrl = "\(web)\(noteId)/" let url = URL(string: resultUrl)!