OSDN Git Service

swiftlint 'line_length'の警告を修正
[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(wallDeadline: DispatchWallTime.now(), execute: {
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 newIndexPath = IndexPath(item: index, section: 0)
65             let set: Set<IndexPath> = [newIndexPath]
66             scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
67             selectionIndexPaths = set
68             
69             return
70         }
71         super.keyDown(with: event)
72     }
73     override func quickLook(with event: NSEvent) {
74         quickLookPreviewItems(nil)
75     }
76     override func quickLookPreviewItems(_ sender: Any?) {
77         if QLPreviewPanel.sharedPreviewPanelExists(),
78             QLPreviewPanel.shared().isVisible {
79             QLPreviewPanel.shared().orderOut(nil)
80         } else {
81             QLPreviewPanel.shared().makeKeyAndOrderFront(nil)
82         }
83     }
84 }
85
86 extension CollectionView: QLPreviewPanelDataSource, QLPreviewPanelDelegate {
87     override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
88         return true
89     }
90     override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
91         panel.dataSource = self
92         panel.delegate = self
93     }
94     override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
95         panel.dataSource = nil
96         panel.delegate = nil
97     }
98     
99     func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
100         return selectionIndexPaths.count
101     }
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
106             else { return nil }
107         return item
108     }
109     
110     func previewPanel(_ panel: QLPreviewPanel!, handle event: NSEvent!) -> Bool {
111         if event.type == .keyDown {
112             keyDown(with: event)
113             return true
114         }
115         return false
116     }
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
123     }
124 }