class SetDialog(QDialog): 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) def addSet(self): def gettext(): (text, ok) = QInputDialog.getText (self, 'puddletag', 'Enter a name' 'for the set', QLineEdit.Normal) if ok: if self.setscombo.findText(text) > -1: QMessageBox.information (self, 'puddletag', 'The name entered already exists.') return gettext() return text text = gettext() if text: self.setscombo.addItem(text) self._sets.append([unicode(text), ['', ''], []]) self.setscombo.setCurrentIndex(self.setscombo.count() - 1) def fill(self, sets): if not sets: return self._sets = sets self.setscombo.clear() self.setscombo.addItems([z[0] for z in sets]) self.currentSet = sets[0] self.setscombo.setCurrentIndex(0) self.connect(self.setscombo, SIGNAL('currentIndexChanged (int)'), self.changeSet) def _setCurrentSet(self, s): [text.setText(disp) for text, disp in zip(self.texts, s[1])] self.listbox.clear() [self.listbox.addItem(alg.pprint()) for alg in s[2]] index = self.maintag.findText(s[3]) if index > -1: self.maintag.setCurrentIndex(index) else: self.maintag.addItem(s[3]) self.maintag.setCurrentIndex(self.maintag.count() - 1) def _getCurrentSet(self): return self._sets[self.setscombo.currentIndex()] currentSet = property(_getCurrentSet, _setCurrentSet) def changeSet(self, index): i = self._previndex prevset = {'setname': self._sets[i][0], 'disp': [unicode(text.text()) for text in self.texts], 'algs': self._sets[i][2], 'maintag': unicode(self.maintag.currentText())} self._sets[i][1] = prevset['disp'] self._sets[i][2] = prevset['algs'] self._sets[i][3] = prevset['maintag'] saveset(**prevset) self.currentSet = self._sets[index] self._previndex = index def add(self): win = AlgWin(self) win.setModal(True) self.connect(win, SIGNAL('okClicked'), self.addBuddy) win.show() def addBuddy(self, alg): self.listbox.addItem(alg.pprint()) self.currentSet[2].append(alg) def edit(self): win = AlgWin(self, self.currentSet[2][self.listbox.currentRow()]) win.setModal(True) self.connect(win, SIGNAL('okClicked'), self.editBuddy) win.show() def editBuddy(self, alg): self.listbox.item(self.listbox.currentRow()).setText(alg.pprint()) self._sets[self._previndex][2][self.listbox.currentRow()] = alg def moveUp(self): self.listbox.moveUp(self.currentSet[2]) def moveDown(self): self.listbox.moveDown(self.currentSet[2]) def remove(self): del(self.currentSet[2][self.listbox.currentRow()]) self.listbox.takeItem(self.listbox.currentRow()) def okClicked(self): i = self.setscombo.currentIndex() prevset = {'setname': self._sets[i][0], 'disp': [unicode(text.text()) for text in self.texts], 'algs': self._sets[i][2], 'maintag': unicode(self.maintag.currentText())} saveset(**prevset) self.close() self.emit(SIGNAL('setAvailable'), *self.currentSet) def cancelClicked(self): self.close()
class ShortcutEditor(QDialog): 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 _addShortcut(self): shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) win = Editor('Add Shortcut', u'', self._actions, self.names(), shortcuts, self) win.setModal(True) self.connect(win, SIGNAL('actionChanged'), self.addShortcut) win.show() def addShortcut(self, name, filenames, shortcut=u'', select=True): item = QListWidgetItem(name) item.actionName = name item.filenames = filenames[::] item.shortcut = shortcut self._listbox.addItem(item) if select: self._listbox.setCurrentItem(item, QItemSelectionModel.ClearAndSelect) def applySettings(self, control=None): from puddlestuff.puddletag import remove_shortcuts, add_shortcuts remove_shortcuts('&Actions', self._names) f = open(FILENAME, 'w') f.close() cparser = PuddleConfig(FILENAME) for i, item in enumerate(self._listbox.items()): section = SHORTCUT_SECTION + unicode(i) cparser.set(section, NAME, item.actionName) cparser.set(section, FILENAMES, item.filenames) from puddlestuff.mainwin.funcs import applyaction shortcuts = create_action_shortcuts(applyaction, control) for item, shortcut in zip(self._listbox.items(), shortcuts): if item.shortcut: shortcut.setShortcut(item.shortcut) add_shortcuts('&Actions', shortcuts, save=True) def okClicked(self): self.applySettings() self.close() def _duplicate(self): try: item = self._listbox.selectedItems()[0] except IndexError: return shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) win = Editor('Duplicate Shortcut', u'', self._actions, self.names(), shortcuts, self) win.setAttrs(item.actionName, self._actions, item.filenames, u'') win.setModal(True) self.connect(win, SIGNAL('actionChanged'), self.addShortcut) win.show() def _editShortcut(self): try: item = self._listbox.selectedItems()[0] except IndexError: return shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) names = self.names() names.remove(item.actionName) win = Editor('Edit Shortcut', item.shortcut, self._actions, names, shortcuts, self) win.setAttrs(item.actionName, self._actions, item.filenames, item.shortcut) win.setModal(True) self.connect(win, SIGNAL('actionChanged'), partial(self.editShortcut, item)) win.show() def editShortcut(self, item, name, filenames, shortcut): item.actionName = name item.filenames = filenames[::] item.shortcut = shortcut item.setText(name) def loadSettings(self, filename=None, actions=None): self._names = [] self._hotkeys = [] if filename is None: filename = os.path.join(ACTIONDIR, 'action_shortcuts') self._listbox.clear() cparser = PuddleConfig(filename) if actions is None: self._actions = load_actions() else: self._actions = actions from puddlestuff.puddletag import status if status['actions']: shortcuts = dict( (unicode(a.text()), unicode(a.shortcut().toString())) for a in status['actions']) else: shortcuts = {} for section in sorted(cparser.sections()): if section.startswith('Shortcut'): name = cparser.get(section, NAME, 'Default') self._names.append(name) filenames = cparser.get(section, FILENAMES, []) shortcut = shortcuts.get(name, u'') self.addShortcut(name, filenames, shortcut, select=False) self._hotkeys.append(shortcut) def names(self): return [item.actionName for item in self._listbox.items()]
class Editor(QDialog): 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 _addAction(self, item=None): if item is None: for item in self._actionList.selectedItems(): self._addAction(item) return new_item = QListWidgetItem(item) new_item._action = item._action self._newActionList.addItem(new_item) self._newActionList.setCurrentItem(new_item, QItemSelectionModel.ClearAndSelect) def enableOk(self, text): if not text or text in self._names: self._ok.setEnabled(False) else: self._ok.setEnabled(True) def okClicked(self): alist = self._newActionList items = map(alist.item, xrange(alist.count())) actions = [item._action[1] for item in items] self.emit( SIGNAL('actionChanged'), unicode(self._name.text()), actions, unicode(self._shortcut.text()) if self._shortcut.valid else u'') self.close() def setActions(self, actions): self._actionList.clear() self._actions = [] for funcs, name, filename in actions: item = QListWidgetItem(name) item.setToolTip(u'\n'.join([func.description() for func in funcs])) item._action = [name, filename] self._actionList.addItem(item) def setName(self, name): self._name.setText(name) def setAttrs(self, name, actions, filenames, shortcut=u''): names = dict([(z[2], z[1]) for z in actions]) self.setActions(actions) self.setName(name) self._newActionList.clear() self.setShortcut(shortcut) if filenames: for filename in filenames: item = QListWidgetItem( names.get(filename, translate('Shortcuts', '(Deleted)'))) item._action = [names.get(filename, u''), filename] self._newActionList.addItem(item) def setShortcut(self, text): self._shortcut.setText(text)
class ShortcutEditor(QDialog): 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 _addShortcut(self): shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) win = Editor('Add Shortcut', u'', self._actions, self.names(), shortcuts, self) win.setModal(True) self.connect(win, SIGNAL('actionChanged'), self.addShortcut) win.show() def addShortcut(self, name, filenames, shortcut=u'', select=True): item = QListWidgetItem(name) item.actionName = name item.filenames = filenames[::] item.shortcut = shortcut self._listbox.addItem(item) if select: self._listbox.setCurrentItem(item, QItemSelectionModel.ClearAndSelect) def applySettings(self, control = None): from puddlestuff.puddletag import remove_shortcuts, add_shortcuts remove_shortcuts('&Actions', self._names) f = open(FILENAME, 'w') f.close() cparser = PuddleConfig(FILENAME) for i, item in enumerate(self._listbox.items()): section = SHORTCUT_SECTION + unicode(i) cparser.set(section, NAME, item.actionName) cparser.set(section, FILENAMES, item.filenames) from puddlestuff.mainwin.funcs import applyaction shortcuts = create_action_shortcuts(applyaction, control) for item, shortcut in zip(self._listbox.items(), shortcuts): if item.shortcut: shortcut.setShortcut(item.shortcut) add_shortcuts('&Actions', shortcuts, save=True) def okClicked(self): self.applySettings() self.close() def _duplicate(self): try: item = self._listbox.selectedItems()[0] except IndexError: return shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) win = Editor('Duplicate Shortcut', u'', self._actions, self.names(), shortcuts, self) win.setAttrs(item.actionName, self._actions, item.filenames, u'') win.setModal(True) self.connect(win, SIGNAL('actionChanged'), self.addShortcut) win.show() def _editShortcut(self): try: item = self._listbox.selectedItems()[0] except IndexError: return shortcuts = get_shortcuts().difference(self._hotkeys).union( i.shortcut for i in self._listbox.items() if i.shortcut) names = self.names() names.remove(item.actionName) win = Editor('Edit Shortcut', item.shortcut, self._actions, names, shortcuts, self) win.setAttrs(item.actionName, self._actions, item.filenames, item.shortcut) win.setModal(True) self.connect(win, SIGNAL('actionChanged'), partial(self.editShortcut, item)) win.show() def editShortcut(self, item, name, filenames, shortcut): item.actionName = name item.filenames = filenames[::] item.shortcut = shortcut item.setText(name) def loadSettings(self, filename=None, actions=None): self._names = [] self._hotkeys = [] if filename is None: filename = os.path.join(ACTIONDIR, 'action_shortcuts') self._listbox.clear() cparser = PuddleConfig(filename) if actions is None: self._actions = load_actions() else: self._actions = actions from puddlestuff.puddletag import status if status['actions']: shortcuts = dict((unicode(a.text()), unicode(a.shortcut().toString())) for a in status['actions']) else: shortcuts = {} for section in sorted(cparser.sections()): if section.startswith('Shortcut'): name = cparser.get(section, NAME, 'Default') self._names.append(name) filenames = cparser.get(section, FILENAMES, []) shortcut = shortcuts.get(name, u'') self.addShortcut(name, filenames, shortcut, select=False) self._hotkeys.append(shortcut) def names(self): return [item.actionName for item in self._listbox.items()]
class Editor(QDialog): 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 _addAction(self, item=None): if item is None: for item in self._actionList.selectedItems(): self._addAction(item) return new_item = QListWidgetItem(item) new_item._action = item._action self._newActionList.addItem(new_item) self._newActionList.setCurrentItem(new_item, QItemSelectionModel.ClearAndSelect) def enableOk(self, text): if not text or text in self._names: self._ok.setEnabled(False) else: self._ok.setEnabled(True) def okClicked(self): alist = self._newActionList items = map(alist.item, xrange(alist.count())) actions = [item._action[1] for item in items] self.emit(SIGNAL('actionChanged'), unicode(self._name.text()), actions, unicode(self._shortcut.text()) if self._shortcut.valid else u'') self.close() def setActions(self, actions): self._actionList.clear() self._actions = [] for funcs, name, filename in actions: item = QListWidgetItem(name) item.setToolTip(u'\n'.join([func.description() for func in funcs])) item._action = [name, filename] self._actionList.addItem(item) def setName(self, name): self._name.setText(name) def setAttrs(self, name, actions, filenames, shortcut=u''): names = dict([(z[2], z[1]) for z in actions]) self.setActions(actions) self.setName(name) self._newActionList.clear() self.setShortcut(shortcut) if filenames: for filename in filenames: item = QListWidgetItem(names.get(filename, translate('Shortcuts', '(Deleted)'))) item._action = [names.get(filename, u''), filename] self._newActionList.addItem(item) def setShortcut(self, text): self._shortcut.setText(text)