diff --git a/modules/music_player/music_objects/album.py b/modules/music_player/music_objects/album.py
index 7e8eeb2..5a6b801 100644
--- a/modules/music_player/music_objects/album.py
+++ b/modules/music_player/music_objects/album.py
@@ -21,4 +21,11 @@ class album:
for song in songs:
pixbuf = song.get_image_from_ID3()
if not pixbuf is None:
- return pixbuf
\ No newline at end of file
+ return pixbuf
+
+ #If nothing has been found return the default
+ return self.get_default_image()
+
+ #Returns the pixbuf of the default artist image
+ def get_default_image(self):
+ return self.music_player.default_artist_cover
\ No newline at end of file
diff --git a/modules/music_player/music_player.py b/modules/music_player/music_player.py
index cdc6b42..ef88ccd 100644
--- a/modules/music_player/music_player.py
+++ b/modules/music_player/music_player.py
@@ -13,6 +13,7 @@ from ui_elements.label_list import LabelList
class Module:
CONTEXT_HEADINGS, CONTEXT_ROW, CONTEXT_ALBUM_LIST, CONTEXT_SONG_LIST, CONTEXT_PLAY_SCR = range(5)
+ DIRECTION_LEFT, DIRECTION_RIGHT = range(2)
title = "Music"
num_columns = 6
@@ -24,7 +25,6 @@ class Module:
self.stage = glossMgr.get_stage()
self.glossMgr = glossMgr
self.dbMgr = dbMgr
- self.setup_ui()
self.albums = []
self.artists = []
self.songs = []
@@ -49,13 +49,27 @@ class Module:
self.timeout_id = 0
self.queue_id = 0
+ #There has be 3 of these labels, one left, center and right
+ self.artist_label_1 = clutter.Label()
+ self.artist_label_2 = clutter.Label()
+ self.artist_label_3 = clutter.Label()
+ self.artist_label_current = self.artist_label_1
+
+ self.setup_ui()
def setup_ui(self):
self.menu_image = self.glossMgr.themeMgr.get_texture("music_menu_image", None, None)
self.default_artist_cover = self.glossMgr.themeMgr.get_texture("music_default_artist_image", None, None).get_pixbuf()
+ self.default_album_cover = self.glossMgr.themeMgr.get_texture("music_default_album_image", None, None).get_pixbuf()
self.main_img = self.glossMgr.themeMgr.get_imageFrame("music_main_image")
+ self.artist_label_1.set_position(200, 200)
+ self.artist_label_2.set_position(200, 200)
+ self.artist_label_3.set_position(200, 200)
+ self.artist_label_1.set_color(clutter.color_parse('White'))
+ self.artist_label_2.set_color(clutter.color_parse('White'))
+ self.artist_label_3.set_color(clutter.color_parse('White'))
#Get the images dir setting our of the DB
#But also creates the setting if it doesn't already exist
@@ -87,6 +101,7 @@ class Module:
#React based on the current input context
if self.current_context == self.CONTEXT_ROW:
if (event.keyval == clutter.keysyms.Left) or (event.keyval == clutter.keysyms.Right):
+ self.previous_music_object = self.artistImageRow.get_current_object()
#First check if there's any current timeouts and if there is, clear it
#if not self.timeout_id == 0: gobject.source_remove(self.timeout_id)
self.artistImageRow.sleep = True
@@ -96,6 +111,10 @@ class Module:
if self.queue_id == 0: self.queue_id = self.artistImageRow.input_queue.connect("queue-flushed", self.load_albums)
self.artistImageRow.sleep = False
+
+ if (event.keyval == clutter.keysyms.Left): self.direction = self.DIRECTION_LEFT
+ if (event.keyval == clutter.keysyms.Right): self.direction = self.DIRECTION_RIGHT
+
elif (event.keyval == clutter.keysyms.Down):
self.list1.select_first_elegant()
@@ -161,6 +180,8 @@ class Module:
artist = self.artistImageRow.get_current_object()
self.conn_id = self.backend.connect("query-complete", self.update_for_albums, artist)
self.backend.get_albums_by_artistID(artist.artistID)
+
+ self.transition_heading(self.direction, self.previous_music_object, artist, None)
#thread = threading.Thread(target=self.backend.get_albums_by_artistID, args=(artist.artistID,))
#thread.start()
@@ -277,8 +298,77 @@ class Module:
self.main_img.show()
self.stage.add(self.main_img)
+ self.stage.add(self.artist_label_1)
+ self.artist_label_1.show()
+ self.stage.add(self.artist_label_2)
+ self.artist_label_2.show()
+ self.stage.add(self.artist_label_3)
+ self.artist_label_3.show()
+
self.timeline_display.start()
+
+ def transition_heading(self, direction, old_music_item, new_music_item, timeline = None):
+ start_timeline = False
+ if timeline is None:
+ #Completely generic timeline definition
+ timeline = clutter.Timeline(20, 30)
+ start_timeline = True
+
+ self.alpha = clutter.Alpha(timeline, clutter.ramp_inc_func)
+
+ if direction == self.DIRECTION_LEFT:
+ if self.artist_label_current == self.artist_label_1: next_label = self.artist_label_2
+ elif self.artist_label_current == self.artist_label_2: next_label = self.artist_label_3
+ elif self.artist_label_current == self.artist_label_3: next_label = self.artist_label_1
+ else:
+ if self.artist_label_current == self.artist_label_1: next_label = self.artist_label_3
+ elif self.artist_label_current == self.artist_label_2: next_label = self.artist_label_1
+ elif self.artist_label_current == self.artist_label_3: next_label = self.artist_label_2
+
+ next_label.set_opacity(0)
+ next_label.set_scale(0.5, 0.5)
+ next_label.set_text(new_music_item.name)
+
+ if direction == self.DIRECTION_LEFT:
+ next_label.set_x( self.artist_label_current.get_x() + (self.artist_label_current.get_width()))
+ outgoing_x = self.artist_label_current.get_x() - int(self.artist_label_current.get_width()/2)
+ else:
+ next_label.set_x( self.artist_label_current.get_x() - (next_label.get_width()))
+ outgoing_x = self.artist_label_current.get_x() + int(self.artist_label_current.get_width())
+
+ incoming_x = self.artist_label_current.get_x() + int(self.artist_label_current.get_width()/2) - int(next_label.get_width()/2)
+ knots_incoming =(\
+ (next_label.get_x(), next_label.get_y()),
+ (incoming_x, next_label.get_y())
+ )
+ knots_outgoing =(\
+ (self.artist_label_current.get_x(), self.artist_label_current.get_y()),
+ (outgoing_x, next_label.get_y())
+ )
+
+ self.behaviourIncomingPath = clutter.BehaviourPath(knots = knots_incoming, alpha = self.alpha)
+ self.behaviourOutgoingPath = clutter.BehaviourPath(knots = knots_outgoing, alpha = self.alpha)
+ self.behaviourIncomingOpacity = clutter.BehaviourOpacity(opacity_start = 0, opacity_end = 255, alpha = self.alpha)
+ self.behaviourOutgoingOpacity = clutter.BehaviourOpacity(opacity_start = 255, opacity_end = 0, alpha = self.alpha)
+ self.behaviourIncomingScale = clutter.BehaviourScale(x_scale_start = 0.5, y_scale_start = 0.5, x_scale_end = 1, y_scale_end = 1, alpha = self.alpha)
+ self.behaviourOutgoingScale = clutter.BehaviourScale(x_scale_start = 1, y_scale_start = 1, x_scale_end = 0.5, y_scale_end = 0.5, alpha = self.alpha)
+
+ self.behaviourIncomingPath.apply(next_label)
+ self.behaviourIncomingOpacity.apply(next_label)
+ self.behaviourIncomingScale.apply(next_label)
+ self.behaviourOutgoingPath.apply(self.artist_label_current)
+ self.behaviourOutgoingOpacity.apply(self.artist_label_current)
+ self.behaviourOutgoingScale.apply(self.artist_label_current)
+
+ timeline.connect("completed", self.set_next_heading, next_label)
+
+ if start_timeline:
+ timeline.start()
+
+ def set_next_heading(self, data, new_heading):
+ self.artist_label_current = new_heading
+
def stop(self):
pass
@@ -287,41 +377,4 @@ class Module:
pass
def unpause(self):
- pass
- """
- def load_songs(self):
- #Generate some SQL to retrieve videos that were in the final_file_list
- #Load the videos into the cover viewer
- sql = "SELECT * FROM music_songs" # WHERE filename IN ("
- if self.glossMgr.debug: print "Music SQL: " + sql
-
- results = self.dbMgr.run_sql(sql)
-
- #Check for null return
- if results == None:
- print "MusicPlayer: No connection to DB or no songs found in DB"
- return None
-
- pixbuf = None
- #Else add the entries in
- for record in results:
- tempSong = song(self)
- tempSong.import_from_mythObject(record)
- self.songs.append(tempSong)
-
-
- if not tempSong.get_image()is None:
- pixbuf = tempSong.get_image()
- break
- #print filename
- #tempSong.set_file(filename)
-
- if not pixbuf is None:
- loader = gtk.gdk.PixbufLoader()
- loader.write(pixbuf)
- loader.close()
- pixbuf = loader.get_pixbuf()
- self.tmpImage = clutter.Texture()
- self.tmpImage.set_pixbuf(pixbuf)
-
- """
\ No newline at end of file
+ pass
\ No newline at end of file
diff --git a/themes/Pear/music.xml b/themes/Pear/music.xml
index 94418a9..fe60d27 100644
--- a/themes/Pear/music.xml
+++ b/themes/Pear/music.xml
@@ -91,6 +91,9 @@
music/default_cover.png
+
+ music/default_cover.png
+
None