AppFlowy/frontend/appflowy_flutter/macos/Runner/MainFlutterWindow.swift
2024-05-27 08:51:49 +08:00

86 lines
3.5 KiB
Swift

import Cocoa
import FlutterMacOS
private let kTrafficLightOffetTop = 14
class MainFlutterWindow: NSWindow {
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: 12)
self.layoutTrafficLightButton(titlebarView: titlebarView, button: minButton, offsetTop: CGFloat(kTrafficLightOffetTop), offsetLeft: 30)
self.layoutTrafficLightButton(titlebarView: titlebarView, button: zoomButton, offsetTop: CGFloat(kTrafficLightOffetTop), offsetLeft: 48)
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)
}
override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.registerMethodChannel(flutterViewController: flutterViewController)
self.setFrame(windowFrame, display: true)
self.titlebarAppearsTransparent = true
self.titleVisibility = .hidden
self.styleMask.insert(StyleMask.fullSizeContentView)
self.isMovableByWindowBackground = true
self.isMovable = false
self.layoutTrafficLights()
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
}