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 return ScreenshotEditorViewController()
24 private var viewControllers: [NSViewController] = []
25 private weak var currentRightViewController: BridgeViewController?
26 private lazy var listViewController: ScreenshotListViewController = {
27 return ScreenshotListViewController()
30 @objc var filterPredicate: NSPredicate? = nil {
33 listViewController.screenshots.filterPredicate = filterPredicate
37 override var windowNibName: NSNib.Name {
39 return .nibName(instanceOf: self)
42 override func windowDidLoad() {
46 viewControllers.append(listViewController)
47 replaceView(left, viewController: listViewController)
48 listViewController.representedObject = listViewController.screenshots
50 viewControllers.append(detailViewController)
51 rightController.addChildViewController(detailViewController)
52 replaceView(right, viewController: detailViewController)
53 detailViewController.representedObject = listViewController.screenshots
55 rightController.addChildViewController(editorViewController)
57 _ = editorViewController.view
58 editorViewController.representedObject = listViewController.screenshots
60 currentRightViewController = detailViewController
62 shareButton.sendAction(on: [.leftMouseDown])
65 func replaceView(_ view: NSView, viewController: NSViewController) {
67 viewController.view.frame = view.frame
68 viewController.view.setFrameOrigin(.zero)
69 viewController.view.autoresizingMask = view.autoresizingMask
70 view.addSubview(viewController.view)
73 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
75 listViewController.registerScreenshot(image, fromOnScreen: fromOnScreen)
78 @IBAction func share(_ sender: AnyObject?) {
80 currentRightViewController?.share(sender)
83 @IBAction func changeToEditor(_ sender: AnyObject?) {
85 rightController.transition(from: detailViewController,
86 to: editorViewController,
87 options: [.slideLeft],
88 completionHandler: nil)
89 currentRightViewController = editorViewController
92 @IBAction func changeToDetail(_ sender: AnyObject?) {
94 rightController.transition(from: editorViewController,
95 to: detailViewController,
96 options: [.slideRight],
97 completionHandler: nil)
98 currentRightViewController = detailViewController
102 extension ScreenshotListWindowController: NSSharingServicePickerDelegate {
104 func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
105 delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
107 return currentRightViewController
111 extension ScreenshotListWindowController: NSSplitViewDelegate {
113 private static let leftMinWidth: CGFloat = 299
114 private static let rightMinWidth: CGFloat = 400
116 func splitView(_ splitView: NSSplitView,
117 constrainMinCoordinate proposedMinimumPosition: CGFloat,
118 ofSubviewAt dividerIndex: Int) -> CGFloat {
120 if dividerIndex == 0 { return ScreenshotListWindowController.leftMinWidth }
122 return proposedMinimumPosition
125 func splitView(_ splitView: NSSplitView,
126 constrainSplitPosition proposedPosition: CGFloat,
127 ofSubviewAt dividerIndex: Int) -> CGFloat {
129 if dividerIndex == 0 {
131 let rightWidth = splitView.frame.size.width - proposedPosition
133 if rightWidth < ScreenshotListWindowController.rightMinWidth {
135 return splitView.frame.size.width - ScreenshotListWindowController.rightMinWidth
139 return proposedPosition
142 func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
144 splitView.adjustSubviews()
146 let leftView = splitView.subviews[0]
147 let rightView = splitView.subviews[1]
149 if leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
151 var leftRect = leftView.frame
152 leftRect.size.width = ScreenshotListWindowController.leftMinWidth
153 leftView.frame = leftRect
155 var rightRect = rightView.frame
156 rightRect.size.width = splitView.frame.width - leftRect.width - splitView.dividerThickness
157 rightRect.origin.x = leftRect.width + splitView.dividerThickness
158 rightView.frame = rightRect
162 func splitView(_ splitView: NSSplitView, shouldAdjustSizeOfSubview view: NSView) -> Bool {
164 let leftView = splitView.subviews[0]
165 let rightView = splitView.subviews[1]
167 if leftView == view {
169 if leftView.frame.width < ScreenshotListWindowController.leftMinWidth { return false }
171 if rightView == view {
173 if leftView.frame.width >= ScreenshotListWindowController.leftMinWidth { return false }
180 @available(OSX 10.12.2, *)
181 extension ScreenshotListWindowController: NSSharingServicePickerTouchBarItemDelegate {
183 override func makeTouchBar() -> NSTouchBar? {
185 return listViewController.touchBar
188 func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
190 return currentRightViewController?.items(for: pickerTouchBarItem) ?? []