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 private weak var shareButton: NSButton!
14 @IBOutlet private var rightController: NSViewController!
15 @IBOutlet private weak var left: NSView!
16 @IBOutlet private weak var right: NSView!
18 private lazy var detailViewController: ScreenshotDetailViewController = {
20 return ScreenshotDetailViewController()
22 private var editorViewController: ScreenshotEditorViewController!
23 private var viewControllers: [NSViewController] = []
24 private weak var currentRightViewController: BridgeViewController?
25 private lazy var listViewController: ScreenshotListViewController = {
27 return ScreenshotListViewController()
30 @objc var filterPredicate: NSPredicate? = nil {
34 listViewController.screenshots.filterPredicate = filterPredicate
38 override var windowNibName: NSNib.Name {
40 return .nibName(instanceOf: self)
43 override func windowDidLoad() {
47 viewControllers.append(listViewController)
48 overlapView(left, viewController: listViewController)
49 listViewController.representedObject = listViewController.screenshots
51 viewControllers.append(detailViewController)
52 rightController.addChildViewController(detailViewController)
53 overlapView(right, viewController: detailViewController)
54 detailViewController.representedObject = listViewController.screenshots
56 editorViewController = createEditor()
57 rightController.addChildViewController(editorViewController)
59 _ = editorViewController.view
60 editorViewController.representedObject = listViewController.screenshots
62 currentRightViewController = detailViewController
64 shareButton.sendAction(on: [.leftMouseDown])
67 func overlapView(_ view: NSView, viewController: NSViewController) {
69 viewController.view.frame = view.frame
70 viewController.view.setFrameOrigin(.zero)
71 viewController.view.autoresizingMask = view.autoresizingMask
72 view.addSubview(viewController.view)
75 func registerScreenshot(_ image: NSBitmapImageRep) {
77 ScreenshotRegister(ApplicationDirecrories.screenshotSaveDirectoryURL)
78 .registerScreenshot(image, name: localizedAppName())
81 private func createEditor() -> ScreenshotEditorViewController {
83 let editor = ScreenshotEditorViewController()
84 editor.completeHandler = { [weak self] in
86 defer { self?.changeToDetail(nil) }
88 $0?.tiffRepresentation
89 .flatMap { NSBitmapImageRep(data: $0) }
92 ScreenshotRegister(ApplicationDirecrories.screenshotSaveDirectoryURL)
93 .registerScreenshot($0, name: localizedAppName())
100 @IBAction func share(_ sender: AnyObject?) {
102 currentRightViewController?.share(sender)
105 @IBAction func changeToEditor(_ sender: AnyObject?) {
107 rightController.transition(from: detailViewController,
108 to: editorViewController,
109 options: [.slideLeft],
110 completionHandler: nil)
111 currentRightViewController = editorViewController
114 @IBAction func changeToDetail(_ sender: AnyObject?) {
116 rightController.transition(from: editorViewController,
117 to: detailViewController,
118 options: [.slideRight],
119 completionHandler: nil)
120 currentRightViewController = detailViewController
124 extension ScreenshotListWindowController: NSSharingServicePickerDelegate {
126 func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
127 delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
129 return currentRightViewController
133 extension ScreenshotListWindowController: NSSplitViewDelegate {
135 private static let leftMinWidth: CGFloat = 299
136 private static let rightMinWidth: CGFloat = 400
138 func splitView(_ splitView: NSSplitView,
139 constrainMinCoordinate proposedMinimumPosition: CGFloat,
140 ofSubviewAt dividerIndex: Int) -> CGFloat {
142 if dividerIndex == 0 {
144 return ScreenshotListWindowController.leftMinWidth
147 return proposedMinimumPosition
150 func splitView(_ splitView: NSSplitView,
151 constrainSplitPosition proposedPosition: CGFloat,
152 ofSubviewAt dividerIndex: Int) -> CGFloat {
154 if dividerIndex == 0 {
156 let rightWidth = splitView.frame.size.width - proposedPosition
158 if rightWidth < ScreenshotListWindowController.rightMinWidth {
160 return splitView.frame.size.width - ScreenshotListWindowController.rightMinWidth
164 return proposedPosition
167 func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
169 splitView.adjustSubviews()
171 let leftView = splitView.subviews[0]
172 let rightView = splitView.subviews[1]
174 if leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
176 var leftRect = leftView.frame
177 leftRect.size.width = ScreenshotListWindowController.leftMinWidth
178 leftView.frame = leftRect
180 var rightRect = rightView.frame
181 rightRect.size.width = splitView.frame.width - leftRect.width - splitView.dividerThickness
182 rightRect.origin.x = leftRect.width + splitView.dividerThickness
183 rightView.frame = rightRect
187 func splitView(_ splitView: NSSplitView, shouldAdjustSizeOfSubview view: NSView) -> Bool {
189 let leftView = splitView.subviews[0]
190 let rightView = splitView.subviews[1]
192 if leftView == view, leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
196 if rightView == view, leftView.frame.width >= ScreenshotListWindowController.leftMinWidth {
205 @available(OSX 10.12.2, *)
206 extension ScreenshotListWindowController: NSSharingServicePickerTouchBarItemDelegate {
208 override func makeTouchBar() -> NSTouchBar? {
210 return listViewController.touchBar
213 func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
215 return currentRightViewController?.items(for: pickerTouchBarItem) ?? []