OSDN Git Service

関数名を変更
[kcd/KCD.git] / KCD / ScreenshotListWindowController.swift
1 //
2 //  ScreenshotListWindowController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/31.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class ScreenshotListWindowController: NSWindowController {
12     
13     @IBOutlet weak var shareButton: NSButton!
14     @IBOutlet var rightController: NSViewController!
15     @IBOutlet weak var left: NSView!
16     @IBOutlet weak var right: NSView!
17     
18     private lazy var detailViewController: ScreenshotDetailViewController = {
19         return ScreenshotDetailViewController()
20     }()
21     private var editorViewController: ScreenshotEditorViewController!
22     private var viewControllers: [NSViewController] = []
23     private weak var currentRightViewController: BridgeViewController?
24     private lazy var listViewController: ScreenshotListViewController = {
25             return ScreenshotListViewController()
26     }()
27     
28     @objc var filterPredicate: NSPredicate? = nil {
29         
30         didSet {
31             listViewController.screenshots.filterPredicate = filterPredicate
32         }
33     }
34     
35     override var windowNibName: NSNib.Name {
36         
37         return .nibName(instanceOf: self)
38     }
39     
40     override func windowDidLoad() {
41         
42         super.windowDidLoad()
43         
44         viewControllers.append(listViewController)
45         replaceView(left, viewController: listViewController)
46         listViewController.representedObject = listViewController.screenshots
47         
48         viewControllers.append(detailViewController)
49         rightController.addChildViewController(detailViewController)
50         replaceView(right, viewController: detailViewController)
51         detailViewController.representedObject = listViewController.screenshots
52         
53         editorViewController = createEditor()
54         rightController.addChildViewController(editorViewController)
55         // force load view.
56         _ = editorViewController.view
57         editorViewController.representedObject = listViewController.screenshots
58         
59         currentRightViewController = detailViewController
60         
61         shareButton.sendAction(on: [.leftMouseDown])
62     }
63     
64     func replaceView(_ view: NSView, viewController: NSViewController) {
65         
66         viewController.view.frame = view.frame
67         viewController.view.setFrameOrigin(.zero)
68         viewController.view.autoresizingMask = view.autoresizingMask
69         view.addSubview(viewController.view)
70     }
71     
72     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
73         
74         listViewController.registerScreenshot(image, fromOnScreen: fromOnScreen)
75     }
76     
77     private func createEditor() -> ScreenshotEditorViewController {
78         
79         let editor = ScreenshotEditorViewController()
80         editor.completeHandler = { [weak self] in
81             
82             defer { self?.changeToDetail(nil) }
83             
84             guard let image = $0 else { return }
85             self?.listViewController.registerImage(image)
86         }
87         
88         return editor
89     }
90     
91     @IBAction func share(_ sender: AnyObject?) {
92         
93         currentRightViewController?.share(sender)
94     }
95     
96     @IBAction func changeToEditor(_ sender: AnyObject?) {
97         
98         rightController.transition(from: detailViewController,
99                                    to: editorViewController,
100                                    options: [.slideLeft],
101                                    completionHandler: nil)
102         currentRightViewController = editorViewController
103     }
104     
105     @IBAction func changeToDetail(_ sender: AnyObject?) {
106         
107         rightController.transition(from: editorViewController,
108                                    to: detailViewController,
109                                    options: [.slideRight],
110                                    completionHandler: nil)
111         currentRightViewController = detailViewController
112     }
113 }
114
115 extension ScreenshotListWindowController: NSSharingServicePickerDelegate {
116     
117     func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
118                               delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
119         
120         return currentRightViewController
121     }
122 }
123
124 extension ScreenshotListWindowController: NSSplitViewDelegate {
125     
126     private static let leftMinWidth: CGFloat = 299
127     private static let rightMinWidth: CGFloat = 400
128     
129     func splitView(_ splitView: NSSplitView,
130                    constrainMinCoordinate proposedMinimumPosition: CGFloat,
131                    ofSubviewAt dividerIndex: Int) -> CGFloat {
132         
133         if dividerIndex == 0 { return ScreenshotListWindowController.leftMinWidth }
134         
135         return proposedMinimumPosition
136     }
137     
138     func splitView(_ splitView: NSSplitView,
139                    constrainSplitPosition proposedPosition: CGFloat,
140                    ofSubviewAt dividerIndex: Int) -> CGFloat {
141         
142         if dividerIndex == 0 {
143             
144             let rightWidth = splitView.frame.size.width - proposedPosition
145             
146             if rightWidth < ScreenshotListWindowController.rightMinWidth {
147                 
148                 return splitView.frame.size.width - ScreenshotListWindowController.rightMinWidth
149             }
150         }
151         
152         return proposedPosition
153     }
154     
155     func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
156         
157         splitView.adjustSubviews()
158         
159         let leftView = splitView.subviews[0]
160         let rightView = splitView.subviews[1]
161         
162         if leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
163             
164             var leftRect = leftView.frame
165             leftRect.size.width = ScreenshotListWindowController.leftMinWidth
166             leftView.frame = leftRect
167             
168             var rightRect = rightView.frame
169             rightRect.size.width = splitView.frame.width - leftRect.width - splitView.dividerThickness
170             rightRect.origin.x = leftRect.width + splitView.dividerThickness
171             rightView.frame = rightRect
172         }
173     }
174     
175     func splitView(_ splitView: NSSplitView, shouldAdjustSizeOfSubview view: NSView) -> Bool {
176         
177         let leftView = splitView.subviews[0]
178         let rightView = splitView.subviews[1]
179         
180         if leftView == view, leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
181             
182             return false
183         }
184         if rightView == view, leftView.frame.width >= ScreenshotListWindowController.leftMinWidth {
185             
186             return false
187         }
188         
189         return true
190     }
191 }
192
193 @available(OSX 10.12.2, *)
194 extension ScreenshotListWindowController: NSSharingServicePickerTouchBarItemDelegate {
195     
196     override func makeTouchBar() -> NSTouchBar? {
197         
198         return listViewController.touchBar
199     }
200     
201     func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
202         
203         return currentRightViewController?.items(for: pickerTouchBarItem) ?? []
204     }
205 }