2 // ScreenshotListWindowController.swift
5 // Created by Hori,Masaki on 2016/12/31.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 final class ScreenshotListWindowController: NSWindowController {
13 @IBOutlet weak var shareButton: NSButton!
14 @IBOutlet var rightController: NSViewController!
15 @IBOutlet weak var left: NSView!
16 @IBOutlet weak var right: NSView!
18 private lazy var detailViewController: ScreenshotDetailViewController = {
19 return ScreenshotDetailViewController()
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()
28 @objc var filterPredicate: NSPredicate? = nil {
31 listViewController.screenshots.filterPredicate = filterPredicate
35 override var windowNibName: NSNib.Name {
37 return .nibName(instanceOf: self)
40 override func windowDidLoad() {
44 viewControllers.append(listViewController)
45 replaceView(left, viewController: listViewController)
46 listViewController.representedObject = listViewController.screenshots
48 viewControllers.append(detailViewController)
49 rightController.addChildViewController(detailViewController)
50 replaceView(right, viewController: detailViewController)
51 detailViewController.representedObject = listViewController.screenshots
53 editorViewController = createEditor()
54 rightController.addChildViewController(editorViewController)
56 _ = editorViewController.view
57 editorViewController.representedObject = listViewController.screenshots
59 currentRightViewController = detailViewController
61 shareButton.sendAction(on: [.leftMouseDown])
64 func replaceView(_ view: NSView, viewController: NSViewController) {
66 viewController.view.frame = view.frame
67 viewController.view.setFrameOrigin(.zero)
68 viewController.view.autoresizingMask = view.autoresizingMask
69 view.addSubview(viewController.view)
72 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
74 listViewController.registerScreenshot(image, fromOnScreen: fromOnScreen)
77 private func createEditor() -> ScreenshotEditorViewController {
79 let editor = ScreenshotEditorViewController()
80 editor.completeHandler = { [weak self] in
82 defer { self?.changeToDetail(nil) }
84 guard let image = $0 else { return }
85 self?.listViewController.registerImage(image)
91 @IBAction func share(_ sender: AnyObject?) {
93 currentRightViewController?.share(sender)
96 @IBAction func changeToEditor(_ sender: AnyObject?) {
98 rightController.transition(from: detailViewController,
99 to: editorViewController,
100 options: [.slideLeft],
101 completionHandler: nil)
102 currentRightViewController = editorViewController
105 @IBAction func changeToDetail(_ sender: AnyObject?) {
107 rightController.transition(from: editorViewController,
108 to: detailViewController,
109 options: [.slideRight],
110 completionHandler: nil)
111 currentRightViewController = detailViewController
115 extension ScreenshotListWindowController: NSSharingServicePickerDelegate {
117 func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
118 delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
120 return currentRightViewController
124 extension ScreenshotListWindowController: NSSplitViewDelegate {
126 private static let leftMinWidth: CGFloat = 299
127 private static let rightMinWidth: CGFloat = 400
129 func splitView(_ splitView: NSSplitView,
130 constrainMinCoordinate proposedMinimumPosition: CGFloat,
131 ofSubviewAt dividerIndex: Int) -> CGFloat {
133 if dividerIndex == 0 { return ScreenshotListWindowController.leftMinWidth }
135 return proposedMinimumPosition
138 func splitView(_ splitView: NSSplitView,
139 constrainSplitPosition proposedPosition: CGFloat,
140 ofSubviewAt dividerIndex: Int) -> CGFloat {
142 if dividerIndex == 0 {
144 let rightWidth = splitView.frame.size.width - proposedPosition
146 if rightWidth < ScreenshotListWindowController.rightMinWidth {
148 return splitView.frame.size.width - ScreenshotListWindowController.rightMinWidth
152 return proposedPosition
155 func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
157 splitView.adjustSubviews()
159 let leftView = splitView.subviews[0]
160 let rightView = splitView.subviews[1]
162 if leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
164 var leftRect = leftView.frame
165 leftRect.size.width = ScreenshotListWindowController.leftMinWidth
166 leftView.frame = leftRect
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
175 func splitView(_ splitView: NSSplitView, shouldAdjustSizeOfSubview view: NSView) -> Bool {
177 let leftView = splitView.subviews[0]
178 let rightView = splitView.subviews[1]
180 if leftView == view, leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
184 if rightView == view, leftView.frame.width >= ScreenshotListWindowController.leftMinWidth {
193 @available(OSX 10.12.2, *)
194 extension ScreenshotListWindowController: NSSharingServicePickerTouchBarItemDelegate {
196 override func makeTouchBar() -> NSTouchBar? {
198 return listViewController.touchBar
201 func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
203 return currentRightViewController?.items(for: pickerTouchBarItem) ?? []