diff --git a/picard/cluster.py b/picard/cluster.py
index 95449388e..52a055213 100644
--- a/picard/cluster.py
+++ b/picard/cluster.py
@@ -126,6 +126,12 @@ class Cluster(QtCore.QObject, Item):
def can_browser_lookup(self):
return not self.special
+ def can_view_info(self):
+ if self.files:
+ return True
+ else:
+ return False
+
def is_album_like(self):
return True
@@ -284,6 +290,9 @@ class UnmatchedFiles(Cluster):
def can_autotag(self):
return len(self.files) > 0
+ def can_view_info(self):
+ return False
+
class ClusterList(list, Item):
diff --git a/picard/ui/infodialog.py b/picard/ui/infodialog.py
index ffc9e440a..f052b94d6 100644
--- a/picard/ui/infodialog.py
+++ b/picard/ui/infodialog.py
@@ -167,3 +167,32 @@ class AlbumInfoDialog(InfoDialog):
else:
tabWidget.setTabText(tab_index, _("&Info"))
self.tab_hide(tab)
+
+
+class ClusterInfoDialog(InfoDialog):
+
+ def __init__(self, cluster, parent=None):
+ InfoDialog.__init__(self, cluster, parent)
+ self.setWindowTitle(_("Cluster Info"))
+
+ def _display_info_tab(self):
+ tab = self.ui.info_tab
+ cluster = self.obj
+ tabWidget = self.ui.tabWidget
+ tab_index = tabWidget.indexOf(tab)
+ tabWidget.setTabText(tab_index, _("&Info"))
+ info = []
+ info.append("%s %s" % (_('Album:'),
+ unicode(QtCore.Qt.escape(cluster.metadata["album"]))))
+ info.append("%s %s" % (_('Artist:'),
+ unicode(QtCore.Qt.escape(cluster.metadata["albumartist"]))))
+ lines = []
+ for file in cluster.iterfiles(False):
+ artist = file.metadata["artist"] or file.metadata["albumartist"] or cluster.metadata["albumartist"]
+ lines.append(file.metadata["tracknumber"]+ u" " +
+ file.metadata["title"] + " - " + artist + " (" +
+ file.metadata["~length"]+ ")")
+ info.append("%s
%s" % (_('Tracklist:'),
+ '
'.join([unicode(QtCore.Qt.escape(s)) for s in
+ lines])))
+ self.ui.info.setText('
'.join(info))
diff --git a/picard/ui/itemviews.py b/picard/ui/itemviews.py
index 04a211067..39f7ff8ea 100644
--- a/picard/ui/itemviews.py
+++ b/picard/ui/itemviews.py
@@ -256,6 +256,8 @@ class BaseTreeView(QtGui.QTreeWidget):
if isinstance(obj, NonAlbumTrack):
menu.addAction(self.window.refresh_action)
elif isinstance(obj, Cluster):
+ if can_view_info:
+ menu.addAction(self.window.view_info_action)
menu.addAction(self.window.browser_lookup_action)
menu.addSeparator()
menu.addAction(self.window.autotag_action)
diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py
index 7a072ce59..b6f6a8a1f 100644
--- a/picard/ui/mainwindow.py
+++ b/picard/ui/mainwindow.py
@@ -23,9 +23,10 @@ import sys
import os.path
from picard import config, log
+from picard.album import Album
+from picard.cluster import Cluster
from picard.file import File
from picard.track import Track
-from picard.album import Album
from picard.formats import supported_formats
from picard.ui.coverartbox import CoverArtBox
from picard.ui.itemviews import MainPanel
@@ -33,7 +34,7 @@ from picard.ui.metadatabox import MetadataBox
from picard.ui.filebrowser import FileBrowser
from picard.ui.tagsfromfilenames import TagsFromFileNamesDialog
from picard.ui.options.dialog import OptionsDialog
-from picard.ui.infodialog import FileInfoDialog, AlbumInfoDialog
+from picard.ui.infodialog import FileInfoDialog, AlbumInfoDialog, ClusterInfoDialog
from picard.ui.infostatus import InfoStatus
from picard.ui.passworddialog import PasswordDialog
from picard.ui.util import find_starting_directory, ButtonLineEdit
@@ -774,6 +775,9 @@ class MainWindow(QtGui.QMainWindow):
if isinstance(self.selected_objects[0], Album):
album = self.selected_objects[0]
dialog = AlbumInfoDialog(album, self)
+ elif isinstance(self.selected_objects[0], Cluster):
+ cluster = self.selected_objects[0]
+ dialog = ClusterInfoDialog(cluster, self)
else:
file = self.tagger.get_files_from_objects(self.selected_objects)[0]
dialog = FileInfoDialog(file, self)