HelioParser/models/image_model.py
2026-06-10 17:33:12 +03:00

111 lines
No EOL
3.8 KiB
Python

"""
Модель для управления слоями изображений
"""
from PySide6.QtCore import QObject, Signal
from typing import List, Optional, Dict
from pathlib import Path
from dataclasses import dataclass
from datetime import datetime
@dataclass
class ImageLayer:
"""Модель слоя изображения"""
id: int
name: str
filepath: Path
source_id: int
date: datetime
wavelength: str
visible: bool = True
opacity: float = 1.0
image_data: Optional[any] = None
metadata: Optional[Dict] = None
class ImageModel(QObject):
"""Модель для хранения и управления слоями изображений"""
# Сигналы для оповещения View
layer_added = Signal(object) # ImageLayer
layer_removed = Signal(int) # layer_id
layer_visibility_changed = Signal(int, bool) # layer_id, visible
layer_opacity_changed = Signal(int, float) # layer_id, opacity
layer_selected = Signal(int) # layer_id
def __init__(self):
super().__init__()
self._layers: List[ImageLayer] = []
self._next_id = 1
self._selected_layer_id: Optional[int] = None
def add_layer(self, filepath: Path, source_id: int, date: datetime,
wavelength: str, image_data: any, metadata: Dict = None) -> int:
"""Добавляет новый слой"""
layer = ImageLayer(
id=self._next_id,
name=f"{wavelength} - {date.strftime('%Y-%m-%d %H:%M')}",
filepath=filepath,
source_id=source_id,
date=date,
wavelength=wavelength,
image_data=image_data,
metadata=metadata
)
self._layers.append(layer)
self._next_id += 1
self.layer_added.emit(layer)
return layer.id
def remove_layer(self, layer_id: int):
"""Удаляет слой"""
self._layers = [l for l in self._layers if l.id != layer_id]
self.layer_removed.emit(layer_id)
if self._selected_layer_id == layer_id:
self._selected_layer_id = None
def set_layer_visibility(self, layer_id: int, visible: bool):
"""Изменяет видимость слоя"""
for layer in self._layers:
if layer.id == layer_id:
layer.visible = visible
self.layer_visibility_changed.emit(layer_id, visible)
break
def set_layer_opacity(self, layer_id: int, opacity: float):
"""Изменяет прозрачность слоя"""
for layer in self._layers:
if layer.id == layer_id:
layer.opacity = opacity
self.layer_opacity_changed.emit(layer_id, opacity) # ← ЭМИИМ СИГНАЛ
break
def select_layer(self, layer_id: int):
"""Выбирает слой"""
self._selected_layer_id = layer_id
self.layer_selected.emit(layer_id)
def get_selected_layer(self) -> Optional[ImageLayer]:
"""Возвращает выбранный слой"""
if self._selected_layer_id:
for layer in self._layers:
if layer.id == self._selected_layer_id:
return layer
return None
def get_visible_layers(self) -> List[ImageLayer]:
"""Возвращает все видимые слои"""
return [layer for layer in self._layers if layer.visible]
def get_all_layers(self) -> List[ImageLayer]:
"""Возвращает все слои"""
return self._layers.copy()
def clear(self):
"""Очищает все слои"""
layer_ids = [layer.id for layer in self._layers]
self._layers.clear()
for layer_id in layer_ids:
self.layer_removed.emit(layer_id)