def __init__(self, parent=None, figsize=(4.4, 4.4)): super().__init__(parent=parent, figsize=figsize) self.setWindowTitle(self.tr("EMMA Chart")) # self.axes = self.figure.subplots() self.scale_menu = QtWidgets.QMenu(self.tr("Scale")) self.menu.insertMenu(self.edit_figure_action, self.scale_menu) self.scale_group = QtGui.QActionGroup(self.scale_menu) self.scale_group.setExclusive(True) self.scale_actions: List[QtGui.QAction] = [] for key, name in self.supported_scales: scale_action = self.scale_group.addAction(name) scale_action.setCheckable(True) scale_action.triggered.connect(self.update_chart) self.scale_menu.addAction(scale_action) self.scale_actions.append(scale_action) self.scale_actions[0].setChecked(True) self.loss_menu = QtWidgets.QMenu(self.tr("Loss Function")) self.menu.insertMenu(self.edit_figure_action, self.loss_menu) self.loss_group = QtGui.QActionGroup(self.loss_menu) self.loss_group.setExclusive(True) self.loss_actions: List[QtGui.QAction] = [] for key, name in self.supported_losses: loss_action = self.loss_group.addAction(name) loss_action.setCheckable(True) loss_action.triggered.connect(self.update_chart) self.loss_menu.addAction(loss_action) self.loss_actions.append(loss_action) self.loss_actions[8].setChecked(True) self.animated_action = QtGui.QAction(self.tr("Animated")) self.animated_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.animated_action) self.animated_action.setCheckable(True) self.animated_action.setChecked(False) self.interval_menu = QtWidgets.QMenu(self.tr("Animation Interval")) self.menu.insertMenu(self.edit_figure_action, self.interval_menu) self.interval_group = QtGui.QActionGroup(self.interval_menu) self.interval_group.setExclusive(True) self.interval_actions: List[QtGui.QAction] = [] for interval, name in self.supported_intervals: interval_action = self.interval_group.addAction(name) interval_action.setCheckable(True) interval_action.triggered.connect(self.update_chart) self.interval_menu.addAction(interval_action) self.interval_actions.append(interval_action) self.interval_actions[3].setChecked(True) self.repeat_action = QtGui.QAction(self.tr("Repeat Animation")) self.repeat_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.repeat_action) self.repeat_action.setCheckable(True) self.repeat_action.setChecked(False) self._last_result: Optional[EMMAResult] = None
def __init__(self, parent=None, size=(3, 2.5)): super().__init__(parent=parent, figsize=size) self.setWindowTitle(self.tr("Distribution Chart")) self._axes: plt.Axes = self._figure.subplots() self.scale_menu = QtWidgets.QMenu(self.tr("Scale")) self.menu.insertMenu(self.edit_figure_action, self.scale_menu) self.scale_group = QtGui.QActionGroup(self.scale_menu) self.scale_group.setExclusive(True) self.scale_actions: List[QtGui.QAction] = [] for key, name in self.supported_scales: scale_action = self.scale_group.addAction(name) scale_action.setCheckable(True) scale_action.triggered.connect(self.update_chart) self.scale_menu.addAction(scale_action) self.scale_actions.append(scale_action) self.scale_actions[0].setChecked(True) self.show_mode_lines_action = QtGui.QAction(self.tr("Show Mode Lines")) self.show_mode_lines_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.show_mode_lines_action) self.show_mode_lines_action.setCheckable(True) self.show_mode_lines_action.setChecked(False) self.show_legend_action = QtGui.QAction(self.tr("Show Legend")) self.show_legend_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.show_legend_action) self.show_legend_action.setCheckable(True) self.show_legend_action.setChecked(False) self.animated_action = QtGui.QAction(self.tr("Animated")) self.animated_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.animated_action) self.animated_action.setCheckable(True) self.animated_action.setChecked(False) self.interval_menu = QtWidgets.QMenu(self.tr("Animation Interval")) self.menu.insertMenu(self.edit_figure_action, self.interval_menu) self.interval_group = QtGui.QActionGroup(self.interval_menu) self.interval_group.setExclusive(True) self.interval_actions: List[QtGui.QAction] = [] for interval, name in self.supported_intervals: interval_action = self.interval_group.addAction(name) interval_action.setCheckable(True) interval_action.triggered.connect(self.update_chart) self.interval_menu.addAction(interval_action) self.interval_actions.append(interval_action) self.interval_actions[3].setChecked(True) self.repeat_animation_action = QtGui.QAction(self.tr("Repeat Animation")) self.repeat_animation_action.triggered.connect(self.update_chart) self.menu.insertAction(self.edit_figure_action, self.repeat_animation_action) self.repeat_animation_action.setCheckable(True) self.repeat_animation_action.setChecked(False) self._last_result: Union[ArtificialSample, SSUResult, None] = None
def _add_application_section(self, menu): submenu = QtWidgets.QMenu(menu) submenu.setObjectName("settings_menu_website") submenu.setTitle("About") about_group = QtGui.QActionGroup(menu) about_group.setObjectName("website_group") self._add_title(submenu, f"Normcap v{__version__}", about_group) action = QtGui.QAction("Website", about_group) action.setObjectName(URLS.website) submenu.addAction(action) action = QtGui.QAction("FAQs", about_group) action.setObjectName(URLS.faqs) submenu.addAction(action) action = QtGui.QAction("Source code", about_group) action.setObjectName(URLS.github) submenu.addAction(action) action = QtGui.QAction("Releases", about_group) action.setObjectName(URLS.releases) submenu.addAction(action) action = QtGui.QAction("Report a problem", about_group) action.setObjectName(URLS.issues) submenu.addAction(action) menu.addMenu(submenu) action = QtGui.QAction("Close", menu) action.setObjectName("close") menu.addAction(action)
def _add_languages_section(self, menu): tesseract_languages = ocr.utils.get_tesseract_languages( tessdata_path=system_info.get_tessdata_path()) if len(tesseract_languages) <= 7: language_menu = menu else: language_menu = QtWidgets.QMenu("select", menu) language_menu.setObjectName("language_menu") menu.addMenu(language_menu) language_group = QtGui.QActionGroup(language_menu) language_group.setObjectName("language_group") language_group.setExclusive(False) for language in tesseract_languages: action = QtGui.QAction(language, language_group) action.setObjectName(language) action.setCheckable(True) action.setChecked(language in self.settings.value("language")) language_menu.addAction(action) if system_info.is_briefcase_package(): action = QtGui.QAction("... open data folder", menu) traineddata_path = system_info.config_directory() / "tessdata" action.setObjectName(f"file:///{traineddata_path.resolve()}") else: action = QtGui.QAction("... need more?", menu) action.setObjectName("message_languages") menu.addAction(action)
def _add_mode_section(self, menu): mode_group = QtGui.QActionGroup(menu) mode_group.setObjectName("mode_group") mode_group.setExclusive(True) action = QtGui.QAction("parse", mode_group) action.setObjectName("parse") action.setCheckable(True) action.setChecked(self.settings.value("mode") == "parse") menu.addAction(action) action = QtGui.QAction("raw", mode_group) action.setObjectName("raw") action.setCheckable(True) action.setChecked(self.settings.value("mode") == "raw") menu.addAction(action)
def __init__(self, parent=None, figsize=(3, 2.5)): super().__init__(parent=parent, figsize=figsize) self.setWindowTitle(self.tr("Cumulative Frequency Chart")) self._axes = self._figure.subplots() self.scale_menu = QtWidgets.QMenu(self.tr("Scale")) self.menu.insertMenu(self.edit_figure_action, self.scale_menu) self.scale_group = QtGui.QActionGroup(self.scale_menu) self.scale_group.setExclusive(True) self.scale_actions: List[QtGui.QAction] = [] for key, name in self.supported_scales: scale_action = self.scale_group.addAction(name) scale_action.setCheckable(True) scale_action.triggered.connect(self.update_chart) self.scale_menu.addAction(scale_action) self.scale_actions.append(scale_action) self.scale_actions[0].setChecked(True) self._last_samples = []
def __init__(self, game_connection: GameConnection, options: Options): super().__init__() self.setupUi(self) self.game_connection = game_connection self.options = options common_qt_lib.set_default_window_icon(self) with get_data_path().joinpath(f"gui_assets/tracker/trackers.json" ).open("r") as trackers_file: self.trackers = json.load(trackers_file)["trackers"] self._action_to_name = {} theme_group = QtGui.QActionGroup(self) for name in self.trackers.keys(): action = QtGui.QAction(self.menu_tracker) action.setText(name) action.setCheckable(True) action.setChecked(name == options.selected_tracker) action.triggered.connect(self._on_action_select_tracker) self.menu_tracker.addAction(action) self._action_to_name[action] = name theme_group.addAction(action) self._tracker_elements: List[Element] = [] self.create_tracker() self.game_connection_setup = GameConnectionSetup( self, self.connection_status_label, self.game_connection, options) self.game_connection_setup.create_backend_entries(self.menu_backend) self.game_connection_setup.create_upload_nintendont_action( self.menu_options) self.game_connection_setup.refresh_backend() self.action_force_update.triggered.connect(self.on_force_update_button) self._update_timer = QtCore.QTimer(self) self._update_timer.setInterval(100) self._update_timer.timeout.connect(self._on_timer_update) self._update_timer.setSingleShot(True)
def _add_settings_section(self, menu): # sourcery skip: class-extract-method settings_group = QtGui.QActionGroup(menu) settings_group.setObjectName("settings_group") settings_group.setExclusive(False) action = QtGui.QAction("Show notification", settings_group) action.setObjectName("notification") action.setCheckable(True) action.setChecked(bool(self.settings.value("notification", type=bool))) menu.addAction(action) action = QtGui.QAction("Keep in system tray", settings_group) action.setObjectName("tray") action.setCheckable(True) action.setChecked(bool(self.settings.value("tray", type=bool))) menu.addAction(action) action = QtGui.QAction("Check for update", settings_group) action.setObjectName("update") action.setCheckable(True) action.setChecked(bool(self.settings.value("update", type=bool))) menu.addAction(action)
def __init__(self): super().__init__() self._dataset: Optional[Dataset] = None self._translator: Optional[QtCore.QTranslator] = None self._client = QGrainClient() self.setWindowTitle("QGrain") self.ssu_setting_dialog = SSUSettings(self) self.emma_setting_dialog = EMMASettings(parent=self, client=self._client) self.udm_setting_dialog = UDMSettings(parent=self, client=self._client) self.parameter_editor = ParameterEditor(self) self.ssu_multicore_analyzer = SSUMulticoreAnalyzer(self) self.tab_widget = QtWidgets.QTabWidget(self) self.tab_widget.setTabPosition(QtWidgets.QTabWidget.West) self.setCentralWidget(self.tab_widget) self.dataset_generator = DatasetGenerator() self.tab_widget.addTab(self.dataset_generator, self.tr("Generator")) self.dataset_viewer = StatisticalAnalyzer() self.tab_widget.addTab(self.dataset_viewer, self.tr("Statistics")) self.pca_analyzer = PCAAnalyzer() self.tab_widget.addTab(self.pca_analyzer, self.tr("PCA")) self.clustering_analyzer = ClusteringAnalyzer() self.tab_widget.addTab(self.clustering_analyzer, self.tr("Clustering")) self.ssu_analyzer = SSUAnalyzer(self.ssu_setting_dialog, self.parameter_editor) self.tab_widget.addTab(self.ssu_analyzer, self.tr("SSU")) self.emma_analyzer = EMMAAnalyzer(self.emma_setting_dialog, self.parameter_editor, client=self._client) self.tab_widget.addTab(self.emma_analyzer, self.tr("EMMA")) self.udm_analyzer = UDMAnalyzer(self.udm_setting_dialog, self.parameter_editor, client=self._client) self.tab_widget.addTab(self.udm_analyzer, self.tr("UDM")) # Open self.open_menu = self.menuBar().addMenu(self.tr("Open")) self.open_dataset_action = self.open_menu.addAction( self.tr("Grain Size Dataset")) self.open_dataset_action.triggered.connect( lambda: self.load_dataset_dialog.show()) self.load_ssu_result_action = self.open_menu.addAction( self.tr("SSU Results")) self.load_ssu_result_action.triggered.connect( self.ssu_analyzer.result_view.load_results) self.load_emma_result_action = self.open_menu.addAction( self.tr("EMMA Result")) self.load_emma_result_action.triggered.connect( self.emma_analyzer.load_result) self.load_udm_result_action = self.open_menu.addAction( self.tr("UDM Result")) self.load_udm_result_action.triggered.connect( self.udm_analyzer.load_result) # Save self.save_menu = self.menuBar().addMenu(self.tr("Save")) self.save_artificial_action = self.save_menu.addAction( self.tr("Artificial Dataset")) self.save_artificial_action.triggered.connect( self.dataset_generator.on_save_clicked) self.save_statistics_action = self.save_menu.addAction( self.tr("Statistical Result")) self.save_statistics_action.triggered.connect( self.on_save_statistics_clicked) self.save_pca_action = self.save_menu.addAction(self.tr("PCA Result")) self.save_pca_action.triggered.connect(self.on_save_pca_clicked) self.save_clustering_action = self.save_menu.addAction( self.tr("Clustering Result")) self.save_clustering_action.triggered.connect( self.clustering_analyzer.save_result) self.save_ssu_result_action = self.save_menu.addAction( self.tr("SSU Results")) self.save_ssu_result_action.triggered.connect( self.ssu_analyzer.result_view.save_results) self.save_emma_result_action = self.save_menu.addAction( self.tr("EMMA Result")) self.save_emma_result_action.triggered.connect( self.emma_analyzer.save_selected_result) self.save_udm_result_action = self.save_menu.addAction( self.tr("UDM Result")) self.save_udm_result_action.triggered.connect( self.udm_analyzer.save_selected_result) # Config self.config_menu = self.menuBar().addMenu(self.tr("Configure")) self.config_ssu_action = self.config_menu.addAction( self.tr("SSU Algorithm")) self.config_ssu_action.triggered.connect(self.ssu_setting_dialog.show) self.config_emma_action = self.config_menu.addAction( self.tr("EMMA Algorithm")) self.config_emma_action.triggered.connect( self.emma_setting_dialog.show) self.config_udm_action = self.config_menu.addAction( self.tr("UDM Algorithm")) self.config_udm_action.triggered.connect(self.udm_setting_dialog.show) # Experimental self.experimental_menu = self.menuBar().addMenu( self.tr("Experimental")) self.ssu_fit_all_action = self.experimental_menu.addAction( self.tr("Perform SSU For All Samples")) self.ssu_fit_all_action.triggered.connect(self.ssu_fit_all_samples) self.convert_udm_to_ssu_action = self.experimental_menu.addAction( self.tr("Convert Selected UDM Result To SSU Results")) self.convert_udm_to_ssu_action.triggered.connect( self.convert_udm_to_ssu) self.save_all_ssu_figures_action = self.experimental_menu.addAction( self.tr("Save Figures For All SSU Results")) self.save_all_ssu_figures_action.triggered.connect( self.save_all_ssu_figure) # Language self.language_menu = self.menuBar().addMenu(self.tr("Language")) self.language_group = QtGui.QActionGroup(self.language_menu) self.language_group.setExclusive(True) self.language_actions: List[QtGui.QAction] = [] for key, name in self.supported_languages: action = self.language_group.addAction(name) action.setCheckable(True) action.triggered.connect(lambda checked=False, language=key: self. switch_language(language)) self.language_menu.addAction(action) self.language_actions.append(action) self.language_actions[0].setChecked(True) # Theme self.theme_menu = self.menuBar().addMenu(self.tr("Theme")) self.theme_group = QtGui.QActionGroup(self.theme_menu) self.theme_group.setExclusive(True) self.theme_actions = [] self.default_theme_action = self.theme_group.addAction( self.tr("Default")) self.default_theme_action.setCheckable(True) self.default_theme_action.setChecked(True) self.default_theme_action.triggered.connect(lambda: apply_stylesheet( app, theme=os.path.join(QGRAIN_ROOT_PATH, "assets", "default_theme.xml" ), invert_secondary=True, extra=EXTRA)) self.theme_menu.addAction(self.default_theme_action) self.theme_actions.append(self.default_theme_action) self.light_theme_menu = self.theme_menu.addMenu(self.tr("Light Theme")) self.dark_theme_menu = self.theme_menu.addMenu(self.tr("Dark Theme")) for theme in list_themes(): theme_name = string.capwords(" ".join(theme[:-4].split("_")[1:])) action = self.theme_group.addAction(theme_name) action.setCheckable(True) app = QtCore.QCoreApplication.instance() invert = theme.startswith("light") action.triggered.connect( lambda checked=False, t=theme, i=invert: apply_stylesheet( app, theme=t, invert_secondary=i, extra=EXTRA)) self.theme_actions.append(action) if invert: self.light_theme_menu.addAction(action) else: self.dark_theme_menu.addAction(action) # Log self.log_action = QtGui.QAction(self.tr("Log")) self.log_action.triggered.connect(lambda: self.log_dialog.show()) self.menuBar().addAction(self.log_action) # About self.about_action = QtGui.QAction(self.tr("About")) self.about_action.triggered.connect(lambda: self.about_dialog.show()) self.menuBar().addAction(self.about_action) # Connect signals self.ssu_multicore_analyzer.result_finished.connect( self.ssu_analyzer.result_view.add_result) self.load_dataset_dialog = DatasetLoader(self) self.load_dataset_dialog.dataset_loaded.connect(self.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.dataset_viewer.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.pca_analyzer.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.clustering_analyzer.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.ssu_analyzer.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.emma_analyzer.on_dataset_loaded) self.load_dataset_dialog.dataset_loaded.connect( self.udm_analyzer.on_dataset_loaded) self.log_dialog = RuntimeLog(self) self.about_dialog = About(self) self.file_dialog = QtWidgets.QFileDialog(parent=self) self.normal_msg = QtWidgets.QMessageBox(self) self.close_msg = QtWidgets.QMessageBox(self) self.close_msg.setWindowTitle(self.tr("Warning")) self.close_msg.setText( self. tr("Closing this window will terminate all running tasks, are you sure to close it?" )) self.close_msg.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) self.close_msg.setDefaultButton(QtWidgets.QMessageBox.No)