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)
def __init__(self, *args, **kwds): # Initialisation du listCtrl self.log = None self.cacher_traitees = True self.regroupement = None self.tri = "horodatage" GroupListView.__init__(self, *args, **kwds) # Binds perso self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
def __init__(self, *args, **kwds): # Initialisation du listCtrl self.listeFichiers = kwds.pop("listeFichiers", []) self.listeFichiersTrouves = [] self.dictIDappareil = {} self.cacher_doublons = True self.index_regroupement = 4 GroupListView.__init__(self, *args, **kwds) # Binds perso self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
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 __init__(self, *args, **kwds): # Récupération des paramètres perso self.selectionID = None self.selectionTrack = None self.criteres = "" self.itemSelected = False self.popupIndex = -1 self.listeFiltres = [] self.listeTracks = [] self.dictBudget = None # Initialisation du listCtrl GroupListView.__init__(self, *args, **kwds) # Binds perso self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
def __init__(self, *args, **kwds): GroupListView.__init__(self, *args, **kwds) self.selectionID = None self.selectionTrack = None self.IDactivite = None self.partis = True self.listeGroupes = [] self.listeCategories = [] self.regroupement = None self.listeColonnes = [] self.labelParametres = "" # Binds perso self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnActivated) self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
def __init__(self, *args, **kwds): self.selectionID = None self.selectionTrack = None self.IDactivite = None self.partis = True self.listeGroupes = [] self.listeCategories = [] self.regroupement = None self.labelParametres = "" # Initialisation du listCtrl self.nom_fichier_liste = __file__ GroupListView.__init__(self, *args, **kwds) # Binds perso self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnActivated) self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
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)
def setUp(self): super(TestGroupObjectListView, self).setUp() panel = wx.Panel(self.frame, -1) self.objectListView = GroupListView(panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) sizerPanel = wx.BoxSizer(wx.VERTICAL) sizerPanel.Add(self.objectListView, 1, wx.ALL | wx.EXPAND, 4) panel.SetSizer(sizerPanel) sizerFrame = wx.BoxSizer(wx.VERTICAL) sizerFrame.Add(panel, 1, wx.ALL | wx.EXPAND, 4) self.frame.SetSizer(sizerFrame) loadOLV(self.objectListView)
def __init__(self, *args, **kwds): # Initialisation du listCtrl self.IDfamille = kwds.pop("IDfamille", None) self.selectionID = None self.selectionTrack = None ## locale.setlocale(locale.LC_ALL, 'FR') GroupListView.__init__(self, *args, **kwds) self.listePeriodes = [] self.listeIndividus = [] self.listeActivites = [] self.listeFactures = [] self.total = 0.0 self.dictFiltres = {} ## self.InitModel() ## self.InitObjectListView() # Binds perso self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnActivated) self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) self.SetShowGroups(False)
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.lst_songs.ToggleWindowStyle(wx.HSCROLL) 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 __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) global theObjectListView, theFastObjectListView, theVirtualObjectListView, theGroupObjectListView, theFrame theFrame = self self.panel = wx.Panel(self, -1) theObjectListView = ObjectListView(self.panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) theFastObjectListView = FastObjectListView(self.panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) theVirtualObjectListView = VirtualObjectListView( self.panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) theGroupObjectListView = GroupListView(self.panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(theObjectListView, 1, wx.ALL | wx.EXPAND, 4) sizer_2.Add(theFastObjectListView, 1, wx.ALL | wx.EXPAND, 4) sizer_2.Add(theVirtualObjectListView, 1, wx.ALL | wx.EXPAND, 4) sizer_2.Add(theGroupObjectListView, 1, wx.ALL | wx.EXPAND, 4) self.panel.SetSizer(sizer_2) self.panel.Layout() sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.panel, 1, wx.EXPAND) self.SetSizer(sizer_1) self.Layout() wx.CallAfter(self.runTests)
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): 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.lst_songs.ToggleWindowStyle(wx.HSCROLL) 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("groove-dl 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_1.Add(self.sizer_2, 0, wx.EXPAND, 0) self.sizer_1.Add(self.lst_results, 2, wx.EXPAND, 10) self.sizer_1.Add(self.sizer_3, 2, wx.EXPAND, 0) self.sizer_1.Add(self.lst_downloads, 1, wx.EXPAND, 0) 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_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 fn = filename while os.path.exists(os.path.join(dest, fn+'.mp3')) or fn+'.mp3' in [i['filename'] for i in self.downloads]: fn = filename + ' (%d)' % c c += 1 filename = fn + '.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 for d in self.downloads: d["thread"].cancelled = True config = ConfigParser.RawConfigParser() config.add_section("groove-dl") config.set("groove-dl", "dest", dest) 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)
class TestGroupObjectListView(TestObjectListView): def setUp(self): super(TestGroupObjectListView, self).setUp() panel = wx.Panel(self.frame, -1) self.objectListView = GroupListView(panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) sizerPanel = wx.BoxSizer(wx.VERTICAL) sizerPanel.Add(self.objectListView, 1, wx.ALL | wx.EXPAND, 4) panel.SetSizer(sizerPanel) sizerFrame = wx.BoxSizer(wx.VERTICAL) sizerFrame.Add(panel, 1, wx.ALL | wx.EXPAND, 4) self.frame.SetSizer(sizerFrame) loadOLV(self.objectListView) #------------------------------------------------------------------------- # Override inherited tests def testBasicState(self): self.assertEqual(self.objectListView.GetColumnCount(), len(personColumns) + 1) self.assertEqual( self.objectListView.GetItemCount(), len(persons) + len(self.objectListView.groups) * 2 - 1) def testSorting(self): # Sorting within a GroupListView is completely different from an # ObjectListView pass def testSelectAll(self): self.objectListView.SelectAll() for i in range(0, self.objectListView.GetItemCount()): if self.objectListView.GetObjectAt(i): self.assertTrue(self.objectListView.IsSelected(i)) def testAlternateColours(self): # Not ever row has alternate colours -- only those for model objects self.objectListView.useAlternateBackColors = True self.objectListView.RepopulateList() for i in range(self.objectListView.GetItemCount()): if self.objectListView.GetObjectAt(i): if i & 1: self.assertEqual(self.objectListView.oddRowsBackColor, self.getBackgroundColour(i)) else: self.assertEqual(self.objectListView.evenRowsBackColor, self.getBackgroundColour(i)) def getBackgroundColour(self, i): # There is no direct way to get the background colour of an item in a virtual # list, so we have to cheat by approximating the process of building a # list item attr = self.objectListView.OnGetItemAttr(i) if attr is None or not attr.HasBackgroundColour(): # this returns an invalid color return self.objectListView.GetItemBackgroundColour(i) else: return attr.GetBackgroundColour()
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)
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)