class RoutinePanel(wx.Panel): def __init__(self, parent): super(RoutinePanel, self).__init__(parent, wx.ID_ANY) self.active_routine = self.GetParent().GetParent().active_routine if self.active_routine is not None: self.sessions = self.active_routine["sessions"] else: self.sessions = [] self.routineView = GroupListView(self, wx.ID_ANY, style=wx.LC_REPORT | wx.SUNKEN_BORDER) self.routineView.SetColumns([ ColumnDefn("Date", "left", 200, "date"), ColumnDefn("Workout Name", "left", 280, "workoutName"), ColumnDefn("Target", "left", 200, "muscleGroup"), ColumnDefn("Weight", "left", 150, "weight"), ColumnDefn("Sets", "right", 50, "sets"), ColumnDefn("Reps", "left", 50, "reps") ]) self.routineView.cellEditMode = ObjectListView.CELLEDIT_DOUBLECLICK self.routineViewSizer = wx.BoxSizer(wx.VERTICAL) self.routineViewSizer.Add(self.routineView, 1, wx.ALL | wx.EXPAND, 5) self.SetSizer(self.routineViewSizer) # Routine Event Handler def onPageChangeListener(self, event=None): # Clear the routines self.sessions = [] self.active_routine = self.GetParent().GetParent().active_routine # if active routine is set, generate list if self.active_routine is not None: sessions = self.active_routine["sessions"] # For each session, append the workouts for session in sessions: for workout in session["workouts"]: # Append the date to each workout for ObjectListView grouping workout["date"] = session["date"] self.sessions.extend(session["workouts"]) self.routineView.SetObjects(self.sessions)
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)
class MyFrame(wx.Frame): results = [] downloads = [] def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) font = wx.Font(9, wx.FONTFAMILY_DEFAULT, style=wx.FONTSTYLE_NORMAL, weight=wx.FONTWEIGHT_NORMAL) self.lbl_query = wx.StaticText(self, -1, " Song: ", style=wx.ALIGN_CENTRE) self.lbl_query.SetFont(font) self.txt_query = wx.TextCtrl(self, 1, "", style=wx.TE_PROCESS_ENTER) self.fb = wx.StaticBitmap(self, bitmap=wx.BitmapFromImage( wx.ImageFromStream( fbicon, wx.BITMAP_TYPE_PNG)), size=(22, 22)) self.folder_chooser = wx.Button( self, -1, "Choose Destination", size=[-1, self.txt_query.GetSize().GetHeight()]) self.lst_results = ObjectListView(self, -1, style=wx.LC_REPORT) self.lst_downloads = GroupListView(self, -1, style=wx.LC_REPORT) self.lst_artists = ObjectListView(self, -1, style=wx.LC_REPORT) self.lst_albums = ObjectListView(self, -1, style=wx.LC_REPORT) self.lst_songs = ObjectListView(self, -1, style=wx.LC_REPORT) self.frame_statusbar = self.CreateStatusBar(1, wx.SB_RAISED) self.__set_properties() self.__do_layout() self.Bind(EVT_EXEC_FUNC, self._ExecFunc) self.Bind(wx.EVT_TEXT_ENTER, self._TextEnter, self.txt_query) self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self._ResultsContext, self.lst_results) self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self._ResultsContext, self.lst_songs) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._DoubleClick, self.lst_results) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._DoubleClick, self.lst_songs) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._DoubleClick, self.lst_downloads) self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self._DownloadsContext, self.lst_downloads) self.Bind(wx.EVT_BUTTON, self._ChooseFolder, self.folder_chooser) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self._ObjectSelected, self.lst_artists) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self._ObjectSelected, self.lst_albums) self.fb.Bind(wx.EVT_LEFT_DOWN, self._FBClick) self.txt_query.Bind(wx.EVT_KEY_DOWN, self._Tab) self.Bind(wx.EVT_CLOSE, self._Close) self.menu_results = {} self.menu_downloads = {} self.menu_results[ID_DOWNLOAD] = "Download" self.menu_downloads[ID_REMOVE] = "Remove" self.artists = [] if sys.platform == 'win32': self.SetIcon(wx.Icon(sys.executable, wx.BITMAP_TYPE_ICO)) else: if os.path.exists("groove.ico"): self.SetIcon(wx.Icon("groove.ico", wx.BITMAP_TYPE_ICO)) def __set_properties(self): self.SetTitle("JTR's Grooveshark Downloader v" + version) self.SetSize((600, 400)) self.frame_statusbar.SetStatusWidths([-1]) frame_statusbar_fields = [""] columns = [ ColumnDefn("Title", "left", 0, valueGetter="SongName", isSpaceFilling=True), ColumnDefn("Album", "center", 0, valueGetter="AlbumName", isSpaceFilling=True), ColumnDefn("Artist", "center", 0, valueGetter="ArtistName", isSpaceFilling=True) ] columns[0].freeSpaceProportion = 2 columns[1].freeSpaceProportion = columns[2].freeSpaceProportion = 1 self.lst_results.SetColumns(columns) self.lst_results.SetObjects(self.results) self.lst_results.SetEmptyListMsg(emptylistmsg) self.lst_results._ResizeSpaceFillingColumns() self.lst_results.useAlternateBackColors = False columns = [ ColumnDefn("Title", "left", 160, valueGetter="filename", groupKeyGetter="album", isSpaceFilling=True), ColumnDefn("Bitrate", "center", 60, valueGetter="bitrate"), ColumnDefn("Speed", "center", 75, valueGetter="speed"), ColumnDefn("Done/Total", "center", 100, valueGetter="size"), ColumnDefn("Progress", "center", 80, valueGetter="progress") ] self.lst_downloads.SetColumns(columns) self.lst_downloads.SetObjects(self.downloads) self.lst_downloads.SetEmptyListMsg("N/A") self.lst_downloads.SortBy(1) self.lst_downloads.useAlternateBackColors = False self.lst_downloads.putBlankLineBetweenGroups = False self.lst_downloads.SetShowGroups(False) columns = [ ColumnDefn("Artist", "center", 100, valueGetter="name", isSpaceFilling=True) ] self.lst_artists.SetColumns(columns) self.lst_artists.SetEmptyListMsg("N/A") self.lst_artists.useAlternateBackColors = False columns = [ ColumnDefn("Album", "center", 100, valueGetter="name", isSpaceFilling=True) ] self.lst_albums.SetColumns(columns) self.lst_albums.SetEmptyListMsg("N/A") self.lst_albums.useAlternateBackColors = False columns = [ ColumnDefn("Song", "center", 100, valueGetter="Name", isSpaceFilling=True) ] self.lst_songs.SetColumns(columns) self.lst_songs.SetEmptyListMsg("N/A") self.lst_songs.useAlternateBackColors = False for i in range(len(frame_statusbar_fields)): self.frame_statusbar.SetStatusText(frame_statusbar_fields[i], i) self.frame_statusbar.SetStatusStyles([wx.SB_FLAT]) self.list_by_mode = self.lst_results def __do_layout(self): self.sizer_1 = wx.BoxSizer(wx.VERTICAL) self.sizer_2 = wx.BoxSizer(wx.HORIZONTAL) self.sizer_3 = wx.BoxSizer(wx.HORIZONTAL) self.sizer_2.Add(self.lbl_query, 0, wx.ALIGN_CENTER, 0) self.sizer_2.Add(self.txt_query, 2, 0, 0) self.sizer_2.Add(self.folder_chooser, 0, wx.ALIGN_CENTER, 0) self.sizer_2.Add(self.fb, 0, wx.ALIGN_CENTER, 0) self.sizer_1.Add(self.sizer_2, 0, wx.EXPAND, 0) self.sizer_1.Add(self.lst_results, 2, wx.EXPAND, 0) self.sizer_1.Add(self.sizer_3, 2, wx.EXPAND, 0) self.sizer_1.Add(self.lst_downloads, 1, wx.EXPAND, 0) self.sizer_3.Add(self.lst_artists, 1, wx.EXPAND, 0) self.sizer_3.Add(self.lst_albums, 1, wx.EXPAND, 0) self.sizer_3.Add(self.lst_songs, 2, wx.EXPAND, 0) self.SetSizer(self.sizer_1) self.sizer_1.Show(self.sizer_3, False) self.Layout() def _TextEnter(self, event): self.artists = [] if self.lbl_query.GetLabel() == " Artist: ": self.lst_albums.DeleteAllItems() self.lst_songs.DeleteAllItems() search_thread = t_search_object(self, _query=event.GetString()) elif self.lbl_query.GetLabel() == " Song: ": search_thread = t_search_flat(self, event.GetString()) search_thread.start() def _ExecFunc(self, event): event.func(self, event) def _FBClick(self, event): webbrowser.open_new_tab('http://www.facebook.com/groove.dl') def _ResultsContext(self, event): menu = wx.Menu() menu.Append(ID_DOWNLOAD, "Download") wx.EVT_MENU(menu, ID_DOWNLOAD, self._ContextSelection) if self.lbl_query.GetLabel() == " Song: ": lst = self.lst_results elif self.lbl_query.GetLabel() == " Artist: ": lst = self.lst_songs self.PopupMenu(menu, event.GetPoint() + lst.GetPosition()) menu.Destroy() def _DownloadsContext(self, event): menu = wx.Menu() for (id, title) in self.menu_downloads.items(): menu.Append(id, title) wx.EVT_MENU(menu, id, self._ContextSelection) self.PopupMenu(menu, event.GetPoint() + self.lst_downloads.GetPosition()) menu.Destroy() def _DoubleClick(self, event): if event.GetEventObject() in [self.lst_results, self.lst_songs]: self._ContextSelection(ID_DOWNLOAD) elif event.GetEventObject() == self.lst_downloads: try: path = os.path.join( dest, self.lst_downloads.GetSelectedObjects()[0]["filename"]) if sys.platform == 'win32': os.startfile(path) elif sys.platform == 'linux2': subprocess.Popen(['xdg-open', path]) except: pass def _ContextSelection(self, event, flag=None): if (event == ID_DOWNLOAD) or (event.GetId() == ID_DOWNLOAD): if self.lbl_query.GetLabel() == " Song: ": lst = self.lst_results name = 'SongName' elif self.lbl_query.GetLabel() == " Artist: ": lst = self.lst_songs name = 'Name' for song in lst.GetSelectedObjects(): filename = format filename = filename.replace( 'artist', strip(song["ArtistName"], "<>:\"/\|?*")) filename = filename.replace('title', strip(song[name], "<>:\"/\|?*")) filename = filename.replace( 'album', strip(song["AlbumName"], "<>:\"/\|?*")) c = 2 while os.path.exists(os.path.join(dest, filename + '.mp3')): filename = filename + ' (%d)' % c c += 1 filename += '.mp3' t = t_download(self, song) t.download = { "progress": "Initializing", "thread": t, "filename": filename, "album": song["AlbumName"] } self.downloads.append(t.download) self.lst_downloads.SetObjects(self.downloads) t.start() elif (flag != None and flag.flag == ID_REMOVE) or (event.GetId() == ID_REMOVE): for d in self.lst_downloads.GetSelectedObjects(): d["thread"].cancelled = True self.downloads.remove(d) self.lst_downloads.RemoveObjects( self.lst_downloads.GetSelectedObjects()) def _ChooseFolder(self, event): global dest dialog = wx.DirDialog( None, "Please choose the destination directory:", os.getenv('USERPROFILE') if sys.platform == 'win32' else os.getenv('HOME')) if dialog.ShowModal() == wx.ID_OK: dest = dialog.GetPath() dialog.Destroy() def _Tab(self, event): if event.GetKeyCode() == 9: if self.lbl_query.GetLabel() == " Song: ": self.sizer_1.Show(self.sizer_3, True) self.sizer_1.Show(self.lst_results, False) self.sizer_1.Layout() self.lbl_query.SetLabel(" Artist: ") self.list_by_mode = self.lst_artists self.lst_downloads.SetShowGroups(True) self.lst_downloads._ResizeSpaceFillingColumns() elif self.lbl_query.GetLabel() == " Artist: ": self.sizer_1.Show(self.sizer_3, False) self.sizer_1.Show(self.lst_results, True) self.sizer_1.Layout() self.lbl_query.SetLabel(" Song: ") self.list_by_mode = self.lst_results self.lst_downloads.SetShowGroups(False) self.lst_downloads._ResizeSpaceFillingColumns() event.Skip() def _ObjectSelected(self, event): if event.GetEventObject() == self.lst_artists: self.lst_albums.DeleteAllItems() self.lst_songs.DeleteAllItems() obj = self.lst_artists.GetSelectedObject() artist_thread = t_search_object(self, obj) artist_thread.start() elif event.GetEventObject() == self.lst_albums: self.lst_songs.SetObjects( self.lst_albums.GetSelectedObject().Songs) def _Close(self, event): l = 0 for i in self.downloads: if i["progress"] != "Completed" and i["progress"] != "Error": l += 1 if l > 0: if wx.MessageDialog( self, "There are currently %d active downloads. Are you sure you want to cancel them and exit ?" % l, "Active downloads", wx.YES_NO | wx.CENTRE).ShowModal() == wx.ID_NO: return print "BWAH" for d in self.downloads: d["thread"].cancelled = True config = ConfigParser.RawConfigParser() config.add_section("groove-dl") config.set("groove-dl", "dest", dest) print "BWAH" config.set("groove-dl", "format", format) config.write(open(os.path.join(conf, "settings.ini"), "wb")) sys.stdout.close() sys.stderr.close() while (threading.active_count() > 3): time.sleep(0.1) os._exit(0)