| 
									
										
										
										
											2021-06-19 23:41:19 +08:00
										 |  |  | import Cocoa | 
					
						
							|  |  |  | import FlutterMacOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 10:34:12 +08:00
										 |  |  | private let kTrafficLightOffetTop = 22 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-19 23:41:19 +08:00
										 |  |  | class MainFlutterWindow: NSWindow { | 
					
						
							| 
									
										
										
										
											2022-05-27 10:34:12 +08:00
										 |  |  |   func registerMethodChannel(flutterViewController: FlutterViewController) { | 
					
						
							|  |  |  |     let cocoaWindowChannel = FlutterMethodChannel(name: "flutter/cocoaWindow", binaryMessenger: flutterViewController.engine.binaryMessenger) | 
					
						
							|  |  |  |     cocoaWindowChannel.setMethodCallHandler({ | 
					
						
							|  |  |  |       (call: FlutterMethodCall, result: FlutterResult) -> Void in | 
					
						
							|  |  |  |       if call.method == "setWindowPosition" { | 
					
						
							|  |  |  |         guard let position = call.arguments as? NSArray else { | 
					
						
							|  |  |  |           result(nil) | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let nX = position[0] as! NSNumber | 
					
						
							|  |  |  |         let nY = position[1] as! NSNumber | 
					
						
							|  |  |  |         let x = nX.doubleValue | 
					
						
							|  |  |  |         let y = nY.doubleValue | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         self.setFrameOrigin(NSPoint(x: x, y: y)) | 
					
						
							|  |  |  |         result(nil) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } else if call.method == "getWindowPosition" { | 
					
						
							|  |  |  |         let frame = self.frame | 
					
						
							|  |  |  |         result([frame.origin.x, frame.origin.y]) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } else if call.method == "zoom" { | 
					
						
							|  |  |  |         self.zoom(self) | 
					
						
							|  |  |  |         result(nil) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |        | 
					
						
							|  |  |  |       result(FlutterMethodNotImplemented) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   func layoutTrafficLightButton(titlebarView: NSView, button: NSButton, offsetTop: CGFloat, offsetLeft: CGFloat) { | 
					
						
							|  |  |  |     button.translatesAutoresizingMaskIntoConstraints = false; | 
					
						
							|  |  |  |     titlebarView.addConstraint(NSLayoutConstraint.init( | 
					
						
							|  |  |  |       item: button, | 
					
						
							|  |  |  |       attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: titlebarView, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: offsetTop)) | 
					
						
							|  |  |  |     titlebarView.addConstraint(NSLayoutConstraint.init( | 
					
						
							|  |  |  |       item: button, | 
					
						
							|  |  |  |       attribute: NSLayoutConstraint.Attribute.left, relatedBy: NSLayoutConstraint.Relation.equal, toItem: titlebarView, attribute: NSLayoutConstraint.Attribute.left, multiplier: 1, constant: offsetLeft)) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   func layoutTrafficLights() { | 
					
						
							|  |  |  |     let closeButton = self.standardWindowButton(ButtonType.closeButton)! | 
					
						
							|  |  |  |     let minButton = self.standardWindowButton(ButtonType.miniaturizeButton)! | 
					
						
							|  |  |  |     let zoomButton = self.standardWindowButton(ButtonType.zoomButton)! | 
					
						
							|  |  |  |     let titlebarView = closeButton.superview! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     self.layoutTrafficLightButton(titlebarView: titlebarView, button: closeButton, offsetTop: CGFloat(kTrafficLightOffetTop), offsetLeft: 20) | 
					
						
							|  |  |  |     self.layoutTrafficLightButton(titlebarView: titlebarView, button: minButton, offsetTop: CGFloat(kTrafficLightOffetTop), offsetLeft: 38) | 
					
						
							|  |  |  |     self.layoutTrafficLightButton(titlebarView: titlebarView, button: zoomButton, offsetTop: CGFloat(kTrafficLightOffetTop), offsetLeft: 56) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let customToolbar = NSTitlebarAccessoryViewController() | 
					
						
							|  |  |  |     let newView = NSView() | 
					
						
							|  |  |  |     newView.frame = NSRect(origin: CGPoint(), size: CGSize(width: 0, height: 40))  // only the height is cared | 
					
						
							|  |  |  |     customToolbar.view = newView | 
					
						
							|  |  |  |     self.addTitlebarAccessoryViewController(customToolbar) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-19 23:41:19 +08:00
										 |  |  |   override func awakeFromNib() { | 
					
						
							|  |  |  |     let flutterViewController = FlutterViewController.init() | 
					
						
							|  |  |  |     let windowFrame = self.frame | 
					
						
							|  |  |  |     self.contentViewController = flutterViewController | 
					
						
							| 
									
										
										
										
											2022-05-27 10:34:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     self.registerMethodChannel(flutterViewController: flutterViewController) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-19 23:41:19 +08:00
										 |  |  |     self.setFrame(windowFrame, display: true) | 
					
						
							| 
									
										
										
										
											2022-05-27 10:34:12 +08:00
										 |  |  |     self.titlebarAppearsTransparent = true | 
					
						
							|  |  |  |     self.titleVisibility = .hidden | 
					
						
							|  |  |  |     self.styleMask.insert(StyleMask.fullSizeContentView) | 
					
						
							|  |  |  |     self.isMovableByWindowBackground = true | 
					
						
							|  |  |  |     self.isMovable = false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     self.layoutTrafficLights() | 
					
						
							| 
									
										
										
										
											2021-06-19 23:41:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     RegisterGeneratedPlugins(registry: flutterViewController) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     super.awakeFromNib() | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |