OSDN Git Service

guard の書き方を統一した
[kcd/KCD.git] / KCD / BridgeViewController.swift
1 //
2 //  BridgeViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/30.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 protocol ScreenshotSharingProvider {
12     
13     var contentRect: NSRect { get }
14 }
15
16 class BridgeViewController: NSViewController {
17     
18     @IBOutlet var arrayController: NSArrayController!
19     
20     deinit {
21         
22         [.contentArray, .sortDescriptors, .selectionIndexes, .filterPredicate]
23             .forEach { arrayController.unbind($0) }
24     }
25     
26     override var representedObject: Any? {
27         
28         didSet {
29             guard let representedObject = representedObject else { return }
30             
31             [
32                 (.contentArray, #keyPath(ScreenshotModel.screenshots)),
33                 (.sortDescriptors, #keyPath(ScreenshotModel.sortDescriptors)),
34                 (.selectionIndexes, #keyPath(ScreenshotModel.selectedIndexes)),
35                 (.filterPredicate, #keyPath(ScreenshotModel.filterPredicate))
36                 ]
37                 .forEach {
38                     arrayController.bind($0.0, to: representedObject, withKeyPath: $0.1, options: nil)
39             }
40         }
41     }
42     
43     override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
44         
45         (sender as? NSControl)?.action = nil
46         (segue.destinationController as? NSViewController)?.representedObject = representedObject
47     }
48 }
49
50 extension BridgeViewController: NSSharingServicePickerDelegate, ScreenshotSharingProvider {
51     
52     @objc var contentRect: NSRect {
53         
54         fatalError("Must implemente")
55     }
56     
57     private var appendKanColleTag: Bool {
58         
59         return UserDefaults.standard[.appendKanColleTag]
60     }
61     
62     private var tagString: String? {
63         
64         let tag = NSLocalizedString("kancolle", comment: "kancolle twitter hash tag")
65         if tag == "" { return "" }
66         
67         return "#\(tag)"
68     }
69     
70     @IBAction func share(_ sender: AnyObject?) {
71         
72         guard let view = sender as? NSView else { return }
73         
74         let picker = NSSharingServicePicker(items: itemsForShareingServicePicker())
75         picker.delegate = self
76         picker.show(relativeTo: view.bounds, of: view, preferredEdge: .minX)
77     }
78     
79     private func itemsForShareingServicePicker() -> [AnyObject] {
80         
81         guard let informations = arrayController.selectedObjects as? [ScreenshotInformation] else { return [] }
82         
83         let images: [NSImage] = informations.flatMap { NSImage(contentsOf: $0.url) }
84         if !appendKanColleTag { return images }
85         if let tag = tagString {
86             
87             return ["\n\(tag)" as AnyObject] + images
88         }
89         
90         return images
91     }
92 }
93
94 extension BridgeViewController: NSSharingServiceDelegate {
95     
96     func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
97                               delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
98         
99         return self
100     }
101     
102     func sharingService(_ sharingService: NSSharingService, sourceFrameOnScreenForShareItem item: Any) -> NSRect {
103         
104         return self.view.window?.convertToScreen(contentRect) ?? .zero
105     }
106     
107     func sharingService(_ sharingService: NSSharingService,
108                         transitionImageForShareItem item: Any,
109                         contentRect: UnsafeMutablePointer<NSRect>) -> NSImage? {
110         
111         return item as? NSImage
112     }
113     
114     func sharingService(_ sharingService: NSSharingService,
115                         sourceWindowForShareItems items: [Any],
116                         sharingContentScope: UnsafeMutablePointer<NSSharingService.SharingContentScope>) -> NSWindow? {
117         
118         return view.window
119     }
120 }
121
122 @available(OSX 10.12.2, *)
123 extension BridgeViewController: NSSharingServicePickerTouchBarItemDelegate {
124     
125     func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
126         
127         return itemsForShareingServicePicker()
128     }
129 }