Browse Source

interp update

spacexerq 6 days ago
parent
commit
1a264b73c6

+ 8 - 1
apps/gui/src/gui/block_table.py

@@ -80,7 +80,8 @@ def _bg_for(row: BlockRow) -> QColor:
 
 
 class BlockTable(QTableWidget):
-    blockSelected = Signal(int)   # sync_index
+    blockSelected     = Signal(int)   # sync_index  (single click / keyboard)
+    blockDoubleClicked = Signal(int)  # sync_index  (double click → zoom)
 
     def __init__(self, parent=None):
         super().__init__(0, len(_COL_NAMES), parent)
@@ -95,6 +96,7 @@ class BlockTable(QTableWidget):
         self._rows: list[BlockRow] = []
         self._suppress = False
         self.itemSelectionChanged.connect(self._on_selection)
+        self.itemDoubleClicked.connect(self._on_double_click)
 
     # -- public ----------------------------------------------------------------
 
@@ -153,3 +155,8 @@ class BlockTable(QTableWidget):
             r = selected[0].row()
             if r < len(self._rows):
                 self.blockSelected.emit(self._rows[r].sync_index)
+
+    def _on_double_click(self, item) -> None:
+        r = item.row()
+        if r < len(self._rows):
+            self.blockDoubleClicked.emit(self._rows[r].sync_index)

+ 49 - 2
apps/gui/src/gui/plot_panel.py

@@ -77,6 +77,13 @@ _C_TEXT_DARK = {
 _MAX_VLINES = 400
 
 
+class _XOnlyViewBox(pg.ViewBox):
+    """ViewBox that zooms only the X axis on mouse wheel."""
+
+    def wheelEvent(self, ev, axis=None):
+        super().wheelEvent(ev, axis=0)   # axis=0 → X only
+
+
 class PlotPanel(QWidget):
     """
     All waveforms and sync gates on a shared time axis.
@@ -168,6 +175,7 @@ class PlotPanel(QWidget):
         cumtimes  = np.cumsum([0.0] + list(durs))
         self._draw_boundaries(cumtimes)
         self._draw_delay_regions()
+        self._finalize_x_axis()
         self._attach_mouse_events()
 
         # Apply visibility.
@@ -238,6 +246,7 @@ class PlotPanel(QWidget):
             self._draw_boundaries(cumtimes)
 
         self._draw_delay_regions()
+        self._finalize_x_axis()
         self._attach_mouse_events()
 
         # Apply stored visibility state (same logic as plot_all)
@@ -263,6 +272,20 @@ class PlotPanel(QWidget):
                 if key in self._row_btns:
                     self._row_btns[key].setChecked(on)
 
+    def zoom_to_block(self, sync_index: int) -> None:
+        """
+        Center the view on the block and zoom so it occupies ~the middle third.
+        Double-padding on both sides: view_width = 3 * block_duration.
+        """
+        for row in self._block_rows:
+            if row.sync_index == sync_index:
+                dur  = max(row.t_end - row.t_start, 1e-9)
+                mid  = (row.t_start + row.t_end) / 2.0
+                half = dur * 1.5          # 3× block width total → block is central third
+                if self._ref_plot:
+                    self._ref_plot.setXRange(mid - half, mid + half, padding=0)
+                break
+
     def highlight_block(self, sync_index: int) -> None:
         for row in self._block_rows:
             if row.sync_index == sync_index:
@@ -490,12 +513,19 @@ class PlotPanel(QWidget):
     # ------------------------------------------------------------------ #
 
     def _add_row(self, key: str, label: str, units: str, h: int) -> pg.PlotItem:
-        pw = pg.PlotWidget()
+        dark = system_is_dark()
+        lbl_color = "#ccccee" if dark else "#333355"
+
+        pw = pg.PlotWidget(viewBox=_XOnlyViewBox())
         pw.setMinimumHeight(h)
         pw.setMaximumHeight(h + 40)
         p = pw.getPlotItem()
-        p.setLabel("left", label, units=units)
+        p.setLabel("left", label, units=units, color=lbl_color, size="9pt")
         p.showGrid(x=True, y=True, alpha=0.25)
+        # X-axis tick numbers hidden by default; shown only on the last row
+        p.getAxis("bottom").setStyle(showValues=False)
+        p.getAxis("bottom").setLabel("")
+
         self._plot_widgets[key] = pw
         self._plots[key]        = p
         self._plot_area_lay.addWidget(pw)
@@ -505,6 +535,23 @@ class PlotPanel(QWidget):
             p.setXLink(self._ref_plot)
         return p
 
+    def _finalize_x_axis(self) -> None:
+        """Show X-axis ticks + label only on the last (bottom) row."""
+        dark = system_is_dark()
+        lbl_color = "#ccccee" if dark else "#333355"
+        keys = list(self._plots.keys())
+        for i, key in enumerate(keys):
+            ax = self._plots[key].getAxis("bottom")
+            if i == len(keys) - 1:
+                ax.setStyle(showValues=True)
+                self._plots[key].setLabel(
+                    "bottom", "Время", units="с",
+                    color=lbl_color, size="9pt",
+                )
+            else:
+                ax.setStyle(showValues=False)
+                ax.setLabel("")
+
     def _add_row_btn(self, key: str, label: str, color_key: str) -> None:
         _text = _C_TEXT_DARK if system_is_dark() else _C_TEXT_LIGHT
         color = _text.get(color_key, _C.get(color_key, "#555555"))

+ 5 - 3
apps/gui/src/tabs/seq_interp_tab.py

@@ -257,6 +257,7 @@ class SeqInterpTab(QWidget):
         self._plots.blockClicked.connect(self._on_block_from_plot)
         self._plots.timeHovered.connect(self._on_hover)
         self._table.blockSelected.connect(self._on_block_from_table)
+        self._table.blockDoubleClicked.connect(self._plots.zoom_to_block)
         self._scheme.blockClicked.connect(self._on_block_from_scheme)
         self._controls.rerun.connect(self._rerun)
         self._controls.reloadConfig.connect(self._reload_hw_config)
@@ -362,11 +363,12 @@ class SeqInterpTab(QWidget):
         avg_lay.addWidget(self._avg_check)
 
         self._avg_spin = QSpinBox()
-        self._avg_spin.setRange(2, 9999)
-        self._avg_spin.setValue(10)
+        self._avg_spin.setRange(1, 9999)
+        self._avg_spin.setValue(1)
         self._avg_spin.setToolTip("Количество усреднений")
         self._avg_spin.setEnabled(False)
-        self._avg_spin.setFixedWidth(64)
+        self._avg_spin.setFixedWidth(56)
+        self._avg_spin.setButtonSymbols(QSpinBox.NoButtons)
         self._avg_spin.valueChanged.connect(self._on_avg_value_changed)
         avg_lay.addWidget(self._avg_spin)
         avg_lay.addStretch()

+ 26 - 1
services/seq-interp/src/gui/plot_panel.py

@@ -154,6 +154,7 @@ class PlotPanel(QWidget):
         cumtimes  = np.cumsum([0.0] + list(durs))
         self._draw_boundaries(cumtimes)
         self._draw_delay_regions()
+        self._finalize_x_axis()
         self._attach_mouse_events()
 
         # Apply visibility.
@@ -410,12 +411,20 @@ class PlotPanel(QWidget):
     # ------------------------------------------------------------------ #
 
     def _add_row(self, key: str, label: str, units: str, h: int) -> pg.PlotItem:
+        dark = system_is_dark()
+        lbl_color = "#ccccee" if dark else "#333355"
+
         pw = pg.PlotWidget()
         pw.setMinimumHeight(h)
         pw.setMaximumHeight(h + 40)
         p = pw.getPlotItem()
-        p.setLabel("left", label, units=units)
+        p.setLabel("left", label, units=units, color=lbl_color, size="9pt")
+        # Bottom axis: numbers visible, label added later by _finalize_x_axis()
         p.showGrid(x=True, y=True, alpha=0.25)
+        # Hide bottom axis label/numbers by default — shown only on last row
+        p.getAxis("bottom").setStyle(showValues=False)
+        p.getAxis("bottom").setLabel("")
+
         self._plot_widgets[key] = pw
         self._plots[key]        = p
         self._plot_area_lay.addWidget(pw)
@@ -425,6 +434,22 @@ class PlotPanel(QWidget):
             p.setXLink(self._ref_plot)
         return p
 
+    def _finalize_x_axis(self) -> None:
+        """Show X-axis tick values + label only on the last (bottom) row."""
+        dark = system_is_dark()
+        lbl_color = "#ccccee" if dark else "#333355"
+        keys = list(self._plots.keys())
+        for i, key in enumerate(keys):
+            p = self._plots[key]
+            ax = p.getAxis("bottom")
+            if i == len(keys) - 1:
+                ax.setStyle(showValues=True)
+                p.setLabel("bottom", "Время", units="с",
+                           color=lbl_color, size="9pt")
+            else:
+                ax.setStyle(showValues=False)
+                p.getAxis("bottom").setLabel("")
+
     def _add_row_btn(self, key: str, label: str, color_key: str) -> None:
         _text = _C_TEXT_DARK if system_is_dark() else _C_TEXT_LIGHT
         color = _text.get(color_key, _C.get(color_key, "#555555"))