From c210c286a581574bef5d8431d151be56ccbffd46 Mon Sep 17 00:00:00 2001 From: goodboy Date: Tue, 7 Apr 2026 15:19:04 -0400 Subject: [PATCH] Use walrus `getattr()` over `hasattr()` in `_window` Replace all nested `hasattr()` + re-access chains with `:= getattr(..., None)` walrus assigns throughout the zoom UI methods; flattens deeply nested `if hasattr` / `if hasattr` / `if hasattr` pyramids into single chained `and` conditions. Also, - apply multiline code style per `py-codestyle` (list literals, fn sigs, `except` clauses, comments, docstrings) - replace bare `pass` in `except` handlers with `log.exception()` calls - fix `_qt_win` annotation to `QMainWindow|None` (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code --- piker/ui/_window.py | 144 ++++++++++++++++++++++++++++++-------------- 1 file changed, 100 insertions(+), 44 deletions(-) diff --git a/piker/ui/_window.py b/piker/ui/_window.py index d25f6d4d..d5c35303 100644 --- a/piker/ui/_window.py +++ b/piker/ui/_window.py @@ -342,7 +342,10 @@ class MainWindow(QMainWindow): log.debug('Saved window geometry for next session') # raising KBI seems to get intercepted by by Qt so just use the system. - os.kill(os.getpid(), signal.SIGINT) + os.kill( + os.getpid(), + signal.SIGINT, + ) @property def status_bar(self) -> QStatusBar: @@ -549,9 +552,9 @@ class MainWindow(QMainWindow): # update godwidget and its children if self.godwidget: - # update search widget if it exists - if hasattr(self.godwidget, 'search') and self.godwidget.search: - self.godwidget.search.update_fonts() + # update search bg if it exists + if search := getattr(self.godwidget, 'search', None): + search.update_fonts() # update order mode panes in all chart views self._update_chart_order_panes() @@ -571,7 +574,10 @@ class MainWindow(QMainWindow): return # iterate through all linked splits (hist and rt) - for splits_name in ['hist_linked', 'rt_linked']: + for splits_name in [ + 'hist_linked', + 'rt_linked', + ]: splits = getattr(self.godwidget, splits_name, None) if not splits: continue @@ -583,12 +589,14 @@ class MainWindow(QMainWindow): self._update_chart_axes(chart) # update order pane - if hasattr(chart, 'view'): - view = chart.view - if hasattr(view, 'order_mode') and view.order_mode: - order_mode = view.order_mode - if hasattr(order_mode, 'pane') and order_mode.pane: - order_mode.pane.update_fonts() + if ( + (view := getattr(chart, 'view', None)) + and + (order_mode := getattr(view, 'order_mode', None)) + and + (pane := getattr(order_mode, 'pane', None)) + ): + pane.update_fonts() # also check subplots subplots = getattr(splits, 'subplots', {}) @@ -597,54 +605,90 @@ class MainWindow(QMainWindow): self._update_chart_axes(subplot_chart) # update subplot order pane - if hasattr(subplot_chart, 'view'): - subplot_view = subplot_chart.view - if hasattr(subplot_view, 'order_mode') and subplot_view.order_mode: - subplot_order_mode = subplot_view.order_mode - if hasattr(subplot_order_mode, 'pane') and subplot_order_mode.pane: - subplot_order_mode.pane.update_fonts() + if ( + (view := getattr(subplot_chart, 'view', None)) + and + (order_mode := getattr( + view, 'order_mode', None, + )) + and + (pane := getattr(order_mode, 'pane', None)) + ): + pane.update_fonts() - # resize all sidepanes to match main chart's sidepane width - # this ensures volume/subplot sidepanes match the main chart - if splits and hasattr(splits, 'resize_sidepanes'): - splits.resize_sidepanes() + # resize all sidepanes to match the + # main chart's sidepane width; ensures + # volume/subplot sidepanes match. + if ( + splits + and + (resize := getattr( + splits, 'resize_sidepanes', None, + )) + ): + resize() def _update_chart_axes(self, chart) -> None: - '''Update axis fonts and sizing for a chart.''' + ''' + Update axis fonts and sizing for a chart. + + ''' from . import _style # update price axis (right side) - if hasattr(chart, 'pi') and chart.pi: - plot_item = chart.pi + if plot_item := getattr(chart, 'pi', None): # get all axes from plot item - for axis_name in ['left', 'right', 'bottom', 'top']: - axis = plot_item.getAxis(axis_name) - if axis and hasattr(axis, 'update_fonts'): - axis.update_fonts(_style._font) + for axis_name in [ + 'left', + 'right', + 'bottom', + 'top', + ]: + if ( + (axis := plot_item.getAxis(axis_name)) + and + (update_fonts := getattr( + axis, 'update_fonts', None, + )) + ): + update_fonts(_style._font) - # force plot item to recalculate its entire layout + # force plot item to recalculate + # its entire layout plot_item.updateGeometry() # force chart widget to update - if hasattr(chart, 'updateGeometry'): - chart.updateGeometry() + if update_geom := getattr(chart, 'updateGeometry', None): + update_geom() # trigger a full scene update - if hasattr(chart, 'update'): - chart.update() + if update := getattr(chart, 'update', None): + update() - def _refresh_widget_fonts(self, widget: QWidget) -> None: + def _refresh_widget_fonts( + self, + widget: QWidget, + ) -> None: ''' - Recursively update font sizes in all child widgets. + Recursively update font sizes in all + child widgets. + + Handles widgets that have font-size + hardcoded in their stylesheets. - This handles widgets that have font-size hardcoded in their stylesheets. ''' from . import _style # recursively process all children for child in widget.findChildren(QWidget): - # skip widgets that have their own update_fonts method (handled separately) - if hasattr(child, 'update_fonts'): + # skip widgets that have custom update + # methods; handled separately below. + if getattr(child, 'update_fonts', None): + log.debug( + f'Skipping sub-widget with' + f' custom font-update meth..\n' + f'{child!r}\n' + ) continue # update child's stylesheet if it has font-size @@ -654,23 +698,35 @@ class MainWindow(QMainWindow): # this is a heuristic - may need refinement try: child.setFont(_style._font.font) - except (AttributeError, RuntimeError): - pass + except ( + AttributeError, + RuntimeError, + ): + log.exception( + 'Failed to update sub-widget font?\n' + ) # update child's font try: child.setFont(_style._font.font) - except (AttributeError, RuntimeError): - pass + except ( + AttributeError, + RuntimeError, + ): + log.exception( + 'Failed to update sub-widget font?\n' + ) # singleton app per actor -_qt_win: QMainWindow = None +_qt_win: QMainWindow|None = None def main_window() -> MainWindow: - 'Return the actor-global Qt window.' + ''' + Return the actor-global Qt window. + ''' global _qt_win assert _qt_win return _qt_win