def __init__(self, load=False, parent=None, buttons=False): super(ShortcutEditor, self).__init__(parent) self._names = [] self._hotkeys = [] self._listbox = ListBox() listbuttons = ListButtons() listbuttons.insertStretch(0) self.connect(listbuttons, SIGNAL('add'), self._addShortcut) self.connect(listbuttons, SIGNAL('edit'), self._editShortcut) self.connect(listbuttons, SIGNAL('duplicate'), self._duplicate) self.connect(self._listbox, SIGNAL('itemDoubleClicked (QListWidgetItem *)'), self._editShortcut) self._listbox.connectToListButtons(listbuttons) hbox = QHBoxLayout() hbox.addLayout(create_buddy('Shortcuts', self._listbox, QVBoxLayout())) hbox.addLayout(listbuttons) okcancel = OKCancel() vbox = QVBoxLayout() vbox.addLayout(hbox) if buttons: vbox.addLayout(okcancel) self.setLayout(vbox) self.connect(okcancel, SIGNAL('ok'), self.okClicked) self.connect(okcancel, SIGNAL('cancel'), self.close) if load: self.loadSettings()
def __init__(self, title='Add Action', shortcut=u'', actions=None, names=None, shortcuts=None, parent=None): super(Editor, self).__init__(parent) self.setWindowTitle(title) self._items = {} self._name = QLineEdit('Name') if shortcut and shortcut in shortcuts: shortcuts.remove(shortcut) self._shortcut = puddleobjects.ShortcutEditor(shortcuts) self._shortcut.setText(shortcut) clear = QPushButton(translate('Shortcuts', '&Clear')) self.connect(clear, SIGNAL('clicked()'), self._shortcut.clear) if names is None: names = [] self._names = names self._actionList = ListBox() self.connect(self._actionList, SIGNAL('itemDoubleClicked (QListWidgetItem *)'), self._addAction) self._newActionList = ListBox() listbuttons = ListButtons() listbuttons.duplicate.hide() listbuttons.insertStretch(0) self.connect(listbuttons, SIGNAL('add'), self._addAction) self._newActionList.connectToListButtons(listbuttons) okcancel = OKCancel() self.connect(okcancel, SIGNAL('ok'), self.okClicked) self.connect(okcancel, SIGNAL('cancel'), self.close) self._ok = okcancel.ok self.connect(self._name, SIGNAL('textChanged(const QString)'), self.enableOk) scut_status = QLabel('') self.connect(self._shortcut, SIGNAL('validityChanged'), lambda v: scut_status.setText(u'') if v or (not self._shortcut.text()) else scut_status.setText(translate('Shortcuts', "Invalid shortcut sequence."))) okcancel.insertWidget(0, scut_status) hbox = QHBoxLayout() hbox.addLayout( create_buddy('Actions', self._actionList, QVBoxLayout()), 1) hbox.addLayout(listbuttons, 0) hbox.addLayout(create_buddy('Actions to run for shortcut', self._newActionList, QVBoxLayout()), 1) layout = QVBoxLayout() layout.addLayout(create_buddy('Shortcut &Name: ', self._name)) scut_layout = create_buddy('&Keyboard Shortcut: ', self._shortcut) scut_layout.addWidget(clear) layout.addLayout(scut_layout) layout.addLayout(hbox) layout.addLayout(okcancel) self.setLayout(layout) if actions: self.setActions(actions)
def __init__(self, parent=None): filename = os.path.join(PuddleConfig().savedir, 'mappings') self._edited = deepcopy(audioinfo.mapping) self._mappings = audioinfo.mapping QWidget.__init__(self, parent) tooltip = translate( "Mapping Settings", '''<ul><li>Tag is the format that the mapping applies to. One of <b>ID3, APEv2, MP4, or VorbisComment</b>. </li><li>Fields will be mapped from Source to Target, meaning that if Source is found in a tag, it'll be editable in puddletag using Target.</li> <li>Eg. For <b>Tag=VorbisComment, Source=organization, and Target=publisher</b> means that writing to the publisher field for VorbisComments in puddletag will in actuality write to the organization field.</li><li>Mappings for tag sources are also supported, just use the name of the tag source as Tag, eg. <b>Tag=MusicBrainz, Source=artist,Target=performer</b>.</li></ul>''') self._table = QTableWidget() self._table.setToolTip(tooltip) self._table.setColumnCount(3) self._table.setHorizontalHeaderLabels([ translate("Mapping Settings", 'Tag'), translate("Mapping Settings", 'Original Field'), translate("Mapping Settings", 'Target') ]) header = self._table.horizontalHeader() header.setVisible(True) self._table.verticalHeader().setVisible(False) header.setStretchLastSection(True) buttons = ListButtons() buttons.connectToWidget(self) buttons.moveup.setVisible(False) buttons.movedown.setVisible(False) self.connect(buttons, SIGNAL('duplicate'), self.duplicate) hbox = QHBoxLayout() hbox.addWidget(self._table, 1) hbox.addLayout(buttons, 0) self._setMappings(self._mappings) label = QLabel( translate("Mapping Settings", '<b>A restart is required to apply these settings.</b>')) vbox = QVBoxLayout() vbox.addLayout(hbox, 1) vbox.addWidget(label) self.setLayout(vbox)
def __init__(self, parent = None): filename = os.path.join(PuddleConfig().savedir, 'mappings') self._edited = deepcopy(audioinfo.mapping) self._mappings = audioinfo.mapping QWidget.__init__(self, parent) tooltip = translate("Mapping Settings", '''<ul><li>Tag is the format that the mapping applies to. One of <b>ID3, APEv2, MP4, or VorbisComment</b>. </li><li>Fields will be mapped from Source to Target, meaning that if Source is found in a tag, it'll be editable in puddletag using Target.</li> <li>Eg. For <b>Tag=VorbisComment, Source=organization, and Target=publisher</b> means that writing to the publisher field for VorbisComments in puddletag will in actuality write to the organization field.</li><li>Mappings for tag sources are also supported, just use the name of the tag source as Tag, eg. <b>Tag=MusicBrainz, Source=artist,Target=performer</b>.</li></ul>''') self._table = QTableWidget() self._table.setToolTip(tooltip) self._table.setColumnCount(3) self._table.setHorizontalHeaderLabels([ translate("Mapping Settings", 'Tag'), translate("Mapping Settings", 'Original Field'), translate("Mapping Settings", 'Target')]) header = self._table.horizontalHeader() header.setVisible(True) self._table.verticalHeader().setVisible(False) header.setStretchLastSection(True) buttons = ListButtons() buttons.connectToWidget(self) buttons.moveup.setVisible(False) buttons.movedown.setVisible(False) self.connect(buttons, SIGNAL('duplicate'), self.duplicate) hbox = QHBoxLayout() hbox.addWidget(self._table, 1) hbox.addLayout(buttons, 0) self._setMappings(self._mappings) label = QLabel(translate("Mapping Settings", '<b>A restart is required to apply these settings.</b>')) vbox = QVBoxLayout() vbox.addLayout(hbox, 1) vbox.addWidget(label) self.setLayout(vbox)
def __init__(self, parent=None, cenwid=None, status=None): QFrame.__init__(self, parent) self.title = translate('Settings', "Patterns") connect = lambda c, signal, s: self.connect(c, SIGNAL(signal), s) self.setFrameStyle(QFrame.Box) self.listbox = ListBox() self.listbox.setSelectionMode(self.listbox.ExtendedSelection) buttons = ListButtons() self.listbox.addItems(status['patterns']) hbox = QHBoxLayout() hbox.addWidget(self.listbox) self.setLayout(hbox) vbox = QVBoxLayout() sortlistbox = QPushButton(translate("Pattern Settings", '&Sort')) self._sortOrder = Qt.AscendingOrder connect(sortlistbox, 'clicked()', self._sortListBox) vbox.addWidget(sortlistbox) vbox.addLayout(buttons) vbox.addStretch() hbox.addLayout(vbox) connect(buttons, "add", self.addPattern) connect(buttons, "edit", self.editItem) buttons.duplicate.setVisible(False) self.listbox.connectToListButtons(buttons) self.listbox.editButton = buttons.edit connect(self.listbox, 'itemDoubleClicked(QListWidgetItem *)', self._doubleClicked)
def __init__(self, parent = None, status=None): QDialog.__init__(self, parent) self.title = translate('Settings', 'Tag Panel') self._table = PuddleTable([TITLE, FIELD, ROW], [TITLE, FIELD, u'0'], self) self._buttons = ListButtons() self._buttons.connectToWidget(self._table, add=self.add, edit=self.edit, moveup=self._table.moveUp, movedown=self._table.moveDown, duplicate=self.duplicate) hbox = QHBoxLayout() hbox.addWidget(self._table, 1) hbox.addLayout(self._buttons, 0) self.setLayout(hbox) self.connect(self._table, SIGNAL('cellChanged(int,int)'), self._checkItem) self.connect(self._table, SIGNAL('itemSelectionChanged()'), self._enableButtons) self.fill()
def __init__(self, tag_sources, profiles=None, parent = None): super(MassTagEdit, self).__init__(parent) self.setWindowTitle(translate('Profile Config', 'Configure Mass Tagging Profiles')) winsettings('masstag_edit', self) self.listbox = ListBox() self.tag_sources = tag_sources okcancel = OKCancel() okcancel.ok.setDefault(True) self.buttonlist = ListButtons() connect = lambda control, signal, slot: self.connect( control, SIGNAL(signal), slot) connect(okcancel, "ok" , self.okClicked) connect(okcancel, "cancel",self.close) connect(self.buttonlist, "add", self.addClicked) connect(self.buttonlist, "edit", self.editClicked) connect(self.buttonlist, "moveup", self.moveUp) connect(self.buttonlist, "movedown", self.moveDown) connect(self.buttonlist, "remove", self.remove) connect(self.buttonlist, "duplicate", self.dupClicked) connect(self.listbox, "itemDoubleClicked (QListWidgetItem *)", self.editClicked) connect(self.listbox, "currentRowChanged(int)", self.enableListButtons) self.enableListButtons(self.listbox.currentRow()) layout = QVBoxLayout() self.setLayout(layout) layout.addWidget(QLabel(translate('Profile Config', 'Masstagging Profiles'))) list_layout = QHBoxLayout() list_layout.addWidget(self.listbox, 1) list_layout.addLayout(self.buttonlist) layout.addLayout(list_layout) layout.addLayout(okcancel) if profiles is not None: self.setProfiles(profiles)
def __init__(self, parent=None, title=u'', add_text=ADD_TEXT, help_text=u''): QFrame.__init__(self, parent) self.title = title connect = lambda c, signal, s: self.connect(c, SIGNAL(signal), s) self.setFrameStyle(QFrame.Box) self.listbox = ListBox() self.listbox.setSelectionMode(self.listbox.ExtendedSelection) buttons = ListButtons() hbox = QHBoxLayout() hbox.addWidget(self.listbox) vbox = QVBoxLayout() sortlistbox = QPushButton(translate("Defaults", '&Sort')) self._sortOrder = Qt.AscendingOrder connect(sortlistbox, 'clicked()', self._sortListBox) vbox.addWidget(sortlistbox) vbox.addLayout(buttons) vbox.addStretch() hbox.addLayout(vbox) if help_text: label = QLabel(help_text) layout = QVBoxLayout() layout.addWidget(label) layout.addLayout(hbox, 1) self.setLayout(layout) else: self.setLayout(hbox) connect(buttons, "add", self.addItem) connect(buttons, "edit", self.editItem) buttons.duplicate.setVisible(False) self.listbox.connectToListButtons(buttons) self.listbox.editButton = buttons.edit connect(self.listbox, 'itemDoubleClicked(QListWidgetItem *)', self._doubleClicked) self.addText = add_text
def __init__(self, parent=None): QDialog.__init__(self,parent) winsettings('setdialog', self) vbox = QVBoxLayout() self._previndex = 0 self.setscombo = QComboBox() setlabel = QLabel('&Sets') setlabel.setBuddy(self.setscombo) vbox.addWidget(setlabel) comboadd = QToolButton() comboadd.setIcon(QIcon(':/filenew.png')) comboadd.setToolTip('Add set') self.connect(comboadd, SIGNAL('clicked()'), self.addSet) hbox = QHBoxLayout() hbox.addWidget(self.setscombo) hbox.addWidget(comboadd) vbox.addLayout(hbox) conditions = QLabel('&Conditions') vbox.addWidget(conditions) self.listbox = ListBox() conditions.setBuddy(self.listbox) listbuttons = ListButtons() listhbox = QHBoxLayout() listhbox.addWidget(self.listbox) listhbox.addLayout(listbuttons) vbox.addLayout(listhbox) label = QLabel('Retrieve values via: ') self.maintag = QComboBox() self.maintag.addItems(['artist', 'title', 'genre', 'album', 'year']) maintaghbox = QHBoxLayout() maintaghbox.addWidget(label) maintaghbox.addWidget(self.maintag) maintaghbox.addStretch() vbox.addLayout(maintaghbox) dispformat = QLabel('Display Format') vbox.addWidget(dispformat) self.texts = [QLineEdit(), QLineEdit()] t = ['Original', 'Duplicates'] for i, text in enumerate(self.texts): label = QLabel(t[i]) label.setBuddy(text) dispbox = QHBoxLayout() dispbox.addWidget(label) dispbox.addWidget(text) vbox.addLayout(dispbox) okcancel = OKCancel() vbox.addLayout(okcancel) self.connect(okcancel, SIGNAL('ok'), self.okClicked) self.connect(okcancel, SIGNAL('cancel'), self.cancelClicked) self.setLayout(vbox) self.fill(loadsets()) listbuttons.connectToWidget(self)
class SettingsWin(QWidget): def __init__(self, parent = None, status=None): QDialog.__init__(self, parent) self.title = translate('Settings', 'Tag Panel') self._table = PuddleTable([TITLE, FIELD, ROW], [TITLE, FIELD, u'0'], self) self._buttons = ListButtons() self._buttons.connectToWidget(self._table, add=self.add, edit=self.edit, moveup=self._table.moveUp, movedown=self._table.moveDown, duplicate=self.duplicate) hbox = QHBoxLayout() hbox.addWidget(self._table, 1) hbox.addLayout(self._buttons, 0) self.setLayout(hbox) self.connect(self._table, SIGNAL('cellChanged(int,int)'), self._checkItem) self.connect(self._table, SIGNAL('itemSelectionChanged()'), self._enableButtons) self.fill() def add(self, texts = None): table = self._table if not texts: text = table.text rows = [] for row in table.rows: try: rows.append(int(text(row, 2))) except (TypeError, ValueError): pass row = unicode(max(rows) + 1) if rows else u'1' table.add([TITLE, FIELD.lower(), row]) else: table.add(texts) item = table.item(table.rowCount() - 1, 0) table.setCurrentItem(item) table.editItem(item) def fill(self): d = loadsettings() self._old = d for row in d: for z in d[row]: self._table.add(z + (unicode(row),)) def applySettings(self, control = None): texts = self._table.texts d = {} for row in self._table.rows: l = texts(row) try: l[2] = int(l[2]) except ValueError: raise SettingsError(translate('Tag Panel Settings', 'All row numbers must be integers.')) try: d[l[2]].append(l[:-1]) except KeyError: d[l[2]] = [l[:-1]] d = dict([(i, d[v]) for i, v in enumerate(sorted(d))]) #consecutive rows if self._old == d: return savesettings(d) control.setCombos(d) def edit(self): self._table.editItem(self._table.currentItem()) def _checkItem(self, row, column): table = self._table if column == 2: try: int(table.text(row, column)) table.item(row, column).setBackground(TABLEWIDGETBG) except ValueError: i = table.item(row, column) i.setBackground(RED) def _enableButtons(self): table = self._table if table.rowCount() <= 0: self._buttons.edit.setEnabled(False) self._buttons.duplicate.setEnabled(False) self._buttons.remove.setEnabled(False) elif self._table.selectedRows(): self._buttons.edit.setEnabled(True) self._buttons.duplicate.setEnabled(True) self._buttons.remove.setEnabled(True) def duplicate(self): table = self._table row = table.currentRow() if row < 0: return self.add(table.texts(row))
def __init__(self, tag_sources, profile=None, parent=None): super(MTProfileEdit, self).__init__(parent) self.setWindowTitle(translate('Profile Editor', 'Edit Masstagging Profile')) winsettings('masstag_profile', self) self._configs = [] self.tag_sources = tag_sources self._tsps = [] self._name = QLineEdit(translate('Profile Editor', 'Masstagging Profile')) self._desc = QLineEdit() self.listbox = ListBox() self.okcancel = OKCancel() self.okcancel.ok.setDefault(True) self.buttonlist = ListButtons() self.pattern = QLineEdit('%artist% - %album%/%track% - %title%') self.pattern.setToolTip(translate('Profile Editor', "<p>If no tag information is found in a file, " "the tags retrieved using this pattern will be used instead.</p>")) self.albumBound = QSpinBox() self.albumBound.setRange(0,100) self.albumBound.setValue(70) self.albumBound.setToolTip(translate('Profile Editor', "<p>The artist and album fields will be used in " "determining whether an album matches the retrieved one. " "Each field will be compared using a fuzzy matching algorithm. " "If the resulting average match percentage is greater " "or equal than what you specify here it'll be " "considered to match.</p>")) self.matchFields = QLineEdit('artist, title') self.matchFields.setToolTip(translate('Profile Editor', '<p>The fields listed here will be used in ' 'determining whether a file matches a retrieved track. ' 'Each field will be compared using a fuzzy matching ' 'algorithm. If the resulting average match ' 'percentage is greater than the "Minimum Percentage" ' 'it\'ll be considered to match.</p>')) self.trackBound = QSpinBox() self.trackBound.setRange(0,100) self.trackBound.setValue(80) self.jfdi = QCheckBox(translate('Profile Editor', 'Brute force unmatched files.')) self.jfdi.setToolTip(translate('Profile Editor', "<p>Check to enable brute forcing matches. " " If a proper match isn't found for a file, " 'the files will get sorted by filename, ' 'the retrieved tag sources by filename and ' 'corresponding (unmatched) tracks will matched.</p>')) self.existing = QCheckBox(translate('Profile Editor', 'Update empty fields only.')) self.grid = QGridLayout() self.setLayout(self.grid) self.grid.addLayout(create_buddy( translate('Profile Editor', '&Name:'), self._name), 0, 0, 1, 2) self.grid.addLayout(create_buddy( translate('Profile Editor', '&Description'), self._desc), 1, 0, 1, 2) self.grid.addWidget(self.listbox, 2, 0) self.grid.setRowStretch(2, 1) self.grid.addLayout(self.buttonlist, 2, 1) self.grid.addLayout(create_buddy(translate('Profile Editor', 'Pattern to match filenames against.'), self.pattern, QVBoxLayout()), 3, 0, 1, 2) self.grid.addLayout(create_buddy(translate('Profile Editor', 'Minimum percentage required for album matches.'), self.albumBound), 4, 0, 1, 2) self.grid.addLayout(create_buddy(translate('Profile Editor', 'Match tracks using fields: '), self.matchFields, QVBoxLayout()), 5, 0, 1, 2) self.grid.addLayout(create_buddy(translate('Profile Editor', 'Minimum percentage required for track match.'), self.trackBound), 6, 0, 1, 2) self.grid.addWidget(self.jfdi, 7, 0, 1, 2) self.grid.addWidget(self.existing, 8, 0, 1, 2) self.grid.addLayout(self.okcancel, 9, 0, 1, 2) connect = lambda control, signal, slot: self.connect( control, SIGNAL(signal), slot) connect(self.okcancel, "ok" , self.okClicked) connect(self.okcancel, "cancel",self.close) connect(self.buttonlist, "add", self.addClicked) connect(self.buttonlist, "edit", self.editClicked) connect(self.buttonlist, "moveup", self.moveUp) connect(self.buttonlist, "movedown", self.moveDown) connect(self.buttonlist, "remove", self.remove) connect(self.buttonlist, "duplicate", self.dupClicked) connect(self.listbox, "itemDoubleClicked (QListWidgetItem *)", self.editClicked) connect(self.listbox, "currentRowChanged(int)", self.enableListButtons) if profile is not None: self.setProfile(profile) self.enableListButtons(self.listbox.currentRow())
def __init__(self, title='Add Action', shortcut=u'', actions=None, names=None, shortcuts=None, parent=None): super(Editor, self).__init__(parent) self.setWindowTitle(title) self._items = {} self._name = QLineEdit('Name') if shortcut and shortcut in shortcuts: shortcuts.remove(shortcut) self._shortcut = puddleobjects.ShortcutEditor(shortcuts) self._shortcut.setText(shortcut) clear = QPushButton(translate('Shortcuts', '&Clear')) self.connect(clear, SIGNAL('clicked()'), self._shortcut.clear) if names is None: names = [] self._names = names self._actionList = ListBox() self.connect(self._actionList, SIGNAL('itemDoubleClicked (QListWidgetItem *)'), self._addAction) self._newActionList = ListBox() listbuttons = ListButtons() listbuttons.duplicate.hide() listbuttons.insertStretch(0) self.connect(listbuttons, SIGNAL('add'), self._addAction) self._newActionList.connectToListButtons(listbuttons) okcancel = OKCancel() self.connect(okcancel, SIGNAL('ok'), self.okClicked) self.connect(okcancel, SIGNAL('cancel'), self.close) self._ok = okcancel.ok self.connect(self._name, SIGNAL('textChanged(const QString)'), self.enableOk) scut_status = QLabel('') self.connect( self._shortcut, SIGNAL('validityChanged'), lambda v: scut_status.setText(u'') if v or (not self._shortcut.text()) else scut_status.setText( translate('Shortcuts', "Invalid shortcut sequence."))) okcancel.insertWidget(0, scut_status) hbox = QHBoxLayout() hbox.addLayout( create_buddy('Actions', self._actionList, QVBoxLayout()), 1) hbox.addLayout(listbuttons, 0) hbox.addLayout( create_buddy('Actions to run for shortcut', self._newActionList, QVBoxLayout()), 1) layout = QVBoxLayout() layout.addLayout(create_buddy('Shortcut &Name: ', self._name)) scut_layout = create_buddy('&Keyboard Shortcut: ', self._shortcut) scut_layout.addWidget(clear) layout.addLayout(scut_layout) layout.addLayout(hbox) layout.addLayout(okcancel) self.setLayout(layout) if actions: self.setActions(actions)