OSDN Git Service

guard の書き方を統一した
[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             return ScreenshotEditorViewController()
23     }()
24     private var viewControllers: [NSViewController] = []
25     private weak var currentRightViewController: BridgeViewController?
26     private lazy var listViewController: ScreenshotListViewController = {
27             return ScreenshotListViewController()
28     }()
29     
30     @objc var filterPredicate: NSPredicate? = nil {
31         
32         didSet {
33             listViewController.screenshots.filterPredicate = filterPredicate
34         }
35     }
36     
37     override var windowNibName: NSNib.Name {
38         
39         return .nibName(instanceOf: self)
40     }
41     
42     override func windowDidLoad() {
43         
44         super.windowDidLoad()
45         
46         viewControllers.append(listViewController)
47         replaceView(left, viewController: listViewController)
48         listViewController.representedObject = listViewController.screenshots
49         
50         viewControllers.append(detailViewController)
51         rightController.addChildViewController(detailViewController)
52         replaceView(right, viewController: detailViewController)
53         detailViewController.representedObject = listViewController.screenshots
54         
55         rightController.addChildViewController(editorViewController)
56         // force load view.
57         _ = editorViewController.view
58         editorViewController.representedObject = listViewController.screenshots
59         
60         currentRightViewController = detailViewController
61         
62         shareButton.sendAction(on: [.leftMouseDown])
63     }
64     
65     func replaceView(_ view: NSView, viewController: NSViewController) {
66         
67         viewController.view.frame = view.frame
68         viewController.view.setFrameOrigin(.zero)
69         viewController.view.autoresizingMask = view.autoresizingMask
70         view.addSubview(viewController.view)
71     }
72     
73     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
74         
75         listViewController.registerScreenshot(image, fromOnScreen: fromOnScreen)
76     }
77     
78     @IBAction func share(_ sender: AnyObject?) {
79         
80         currentRightViewController?.share(sender)
81     }
82     
83     @IBAction func changeToEditor(_ sender: AnyObject?) {
84         
85         rightController.transition(from: detailViewController,
86                                    to: editorViewController,
87                                    options: [.slideLeft],
88                                    completionHandler: nil)
89         currentRightViewController = editorViewController
90     }
91     
92     @IBAction func changeToDetail(_ sender: AnyObject?) {
93         
94         rightController.transition(from: editorViewController,
95                                    to: detailViewController,
96                                    options: [.slideRight],
97                                    completionHandler: nil)
98         currentRightViewController = detailViewController
99     }
100 }
101
102 extension ScreenshotListWindowController: NSSharingServicePickerDelegate {
103     
104     func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker,
105                               delegateFor sharingService: NSSharingService) -> NSSharingServiceDelegate? {
106         
107         return currentRightViewController
108     }
109 }
110
111 extension ScreenshotListWindowController: NSSplitViewDelegate {
112     
113     private static let leftMinWidth: CGFloat = 299
114     private static let rightMinWidth: CGFloat = 400
115     
116     func splitView(_ splitView: NSSplitView,
117                    constrainMinCoordinate proposedMinimumPosition: CGFloat,
118                    ofSubviewAt dividerIndex: Int) -> CGFloat {
119         
120         if dividerIndex == 0 { return ScreenshotListWindowController.leftMinWidth }
121         
122         return proposedMinimumPosition
123     }
124     
125     func splitView(_ splitView: NSSplitView,
126                    constrainSplitPosition proposedPosition: CGFloat,
127                    ofSubviewAt dividerIndex: Int) -> CGFloat {
128         
129         if dividerIndex == 0 {
130             
131             let rightWidth = splitView.frame.size.width - proposedPosition
132             
133             if rightWidth < ScreenshotListWindowController.rightMinWidth {
134                 
135                 return splitView.frame.size.width - ScreenshotListWindowController.rightMinWidth
136             }
137         }
138         
139         return proposedPosition
140     }
141     
142     func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
143         
144         splitView.adjustSubviews()
145         
146         let leftView = splitView.subviews[0]
147         let rightView = splitView.subviews[1]
148         
149         if leftView.frame.width < ScreenshotListWindowController.leftMinWidth {
150             
151             var leftRect = leftView.frame
152             leftRect.size.width = ScreenshotListWindowController.leftMinWidth
153             leftView.frame = leftRect
154             
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
159         }
160     }
161     
162     func splitView(_ splitView: NSSplitView, shouldAdjustSizeOfSubview view: NSView) -> Bool {
163         
164         let leftView = splitView.subviews[0]
165         let rightView = splitView.subviews[1]
166         
167         if leftView == view {
168             
169             if leftView.frame.width < ScreenshotListWindowController.leftMinWidth { return false }
170         }
171         if rightView == view {
172             
173             if leftView.frame.width >= ScreenshotListWindowController.leftMinWidth { return false }
174         }
175         
176         return true
177     }
178 }
179
180 @available(OSX 10.12.2, *)
181 extension ScreenshotListWindowController: NSSharingServicePickerTouchBarItemDelegate {
182     
183     override func makeTouchBar() -> NSTouchBar? {
184         
185         return listViewController.touchBar
186     }
187     
188     func items(for pickerTouchBarItem: NSSharingServicePickerTouchBarItem) -> [Any] {
189         
190         return currentRightViewController?.items(for: pickerTouchBarItem) ?? []
191     }
192 }