class SongApp(App): # Using StringProperty to for 2 status label in the main screen and 1 status label for pop up screen # Using ListProperty for sorted song button status_text = StringProperty() status_text1 = StringProperty() status_text2 = StringProperty() current_song = StringProperty() song_codes = ListProperty() def __init__(self, **kwargs): super(SongApp, self).__init__(**kwargs) # open csv file: datafile = open("songs.csv", "r") data = datafile.readlines() newsongs = [] for n in data: values = n.strip().split(',') newsongs.append(values) datafile.close() self.list_song = Songlist() # convert list of list into list of object self.list_song.convert_list(newsongs) self.song_list_data = self.list_song.print() # Sort a list of song button def press_sort_button(self, song_code): # sort song by name if song_code == "list of song: (name)": self.list_song.sort_name() # sort song by artist elif song_code == "list of song: (artist)": self.list_song.sort_artist() #sort song by year else: self.list_song.sort_year() self.root.ids.entries_box.clear_widgets() self.create_entry_buttons() def build(self): self.title = "Song Application" self.root = Builder.load_file('app.kv') self.create_entry_buttons() self.song_codes = sorted_song.keys() print(self.song_codes) self.current_song = self.song_codes[0] return self.root def create_entry_buttons(self): # display if the song is already learned and unlearned, they will display in different color and text for n in self.song_list_data: if n.status == "y": text = '"{}" by {} ({}) (learned)'.format( n.name, n.artist, int(n.year)) temp_button = Button(text=text, background_color=(0, 1, 0, 1)) temp_button.bind(on_release=self.press_learned) self.root.ids.entries_box.add_widget(temp_button) else: id_song = n.name text = '"{}" by {} ({})'.format(n.name, n.artist, int(n.year)) temp_button = Button(id=id_song, text=text, background_color=(1, 0, 0, 1)) temp_button.bind(on_release=self.press_entry) self.root.ids.entries_box.add_widget(temp_button) self.songlabel = self.list_song.get_total_label() self.status_text1 = self.songlabel # this function is if the user lick the learned song, the status text will display to notice the user know this song is already learned def press_learned(self, instance): n = instance.text self.status_text2 = "You have already learned this song" def press_entry(self, instance): # update status text n = instance.text self.list_song.get_songs(instance.id).mark_learned() self.root.ids.entries_box.clear_widgets() self.create_entry_buttons() save_csv = self.list_song.get_song_list() datafile = open("songs.csv", "w") for n in save_csv: datafile.write("{},{},{},{}\n".format(n[0], n[1], n[2], n[3])) datafile.close() # function for clear the status def press_clear(self): for instance in self.root.ids.entries_box.children: instance.state = 'normal' self.status_text2 = "" def press_add(self): self.status_text = "Enter details for new Song entry" # this opens the popup self.root.ids.popup.open() # save the song when the user fill in all the information to the table and click save def press_save(self, added_name, added_number, added_artist): if self.root.ids.added_name.text == "" or self.root.ids.added_artist.text == "" or self.root.ids.added_number.text == "": self.status_text = "All fields must be completed" else: new_name = self.root.ids.added_name.text new_artist = self.root.ids.added_artist.text new_number = self.root.ids.added_number.text try: if float(new_number) <= 0: self.status_text = "Please enter a valid number" else: newsong = [] newsong.append(new_name) newsong.append(new_artist) newsong.append(new_number) newsong.append("n") newsonglist = self.list_song.add_song(newsong) self.root.ids.entries_box.clear_widgets() self.create_entry_buttons() # close popup self.root.ids.popup.dismiss() self.clear_fields() except ValueError: self.status_text = "Please enter a valid number" save_csv = self.list_song.get_song_list() datafile = open("songs.csv", "w") for n in save_csv: datafile.write("{},{},{},{}\n".format(n[0], n[1], n[2], n[3])) datafile.close() def clear_fields(self): self.root.ids.added_name.text = "" self.root.ids.added_artist.text = "" self.root.ids.added_number.text = "" def press_cancel(self): self.root.ids.popup.dismiss() self.clear_fields() self.status_text = ""
song_list1 = Songlist() print(song_list1) assert len(song_list1.song_lists) == 0 # test loading songs datafile = open("songs.csv", "r") data = datafile.readlines() newsongs = [] for n in data: values = n.strip().split(',') newsongs.append(values) datafile.close print(newsongs) assert len(newsongs) > 0 # assuming CSV file is not empty # TODO: add tests below to show the various required methods work as expected # test sorting songs song_list1.sort_name() print(song_list1.sort_name) song_list1.sort_artist() print(song_list1.sort_artist) song_list1.sort_year() print(song_list1.sort_year) # test adding a new Song # test get_song() # test getting the number of required and learned songs (separately) # test saving songs (check CSV file manually to see results)