fix graph and white background added
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
from collections.abc import Callable
|
||||
|
||||
import pyqtgraph as pg
|
||||
from PyQt6.QtCore import QSignalBlocker
|
||||
from PyQt6.QtWidgets import QComboBox, QPushButton, QStackedWidget, QWidget
|
||||
|
||||
@@ -14,8 +15,12 @@ from python_app.models.dataset_model import ResultCollection, TraceData
|
||||
from python_app.models.gui_profile_schema import GuiProcessingStateModel
|
||||
from python_app.models.run_config_schema import GprModel
|
||||
|
||||
Renderer = BscanRenderer | GprRenderer | Sar3dRenderer | TraceRenderer
|
||||
|
||||
|
||||
class PlotController:
|
||||
"""Own the plot views: renderers draw and clear only through it, and it counts image changes."""
|
||||
|
||||
def __init__(
|
||||
self, history: HistoryController, settings: Callable[[], GuiProcessingStateModel],
|
||||
geometry: Callable[[], GprModel], running: Callable[[], bool],
|
||||
@@ -36,9 +41,28 @@ class PlotController:
|
||||
for renderer in (self.bscan, self.gpr, self.sar3d, self.trace):
|
||||
self.stack.addWidget(renderer.widget)
|
||||
self.stack.setCurrentWidget(self.trace.widget)
|
||||
# Counts changes of the shown image (drawing, page, size, view range, a legend click
|
||||
# hiding a curve) for observers such as the web stream. QGraphicsScene.changed must stay
|
||||
# unconnected: it switches Qt to a legacy update path that leaves stale pixels behind.
|
||||
self.revision = 0
|
||||
self.stack.currentChanged.connect(self._changed)
|
||||
for plot in self.stack.findChildren(pg.PlotWidget):
|
||||
item = plot.getPlotItem()
|
||||
assert item is not None
|
||||
view = item.getViewBox()
|
||||
view.sigResized.connect(self._changed)
|
||||
view.sigRangeChanged.connect(self._changed)
|
||||
for panel in (self.trace.magnitude, self.trace.phase):
|
||||
panel.legend.sigSampleClicked.connect(self._changed)
|
||||
self._combo: QComboBox | None = None
|
||||
self._next: QPushButton | None = None
|
||||
|
||||
def _changed(self, *_args: object) -> None:
|
||||
self.revision += 1
|
||||
|
||||
def _renderer(self, mode: str) -> Renderer:
|
||||
return {"bscan": self.bscan, "gpr": self.gpr, "sar3d": self.sar3d}.get(mode, self.trace)
|
||||
|
||||
def bind_display_controls(self, combo: QComboBox, next_button: QPushButton) -> None:
|
||||
self._combo, self._next = combo, next_button
|
||||
combo.currentIndexChanged.connect(self.on_display_combo_changed)
|
||||
@@ -55,8 +79,7 @@ class PlotController:
|
||||
return self.sar3d.grid if current is self.sar3d.widget else current
|
||||
|
||||
def set_mode(self, mode: str) -> None:
|
||||
renderer = {"bscan": self.bscan, "gpr": self.gpr, "sar3d": self.sar3d}.get(mode, self.trace)
|
||||
self.stack.setCurrentWidget(renderer.widget)
|
||||
self.stack.setCurrentWidget(self._renderer(mode).widget)
|
||||
self.sync_display_combos()
|
||||
|
||||
def select_combo(self, input_pos: int, output_pos: int) -> None:
|
||||
@@ -96,6 +119,7 @@ class PlotController:
|
||||
self.sync_display_combos()
|
||||
|
||||
def draw_bscan(self) -> bool:
|
||||
self._changed()
|
||||
self.sync_bscan()
|
||||
window, retained = self.window_scans(), len(self.history.preprocessed)
|
||||
if retained < window and self.bscan.history_by_combo:
|
||||
@@ -119,6 +143,7 @@ class PlotController:
|
||||
return False
|
||||
if mode == "bscan":
|
||||
return self.draw_bscan()
|
||||
self._changed()
|
||||
if mode == "gpr":
|
||||
return self.gpr.draw(collection, settings.gpr, self._geometry())
|
||||
if mode == "sar3d":
|
||||
@@ -126,42 +151,36 @@ class PlotController:
|
||||
return self.trace.draw(collection, settings.pass_through)
|
||||
|
||||
def redraw(self, *_args: object) -> None:
|
||||
"""Show the newest result with the current settings."""
|
||||
mode = self._settings().selected_mode
|
||||
if mode == "bscan":
|
||||
self.draw_bscan()
|
||||
elif mode == "sar3d":
|
||||
self.sar3d.clear()
|
||||
if self.history.results:
|
||||
self.draw(self.history.results[-1])
|
||||
elif not self.history.results or not self.draw(self.history.results[-1]):
|
||||
self.clear_current()
|
||||
return
|
||||
# Cleared first: a result of another settings revision is not drawn and must not
|
||||
# leave the previous image, while a renderer's own failure message is kept.
|
||||
self._changed()
|
||||
self._renderer(mode).clear()
|
||||
if self.history.results:
|
||||
self.draw(self.history.results[-1])
|
||||
|
||||
def draw_trace(self, trace: TraceData, title: str) -> None:
|
||||
self._changed()
|
||||
self.trace.draw_trace(trace, title, self._settings().pass_through)
|
||||
|
||||
def clear_trace(self) -> None:
|
||||
self._changed()
|
||||
self.trace.clear()
|
||||
|
||||
def clear_bscan(self) -> None:
|
||||
self._changed()
|
||||
self.bscan.clear()
|
||||
self.sync_display_combos()
|
||||
|
||||
def clear_gpr(self) -> None:
|
||||
self.gpr.clear()
|
||||
|
||||
def clear_current(self) -> None:
|
||||
mode = self._settings().selected_mode
|
||||
if mode == "bscan":
|
||||
self.clear_bscan()
|
||||
elif mode == "gpr":
|
||||
self.clear_gpr()
|
||||
elif mode == "sar3d":
|
||||
self.sar3d.clear()
|
||||
else:
|
||||
self.trace.clear()
|
||||
|
||||
def clear(self) -> None:
|
||||
self.clear_bscan()
|
||||
self.clear_gpr()
|
||||
self.sar3d.clear()
|
||||
self.trace.clear()
|
||||
self._changed()
|
||||
for renderer in (self.bscan, self.gpr, self.sar3d, self.trace):
|
||||
renderer.clear()
|
||||
self.sync_display_combos()
|
||||
|
||||
@staticmethod
|
||||
def has_output(collection: ResultCollection) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user