2 // CollectionView.swift
5 // Created by Hori,Masaki on 2017/01/02.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 class CollectionView: NSCollectionView {
13 required init?(coder: NSCoder) {
14 super.init(coder: coder)
16 self.addObserver(self, forKeyPath: "selectionIndexPaths", context: nil)
19 self.removeObserver(self, forKeyPath: "selectionIndexPaths")
22 override func observeValue(forKeyPath keyPath: String?,
24 change: [NSKeyValueChangeKey: Any]?,
25 context: UnsafeMutableRawPointer?) {
26 if let o = object as? CollectionView, o == self {
27 if !QLPreviewPanel.sharedPreviewPanelExists() { return }
28 if !QLPreviewPanel.shared().isVisible { return }
29 DispatchQueue.main.asyncAfter(deadline: .now()) {
30 QLPreviewPanel.shared().reloadData()
34 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
38 extension CollectionView {
39 override func rightMouseDown(with event: NSEvent) {
40 guard let menu = menu else { return }
42 let mouse = convert(event.locationInWindow, from: nil)
43 guard let indexPath = indexPathForItem(at: mouse),
44 let _ = item(at: indexPath)
46 if !selectionIndexPaths.contains(indexPath) {
48 selectionIndexPaths = [indexPath]
50 NSMenu.popUpContextMenu(menu, with: event, for: self)
52 override func keyDown(with event: NSEvent) {
53 let key = event.charactersIgnoringModifiers
54 if key == " " { return quickLook(with: event) }
57 let leftArrow: UInt16 = 123
58 let rightArrow: UInt16 = 124
59 if event.keyCode == leftArrow || event.keyCode == rightArrow {
60 guard selectionIndexPaths.count != 0 else { return }
61 var index = selectionIndexPaths.first!.item
62 if event.keyCode == leftArrow && index != 0 { index -= 1 }
63 if event.keyCode == rightArrow && index != content.count - 1 { index += 1 }
64 let set: Set<IndexPath> = [IndexPath(item: index, section: 0)]
65 scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
66 selectionIndexPaths = set
70 super.keyDown(with: event)
72 override func quickLook(with event: NSEvent) {
73 quickLookPreviewItems(nil)
75 override func quickLookPreviewItems(_ sender: Any?) {
76 if QLPreviewPanel.sharedPreviewPanelExists(),
77 QLPreviewPanel.shared().isVisible {
78 QLPreviewPanel.shared().orderOut(nil)
80 QLPreviewPanel.shared().makeKeyAndOrderFront(nil)
85 extension CollectionView: QLPreviewPanelDataSource, QLPreviewPanelDelegate {
86 override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
89 override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
90 panel.dataSource = self
93 override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
94 panel.dataSource = nil
98 func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
99 return selectionIndexPaths.count
101 func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
102 let selections = selectionIndexPaths.flatMap { item(at: $0) }
103 guard 0..<selections.count ~= index,
104 let item = selections[index] as? QLPreviewItem
109 func previewPanel(_ panel: QLPreviewPanel!, handle event: NSEvent!) -> Bool {
110 if event.type == .keyDown {
116 func previewPanel(_ panel: QLPreviewPanel!, sourceFrameOnScreenFor item: QLPreviewItem!) -> NSRect {
117 guard let item = item as? ScreenshotCollectionViewItem
118 else { return .zero }
119 let frame = convert(item.imageFrame, from: item.view)
120 let byWindow = convert(frame, to: nil)
121 return window?.convertToScreen(byWindow) ?? .zero