OSDN Git Service

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