def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted( language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.ui.up_button.clicked.connect(partial(self.move_item, 1)) self.ui.down_button.clicked.connect(partial(self.move_item, -1)) self.ui.toolbar_layout_list.currentRowChanged.connect( self.update_buttons) self.ui.toolbar_layout_list.setDragDropMode( QtGui.QAbstractItemView.DragDrop) self.ui.toolbar_layout_list.setDefaultDropAction(QtCore.Qt.MoveAction)
def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(lang[0], lang[1], _(lang[2])) for lang in UI_LANGUAGES] def fcmp(x): return locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons if IS_MACOS or IS_WIN or IS_HAIKU: self.ui.use_system_theme.hide()
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = "advanced" SORT_ORDER = 40 ACTIVE = True options = [ BoolOption("setting", "toolbar_show_labels", True), BoolOption("setting", "toolbar_multiselect", False), BoolOption("setting", "use_adv_search_syntax", False), BoolOption("setting", "quit_confirmation", True), TextOption("setting", "ui_language", u""), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_("System default"), QtCore.QVariant("")) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted(language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u"%s (%s)" % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code)) def load(self): self.ui.toolbar_show_labels.setChecked(self.config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked(self.config.setting["toolbar_multiselect"]) self.ui.use_adv_search_syntax.setChecked(self.config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked(self.config.setting["quit_confirmation"]) current_ui_language = QtCore.QVariant(self.config.setting["ui_language"]) self.ui.ui_language.setCurrentIndex(self.ui.ui_language.findData(current_ui_language)) def save(self): self.config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() self.config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() self.config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() self.config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()).toString() if new_language != self.config.setting["ui_language"]: self.config.setting["ui_language"] = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex() ).toString() dialog = QtGui.QMessageBox( QtGui.QMessageBox.Information, _("Language changed"), _( "You have changed the interface language. You have to restart Picard in order for the change to take effect." ), QtGui.QMessageBox.Ok, self, ) dialog.exec_()
def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), QtCore.QVariant('')) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted( language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code))
def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_theme.clear() for theme in AVAILABLE_UI_THEMES: label = self._UI_THEME_LABELS[theme]['label'] desc = self._UI_THEME_LABELS[theme]['desc'] self.ui.ui_theme.addItem(_(label), theme) idx = self.ui.ui_theme.findData(theme) self.ui.ui_theme.setItemData(idx, _(desc), QtCore.Qt.ToolTipRole) self.ui.ui_theme.setCurrentIndex(self.ui.ui_theme.findData(UiTheme.DEFAULT)) self.ui.ui_language.addItem(_('System default'), '') language_list = [(lang[0], lang[1], _(lang[2])) for lang in UI_LANGUAGES] def fcmp(x): return locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.ui.show_menu_icons.toggled.connect(self.tagger.enable_menu_icons) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons if not OS_SUPPORTS_THEMES: self.ui.ui_theme_container.hide()
def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] fcmp = lambda x: locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.ui.up_button.clicked.connect(partial(self.move_item, 1)) self.ui.down_button.clicked.connect(partial(self.move_item, -1)) self.ui.toolbar_layout_list.currentRowChanged.connect(self.update_buttons) self.ui.toolbar_layout_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) self.ui.toolbar_layout_list.setDefaultDropAction(QtCore.Qt.MoveAction)
def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), QtCore.QVariant('')) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted(language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code)) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse)
def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] def fcmp(x): return locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons
def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted( language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse)
def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_("System default"), QtCore.QVariant("")) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted(language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u"%s (%s)" % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code))
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = None SORT_ORDER = 80 ACTIVE = True HELP_URL = '/config/options_interface.html' SEPARATOR = '—' * 5 TOOLBAR_BUTTONS = { 'add_directory_action': { 'label': N_('Add Folder'), 'icon': 'folder' }, 'add_files_action': { 'label': N_('Add Files'), 'icon': 'document-open' }, 'cluster_action': { 'label': N_('Cluster'), 'icon': 'picard-cluster' }, 'autotag_action': { 'label': N_('Lookup'), 'icon': 'picard-auto-tag' }, 'analyze_action': { 'label': N_('Scan'), 'icon': 'picard-analyze' }, 'browser_lookup_action': { 'label': N_('Lookup in Browser'), 'icon': 'lookup-musicbrainz' }, 'save_action': { 'label': N_('Save'), 'icon': 'document-save' }, 'view_info_action': { 'label': N_('Info'), 'icon': 'picard-edit-tags' }, 'remove_action': { 'label': N_('Remove'), 'icon': 'list-remove' }, 'submit_acoustid_action': { 'label': N_('Submit AcoustIDs'), 'icon': 'acoustid-fingerprinter' }, 'generate_fingerprints_action': { 'label': N_("Generate Fingerprints"), 'icon': 'fingerprint' }, 'play_file_action': { 'label': N_('Open in Player'), 'icon': 'play-music' }, 'cd_lookup_action': { 'label': N_('Lookup CD...'), 'icon': 'media-optical' }, 'tags_from_filenames_action': { 'label': N_('Parse File Names...'), 'icon': 'picard-tags-from-filename' }, } ACTION_NAMES = set(TOOLBAR_BUTTONS.keys()) options = [ BoolOption("setting", "toolbar_show_labels", True), BoolOption("setting", "toolbar_multiselect", False), BoolOption("setting", "builtin_search", True), BoolOption("setting", "use_adv_search_syntax", False), BoolOption("setting", "quit_confirmation", True), TextOption("setting", "ui_language", ""), BoolOption("setting", "use_system_theme", False), BoolOption("setting", "filebrowser_horizontal_autoscroll", True), BoolOption("setting", "starting_directory", False), TextOption("setting", "starting_directory_path", _default_starting_dir), TextOption("setting", "load_image_behavior", "append"), ListOption("setting", "toolbar_layout", [ 'add_directory_action', 'add_files_action', 'separator', 'cluster_action', 'separator', 'autotag_action', 'analyze_action', 'browser_lookup_action', 'separator', 'save_action', 'view_info_action', 'remove_action', 'separator', 'cd_lookup_action', 'separator', 'submit_acoustid_action', ]), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(lang[0], lang[1], _(lang[2])) for lang in UI_LANGUAGES] def fcmp(x): return locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons if IS_MACOS or IS_WIN or IS_HAIKU: self.ui.use_system_theme.hide() def load(self): config = get_config() self.ui.toolbar_show_labels.setChecked( config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked( config.setting["toolbar_multiselect"]) self.ui.builtin_search.setChecked(config.setting["builtin_search"]) self.ui.use_adv_search_syntax.setChecked( config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked( config.setting["quit_confirmation"]) self.ui.use_system_theme.setChecked(config.setting["use_system_theme"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex( self.ui.ui_language.findData(current_ui_language)) self.ui.filebrowser_horizontal_autoscroll.setChecked( config.setting["filebrowser_horizontal_autoscroll"]) self.ui.starting_directory.setChecked( config.setting["starting_directory"]) self.ui.starting_directory_path.setText( config.setting["starting_directory_path"]) self.populate_action_list() self.ui.toolbar_layout_list.setCurrentRow(0) self.update_buttons() def save(self): config = get_config() config.setting[ "toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting[ "toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting[ "use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked( ) config.setting[ "quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_theme_setting = self.ui.use_system_theme.isChecked() new_language = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) restart_warning = None if new_theme_setting != config.setting["use_system_theme"]: restart_warning_title = _('Theme changed') restart_warning = _( 'You have changed the application theme. You have to restart Picard in order for the change to take effect.' ) if new_theme_setting: restart_warning += '\n\n' + _( 'Please note that using the system theme might cause the user interface to be not shown correctly. ' 'If this is the case disable the "Use system theme" option to use Picard\'s default theme again.' ) elif new_language != config.setting["ui_language"]: restart_warning_title = _('Language changed') restart_warning = _( 'You have changed the interface language. You have to restart Picard in order for the change to take effect.' ) if restart_warning: dialog = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Information, restart_warning_title, restart_warning, QtWidgets.QMessageBox.Ok, self) dialog.exec_() config.setting[ "use_system_theme"] = self.ui.use_system_theme.isChecked() config.setting["ui_language"] = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) config.setting[ "filebrowser_horizontal_autoscroll"] = self.ui.filebrowser_horizontal_autoscroll.isChecked( ) config.setting[ "starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath( self.ui.starting_directory_path.text()) self.update_layout_config() def restore_defaults(self): super().restore_defaults() self.update_buttons() def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtWidgets.QFileDialog.getExistingDirectory( self, "", item.text()) if path: path = os.path.normpath(path) item.setText(path) def _get_icon_from_name(self, name): return self.TOOLBAR_BUTTONS[name]['icon'] def _insert_item(self, action, index=None): list_item = ToolbarListItem(action) list_item.setToolTip(_('Drag and Drop to re-order')) if action in self.TOOLBAR_BUTTONS: # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = self.TOOLBAR_BUTTONS[action]['label'] list_item.setText(_(babel_415_workaround)) list_item.setIcon( icontheme.lookup(self._get_icon_from_name(action), icontheme.ICON_SIZE_MENU)) else: list_item.setText(self.SEPARATOR) if index is not None: self.ui.toolbar_layout_list.insertItem(index, list_item) else: self.ui.toolbar_layout_list.addItem(list_item) return list_item def _all_list_items(self): return [ self.ui.toolbar_layout_list.item(i).action_name for i in range(self.ui.toolbar_layout_list.count()) ] def _added_actions(self): actions = self._all_list_items() return set(action for action in actions if action != 'separator') def populate_action_list(self): self.ui.toolbar_layout_list.clear() config = get_config() for name in config.setting['toolbar_layout']: if name in self.ACTION_NAMES or name == 'separator': self._insert_item(name) def update_action_buttons(self): self.ui.add_button.setEnabled( self._added_actions() != self.ACTION_NAMES) def add_to_toolbar(self): display_list = set.difference(self.ACTION_NAMES, self._added_actions()) selected_action, ok = AddActionDialog.get_selected_action( display_list, self) if ok: list_item = self._insert_item( selected_action, self.ui.toolbar_layout_list.currentRow() + 1) self.ui.toolbar_layout_list.setCurrentItem(list_item) self.update_buttons() def insert_separator(self): insert_index = self.ui.toolbar_layout_list.currentRow() + 1 self._insert_item('separator', insert_index) def remove_action(self): item = self.ui.toolbar_layout_list.takeItem( self.ui.toolbar_layout_list.currentRow()) del item self.update_buttons() def update_layout_config(self): config = get_config() config.setting['toolbar_layout'] = self._all_list_items() self._update_toolbar() def _update_toolbar(self): widget = self.parent() while not isinstance(widget, QtWidgets.QMainWindow): widget = widget.parent() # Call the main window's create toolbar method widget.create_action_toolbar() widget.set_tab_order()
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = None SORT_ORDER = 80 ACTIVE = True SEPARATOR = '—'*5 TOOLBAR_BUTTONS = { 'add_directory_action': { 'label': N_('Add Folder'), 'icon': 'folder' }, 'add_files_action': { 'label': N_('Add Files'), 'icon': 'document-open' }, 'cluster_action': { 'label': N_('Cluster'), 'icon': 'picard-cluster' }, 'autotag_action': { 'label': N_('Lookup'), 'icon': 'picard-auto-tag' }, 'analyze_action': { 'label': N_('Scan'), 'icon': 'picard-analyze' }, 'browser_lookup_action': { 'label': N_('Lookup in Browser'), 'icon': 'lookup-musicbrainz' }, 'save_action': { 'label': N_('Save'), 'icon': 'document-save' }, 'view_info_action': { 'label': N_('Info'), 'icon': 'picard-edit-tags' }, 'remove_action': { 'label': N_('Remove'), 'icon': 'list-remove' }, 'submit_acoustid_action': { 'label': N_('Submit AcoustIDs'), 'icon': 'acoustid-fingerprinter' }, 'play_file_action': { 'label': N_('Open in Player'), 'icon': 'play-music' }, 'cd_lookup_action': { 'label': N_('Lookup CD...'), 'icon': 'media-optical' }, } ACTION_NAMES = set(TOOLBAR_BUTTONS.keys()) options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "builtin_search", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", ""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", ""), config.TextOption("setting", "load_image_behavior", "append"), config.ListOption("setting", "toolbar_layout", [ 'add_directory_action', 'add_files_action', 'separator', 'cluster_action', 'separator', 'autotag_action', 'analyze_action', 'browser_lookup_action', 'separator', 'save_action', 'view_info_action', 'remove_action', 'separator', 'cd_lookup_action', 'separator', 'submit_acoustid_action', ]), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] fcmp = lambda x: locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.ui.up_button.clicked.connect(partial(self.move_item, 1)) self.ui.down_button.clicked.connect(partial(self.move_item, -1)) self.ui.toolbar_layout_list.currentRowChanged.connect(self.update_buttons) self.ui.toolbar_layout_list.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) self.ui.toolbar_layout_list.setDefaultDropAction(QtCore.Qt.MoveAction) def load(self): self.ui.toolbar_show_labels.setChecked(config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked(config.setting["toolbar_multiselect"]) self.ui.builtin_search.setChecked(config.setting["builtin_search"]) self.ui.use_adv_search_syntax.setChecked(config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked(config.setting["quit_confirmation"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex(self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked(config.setting["starting_directory"]) self.ui.starting_directory_path.setText(config.setting["starting_directory_path"]) self.populate_action_list() self.ui.toolbar_layout_list.setCurrentRow(0) self.update_buttons() def save(self): config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) dialog = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.'), QtWidgets.QMessageBox.Ok, self) dialog.exec_() config.setting["starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath(self.ui.starting_directory_path.text()) self.update_layout_config() def restore_defaults(self): super(InterfaceOptionsPage, self).restore_defaults() self.update_buttons() def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtWidgets.QFileDialog.getExistingDirectory(self, "", item.text()) if path: path = os.path.normpath(path) item.setText(path) def _get_icon_from_name(self, name): return self.TOOLBAR_BUTTONS[name]['icon'] def _insert_item(self, action, index=None): list_item = ToolbarListItem(action) list_item.setToolTip(_('Drag and Drop to re-order')) if action in self.TOOLBAR_BUTTONS: list_item.setText(_(self.TOOLBAR_BUTTONS[action]['label'])) list_item.setIcon(icontheme.lookup(self._get_icon_from_name(action), icontheme.ICON_SIZE_MENU)) else: list_item.setText(self.SEPARATOR) if index is not None: self.ui.toolbar_layout_list.insertItem(index, list_item) else: self.ui.toolbar_layout_list.addItem(list_item) return list_item def _all_list_items(self): return [self.ui.toolbar_layout_list.item(i).action_name for i in range(self.ui.toolbar_layout_list.count())] def _added_actions(self): actions = self._all_list_items() return set(action for action in actions if action != 'separator') def populate_action_list(self): self.ui.toolbar_layout_list.clear() for name in config.setting['toolbar_layout']: if name in self.ACTION_NAMES or name == 'separator': self._insert_item(name) def update_buttons(self): self.ui.add_button.setEnabled(self._added_actions() != self.ACTION_NAMES) current_row = self.ui.toolbar_layout_list.currentRow() self.ui.up_button.setEnabled(current_row > 0) self.ui.down_button.setEnabled(current_row < self.ui.toolbar_layout_list.count() - 1) def add_to_toolbar(self): display_list = set.difference(self.ACTION_NAMES, self._added_actions()) selected_action, ok = AddActionDialog.get_selected_action(display_list, self) if ok: list_item = self._insert_item(selected_action, self.ui.toolbar_layout_list.currentRow() + 1) self.ui.toolbar_layout_list.setCurrentItem(list_item) self.update_buttons() def insert_separator(self): insert_index = self.ui.toolbar_layout_list.currentRow() + 1 self._insert_item('separator', insert_index) def move_item(self, offset): current_index = self.ui.toolbar_layout_list.currentRow() offset_index = current_index - offset offset_item = self.ui.toolbar_layout_list.item(offset_index) if offset_item: current_item = self.ui.toolbar_layout_list.takeItem(current_index) self.ui.toolbar_layout_list.insertItem(offset_index, current_item) self.ui.toolbar_layout_list.setCurrentItem(current_item) self.update_buttons() def remove_action(self): item = self.ui.toolbar_layout_list.takeItem(self.ui.toolbar_layout_list.currentRow()) del item self.update_buttons() def update_layout_config(self): config.setting['toolbar_layout'] = self._all_list_items() self._update_toolbar() def _update_toolbar(self): widget = self.parent() while not isinstance(widget, QtWidgets.QMainWindow): widget = widget.parent() # Call the main window's create toolbar method widget.create_action_toolbar() widget.set_tab_order()
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = "advanced" SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", u""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", ""), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), QtCore.QVariant('')) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted(language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code)) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) def load(self): self.ui.toolbar_show_labels.setChecked(config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked(config.setting["toolbar_multiselect"]) self.ui.use_adv_search_syntax.setChecked(config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked(config.setting["quit_confirmation"]) current_ui_language = QtCore.QVariant(config.setting["ui_language"]) self.ui.ui_language.setCurrentIndex(self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked(config.setting["starting_directory"]) self.ui.starting_directory_path.setText(config.setting["starting_directory_path"]) def save(self): config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()).toString() if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()).toString() dialog = QtGui.QMessageBox(QtGui.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.'), QtGui.QMessageBox.Ok, self) dialog.exec_() config.setting["starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath(unicode(self.ui.starting_directory_path.text())) def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtGui.QFileDialog.getExistingDirectory(self, "", item.text()) if path: path = os.path.normpath(unicode(path)) item.setText(path)
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = None SORT_ORDER = 80 ACTIVE = True SEPARATOR = '—' * 5 TOOLBAR_BUTTONS = { 'add_directory_action': { 'label': N_('Add Folder'), 'icon': 'folder' }, 'add_files_action': { 'label': N_('Add Files'), 'icon': 'document-open' }, 'cluster_action': { 'label': N_('Cluster'), 'icon': 'picard-cluster' }, 'autotag_action': { 'label': N_('Lookup'), 'icon': 'picard-auto-tag' }, 'analyze_action': { 'label': N_('Scan'), 'icon': 'picard-analyze' }, 'browser_lookup_action': { 'label': N_('Lookup in Browser'), 'icon': 'lookup-musicbrainz' }, 'save_action': { 'label': N_('Save'), 'icon': 'document-save' }, 'view_info_action': { 'label': N_('Info'), 'icon': 'picard-edit-tags' }, 'remove_action': { 'label': N_('Remove'), 'icon': 'list-remove' }, 'submit_acoustid_action': { 'label': N_('Submit AcoustIDs'), 'icon': 'acoustid-fingerprinter' }, 'play_file_action': { 'label': N_('Open in Player'), 'icon': 'play-music' }, 'cd_lookup_action': { 'label': N_('Lookup CD...'), 'icon': 'media-optical' }, } ACTION_NAMES = set(TOOLBAR_BUTTONS.keys()) options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "builtin_search", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", ""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", _default_starting_dir), config.TextOption("setting", "load_image_behavior", "append"), config.ListOption("setting", "toolbar_layout", [ 'add_directory_action', 'add_files_action', 'separator', 'cluster_action', 'separator', 'autotag_action', 'analyze_action', 'browser_lookup_action', 'separator', 'save_action', 'view_info_action', 'remove_action', 'separator', 'cd_lookup_action', 'separator', 'submit_acoustid_action', ]), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] fcmp = lambda x: locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons def load(self): self.ui.toolbar_show_labels.setChecked( config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked( config.setting["toolbar_multiselect"]) self.ui.builtin_search.setChecked(config.setting["builtin_search"]) self.ui.use_adv_search_syntax.setChecked( config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked( config.setting["quit_confirmation"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex( self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked( config.setting["starting_directory"]) self.ui.starting_directory_path.setText( config.setting["starting_directory_path"]) self.populate_action_list() self.ui.toolbar_layout_list.setCurrentRow(0) self.update_buttons() def save(self): config.setting[ "toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting[ "toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting[ "use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked( ) config.setting[ "quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) dialog = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.' ), QtWidgets.QMessageBox.Ok, self) dialog.exec_() config.setting[ "starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath( self.ui.starting_directory_path.text()) self.update_layout_config() def restore_defaults(self): super().restore_defaults() self.update_buttons() def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtWidgets.QFileDialog.getExistingDirectory( self, "", item.text()) if path: path = os.path.normpath(path) item.setText(path) def _get_icon_from_name(self, name): return self.TOOLBAR_BUTTONS[name]['icon'] def _insert_item(self, action, index=None): list_item = ToolbarListItem(action) list_item.setToolTip(_('Drag and Drop to re-order')) if action in self.TOOLBAR_BUTTONS: list_item.setText(_(self.TOOLBAR_BUTTONS[action]['label'])) list_item.setIcon( icontheme.lookup(self._get_icon_from_name(action), icontheme.ICON_SIZE_MENU)) else: list_item.setText(self.SEPARATOR) if index is not None: self.ui.toolbar_layout_list.insertItem(index, list_item) else: self.ui.toolbar_layout_list.addItem(list_item) return list_item def _all_list_items(self): return [ self.ui.toolbar_layout_list.item(i).action_name for i in range(self.ui.toolbar_layout_list.count()) ] def _added_actions(self): actions = self._all_list_items() return set(action for action in actions if action != 'separator') def populate_action_list(self): self.ui.toolbar_layout_list.clear() for name in config.setting['toolbar_layout']: if name in self.ACTION_NAMES or name == 'separator': self._insert_item(name) def update_action_buttons(self): self.ui.add_button.setEnabled( self._added_actions() != self.ACTION_NAMES) def add_to_toolbar(self): display_list = set.difference(self.ACTION_NAMES, self._added_actions()) selected_action, ok = AddActionDialog.get_selected_action( display_list, self) if ok: list_item = self._insert_item( selected_action, self.ui.toolbar_layout_list.currentRow() + 1) self.ui.toolbar_layout_list.setCurrentItem(list_item) self.update_buttons() def insert_separator(self): insert_index = self.ui.toolbar_layout_list.currentRow() + 1 self._insert_item('separator', insert_index) def remove_action(self): item = self.ui.toolbar_layout_list.takeItem( self.ui.toolbar_layout_list.currentRow()) del item self.update_buttons() def update_layout_config(self): config.setting['toolbar_layout'] = self._all_list_items() self._update_toolbar() def _update_toolbar(self): widget = self.parent() while not isinstance(widget, QtWidgets.QMainWindow): widget = widget.parent() # Call the main window's create toolbar method widget.create_action_toolbar() widget.set_tab_order()
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = "advanced" SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", u""), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), QtCore.QVariant('')) language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted( language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, QtCore.QVariant(lang_code)) def load(self): self.ui.toolbar_show_labels.setChecked( config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked( config.setting["toolbar_multiselect"]) self.ui.use_adv_search_syntax.setChecked( config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked( config.setting["quit_confirmation"]) current_ui_language = QtCore.QVariant(config.setting["ui_language"]) self.ui.ui_language.setCurrentIndex( self.ui.ui_language.findData(current_ui_language)) def save(self): config.setting[ "toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting[ "toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting[ "use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked( ) config.setting[ "quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()).toString() if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()).toString() dialog = QtGui.QMessageBox( QtGui.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.' ), QtGui.QMessageBox.Ok, self) dialog.exec_()
class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = "advanced" SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "builtin_search", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", u""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", ""), ] def __init__(self, parent=None): super(InterfaceOptionsPage, self).__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] for lang_code, native, translation in sorted( language_list, key=operator.itemgetter(2), cmp=locale.strcoll): if native and native != translation: name = u'%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_path.setEnabled)) self.ui.starting_directory.stateChanged.connect( partial(enabledSlot, self.ui.starting_directory_browse.setEnabled)) self.ui.starting_directory_browse.clicked.connect( self.starting_directory_browse) def load(self): self.ui.toolbar_show_labels.setChecked( config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked( config.setting["toolbar_multiselect"]) self.ui.builtin_search.setChecked(config.setting["builtin_search"]) self.ui.use_adv_search_syntax.setChecked( config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked( config.setting["quit_confirmation"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex( self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked( config.setting["starting_directory"]) self.ui.starting_directory_path.setText( config.setting["starting_directory_path"]) def save(self): config.setting[ "toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting[ "toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting[ "use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked( ) config.setting[ "quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData( self.ui.ui_language.currentIndex()) dialog = QtGui.QMessageBox( QtGui.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.' ), QtGui.QMessageBox.Ok, self) dialog.exec_() config.setting[ "starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath( unicode(self.ui.starting_directory_path.text())) def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtGui.QFileDialog.getExistingDirectory(self, "", item.text()) if path: path = os.path.normpath(unicode(path)) item.setText(path)