OSDN Git Service

コメントを追加
[kcd/KCD.git] / KCD / CollectionView.swift
1 //
2 //  CollectionView.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/02.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10 import Quartz
11
12 protocol Previewable {
13     
14     var imageFrame: NSRect { get }
15     var view: NSView { get }
16 }
17
18 final class CollectionView: NSCollectionView {
19     
20     private var selectionObservation: NSKeyValueObservation?
21     
22     required init?(coder: NSCoder) {
23         
24         super.init(coder: coder)
25         
26         selectionObservation = observe(\CollectionView.selectionIndexPaths) { (_, _) in
27             
28             if !QLPreviewPanel.sharedPreviewPanelExists() { return }
29             if !QLPreviewPanel.shared().isVisible { return }
30             
31             DispatchQueue.main.asyncAfter(deadline: .now()) {
32                 
33                 QLPreviewPanel.shared().reloadData()
34             }
35         }
36     }
37     
38 }
39
40 extension CollectionView {
41     
42     override func rightMouseDown(with event: NSEvent) {
43         
44         guard let menu = menu else { return }
45         
46         let mouse = convert(event.locationInWindow, from: nil)
47         
48         guard let indexPath = indexPathForItem(at: mouse) else { return }
49         guard let _ = item(at: indexPath) else { return }
50         
51         if !selectionIndexPaths.contains(indexPath) {
52             
53             deselectAll(nil)
54             selectionIndexPaths = [indexPath]
55         }
56         
57         NSMenu.popUpContextMenu(menu, with: event, for: self)
58     }
59     
60     override func keyDown(with event: NSEvent) {
61         
62         let key = event.charactersIgnoringModifiers
63         
64         if key == " " { return quickLook(with: event) }
65         
66         //  左右矢印キーの時の動作
67         let leftArrow: UInt16 = 123
68         let rightArrow: UInt16 = 124
69         if event.keyCode == leftArrow || event.keyCode == rightArrow {
70             
71             guard selectionIndexPaths.count != 0 else { return }
72             
73             var index = selectionIndexPaths.first!.item
74             if event.keyCode == leftArrow && index != 0 { index -= 1 }
75             if event.keyCode == rightArrow && index != content.count - 1 { index += 1 }
76             let set: Set<IndexPath> = [IndexPath(item: index, section: 0)]
77             scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
78             selectionIndexPaths = set
79             
80             return
81         }
82         
83         super.keyDown(with: event)
84     }
85     
86     override func quickLook(with event: NSEvent) {
87         
88         quickLookPreviewItems(nil)
89     }
90     
91     override func quickLookPreviewItems(_ sender: Any?) {
92         
93         if QLPreviewPanel.sharedPreviewPanelExists(),
94             QLPreviewPanel.shared().isVisible {
95             
96             QLPreviewPanel.shared().orderOut(nil)
97             
98         } else {
99             
100             QLPreviewPanel.shared().makeKeyAndOrderFront(nil)
101         }
102     }
103 }
104
105 extension CollectionView: QLPreviewPanelDataSource, QLPreviewPanelDelegate {
106     
107     override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
108         
109         return true
110     }
111     
112     override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
113         
114         panel.dataSource = self
115         panel.delegate = self
116     }
117     
118     override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
119         
120         panel.dataSource = nil
121         panel.delegate = nil
122     }
123     
124     func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
125         
126         return selectionIndexPaths.count
127     }
128     
129     func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
130         
131         let selections = selectionIndexPaths.flatMap(item(at:))
132         
133         guard case 0..<selections.count = index else { return nil }
134         guard let item = selections[index] as? QLPreviewItem else { return nil}
135         
136         return item
137     }
138     
139     func previewPanel(_ panel: QLPreviewPanel!, handle event: NSEvent!) -> Bool {
140         
141         if event.type == .keyDown {
142             
143             keyDown(with: event)
144             
145             return true
146         }
147         
148         return false
149     }
150     
151     func previewPanel(_ panel: QLPreviewPanel!, sourceFrameOnScreenFor item: QLPreviewItem!) -> NSRect {
152         
153         guard let item = item as? Previewable else { return .zero }
154         
155         let frame = convert(item.imageFrame, from: item.view)
156         let byWindow = convert(frame, to: nil)
157         
158         return window?.convertToScreen(byWindow) ?? .zero
159     }
160 }