Esempio n. 1
0
 def __init__(self, engine):
     super().__init__()
     self.setupUi(self)
     self._engine = engine
     machines = {
         plugin.name: _(plugin.name)
         for plugin in registry.list_plugins('machine')
     }
     mappings = (
         # i18n: Widget: “ConfigWindow”.
         (_('Interface'), (
             ConfigOption(_('Start minimized:'), 'start_minimized', BooleanOption,
                          _('Minimize the main window to systray on startup.')),
             ConfigOption(_('Show paper tape:'), 'show_stroke_display', BooleanOption,
                          _('Open the paper tape on startup.')),
             ConfigOption(_('Show suggestions:'), 'show_suggestions_display', BooleanOption,
                          _('Open the suggestions dialog on startup.')),
             ConfigOption(_('Add translation dialog opacity:'), 'translation_frame_opacity',
                          partial(IntOption, maximum=100, minimum=0),
                          _('Set the translation dialog opacity:\n'
                            '- 0 makes the dialog invisible\n'
                            '- 100 is fully opaque')),
             ConfigOption(_('Dictionaries display order:'), 'classic_dictionaries_display_order',
                          partial(BooleanAsDualChoiceOption,
                                  _('top-down'), _('bottom-up')),
                          _('Set the display order for dictionaries:\n'
                            '- top-down: match the search order; highest priority first\n'
                            '- bottom-up: reverse search order; lowest priority first\n')),
         )),
         # i18n: Widget: “ConfigWindow”.
         (_('Logging'), (
             ConfigOption(_('Log file:'), 'log_file_name',
                          partial(FileOption,
                                  _('Select a log file'),
                                  _('Log files (*.log)')),
                          _('File to use for logging strokes/translations.')),
             ConfigOption(_('Log strokes:'), 'enable_stroke_logging', BooleanOption,
                          _('Save strokes to the logfile.')),
             ConfigOption(_('Log translations:'), 'enable_translation_logging', BooleanOption,
                          _('Save translations to the logfile.')),
         )),
         # i18n: Widget: “ConfigWindow”.
         (_('Machine'), (
             ConfigOption(_('Machine:'), 'machine_type', partial(ChoiceOption, choices=machines),
                          dependents=(
                              ('machine_specific_options', self._update_machine_options),
                              ('system_keymap', lambda v: self._update_keymap(machine_type=v)),
                          )),
             ConfigOption(_('Options:'), 'machine_specific_options', self._machine_option),
             ConfigOption(_('Keymap:'), 'system_keymap', KeymapOption),
         )),
         # i18n: Widget: “ConfigWindow”.
         (_('Output'), (
             ConfigOption(_('Enable at start:'), 'auto_start', BooleanOption,
                          _('Enable output on startup.')),
             ConfigOption(_('Start attached:'), 'start_attached', BooleanOption,
                          _('Disable preceding space on first output.\n'
                            '\n'
                            'This option is only applicable when spaces are placed before.')),
             ConfigOption(_('Start capitalized:'), 'start_capitalized', BooleanOption,
                          _('Capitalize the first word.')),
             ConfigOption(_('Space placement:'), 'space_placement',
                          partial(ChoiceOption, choices={
                              'Before Output': _('Before Output'),
                              'After Output': _('After Output'),
                          }),
                          _('Set automatic space placement: before or after each word.')),
             ConfigOption(_('Undo levels:'), 'undo_levels',
                          partial(IntOption,
                                  maximum=10000,
                                  minimum=MINIMUM_UNDO_LEVELS),
                          _('Set how many preceding strokes can be undone.\n'
                            '\n'
                            'Note: the effective value will take into account the\n'
                            'dictionaries entry with the maximum number of strokes.')),
         )),
         # i18n: Widget: “ConfigWindow”.
         (_('Plugins'), (
             ConfigOption(_('Extension:'), 'enabled_extensions',
                          partial(MultipleChoicesOption, choices={
                              plugin.name: plugin.name
                              for plugin in registry.list_plugins('extension')
                          }, labels=(_('Name'), _('Enabled'))),
                          _('Configure enabled plugin extensions.')),
         )),
         # i18n: Widget: “ConfigWindow”.
         (_('System'), (
             ConfigOption(_('System:'), 'system_name',
                          partial(ChoiceOption, choices={
                              plugin.name: plugin.name
                              for plugin in registry.list_plugins('system')
                          }),
                          dependents=(
                              ('system_keymap', lambda v: self._update_keymap(system_name=v)),
                          )),
         )),
     )
     # Only keep supported options, to avoid messing with things like
     # dictionaries, that are handled by another (possibly concurrent)
     # dialog.
     self._supported_options = set()
     for section, option_list in mappings:
         self._supported_options.update(option.option_name for option in option_list)
     self._update_config()
     # Create and fill tabs.
     option_by_name = {}
     for section, option_list in mappings:
         layout = QFormLayout()
         for option in option_list:
             option_by_name[option.option_name] = option
             option.layout = layout
             option.widget = self._create_option_widget(option)
             option.label = QLabel(option.display_name)
             option.label.setToolTip(option.help_text)
             option.label.setBuddy(option.widget)
             layout.addRow(option.label, option.widget)
         frame = QFrame()
         frame.setLayout(layout)
         frame.setAccessibleName(section)
         frame.setFocusProxy(option_list[0].widget)
         scroll_area = QScrollArea()
         scroll_area.setWidgetResizable(True)
         scroll_area.setWidget(frame)
         scroll_area.setFocusProxy(frame)
         self.tabs.addTab(scroll_area, section)
     # Update dependents.
     for option in option_by_name.values():
         option.dependents = [
             (option_by_name[option_name], update_fn)
             for option_name, update_fn in option.dependents
         ]
     self.buttons.button(QDialogButtonBox.Ok).clicked.connect(self.on_apply)
     self.buttons.button(QDialogButtonBox.Apply).clicked.connect(self.on_apply)
     self.tabs.currentWidget().setFocus()
     self.restore_state()
     self.finished.connect(self.save_state)