Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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 = []
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)