def _makeListView (self, parent): if self.config.groupByGenre: listView = GroupListView (parent, wx.ID_ANY, style = wx.LC_REPORT | wx.SUNKEN_BORDER, useAlternateBackColors = False) else: listView = ObjectListView (parent, wx.ID_ANY, style = wx.LC_REPORT | wx.SUNKEN_BORDER, useAlternateBackColors = False) listView.rowFormatter = self.rowFormatter listView.SetEmptyListMsg ("No transducers found") # COLUMNS: # Normal: DR # Grp: D(G)R # Det: DNGSR # Det+Grp: DN(G)SR cols = ([ ColumnDefn ("Description", "left", 220, "smartName"), ColumnDefn ("Reading", "right", 100, "lastRead", isSpaceFilling = True), ]) if self.config.viewDetails: cols.insert (1, ColumnDefn ("Name", "center", 50, "name")) if self.config.groupByGenre: # This col is only used for grouping, use 0 width and make entries empty to hide it cols.insert (2, ColumnDefn ("Genre", "center", 0, "genre", maximumWidth = 0, stringConverter = lambda g: "", groupKeyConverter = lambda g: "Sensors" if g == Sensoria.SENSOR else "Actuators")) else: cols.insert (2, ColumnDefn ("Genre", "center", 100, "genre", stringConverter = lambda g: "Sensor" if g == Sensoria.SENSOR else "Actuator")) cols.insert (3, ColumnDefn ("Stereo", "center", 50, "stereotype")) elif self.config.groupByGenre: # This col is only used for grouping, use 0 width and make entries empty to hide it cols.insert (2, ColumnDefn ("Genre", "center", 50, "genre", maximumWidth = 0, stringConverter = lambda g: "", groupKeyConverter = lambda g: "Sensors" if g == Sensoria.SENSOR else "Actuators")) listView.SetColumns (cols) if self.config.groupByGenre: listView.showItemCounts = False listView.SetShowGroups = True listView.alwaysGroupByColumnIndex = 3 # col 0 is expansion icon listView.SetSortColumn (listView.columns[1]) else: listView.SetSortColumn (listView.columns[0]) listView.Bind (wx.EVT_LIST_ITEM_ACTIVATED, self.onItemDoubleClicked) listView.Bind (wx.EVT_LIST_ITEM_RIGHT_CLICK, self.onItemRightClicked) return listView
class MyFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) self.Init() def Init(self): self.InitModel() self.InitWidgets() self.InitObjectListView() def InitModel(self): self.songs = ExampleModel.GetTracks() def InitWidgets(self): panel = wx.Panel(self, -1) sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(panel, 1, wx.ALL | wx.EXPAND) self.SetSizer(sizer_1) self.myOlv = GroupListView(panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(self.myOlv, 1, wx.ALL | wx.EXPAND, 4) panel.SetSizer(sizer_2) self.Layout() def InitObjectListView(self): groupImage = self.myOlv.AddImages(ExampleImages.getGroup16Bitmap(), ExampleImages.getGroup32Bitmap()) userImage = self.myOlv.AddImages(ExampleImages.getUser16Bitmap(), ExampleImages.getUser32Bitmap()) musicImage = self.myOlv.AddImages(ExampleImages.getMusic16Bitmap(), ExampleImages.getMusic32Bitmap()) soloArtists = [ "Nelly Furtado", "Missy Higgins", "Moby", "Natalie Imbruglia", "Dido", "Paul Simon", "Bruce Cockburn" ] def artistImageGetter(track): if track.artist in soloArtists: return userImage else: return groupImage def sizeToNiceString(byteCount): """ Convert the given byteCount into a string like: 9.9bytes/KB/MB/GB """ for (cutoff, label) in [(1024 * 1024 * 1024, "GB"), (1024 * 1024, "MB"), (1024, "KB")]: if byteCount >= cutoff: return "%.1f %s" % (byteCount * 1.0 / cutoff, label) if byteCount == 1: return "1 byte" else: return "%d bytes" % byteCount def lastPlayedGroupKey(track): """ Return the grouping key for the given track when group by last played column """ # We only want to group tracks by the month in which they were played return datetime.date(track.lastPlayed.year, track.lastPlayed.month, 1) def lastPlayedGroupKeyConverter(groupKey): # Convert the given group key (which is a date) into a representation string return groupKey.strftime("%B %Y") self.myOlv.useExpansionColumn = True self.myOlv.SetColumns([ ColumnDefn("Title", "left", 120, "title", imageGetter=musicImage, useInitialLetterForGroupKey=True), ColumnDefn("Artist", "left", 120, "artist", imageGetter=artistImageGetter), ColumnDefn("Size", "center", 100, "sizeInBytes", stringConverter=sizeToNiceString), ColumnDefn("Last Played", "left", 100, "lastPlayed", groupKeyGetter=lastPlayedGroupKey, groupKeyConverter=lastPlayedGroupKeyConverter), ColumnDefn("Rating", "center", 100, "rating") ]) #self.myOlv.CreateCheckStateColumn() self.myOlv.SetSortColumn(self.myOlv.columns[2]) self.myOlv.SetObjects(self.songs)