Example #1
0
    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()
Example #2
0
from kivy.app import App
from kivy.config import Config
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.button import Button

from song import Song
from songlist import Songlist

Config.set('graphics', 'resizable', False)

version = "2.0"
program_author = "Rizwan"

MySongList = Songlist("songs.csv")


class SongLearnApp(App):
    def build(self):
        Window.size = (1280, 720)
        self.title = "Songs to be learnt {} - by {}".format(
            version, program_author)  #displaying on the top
        self.root = Builder.load_file('app.kv')  #loading the kv file

        MySongList.sort_songs_by_year()

        for i, song in enumerate(MySongList.list_of_songs):
            new_song_button = Button(text="\"{}\" by {} ({})".format(
                song.name, song.artist, song.year),
                                     id=str(i),
Example #3
0
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 = ""
"""
(incomplete) Tests for SongList class
"""
from songlist import Songlist
from song import Song

# test empty SongList
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