123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- //
- // KMScreenShotMaskViewController.swift
- // PDF Reader Pro
- //
- // Created by liujiajie on 2024/1/24.
- //
- import Cocoa
- let keditViewGap = 5
- class KMScreenShotMaskViewController: NSViewController{
- @IBOutlet var screenShotMaskView: KMScreenShotMaskView!
- var editViewController: KMScreenShotEditViewController!
- var holeDragImageView: NSImageView!
- var callBack: captureScreenCallBack?
- convenience init(callB: @escaping captureScreenCallBack) {
- self.init(nibName: "KMScreenShotMaskViewController", bundle: nil)
- self.callBack = callB
- }
-
- override func loadView() {
- super.loadView()
- initViews()
- handlerCallBack()
- }
- func initViews() {
- view.wantsLayer = true
- view.layer?.backgroundColor = NSColor.clear.cgColor
- screenShotMaskView.frame = view.frame
-
- editViewController = KMScreenShotEditViewController(nibName: "KMScreenShotEditViewController", bundle: nil)
- view.addSubview(editViewController.view)
- editViewController.view.isHidden = true
-
- holeDragImageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 40, height: 40))
- view.addSubview(holeDragImageView)
- holeDragImageView.isHidden = true
- holeDragImageView.image = NSImage(named: "drag.png")
- }
- func handlerCallBack() {
- self.screenShotMaskView.callBack = self.callBack
-
- self.screenShotMaskView.frameCallBack = {[unowned self] rect in
- if self.editViewController.view.isHidden {
- self.editViewController.view.isHidden = false
- }
- if self.holeDragImageView.isHidden{
- self.holeDragImageView.isHidden = false
- }
- self.editViewController.updateSize(withRect: rect)
- self.updateEditViewFrame(with: rect)
- self.updateHoleButtonPosition(rect)
- }
-
- self.editViewController.buttonCallBack = { [weak self] captureOrNot in
- self!.holeDragImageView.isHidden = true
- if captureOrNot {
- self!.screenShotMaskView.captureImage()
- } else {
- self!.screenShotMaskView.endImageCapture()
- }
- }
-
- self.editViewController.sizeCallBack = { [weak self] size in
- self!.screenShotMaskView.updateholeSize(newSize: size)
- self?.updateHoleButtonPositionWithHoleSize(holeSize: size)
- }
-
- self.screenShotMaskView.detachCallBack = { [weak self] event in
- let cursorPoint = KMScreenShotHandler.screenPosition(for: event)
- self?.screenShotMaskView.holeDragMode = NSPointInRect(cursorPoint, NSMakeRect((self?.screenShotMaskView.borderFrame.origin.x ?? 0) + 4, (self?.screenShotMaskView.borderFrame.origin.y ?? 0) + 4, (self?.screenShotMaskView.borderFrame.size.width ?? 0) - 8, (self?.screenShotMaskView.borderFrame.size.height ?? 0) - 8))
- }
- }
- func beginImageCapture(_ isCaptureWindow: Bool) {
- self.holeDragImageView.isHidden = true
- if isCaptureWindow {
- self.editViewController.view.isHidden = true
- }
- self.screenShotMaskView.beginImageCapture(isCaptureWindow: isCaptureWindow)
- }
- func updateHoleButtonPositionWithHoleSize(holeSize: CGSize) {
- self.holeDragImageView.frame = NSMakeRect(self.screenShotMaskView.borderFrame.origin.x + holeSize.width/2 - self.holeDragImageView.frame.size.width/2, self.screenShotMaskView.borderFrame.origin.y + holeSize.height/2 - self.holeDragImageView.frame.size.height/2, self.holeDragImageView.frame.size.width, self.holeDragImageView.frame.size.height)
- }
- func updateHoleButtonPosition(_ rect: NSRect) {
- self.holeDragImageView.frame = NSMakeRect(NSMidX(rect) - self.holeDragImageView.frame.size.width/2, NSMidY(rect) - self.holeDragImageView.frame.size.height/2, self.holeDragImageView.frame.size.width, self.holeDragImageView.frame.size.height)
- }
- func updateEditViewFrame(with aRect: NSRect) {
- let viewWidth = self.editViewController.view.frame.size.width
- let viewHeight = self.editViewController.view.frame.size.height
- var newRect = NSMakeRect(NSMinX(aRect), NSMinY(aRect) - viewHeight - CGFloat(keditViewGap), viewWidth, viewHeight)
- if NSMinY(newRect) < 0 {
- newRect.origin.x = NSMinX(newRect) - viewWidth - CGFloat(keditViewGap)
- newRect.origin.y = NSMinY(aRect) + CGFloat(keditViewGap)
- if newRect.origin.x < 0 {
- newRect.origin.x = NSMinX(aRect) + CGFloat(keditViewGap)
- }
- }
- let screenFrame = NSScreen.screens.first!.frame
- if NSMaxX(screenFrame) < NSMaxX(newRect) {
- newRect.origin.x = screenFrame.size.width - viewWidth
- }
-
- if NSMaxY(screenFrame) < NSMaxY(newRect) {
- newRect.origin.y = screenFrame.size.height - viewHeight
- }
-
- self.editViewController.view.frame = newRect
- }
- }
|