def onModLoaded(self): """ The module has been loaded """ txtRdrLen = gtk.CellRendererText() columns = (('', [(gtk.CellRendererPixbuf(), gtk.gdk.Pixbuf), (txtRdrLen, gobject.TYPE_STRING), (gtk.CellRendererText(), gobject.TYPE_STRING)], True), (None, [(None, gobject.TYPE_PYOBJECT)], False)) self.tree = extTreeview.ExtTreeView(columns, True) self.popup = None self.cfgWin = None self.expName = MOD_L10N self.scrolled = gtk.ScrolledWindow() self.cacheDir = os.path.join(consts.dirCfg, MOD_INFO[modules.MODINFO_NAME]) # The album length is written in a smaller font, with a lighter color txtRdrLen.set_property('scale', 0.85) txtRdrLen.set_property('foreground-gdk', self.tree.get_style().text[gtk.STATE_INSENSITIVE]) # Explorer self.tree.setDNDSources([consts.DND_TARGETS[consts.DND_DAP_TRACKS]]) self.scrolled.add(self.tree) self.scrolled.set_shadow_type(gtk.SHADOW_IN) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.show() # GTK handlers self.tree.connect('drag-data-get', self.onDragDataGet) self.tree.connect('key-press-event', self.onKeyPressed) self.tree.connect('exttreeview-button-pressed', self.onButtonPressed) modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': self.expName, 'icon': icons.cdromMenuIcon(), 'widget': self.scrolled}) # Hide the album length when not drawing the root node self.tree.get_column(0).set_cell_data_func(txtRdrLen, self.__drawAlbumLenCell) # CD-ROM drive read speed modules.postMsg(consts.MSG_CMD_SET_CD_SPEED, {'speed': prefs.get(__name__, 'read-speed', PREFS_DFT_READ_SPEED)})
def playPaths(self, tree, paths, replace): """ Replace/extend the tracklist If the list 'paths' is None, use the current selection """ if self.tree.getNbChildren((0,)) != 0: tracks = self.getTracksFromPaths(tree, paths) if replace: modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': tracks, 'playNow': True}) else: modules.postMsg(consts.MSG_CMD_TRACKLIST_ADD, {'tracks': tracks, 'playNow': False})
def loadDisc(self): """ Read disc information and create the explorer tree accordingly """ import DiscID try: discInfo = DiscID.disc_id(DiscID.open(prefs.get(__name__, 'device', PREFS_DFT_DEVICE))) except Exception, err: if err[0] == 123: self.tree.replaceContent([(icons.cdromMenuIcon(), None, _('No disc found'), None)]) modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': self.expName, 'newExpName': MOD_L10N}) self.expName = MOD_L10N else: logger.error('[%s] Unable to read device\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) return
def updateTree(self, discInfo): """ Update the tree using disc information from the cache, if any """ cddb = self.getDiscFromCache(discInfo) # Create fake CDDB information if needed if cddb is None: cddb = {'DTITLE': '%s / %s' % (consts.UNKNOWN_ARTIST, consts.UNKNOWN_ALBUM)} for i in xrange(discInfo[DISC_NB_TRACKS]): cddb['TTITLE%u' % i] = consts.UNKNOWN_TITLE # Compute the length of each track trackLen = [int(round((discInfo[DISC_FRAME1 + i + 1] - discInfo[DISC_FRAME1 + i]) / 75.0)) for i in xrange(discInfo[DISC_NB_TRACKS] - 1)] trackLen.append(discInfo[DISC_LENGTH] - int(round(discInfo[DISC_FRAMEn] / 75.0))) # Update the root of the tree disc = cddb['DTITLE'].strip().decode('iso-8859-15', 'replace') artist, album = disc.split(' / ') self.tree.setItem((0,), ROW_NAME, '%s' % tools.htmlEscape(disc)) self.tree.setItem((0,), ROW_LENGTH, '[%s]' % sec2str(sum(trackLen))) # Update the explorer name modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': self.expName, 'newExpName': disc}) self.expName = disc # Optional information try: date = int(cddb['DYEAR'].strip().decode('iso-8859-15', 'replace')) except: date = None try: genre = cddb['DGENRE'].strip().decode('iso-8859-15', 'replace') except: genre = None # Update each track for i, child in enumerate(self.tree.iterChildren((0,))): title = cddb['TTITLE%u' % i].strip().decode('iso-8859-15', 'replace') # Create the corresponding Track object track = CDTrack(str(i+1)) track.setTitle(title) track.setAlbum(album) track.setArtist(artist) track.setLength(trackLen[i]) track.setNumber(i+1) # Optional information if date is not None: track.setDate(date) if genre is not None: track.setGenre(genre) # Fill the tree self.tree.setItem(child, ROW_NAME, '%02u. %s' % (i + 1, tools.htmlEscape(title))) self.tree.setItem(child, ROW_TRACK, track)
def onBtnOk(self, btn): """ Check that entered information is correct before saving everything """ device = self.cfgWin.getWidget('txt-device').get_text() useCDDB = self.cfgWin.getWidget('chk-useCDDB').get_active() useCache = useCDDB and self.cfgWin.getWidget('chk-useCache').get_active() readSpeed = self.cfgWin.getWidget('combo-read-speed').get_model()[self.cfgWin.getWidget('combo-read-speed').get_active()][1] if not os.path.exists(device): error = _('Invalid path') errorMsg = _('The path to the CD-ROM device is not valid. Please choose an existing path.') gui.errorMsgBox(self.cfgWin, error, errorMsg) self.cfgWin.getWidget('txt-device').grab_focus() else: prefs.set(__name__, 'device', device) prefs.set(__name__, 'use-cddb', useCDDB) prefs.set(__name__, 'use-cache', useCache) prefs.set(__name__, 'read-speed', readSpeed) self.cfgWin.hide() # CD-ROM drive read speed modules.postMsg(consts.MSG_CMD_SET_CD_SPEED, {'speed': readSpeed})
def onModUnloaded(self): """ The module is going to be unloaded """ modules.postMsg(consts.MSG_CMD_EXPLORER_REMOVE, {'modName': MOD_L10N, 'expName': self.expName}) if not prefs.get(__name__, 'use-cache', PREFS_DFT_USE_CACHE): self.clearCache()