Files
ShadowsocksX-NG/ShadowsocksX-NG/ToastWindowController.swift
2017-10-20 18:39:25 +08:00

122 lines
3.8 KiB
Swift

//
// ToastWindowController.swift
// ShadowsocksX-NG
//
// Created by on 2017/3/20.
// Copyright © 2017 qiuyuzhou. All rights reserved.
//
import Cocoa
class ToastWindowController: NSWindowController {
var message: String = ""
@IBOutlet weak var titleTextField: NSTextField!
@IBOutlet weak var panelView: NSView!
let kHudFadeInDuration: Double = 0.35
let kHudFadeOutDuration: Double = 0.35
let kHudDisplayDuration: Double = 1.2
let kHudAlphaValue: CGFloat = 0.75
let kHudCornerRadius: CGFloat = 18.0
let kHudHorizontalMargin: CGFloat = 30
let kHudHeight: CGFloat = 90.0
var timerToFadeOut: Timer? = nil
var fadingOut: Bool = false
override func windowDidLoad() {
super.windowDidLoad()
self.shouldCascadeWindows = false
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
if let win = self.window {
win.isOpaque = false
win.backgroundColor = .clear
win.styleMask = NSWindow.StyleMask.borderless
win.hidesOnDeactivate = false
win.collectionBehavior = NSWindow.CollectionBehavior.canJoinAllSpaces
win.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.floatingWindow)))
win.orderFrontRegardless()
}
let viewLayer: CALayer = CALayer()
viewLayer.backgroundColor = CGColor.init(red: 0.05, green: 0.05, blue: 0.05, alpha: kHudAlphaValue)
viewLayer.cornerRadius = kHudCornerRadius
panelView.wantsLayer = true
panelView.layer = viewLayer
panelView.layer?.opacity = 0.0
self.titleTextField.stringValue = self.message
setupHud()
}
func setupHud() -> Void {
titleTextField.sizeToFit()
var labelFrame: CGRect = titleTextField.frame
var hudWindowFrame: CGRect = self.window!.frame
hudWindowFrame.size.width = labelFrame.size.width + kHudHorizontalMargin * 2
hudWindowFrame.size.height = kHudHeight
let screenRect: NSRect = NSScreen.screens[0].visibleFrame
hudWindowFrame.origin.x = (screenRect.size.width - hudWindowFrame.size.width) / 2
hudWindowFrame.origin.y = (screenRect.size.height - hudWindowFrame.size.height) / 2
self.window!.setFrame(hudWindowFrame, display: true)
var viewFrame: NSRect = hudWindowFrame;
viewFrame.origin.x = 0
viewFrame.origin.y = 0
panelView.frame = viewFrame
labelFrame.origin.x = kHudHorizontalMargin
labelFrame.origin.y = (hudWindowFrame.size.height - labelFrame.size.height) / 2
titleTextField.frame = labelFrame
}
func fadeInHud() -> Void {
if timerToFadeOut != nil {
timerToFadeOut?.invalidate()
timerToFadeOut = nil
}
fadingOut = false
CATransaction.begin()
CATransaction.setAnimationDuration(kHudFadeInDuration)
CATransaction.setCompletionBlock { self.didFadeIn() }
panelView.layer?.opacity = 1.0
CATransaction.commit()
}
func didFadeIn() -> Void {
timerToFadeOut = Timer.scheduledTimer(
timeInterval: kHudDisplayDuration,
target: self,
selector: #selector(fadeOutHud),
userInfo: nil,
repeats: false)
}
@objc func fadeOutHud() -> Void {
fadingOut = true
CATransaction.begin()
CATransaction.setAnimationDuration(kHudFadeOutDuration)
CATransaction.setCompletionBlock { self.didFadeOut() }
panelView.layer?.opacity = 0.0
CATransaction.commit()
}
func didFadeOut() -> Void {
if fadingOut {
self.window?.orderOut(self)
}
fadingOut = false
}
}