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 |