1import numpy as np
2from PyQt5.QtGui import QPixmap
3from PyQt5.QtWidgets import QGraphicsPixmapItem, QApplication
4
5from urh.signalprocessing.Spectrogram import Spectrogram
6from urh.ui.painting.SceneManager import SceneManager
7from urh.ui.painting.SpectrogramScene import SpectrogramScene
8
9
10class SpectrogramSceneManager(SceneManager):
11    def __init__(self, samples, parent):
12        super().__init__(parent)
13
14        self.samples_need_update = True
15
16        self.scene.clear()
17        self.spectrogram = Spectrogram(samples)
18        self.scene = SpectrogramScene()
19
20    @property
21    def num_samples(self):
22        return len(self.spectrogram.samples)
23
24    def set_parameters(self, samples: np.ndarray, window_size, data_min, data_max) -> bool:
25        """
26        Return true if redraw is needed
27        """
28        redraw_needed = False
29        if self.samples_need_update:
30            self.spectrogram.samples = samples
31            redraw_needed = True
32            self.samples_need_update = False
33
34        if window_size != self.spectrogram.window_size:
35            self.spectrogram.window_size = window_size
36            redraw_needed = True
37
38        if data_min != self.spectrogram.data_min:
39            self.spectrogram.data_min = data_min
40            redraw_needed = True
41
42        if data_max != self.spectrogram.data_max:
43            self.spectrogram.data_max = data_max
44            redraw_needed = True
45
46        return redraw_needed
47
48    def show_scene_section(self, x1: float, x2: float, subpath_ranges=None, colors=None):
49        pass
50
51    def update_scene_rect(self):
52        self.scene.setSceneRect(0, 0, self.spectrogram.time_bins, self.spectrogram.freq_bins)
53
54    def show_full_scene(self):
55        for item in self.scene.items():
56            if isinstance(item, QGraphicsPixmapItem):
57                self.scene.removeItem(item)
58
59        x_pos = 0
60        for image in self.spectrogram.create_image_segments():
61            item = self.scene.addPixmap(QPixmap.fromImage(image))
62            item.setPos(x_pos, 0)
63            x_pos += image.width()
64            QApplication.instance().processEvents()
65
66        # Estimated time_bins from update_scene_rect may be too many for small signals so we update the scene rect
67        # after we know how wide the spectrogram actually is
68        self.scene.setSceneRect(0, 0, x_pos, self.spectrogram.freq_bins)
69
70    def init_scene(self):
71        pass
72
73    def eliminate(self):
74        self.spectrogram.samples = None
75        self.spectrogram = None
76        super().eliminate()
77