OSDN Git Service

UAをVersion/10.0.3 Safari/602.4.8に変更
[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 class CollectionView: NSCollectionView {
13     required init?(coder: NSCoder) {
14         super.init(coder: coder)
15         
16         self.addObserver(self, forKeyPath: "selectionIndexPaths", context: nil)
17     }
18     deinit {
19         self.removeObserver(self, forKeyPath: "selectionIndexPaths")
20     }
21     
22     override func observeValue(forKeyPath keyPath: String?,
23                                of object: Any?,
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()
31             }
32             return
33         }
34         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
35     }
36 }
37
38 extension CollectionView {
39     override func rightMouseDown(with event: NSEvent) {
40         guard let menu = menu else { return }
41         
42         let mouse = convert(event.locationInWindow, from: nil)
43         guard let indexPath = indexPathForItem(at: mouse),
44             let _ = item(at: indexPath)
45             else { return }
46         if !selectionIndexPaths.contains(indexPath) {
47             deselectAll(nil)
48             selectionIndexPaths = [indexPath]
49         }
50         NSMenu.popUpContextMenu(menu, with: event, for: self)
51     }
52     override func keyDown(with event: NSEvent) {
53         let key = event.charactersIgnoringModifiers
54         if key == " " { return quickLook(with: event) }
55         
56         //  左右矢印キーの時の動作
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
67             
68             return
69         }
70         super.keyDown(with: event)
71     }
72     override func quickLook(with event: NSEvent) {
73         quickLookPreviewItems(nil)
74     }
75     override func quickLookPreviewItems(_ sender: Any?) {
76         if QLPreviewPanel.sharedPreviewPanelExists(),
77             QLPreviewPanel.shared().isVisible {
78             QLPreviewPanel.shared().orderOut(nil)
79         } else {
80             QLPreviewPanel.shared().makeKeyAndOrderFront(nil)
81         }
82     }
83 }
84
85 extension CollectionView: QLPreviewPanelDataSource, QLPreviewPanelDelegate {
86     override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
87         return true
88     }
89     override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
90         panel.dataSource = self
91         panel.delegate = self
92     }
93     override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
94         panel.dataSource = nil
95         panel.delegate = nil
96     }
97     
98     func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
99         return selectionIndexPaths.count
100     }
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
105             else { return nil }
106         return item
107     }
108     
109     func previewPanel(_ panel: QLPreviewPanel!, handle event: NSEvent!) -> Bool {
110         if event.type == .keyDown {
111             keyDown(with: event)
112             return true
113         }
114         return false
115     }
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
122     }
123 }