EG/core/drag_drop/macos_detector.py
2026-01-21 09:59:13 +08:00

105 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
macOS平台拖拽检测器
使用macOS Cocoa API实现系统级拖拽检测。
"""
import os
import sys
import time
import threading
from typing import List, Optional
from .base_detector import BaseDragDetector
class MacOSDragDetector(BaseDragDetector):
"""macOS平台拖拽检测器"""
def __init__(self, supported_formats: List[str] = None):
"""
初始化macOS拖拽检测器
Args:
supported_formats: 支持的文件格式列表
"""
super().__init__(supported_formats)
self._app_kit_available = self._check_app_kit()
self._cocoa_available = self._check_cocoa()
def _check_app_kit(self) -> bool:
"""检查AppKit是否可用"""
try:
import AppKit
return True
except ImportError:
return False
def _check_cocoa(self) -> bool:
"""检查Cocoa是否可用"""
try:
import Cocoa
return True
except ImportError:
return False
def _setup_cocoa_drag_drop(self) -> bool:
"""设置Cocoa拖拽接收"""
try:
if not self._app_kit_available:
return False
import AppKit
# 创建拖拽接收器
# 这里需要实现macOS的拖拽API调用
# 暂时返回False需要进一步实现
return False
except Exception as e:
print(f"设置Cocoa拖拽失败: {e}")
return False
def _monitor_file_drag(self):
"""通过文件系统变化监控拖拽"""
# 监控用户桌面和下载目录
desktop_path = os.path.expanduser("~/Desktop")
downloads_path = os.path.expanduser("~/Downloads")
watch_dirs = [desktop_path, downloads_path]
while self.is_running:
try:
current_time = time.time()
for watch_dir in watch_dirs:
if not os.path.exists(watch_dir):
continue
for filename in os.listdir(watch_dir):
filepath = os.path.join(watch_dir, filename)
try:
file_time = os.path.getmtime(filepath)
# 如果文件是最近1秒内创建的
if current_time - file_time < 1.0:
if self._is_supported_format(filepath):
self.add_dropped_file(filepath)
except OSError:
continue
except Exception as e:
print(f"文件拖拽监控错误: {e}")
time.sleep(0.5)
def _monitor_loop(self):
"""主监控循环"""
if self._app_kit_available and self._cocoa_available:
# 尝试设置真正的拖拽接收
if not self._setup_cocoa_drag_drop():
# 降级到文件系统监控
self._monitor_file_drag()
else:
# 降级到文件系统监控
self._monitor_file_drag()
def is_supported(self) -> bool:
"""检查macOS平台是否支持"""
return sys.platform.startswith('darwin')