Source code for tommy.view.plot_selection_view

from PySide6.QtWidgets import QWidget, QTabWidget

from tommy.controller.config_controller import ConfigController
from tommy.controller.graph_controller import GraphController
from tommy.controller.visualizations.possible_visualization import (
    PossibleVisualization, VisGroup)
from tommy.support.constant_variables import text_font, plot_tab_font
from tommy.view.graph_view import GraphView


[docs] class PlotSelectionView(QTabWidget): """A class to display options for selecting a plot.""" _disable_tab_clicked_event: bool ORDER_OF_VIS_GROUPS: list[VisGroup] = [VisGroup.CORPUS, VisGroup.MODEL, VisGroup.TOPIC] assert len(ORDER_OF_VIS_GROUPS) == len(VisGroup), ( "Not all visualization groups have a corresponding order in the plots " "selection view")
[docs] def __init__(self, graph_controller: GraphController, config_controller: ConfigController, graph_view: GraphView) -> None: """Initialize the GraphDisplay.""" super().__init__() self._disable_tab_clicked_event = False # Initialize widget properties self.setFixedHeight(50) self.setStyleSheet(f""" QTabWidget {{ color: black; border: none; font-family: {text_font}; }} QTabBar::tab {{ background-color: rgba(210, 210, 210, 1); color: rgba(120, 120, 120, 1); font-size: 15px; padding-left: 10px; padding-right: 10px; padding-top: 15px; padding-bottom: 15px; font-weight: bold; }} QTabBar::tab:disabled {{ background-color: white; color: white; }} QTabBar::tab:selected {{ color: #000000; background-color: rgba(230, 230, 230, 1); }} QTabBar::tab:hover {{ background-color: rgba(230, 230, 230, 1); }} QTabWidget::tab-bar {{ alignment: left; }} """) # Set reference to the graph-controller and graphview self._graph_controller = graph_controller self._config_controller = config_controller self._graph_controller.possible_plots_changed_event.subscribe( self._create_tabs) self._graph_controller.refresh_plots_event.subscribe( lambda _: self._tab_clicked_event()) self._graph_view = graph_view self.setFont(plot_tab_font) # Initialize a dict from tab index to the corresponding visualization self._tabs_plots: dict[int, PossibleVisualization] = {} # Add tabChanged event self.currentChanged.connect(self._tab_clicked_event)
def _config_changed_event(self) -> None: """Update the currently selected tab in the graph-view""" if not self._graph_controller.visualizations_available(): self.remove_all_tabs() self._graph_view.clear_plot() return selected_tab_index = self.currentIndex() new_possible_vis = self._tabs_plots[selected_tab_index] new_plot, plot_type = self._graph_controller.get_visualization( new_possible_vis.index) self._graph_view.display_plot(new_plot, plot_type) def _tab_clicked_event(self) -> None: """Update the currently selected tab in the graph-view""" # do not update while we are removing all the tabs if self._disable_tab_clicked_event: return selected_tab_index = self.currentIndex() # because pyqt tries to select inactive (spacer) tab after creation # if the tab bar was empty before if selected_tab_index not in self._tabs_plots: return new_possible_vis = self._tabs_plots[selected_tab_index] new_plot, plot_type = self._graph_controller.get_visualization( new_possible_vis.index) self._graph_view.display_plot(new_plot, plot_type) def _create_tabs(self, possible_vis_list: list[PossibleVisualization] ) -> None: """ Create new tabs for all the possible visualizations :param possible_vis_list: The list of all possible visualization to create tabs for """ self.remove_all_tabs() # Partition all tabs based on in which visualization group they belong partitioned_tabs: dict[VisGroup, list[PossibleVisualization]] = { vis_group: [] for vis_group in VisGroup} for vis in possible_vis_list: partitioned_tabs[vis.type].append(vis) # Create all tabs for vis_group in self.ORDER_OF_VIS_GROUPS: tabs_in_group = partitioned_tabs[vis_group] # Add disabled tab as a spacer between groups (but not on the left) if self.count() > 0 and len(tabs_in_group) > 0: self._add_spacer_tab() # add all tabs in the group self._add_multiple_tabs(tabs_in_group)
[docs] def remove_all_tabs(self): """Clear layout and list of possible plots""" # disable tab clicked event because it would be called for every tab self._disable_tab_clicked_event = True self._tabs_plots = {} if self.count() > 0: self.clear() self._disable_tab_clicked_event = False
def _add_multiple_tabs(self, visualizations: list[PossibleVisualization]): """Add a tab and save the plot index for each visualization given""" for vis in visualizations: self._tabs_plots[self.count()] = vis self.addTab(QWidget(), vis.short_tab_name) def _add_spacer_tab(self): """Add a disabled tab to the tabs bar as a spacer""" self.addTab(QWidget(), " ") self.setTabEnabled(self.count() - 1, False)
""" This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course. © Copyright Utrecht University (Department of Information and Computing Sciences) """