mlukac/xrf-explorer-dev
0
1from typing import Callable2 3import panel as pn4import param5 6from xrf_explorer.common.defaults import K_MEANS, K_MEANS_BOUNDS7from xrf_explorer.core.events import (8 NClustersUpdated,9 ShowWeightsUpdated,10 XRFFileLoadHandled,11)12from xrf_explorer.core.types import EventTriggerProtocol13from xrf_explorer.helpers.print import time_me14 15 16class PCAProjController(param.Parameterized):17 18 show_weights = param.Boolean(default=False, allow_refs=True)19 n_clusters = param.Integer(default=K_MEANS, bounds=K_MEANS_BOUNDS)20 21 def __init__(22 self,23 app: EventTriggerProtocol,24 max_k_getter: Callable[[], int | None],25 **kwargs,26 ) -> None:27 super().__init__(**kwargs)28 self._app = app29 self._max_k_getter = max_k_getter30 self._initialized: bool = False31 32 self._show_weights_widget = pn.widgets.Switch.from_param(33 parameter=self.param.show_weights,34 name="Show Weights",35 align="center",36 margin=(0, 0, 0, 0),37 )38 self._n_clusters_widget = pn.widgets.IntSlider.from_param(39 parameter=self.param.n_clusters,40 name="Number of Clusters",41 min_width=100,42 )43 44 def handle_xrf_load(self, event: XRFFileLoadHandled) -> None:45 upper_bound = self._max_k_getter()46 self.param.n_clusters.bounds = (1, upper_bound)47 if self.n_clusters > upper_bound:48 self.n_clusters = upper_bound49 self._initialized = True50 51 @property52 def show_weights_widget(self) -> pn.widgets.Switch:53 return self._show_weights_widget54 55 @property56 def n_clusters_widget(self) -> pn.widgets.IntSlider:57 return self._n_clusters_widget58 59 @time_me()60 @param.depends("n_clusters", watch=True)61 def update_n_clusters(self) -> None:62 if not self._initialized:63 return64 self._app.trigger(NClustersUpdated(n_clusters=self.n_clusters))65 66 @time_me()67 @param.depends("show_weights", watch=True)68 def update_show_weights(self) -> None:69 self._app.trigger(ShowWeightsUpdated(show_weights=self.show_weights))70 