]> git.r.bdr.sh - rbdr/captura/blobdiff - Captura/Presentation/Windows/RecordingWindow.swift
Save WIP -> Multimonitor change working
[rbdr/captura] / Captura / Presentation / Windows / RecordingWindow.swift
index 2bb9928067f7accd8caf361630909974dfc98a59..b5c44139cb6a26cac5b0d86c720379764a4c85af 100644 (file)
@@ -7,13 +7,13 @@ class RecordingWindow: NSWindow {
     self.screen?.backingScaleFactor ?? 1.0
   }
   
-  init(_ button: NSRect?) {
+  var recordingContentView: RecordingContentView {
+    self.contentView as! RecordingContentView
+  }
+  
+  init(_ configuration: CaptureSessionConfiguration, _ button: NSRect?) {
     
-    let screens = NSScreen.screens
-    var boundingBox = NSZeroRect
-    for screen in screens {
-        boundingBox = NSUnionRect(boundingBox, screen.frame)
-    }
+    let boundingBox = NSScreen.screenWithMouse?.frame ?? NSZeroRect
     
     super.init(
       contentRect: boundingBox,
@@ -21,23 +21,28 @@ class RecordingWindow: NSWindow {
       backing: .buffered,
       defer: false)
 
+
     self.isReleasedWhenClosed = false
     self.collectionBehavior = [.canJoinAllSpaces]
-    self.center()
     self.isMovableByWindowBackground = false
     self.isMovable = false
+    self.canHide = false
     self.titlebarAppearsTransparent = true
     self.setFrame(boundingBox, display: true)
     self.titleVisibility = .hidden
-    let recordingView = RecordingContentView()
+    let recordingView = RecordingContentView(configuration, frame: boundingBox, button: button ?? NSZeroRect)
     recordingView.frame = boundingBox
-    recordingView.button = button
     self.contentView = recordingView
-    self.backgroundColor = NSColor(white: 1.0, alpha: 0.001)
+    //self.backgroundColor = NSColor(white: 1.0, alpha: 0.001)
+    self.backgroundColor = NSColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 0.5)
     self.level = .screenSaver
     self.isOpaque = false
     self.hasShadow = false
-    self.makeKeyAndOrderFront(nil)
+    
+    print("AAAAH INIT CHANGE")
+    print("AAAAH FRAME X: \(recordingView.frame.minX) \(recordingView.frame.maxX) // Y: \(recordingView.frame.minY) \(recordingView.frame.maxY)")
+    print("AAAAH BOUNDS X: \(recordingView.bounds.minX) \(recordingView.bounds.maxX) // Y: \(recordingView.bounds.minY) \(recordingView.bounds.maxY)")
+    print("AAAAH WIN F X: \(self.frame.minX) \(self.frame.maxX) // Y: \(self.frame.minY) \(self.frame.maxY)")
   }
   
   // MARK: - Window Behavior Overrides
@@ -77,12 +82,64 @@ enum RecordingWindowState {
 
 class RecordingContentView: NSView {
   
+  init(_ configuration: CaptureSessionConfiguration, frame: NSRect, button: NSRect) {
+    super.init(frame: frame)
+    preventResize = configuration.preventResize
+    preventMove = configuration.preventMove
+    autoStart = configuration.autoStart
+    self.button = button
+    
+    for screen in NSScreen.screens {
+      print(screen.frame)
+      // BEFORE YOU WENT TO BED:
+      // You were checking which screen contains the button, so you can calculate the offset which should give you
+      // the location of the button, which you can then use to draw the button at the same offset whenever you need
+      // to change screen! This would keep the behavior of pressing the record button.
+      // If this does work, remember to then test it with a Hi DPI display, because we might need to adjust for pixel
+      // density.
+      // Finally, if it does work, make sure the alternate monitor still responds, by adjusting the behavior of the
+      // real button
+      if screen.frame.intersects(button) {
+        print("CONTAINS! ->")
+        let relativeX = screen.frame.width - button.maxX
+        let relativeY = screen.frame.height - button.maxY
+        print("The rect is at (\(relativeX), \(relativeY)) relative to the top right of the screen frame.")
+      } else {
+        print("NO CONTAINS ->")
+      }
+      print(button)
+    }
+    
+    if configuration.x != nil || configuration.y != nil || configuration.width != nil || configuration.height != nil {
+      box = NSRect(
+        x: configuration.x ?? Int(frame.width / 2.0),
+        y: configuration.y ?? Int(frame.height / 2.0),
+        width: configuration.width ?? 400,
+        height: configuration.height ?? 400
+      )
+    }
+    
+    if autoStart {
+      DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
+        NotificationCenter.default.post(name: .startRecording, object: nil, userInfo: nil)
+      }
+    }
+  }
+  
+  required init?(coder: NSCoder) {
+    fatalError("init(coder:) has not been implemented")
+  }
+  
+  private var buttons: [NSRect] = []
   public var button: NSRect? = nil
   @Published public var box: NSRect? = nil
   public var state: RecordingWindowState = .idle
   private var mouseLocation: NSPoint = NSPoint()
   private var origin: NSPoint = NSPoint()
   private var boxOrigin: NSPoint = NSPoint()
+  private var preventResize = false
+  private var preventMove = false
+  private var autoStart = false
   
   private var resizeBox: NSRect? {
     if let box {
@@ -135,6 +192,12 @@ class RecordingContentView: NSView {
     self.addTrackingArea(trackingArea)
   }
   
+  override func mouseExited(with event: NSEvent) {
+    if state == .idle && box == nil {
+      self.moveWindow()
+    }
+  }
+  
   override func mouseMoved(with event: NSEvent) {
     
     self.mouseLocation = self.convert(event.locationInWindow, from: nil)
@@ -219,18 +282,22 @@ class RecordingContentView: NSView {
         }
       }
       
-      if resizeBox!.contains(origin) {
+      if resizeBox!.contains(origin) && !preventResize {
         self.origin = NSPoint(x: box.minX, y: box.maxY)
         state = .resizing
         return
       }
-      if box.contains(origin) {
+      if box.contains(origin) && !preventMove {
         state = .moving
         self.boxOrigin = NSPoint(x: box.origin.x, y: box.origin.y)
         return
       }
     }
     
+    if preventResize || preventMove {
+      return
+    }
+    
     state = .drawing
   }
 
@@ -269,6 +336,17 @@ class RecordingContentView: NSView {
     
     let dashLength: CGFloat = 5.0
     let lineWidth = 0.5
+    
+    if let button {
+      let buttonPath = NSBezierPath()
+      buttonPath.move(to: NSPoint(x: button.minX, y: button.minY))
+      buttonPath.line(to: NSPoint(x: button.maxX, y: button.minY))
+      buttonPath.line(to: NSPoint(x: button.maxX, y: button.maxY))
+      buttonPath.line(to: NSPoint(x: button.minX, y: button.maxY))
+      buttonPath.line(to: NSPoint(x: button.minX, y: button.minY))
+      NSColor(red: 1, green: 0, blue: 1, alpha: 1).setFill()
+      buttonPath.fill()
+    }
 
     if state == .idle && box == nil {
       let blackLine = NSBezierPath()
@@ -388,4 +466,31 @@ class RecordingContentView: NSView {
 
     text.draw(in: textRect, withAttributes: textAttributes)
   }
+  
+  private func moveWindow() {
+    print("AAAAH BEFORE WE CHANGE")
+    print("AAAAH FRAME X: \(self.frame.minX) \(self.frame.maxX) // Y: \(self.frame.minY) \(self.frame.maxY)")
+    print("AAAAH BOUNDS X: \(self.bounds.minX) \(self.bounds.maxX) // Y: \(self.bounds.minY) \(self.bounds.maxY)")
+    print("AAAAH WIN F X: \(self.window?.frame.minX) \(self.window?.frame.maxX) // Y: \(self.window?.frame.minY) \(self.window?.frame.maxY)")
+    let screen = NSScreen.screenWithMouse
+    if let currentScreen = self.window?.screen {
+      if currentScreen != screen {
+        let frame = screen?.frame ?? NSZeroRect
+        self.frame = CGRect(origin: NSZeroPoint, size: frame.size)
+        self.bounds = CGRect(origin: NSZeroPoint, size: frame.size)
+        self.updateTrackingAreas()
+        
+        if let window = self.window {
+          self.bounds = frame
+          window.setFrame(frame, display: true, animate: false)
+          window.makeKeyAndOrderFront(nil)
+          window.orderFrontRegardless()
+          print("AAAAH AFTER CHANGE")
+          print("AAAAH FRAME X: \(self.frame.minX) \(self.frame.maxX) // Y: \(self.frame.minY) \(self.frame.maxY)")
+          print("AAAAH BOUNDS X: \(self.bounds.minX) \(self.bounds.maxX) // Y: \(self.bounds.minY) \(self.bounds.maxY)")
+          print("AAAAH WIN F X: \(self.window?.frame.minX) \(self.window?.frame.maxX) // Y: \(self.window?.frame.minY) \(self.window?.frame.maxY)")
+        }
+      }
+    }
+  }
 }