fuck yeah!
This commit is contained in:
parent
ccb53d9091
commit
da10f5e132
44 changed files with 3260 additions and 448 deletions
111
models/image_model.py
Normal file
111
models/image_model.py
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
"""
|
||||
Модель для управления слоями изображений
|
||||
"""
|
||||
|
||||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue