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