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(wallDeadline: DispatchWallTime.now(), execute: {
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 newIndexPath = IndexPath(item: index, section: 0)
65 let set: Set<IndexPath> = [newIndexPath]
66 scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
67 selectionIndexPaths = set
71 super.keyDown(with: event)
73 override func quickLook(with event: NSEvent) {
74 quickLookPreviewItems(nil)
76 override func quickLookPreviewItems(_ sender: Any?) {
77 if QLPreviewPanel.sharedPreviewPanelExists(),
78 QLPreviewPanel.shared().isVisible {
79 QLPreviewPanel.shared().orderOut(nil)
81 QLPreviewPanel.shared().makeKeyAndOrderFront(nil)
86 extension CollectionView: QLPreviewPanelDataSource, QLPreviewPanelDelegate {
87 override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
90 override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
91 panel.dataSource = self
94 override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
95 panel.dataSource = nil
99 func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
100 return selectionIndexPaths.count
102 func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
103 let selections = selectionIndexPaths.flatMap { item(at: $0) }
104 guard 0..<selections.count ~= index,
105 let item = selections[index] as? QLPreviewItem
110 func previewPanel(_ panel: QLPreviewPanel!, handle event: NSEvent!) -> Bool {
111 if event.type == .keyDown {
117 func previewPanel(_ panel: QLPreviewPanel!, sourceFrameOnScreenFor item: QLPreviewItem!) -> NSRect {
118 guard let item = item as? ScreenshotCollectionViewItem
119 else { return .zero }
120 let frame = convert(item.imageFrame, from: item.view)
121 let byWindow = convert(frame, to: nil)
122 return window?.convertToScreen(byWindow) ?? .zero