OSDN Git Service

UAをVersion/10.0.3 Safari/602.4.8に変更
[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     var contentRect: NSRect { get }
13 }
14
15 class BridgeViewController: NSViewController {
16     @IBOutlet var arrayController: NSArrayController!
17     
18     deinit {
19         [NSContentArrayBinding, NSSortDescriptorsBinding,
20          NSSelectionIndexesBinding, NSFilterPredicateBinding]
21             .forEach { arrayController.unbind($0) }
22     }
23     
24     override var representedObject: Any? {
25         didSet {
26             guard let representedObject = representedObject else { return }
27             [
28                 (NSContentArrayBinding, "screenshots"),
29                 (NSSortDescriptorsBinding, "sortDescriptors"),
30                 (NSSelectionIndexesBinding, "selectedIndexes"),
31                 (NSFilterPredicateBinding, "filterPredicate")
32                 ]
33                 .forEach {
34                     arrayController.bind($0.0, to: representedObject, withKeyPath: $0.1, options: nil)
35             }
36         }
37     }
38     override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
39         (sender as? NSControl)?.action = nil
40         (segue.destinationController as? NSViewController)?.representedObject = representedObject
41     }
42 }
43
44 extension BridgeViewController: NSSharingServicePickerDelegate, ScreenshotSharingProvider {
45     var contentRect: NSRect {
46         fatalError("Must implemente")
47     }
48     private var appendKanColleTag: Bool {
49         return UserDefaults.standard.appendKanColleTag
50     }
51     private var tagString: String? {
52         let tag = NSLocalizedString("kancolle", comment: "kancolle twitter hash tag")
53         if tag == "" { return "" }
54         return "#\(tag)"
55     }
56     @IBAction func share(_ sender: AnyObject?) {
57         guard let view = sender as? NSView else { return }
58         let picker = NSSharingServicePicker(items: itemsForShareingServicePicker())
59         picker.delegate = self
60         picker.show(relativeTo: view.bounds, of: view, preferredEdge: .minX)
61     }
62     
63     fileprivate func itemsForShareingServicePicker() -> [AnyObject] {
64         guard let informations = arrayController.selectedObjects as? [ScreenshotInformation]
65             else { return [] }
66         let images: [NSImage] = informations.flatMap { NSImage(contentsOf: $0.url) }
67         if !appendKanColleTag { return images }
68         if let tag = tagString {
69             return ["\n\(tag)" as AnyObject] + images
70         }
71         return images
72     }
73 }
74 extension BridgeViewController: NSSharingServiceDelegate {
75     func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
76                               delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
77         return self
78     }
79     
80     func sharingService(_ sharingService: NSSharingService, sourceFrameOnScreenForShareItem item: Any) -> NSRect {
81         return self.view.window?.convertToScreen(contentRect) ?? .zero
82     }
83     func sharingService(_ sharingService: NSSharingService,
84                         transitionImageForShareItem item: Any,
85                         contentRect: UnsafeMutablePointer<NSRect>) -> NSImage? {
86         return item as? NSImage
87     }
88     func sharingService(_ sharingService: NSSharingService,
89                         sourceWindowForShareItems items: [Any],
90                         sharingContentScope: UnsafeMutablePointer<NSSharingContentScope>) -> NSWindow? {
91         return view.window
92     }
93 }
94
95 @available(OSX 10.12.2, *)
96 extension BridgeViewController: NSSharingServicePickerTouchBarItemDelegate {
97     func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
98         return itemsForShareingServicePicker()
99     }
100 }