コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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)