diff --git a/contrib/plugins/viewvariables/__init__.py b/contrib/plugins/viewvariables/__init__.py new file mode 100644 index 000000000..2a9b87d44 --- /dev/null +++ b/contrib/plugins/viewvariables/__init__.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- + +PLUGIN_NAME = u'View script variables' +PLUGIN_AUTHOR = u'Sophist' +PLUGIN_DESCRIPTION = u'''Display a dialog box listing the metadata variables for the track / file.''' +PLUGIN_VERSION = '0.5' +PLUGIN_API_VERSIONS = ['1.0'] + +from PyQt4 import QtGui, QtCore +try: + from picard.util.tags import PRESERVED_TAGS +except ImportError: + from picard.file import File + PRESERVED_TAGS = File._default_preserved_tags + +from picard.file import File +from picard.track import Track +from picard.ui.itemviews import BaseAction, register_file_action, register_track_action +from picard.plugins.viewvariables.ui_variables_dialog import Ui_VariablesDialog + +class ViewVariables(BaseAction): + NAME = 'View script variables' + + def callback(self, objs): + obj = objs[0] + files = self.tagger.get_files_from_objects(objs) + if files: + obj = files[0] + dialog = ViewVariablesDialog(obj) + dialog.exec_() + +class ViewVariablesDialog(QtGui.QDialog): + + def __init__(self, obj, parent=None): + QtGui.QDialog.__init__(self, parent) + self.ui = Ui_VariablesDialog() + self.ui.setupUi(self) + self.ui.buttonBox.accepted.connect(self.accept) + self.ui.buttonBox.rejected.connect(self.reject) + metadata = obj.metadata + if isinstance(obj,File): + self.setWindowTitle(_("File: %s") % obj.base_filename) + elif isinstance(obj,Track): + tn = metadata['tracknumber'] + if len(tn) == 1: + tn = u"0" + tn + self.setWindowTitle(_("Track: %s %s ") % (tn, metadata['title'])) + else: + self.setWindowTitle(_("Variables")) + self._display_metadata(metadata) + + def _display_metadata(self, metadata): + keys = metadata.keys() + keys.sort(key=lambda key: + '0' + key if key in PRESERVED_TAGS and key.startswith('~') else + '1' + key if key.startswith('~') else + '2' + key + ) + media = hidden = album = False + table = self.ui.metadata_table + key_example, value_example = self.get_table_items(table, 0) + self.key_flags = key_example.flags() + self.value_flags = value_example.flags() + table.setRowCount(len(keys)+3) + i = 0 + for key in keys: + if key in PRESERVED_TAGS and key.startswith('~') : + if not media: + self.add_separator_row(table, i, _("File variables")) + i += 1 + media = True + elif key.startswith('~'): + if not hidden: + self.add_separator_row(table, i, _("Hidden variables")) + i += 1 + hidden = True + else: + if not album: + self.add_separator_row(table, i, _("Tag variables")) + i += 1 + album = True + + key_item, value_item = self.get_table_items(table, i) + i += 1 + key_item.setText(u"_" + key[1:] if key.startswith('~') else key) + if key in metadata: + value = dict.get(metadata, key) + if len(value) == 1 and value[0] != '': + value = value[0] + else: + value = repr(value) + value_item.setText(value) + + def add_separator_row(self, table, i, title): + key_item, value_item = self.get_table_items(table, i) + font = key_item.font() + font.setBold(True) + key_item.setFont(font) + key_item.setText(title) + + def get_table_items(self, table, i): + key_item = table.item(i, 0) + value_item = table.item(i, 1) + if not key_item: + key_item = QtGui.QTableWidgetItem() + key_item.setFlags(self.key_flags) + table.setItem(i, 0, key_item) + if not value_item: + value_item = QtGui.QTableWidgetItem() + value_item.setFlags(self.value_flags) + table.setItem(i, 1, value_item) + return key_item, value_item + +vv = ViewVariables() +register_file_action(vv) +register_track_action(vv) diff --git a/contrib/plugins/viewvariables/ui_variables_dialog.py b/contrib/plugins/viewvariables/ui_variables_dialog.py new file mode 100644 index 000000000..dcfae1895 --- /dev/null +++ b/contrib/plugins/viewvariables/ui_variables_dialog.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui\variables_dialog.ui' +# +# Created: Wed Mar 26 06:58:04 2014 +# by: PyQt4 UI code generator 4.10.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_VariablesDialog(object): + def setupUi(self, VariablesDialog): + VariablesDialog.setObjectName(_fromUtf8("VariablesDialog")) + VariablesDialog.resize(600, 450) + self.verticalLayout = QtGui.QVBoxLayout(VariablesDialog) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.metadata_table = QtGui.QTableWidget(VariablesDialog) + self.metadata_table.setAutoFillBackground(False) + self.metadata_table.setSelectionMode(QtGui.QAbstractItemView.ContiguousSelection) + self.metadata_table.setRowCount(1) + self.metadata_table.setColumnCount(2) + self.metadata_table.setObjectName(_fromUtf8("metadata_table")) + item = QtGui.QTableWidgetItem() + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + item.setFont(font) + self.metadata_table.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + item.setFont(font) + self.metadata_table.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + self.metadata_table.setItem(0, 0, item) + item = QtGui.QTableWidgetItem() + item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled) + self.metadata_table.setItem(0, 1, item) + self.metadata_table.horizontalHeader().setDefaultSectionSize(150) + self.metadata_table.horizontalHeader().setSortIndicatorShown(False) + self.metadata_table.horizontalHeader().setStretchLastSection(True) + self.metadata_table.verticalHeader().setVisible(False) + self.metadata_table.verticalHeader().setDefaultSectionSize(20) + self.metadata_table.verticalHeader().setMinimumSectionSize(20) + self.verticalLayout.addWidget(self.metadata_table) + self.buttonBox = QtGui.QDialogButtonBox(VariablesDialog) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(VariablesDialog) + QtCore.QMetaObject.connectSlotsByName(VariablesDialog) + + def retranslateUi(self, VariablesDialog): + item = self.metadata_table.horizontalHeaderItem(0) + item.setText(_("Variable")) + item = self.metadata_table.horizontalHeaderItem(1) + item.setText(_("Value")) + __sortingEnabled = self.metadata_table.isSortingEnabled() + self.metadata_table.setSortingEnabled(False) + self.metadata_table.setSortingEnabled(__sortingEnabled) + diff --git a/contrib/plugins/viewvariables/variables_dialog.ui b/contrib/plugins/viewvariables/variables_dialog.ui new file mode 100644 index 000000000..4d167b2ea --- /dev/null +++ b/contrib/plugins/viewvariables/variables_dialog.ui @@ -0,0 +1,98 @@ + + + VariablesDialog + + + + 0 + 0 + 600 + 450 + + + + + + + false + + + QAbstractItemView::ContiguousSelection + + + 1 + + + 2 + + + 150 + + + false + + + true + + + false + + + 20 + + + 20 + + + + + Variable + + + + 75 + true + + + + + + Value + + + + 75 + true + + + + + + + + + ItemIsSelectable|ItemIsEnabled + + + + + ItemIsSelectable|ItemIsEnabled + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + buttonBox + + + +