You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							65 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							65 lines
						
					
					
						
							2.8 KiB
						
					
					
				from PyQt6.QtCore import QMimeData, QUrl | 
						|
from PyQt6.QtGui import QDragEnterEvent, QDropEvent | 
						|
import os | 
						|
 | 
						|
 | 
						|
class DragDropHandler: | 
						|
    """Обработчик drag-n-drop событий""" | 
						|
 | 
						|
    def __init__(self, main_window): | 
						|
        self.main_window = main_window | 
						|
 | 
						|
    def handle_drag_enter(self, event: QDragEnterEvent): | 
						|
        """Обработчик события перетаскивания в окно""" | 
						|
        if event.mimeData().hasUrls() or event.mimeData().hasText(): | 
						|
            event.acceptProposedAction() | 
						|
            self.main_window.show_drag_drop_interface(event.mimeData()) | 
						|
 | 
						|
    def handle_drag_leave(self, event): | 
						|
        """Обработчик события выхода перетаскивания из окна""" | 
						|
        self.main_window.dragLeaveEvent(event) | 
						|
 | 
						|
    def save_image_by_url(self, url): | 
						|
        from PIL import Image | 
						|
        import requests | 
						|
        from io import BytesIO | 
						|
 | 
						|
        response = requests.get(url) | 
						|
        img = Image.open(BytesIO(response.content)) | 
						|
        img.save(f"data/{os.path.basename(url)}") | 
						|
 | 
						|
        return f"data/{os.path.basename(url)}" | 
						|
 | 
						|
    def handle_drop(self, event: QDropEvent): | 
						|
        """Обработчик события отпускания перетаскиваемого объекта""" | 
						|
        mime_data = event.mimeData() | 
						|
 | 
						|
        if mime_data.hasUrls(): | 
						|
            # Обработка файлов | 
						|
            urls = mime_data.urls() | 
						|
            if urls and urls[0].isLocalFile(): | 
						|
                file_path = urls[0].toLocalFile() | 
						|
                if self.is_image_file(file_path): | 
						|
                    self.main_window.handle_dropped_image(file_path) | 
						|
                    event.acceptProposedAction() | 
						|
                else: | 
						|
                    # Если это не изображение, обрабатываем как текст | 
						|
                    self.main_window.handle_dropped_text("", 'file_drop', event.position().y()) | 
						|
            else: | 
						|
                file_path = self.save_image_by_url(mime_data.text()) | 
						|
                if self.is_image_file(file_path): | 
						|
                    self.main_window.handle_dropped_image(file_path) | 
						|
                    event.acceptProposedAction() | 
						|
                else: | 
						|
                    self.main_window.handle_dropped_text("", 'file_drop', event.position().y()) | 
						|
        elif mime_data.hasText(): | 
						|
            # Обработка текста | 
						|
            text = mime_data.text() | 
						|
            self.main_window.handle_dropped_text(text, 'text_drop', event.position().y()) | 
						|
            event.acceptProposedAction() | 
						|
 | 
						|
 | 
						|
    def is_image_file(self, file_path): | 
						|
        """Проверяет, является ли файл изображением""" | 
						|
        image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff', '.webp'} | 
						|
        return os.path.splitext(file_path.lower())[1] in image_extensions |