2 // BridgeViewController.swift
5 // Created by Hori,Masaki on 2016/12/30.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 protocol ScreenshotSharingProvider {
13 var contentRect: NSRect { get }
16 class BridgeViewController: NSViewController {
18 @IBOutlet private(set) var arrayController: NSArrayController!
22 arrayController.unbind(.contentArray)
23 arrayController.unbind(.sortDescriptors)
24 arrayController.unbind(.selectionIndexes)
25 arrayController.unbind(.filterPredicate)
28 override var representedObject: Any? {
31 guard let representedObject = representedObject as? ScreenshotModel else { return }
33 arrayController.bind(.contentArray, to: representedObject, withKeyPath: #keyPath(ScreenshotModel.screenshots))
34 arrayController.bind(.sortDescriptors, to: representedObject, withKeyPath: #keyPath(ScreenshotModel.sortDescriptors))
35 arrayController.bind(.selectionIndexes, to: representedObject, withKeyPath: #keyPath(ScreenshotModel.selectedIndexes))
36 arrayController.bind(.filterPredicate, to: representedObject, withKeyPath: #keyPath(ScreenshotModel.filterPredicate))
40 override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
42 (sender as? NSControl)?.action = nil
43 (segue.destinationController as? NSViewController)?.representedObject = representedObject
47 extension BridgeViewController: NSSharingServicePickerDelegate, ScreenshotSharingProvider {
49 @objc var contentRect: NSRect {
51 fatalError("Must implemente")
54 private var appendKanColleTag: Bool {
56 return UserDefaults.standard[.appendKanColleTag]
59 private var tagString: String? {
61 let tag = LocalizedStrings.tweetTag.string
62 if tag == "" { return "" }
67 @IBAction func share(_ sender: AnyObject?) {
69 guard let view = sender as? NSView else { return }
71 let picker = NSSharingServicePicker(items: itemsForShareingServicePicker())
72 picker.delegate = self
73 picker.show(relativeTo: view.bounds, of: view, preferredEdge: .minX)
76 private func itemsForShareingServicePicker() -> [AnyObject] {
78 guard let informations = arrayController.selectedObjects as? [ScreenshotInformation] else { return [] }
80 let images: [NSImage] = informations.compactMap { NSImage(contentsOf: $0.url) }
81 if !appendKanColleTag { return images }
82 if let tag = tagString {
84 return ["\n\(tag)" as AnyObject] + images
91 extension BridgeViewController: NSSharingServiceDelegate {
93 func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
94 delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
99 func sharingService(_ sharingService: NSSharingService, sourceFrameOnScreenForShareItem item: Any) -> NSRect {
101 return self.view.window?.convertToScreen(contentRect) ?? .zero
104 func sharingService(_ sharingService: NSSharingService,
105 transitionImageForShareItem item: Any,
106 contentRect: UnsafeMutablePointer<NSRect>) -> NSImage? {
108 return item as? NSImage
111 func sharingService(_ sharingService: NSSharingService,
112 sourceWindowForShareItems items: [Any],
113 sharingContentScope: UnsafeMutablePointer<NSSharingService.SharingContentScope>) -> NSWindow? {
119 @available(OSX 10.12.2, *)
120 extension BridgeViewController: NSSharingServicePickerTouchBarItemDelegate {
122 func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
124 return itemsForShareingServicePicker()