diff --git a/Maccy/Maccy.swift b/Maccy/Maccy.swift index b9c1c05c..3c0aff9c 100644 --- a/Maccy/Maccy.swift +++ b/Maccy/Maccy.swift @@ -87,7 +87,9 @@ class Maccy: NSObject { pasteByDefaultObserver = UserDefaults.standard.observe(\.pasteByDefault, options: .new, changeHandler: { _, _ in self.rebuild() }) - statusItemConfigurationObserver = UserDefaults.standard.observe(\.showInStatusBar, options: .new, changeHandler: { _, change in + statusItemConfigurationObserver = UserDefaults.standard.observe(\.showInStatusBar, + options: .new, + changeHandler: { _, change in if self.statusItem.isVisible != change.newValue! { self.statusItem.isVisible = change.newValue! } diff --git a/Maccy/Menu.swift b/Maccy/Menu.swift index 91ccf23f..0cdf406b 100644 --- a/Maccy/Menu.swift +++ b/Maccy/Menu.swift @@ -14,12 +14,16 @@ class Menu: NSMenu, NSMenuDelegate { private var clipboard: Clipboard! private var history: History! private var historyItems: [HistoryMenuItem] = [] + private var maxMenuItems: Int { + UserDefaults.standard.maxMenuItems * 2 + } required init(coder decoder: NSCoder) { super.init(coder: decoder) } init(history: History, clipboard: Clipboard) { + UserDefaults.standard.register(defaults: [UserDefaults.Keys.maxMenuItems: UserDefaults.Values.maxMenuItems]) super.init(title: "Maccy") self.history = history self.clipboard = clipboard @@ -35,6 +39,9 @@ class Menu: NSMenu, NSMenuDelegate { func buildItems(_ allItems: [HistoryItem]) { clearAll() + + let menuSizeLimit = items.count + maxMenuItems + for item in Sorter(by: UserDefaults.standard.sortBy).sort(allItems) { let copyHistoryItem = HistoryMenuItem(item: item, onSelected: copy(_:)) let pasteHistoryItem = HistoryMenuItem(item: item, onSelected: copyAndPaste(_:)) @@ -47,6 +54,16 @@ class Menu: NSMenu, NSMenuDelegate { prependHistoryItems(copyHistoryItem, pasteHistoryItem) } } + + if maxMenuItems > 0 { + for historyItem in historyItems.reversed() { + if items.count > menuSizeLimit { + removeItem(historyItem) + } else { + break + } + } + } } func clearAll() { @@ -58,7 +75,11 @@ class Menu: NSMenu, NSMenuDelegate { } func updateFilter(filter: String) { - let results = search.search(string: filter, within: historyItems) + var results = search.search(string: filter, within: historyItems) + + if maxMenuItems > 0 && maxMenuItems < results.count { + results.removeSubrange(maxMenuItems...results.count - 1) + } // First, remove items that don't match search. for item in historyItems { diff --git a/Maccy/Preferences/AppearancePreferenceViewController.swift b/Maccy/Preferences/AppearancePreferenceViewController.swift index 78c1b38c..4129978c 100644 --- a/Maccy/Preferences/AppearancePreferenceViewController.swift +++ b/Maccy/Preferences/AppearancePreferenceViewController.swift @@ -11,6 +11,8 @@ class AppearancePreferenceViewController: NSViewController, PreferencePane { @IBOutlet weak var popupAtButton: NSPopUpButton! @IBOutlet weak var imageHeightSlider: NSSlider! @IBOutlet weak var imageHeightLabel: NSTextField! + @IBOutlet weak var menuSizeSlider: NSSlider! + @IBOutlet weak var menuSizeLabel: NSTextField! @IBOutlet weak var showMenuIconButton: NSButton! @IBOutlet weak var showSearchFieldButton: NSButton! @IBOutlet weak var showTitleButton: NSButton! @@ -20,6 +22,7 @@ class AppearancePreferenceViewController: NSViewController, PreferencePane { super.viewWillAppear() populatePopupPosition() populateImageHeight() + populateMenuSize() populateShowMenuIcon() populateShowSearchField() populateShowTitle() @@ -44,6 +47,13 @@ class AppearancePreferenceViewController: NSViewController, PreferencePane { UserDefaults.standard.imageMaxHeight = sender.integerValue } + @IBAction func menuSizeChanged(_ sender: NSSlider) { + let old = String(UserDefaults.standard.maxMenuItems) + let new = String(menuSizeSlider.integerValue) + updateMenuSizeLabel(old: old, new: new) + UserDefaults.standard.maxMenuItems = sender.integerValue + } + @IBAction func showMenuIconChanged(_ sender: NSButton) { UserDefaults.standard.showInStatusBar = (sender.state == .on) } @@ -87,6 +97,22 @@ class AppearancePreferenceViewController: NSViewController, PreferencePane { imageHeightLabel.stringValue = newLabelValue } + private func populateMenuSize() { + menuSizeSlider.integerValue = UserDefaults.standard.maxMenuItems + let new = String(menuSizeSlider.integerValue) + updateMenuSizeLabel(old: "{menuSize}", new: new) + } + + private func updateMenuSizeLabel(old: String, new: String) { + let newLabelValue = menuSizeLabel.stringValue.replacingOccurrences( + of: old, + with: new, + options: [], + range: menuSizeLabel.stringValue.range(of: old) + ) + menuSizeLabel.stringValue = newLabelValue + } + private func populateShowMenuIcon() { showMenuIconButton.state = UserDefaults.standard.showInStatusBar ? .on : .off } diff --git a/Maccy/Preferences/Base.lproj/AppearancePreferenceViewController.xib b/Maccy/Preferences/Base.lproj/AppearancePreferenceViewController.xib index bef21565..c80b1037 100644 --- a/Maccy/Preferences/Base.lproj/AppearancePreferenceViewController.xib +++ b/Maccy/Preferences/Base.lproj/AppearancePreferenceViewController.xib @@ -10,6 +10,8 @@ + + @@ -21,15 +23,17 @@ - + - + + + @@ -39,12 +43,12 @@ - + - + @@ -54,7 +58,7 @@ - + @@ -74,9 +78,9 @@ - + - + Change the location where popup appears. Default: Cursor. @@ -86,7 +90,7 @@ Default: Cursor. - + @@ -96,7 +100,7 @@ Default: Cursor. - + @@ -109,9 +113,9 @@ Default: Cursor. - + - + Maximum image preview height: {imageHeight}. Default: 40. Hint: Set to 16 to look like text items. @@ -120,16 +124,53 @@ Hint: Set to 16 to look like text items. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Number of visible items: {menuSize}. +Hidden items are still kept in history and can be found using search. +Set to 0 to make all items visible. +Default: 0. + + + + + - +