Some neat updates/refactoring to the video player module. Folder list now implements the cover viewer to take advantage of all its scrolling abilities

This commit is contained in:
noisymime 2008-01-17 12:27:52 +00:00
parent cae16838cf
commit dceec7074d
10 changed files with 199 additions and 168 deletions

View File

@ -44,11 +44,12 @@ class GlossMgr:
print "Perspective: " + str(stage.get_perspective())
#stage.set_perspective(60.0, 1.0, 0.1, 1)
#Setip the selector bar
self.selector_bar = MenuSelector(self)
self.stage.add(self.selector_bar)#Load the theme manager
#self.themeMgr = ThemeMgr(self.stage)
self.selector_bar.show_all()
self.stage.add(self.selector_bar)
self.selector_bar.show_all()
self.currentPlugin = None
def addMenu(self, newMenu):
@ -61,7 +62,15 @@ class GlossMgr:
self.currentMenu.getItemGroup().show_all()
self.currentMenu.show_all()
self.currentMenu.show()
#This is a bit hacky, but we set the selector bar size based on the font size
tmpLabel = clutter.Label()
tmpLabel.set_text("AAA")
tmpLabel.set_font_name(self.currentMenu.font)
#Selector bar height is 20% larger than the labels
self.selector_bar.set_height( int(tmpLabel.get_height()*1.2) )
self.selector_bar.set_menu(self.currentMenu)
tmpLabel = None
def get_selector_bar(self):
return self.selector_bar

View File

@ -74,4 +74,10 @@ class InputQueue:
self.queue_east = 0
self.queue_south = 0
self.queue_west = 0
self.queue_north = 0
self.queue_north = 0
def is_in_queue(self):
if (self.queue_north > 0) or (self.queue_south > 0) or (self.queue_east > 0) or (self.queue_west > 0):
return True
else:
return False

View File

@ -33,18 +33,14 @@ class VideoController:
#return
self.player = player
self.stage.add(self.video_texture)
self.video_texture.set_uri(uri)
#fd = uri[5:7]
#self.customBin(fd)
self.video_texture.set_position(0, 0)
self.video_texture.show()
#We need to connect to the message queue on the playbin to watch for any message (ie codec or file not found errors)
self.bin = self.video_texture.get_playbin()
#print "Queue: " + str(self.bin.get_property("queue_size"))
#print "Queue: " + str(self.bin.get_property("queue_threshold"))
print "Queue: " + str(self.bin.get_property("queue_min_threshold"))
#print "Queue: " + str(self.bin.get_property("queue_min_threshold"))
bus = self.video_texture.get_playbin().get_bus()
bus.add_signal_watch()
bus.connect('message', self.on_bus_message)
@ -73,6 +69,10 @@ class VideoController:
#self.bin.add(self.queue2)
#decodebin.link(self.queue1)
#self.queue1.link(decodebin)
self.video_texture.set_opacity(255)
self.video_texture.set_position(0, 0)
self.video_texture.show()
self.stage.add(self.video_texture)
return self.video_texture

View File

@ -6,7 +6,7 @@ import gobject
import pango
import clutter
import os
from modules.video_player.CoverItem import cover_item
from modules.video_player.elements.CoverItem import cover_item
from InputQueue import InputQueue
class coverViewer(clutter.Group):
@ -14,7 +14,7 @@ class coverViewer(clutter.Group):
inactiveOpacity = 150
covers_size_percent = 0.90 #This is the percentage of the total group size that the covers will take
detailBox_height = 160 #Needs a percent
update_details = False
def __init__(self, stage, width, height, rows, columns):
@ -45,7 +45,7 @@ class coverViewer(clutter.Group):
self.covers_group_clip.set_clip(-(scale_amount/2), -(scale_amount/2), clip_width, clip_height)
self.current_video_details = video_details_group(self.covers_width)
#self.current_video_details = video_details_group(self.covers_width)
self.num_covers = 0
self.cover_gap = 1
@ -73,25 +73,8 @@ class coverViewer(clutter.Group):
self.covers_group_clip.show()
#self.stage.add(self.current_video_description)
self.current_video_details.show()
self.current_video_details.show_all()
#Loads the various UI elements using the theme mgr
def load_theme(self):
pass
#Turns the description group off and on
def toggle_details(self):
if self.current_video_details.get_parent() == None:
self.add(self.current_video_details)
#Set the position of the details group
(pos_x, pos_y) = self.get_abs_position()
#The next two lines are horribly ugly, but all they do is position the details viewer in the middle of the gap between the bottom of the visible cover viewer and the bottom of the stage
viewer_lower_y = int(pos_y + (self.max_visible_rows * self.cover_size))
pos_y = viewer_lower_y# + int( (self.stage.get_height() - viewer_lower_y) / 2 - int(self.current_video_details.get_height()/2))
self.current_video_details.set_position(20, pos_y)
else:
self.stage.remove(self.current_video_details)
#self.current_video_details.show()
#self.current_video_details.show_all()
def add_video(self, video):
self.videoLibrary.append(video)
@ -135,7 +118,6 @@ class coverViewer(clutter.Group):
numFolders = len(self.folderLibrary)
if incomingItem >= numFolders:
incomingItemVideo = incomingItem - numFolders
self.current_video_details.set_video(self.videoLibrary[incomingItemVideo], self.timeline)
#Check if the cover is currently not visible
rolling = False
@ -151,7 +133,6 @@ class coverViewer(clutter.Group):
alpha = clutter.Alpha(self.timeline, clutter.smoothstep_inc_func)# clutter.ramp_inc_func)
self.behaviourNew_scale = clutter.BehaviourScale(scale_start=1, scale_end=self.scaleFactor, alpha=alpha) #clutter.GRAVITY_CENTER)
#self.behaviourNew_scale.set_property("scale-gravity", clutter.GRAVITY_CENTER)
self.behaviourNew_z = clutter.BehaviourDepth(depth_start=1, depth_end=2, alpha=alpha)
#If we're performing a roll (See above) then the incoming opacity should start at 0 rather than the normal inactive opacity
if rolling:
@ -160,7 +141,6 @@ class coverViewer(clutter.Group):
self.behaviourNew_opacity = clutter.BehaviourOpacity(opacity_start=self.inactiveOpacity, opacity_end=255, alpha=alpha)
self.behaviourOld_scale = clutter.BehaviourScale(scale_start=self.scaleFactor, scale_end=1, alpha=alpha)
#self.behaviourOld_scale.set_property("scale-gravity", clutter.GRAVITY_CENTER)
self.behaviourOld_z = clutter.BehaviourDepth(depth_start=2, depth_end=1, alpha=alpha)
self.behaviourOld_opacity = clutter.BehaviourOpacity(opacity_start=255, opacity_end=self.inactiveOpacity, alpha=alpha)
@ -196,11 +176,12 @@ class coverViewer(clutter.Group):
def select_first(self):
self.timeline = clutter.Timeline(20,80)
self.input_queue.set_timeline(self.timeline)
"""
if not len(self.folderLibrary) == 0:
pass
else:
self.current_video_details.set_video(self.videoLibrary[0], self.timeline)
"""
incomingItem = 0
incomingTexture = self.textureLibrary[incomingItem]
@ -225,16 +206,13 @@ class coverViewer(clutter.Group):
alpha = clutter.Alpha(self.timeline, clutter.smoothstep_inc_func)
self.behaviourOld_scale = clutter.BehaviourScale(scale_start=self.scaleFactor, scale_end=1, alpha=alpha)
self.behaviourOld_scale.set_property("scale-gravity", clutter.GRAVITY_CENTER)
self.behaviourOld_z = clutter.BehaviourDepth(depth_start=2, depth_end=1, alpha=alpha)
self.behaviourOld_opacity = clutter.BehaviourOpacity(opacity_start=255, opacity_end=self.inactiveOpacity, alpha=alpha)
self.behaviourOldDetails_opacity = clutter.BehaviourOpacity(opacity_start=255, opacity_end=0, alpha=alpha)
current_cover = self.textureLibrary[self.currentSelection]
self.behaviourOld_scale.apply(current_cover)
self.behaviourOld_z.apply(current_cover)
self.behaviourOld_opacity.apply(current_cover)
self.behaviourOldDetails_opacity.apply(self.current_video_details)
self.timeline.start()
@ -306,23 +284,24 @@ class coverViewer(clutter.Group):
def get_current_item(self):
return self.textureLibrary[self.currentSelection]
#If the current item # is greater than the number of folders, we have a video
"""
if self.currentSelection >= len(self.folderLibrary):
selection = self.currentSelection - len(self.folderLibrary)
return self.videoLibrary[selection]
else:
return self.folderLibrary[self.currentSelection]
"""
def get_current_video(self):
return self.videoLibrary[self.currentSelection]
def get_item_x(self, itemNo):
return self.textureLibrary[itemNo]
def get_item_library(self):
return self.textureLibrary
def set_details_update(self, on_off, details):
self.update_details = on_off
self.details_group = details
def on_key_press_event(self, event):
self.input_queue.input(event)
return self.timeline
#These are the basic movement functions
def move_left(self):
@ -353,85 +332,8 @@ class coverViewer(clutter.Group):
#If there is movement, make the scale happen
if not newItem == None:
self.select_item(newItem, self.currentSelection)
if self.update_details:
self.details_group.set_video_bare(self.videoLibrary[self.currentSelection])
self.update_details = False
class video_details_group(clutter.Group):
font = "Lucida Grande "
title_font_size = 30
main_font_size = 22
plot_font_size = 18
backgroundImg = "ui/vid_details_bg.png"
def __init__(self, desired_width):
clutter.Group.__init__(self)
self.width = desired_width
"""
self.bgImg = clutter.Texture()
pixbuf = gtk.gdk.pixbuf_new_from_file(self.backgroundImg)
self.bgImg.set_pixbuf(pixbuf)
yx_ratio = float(self.bgImg.get_height()) / float(self.bgImg.get_width())
bg_height = int(desired_width * yx_ratio)
self.bgImg.set_size(desired_width, bg_height)
#self.bgImg.set_opacity(200)
self.bgImg.show()
self.add(self.bgImg)
"""
#Add the various labels
self.title = clutter.Label()
self.title.set_font_name(self.font + str(self.title_font_size))
self.title.set_color(clutter.color_parse('White'))
self.title.set_text("")
self.title.set_ellipsize(pango.ELLIPSIZE_END)
self.add(self.title)
#Not sure how to get the row height before the text is set :(
self.row_gap = self.title.get_height()
self.year = clutter.Label()
self.year.set_font_name(self.font + str(self.main_font_size))
self.year.set_color(clutter.color_parse('White'))
self.year.set_text("")
self.year.set_opacity(220)
self.year.set_ellipsize(pango.ELLIPSIZE_END)
self.year.set_position(0, self.row_gap)
self.add(self.year)
self.director = clutter.Label()
self.director.set_font_name(self.font + str(self.main_font_size))
self.director.set_color(clutter.color_parse('White'))
self.director.set_text("")
self.director.set_opacity(220)
self.director.set_ellipsize(pango.ELLIPSIZE_END)
self.director.set_position(int(self.year.get_width()), self.row_gap)
self.add(self.director)
self.plot = clutter.Label()
self.plot.set_font_name(self.font + str(self.plot_font_size))
self.plot.set_color(clutter.color_parse('White'))
self.plot.set_text("")
self.plot.set_opacity(220)
#self.plot.set_ellipsize(pango.ELLIPSIZE_END)
self.plot.set_position(0, int(self.row_gap*2))
self.add(self.plot)
self.show_all()
def set_video_bare(self,video):
self.timeline = clutter.Timeline(10,45)
self.set_video(video, self.timeline)
def set_video(self, video, timeline):
self.video = video
self.title.set_text(video.title)
self.title.set_width(self.width)
self.year.set_text("Year: " + str(video.year))
self.director.set_text(" Director: " + str(video.director))
self.director.set_position(int(self.year.get_width()), self.row_gap)
self.director.set_width(int(self.width - self.year.get_width()))
self.plot.set_text(video.plot)
self.plot.set_width(self.width)

View File

@ -6,7 +6,8 @@ import gobject
import pango
import clutter
import os
from modules.video_player.CoverItem import cover_item
from modules.video_player.elements.CoverItem import cover_item
from modules.video_player.elements.cover_viewer import coverViewer
class folderMenu(clutter.Group):
scaleFactor = 1.4
@ -24,12 +25,17 @@ class folderMenu(clutter.Group):
pixbuf = gtk.gdk.pixbuf_new_from_file(self.selection_box_src)
self.selector_box.set_pixbuf(pixbuf)
self.selector_box.set_size(item_size, item_size)
self.add(self.selector_box)
#self.add(self.selector_box)
self.selector_box.show()
self.folderLibrary = []
self.viewerLibrary = []
self.folder_group = coverViewer(self.stage, item_size, (item_size*rows), rows, 1)
self.folder_group.scaleFactor = 1
self.folder_group.show()
self.add(self.folder_group)
def add_base_dir(self, folderName, cover_viewer):
tempItem = cover_item(None, folderName, self.item_size)
rows = len(self.folderLibrary)
@ -37,11 +43,13 @@ class folderMenu(clutter.Group):
y = rows * self.item_size
tempItem.set_position(x, y)
tempItem.show()
self.add(tempItem)
#self.add(tempItem)
self.folder_group.add_folder(folderName)
#Check if this is the first folder
if len(self.folderLibrary) == 0:
self.currentItemNo = 0
self.folder_group.select_first()
self.folderLibrary.append(tempItem)
self.viewerLibrary.append(cover_viewer)
@ -64,6 +72,7 @@ class folderMenu(clutter.Group):
newItemNo = self.currentItemNo + 1
self.switch_viewer(self.viewerLibrary[newItemNo], 1)
self.currentItemNo = newItemNo
self.folder_group.on_key_press_event(event)
elif (event.keyval == up):
#Check if we're already at the end of the line
if self.currentItemNo == 0:
@ -72,7 +81,8 @@ class folderMenu(clutter.Group):
newItemNo = self.currentItemNo - 1
self.switch_viewer(self.viewerLibrary[newItemNo], -1)
self.currentItemNo = newItemNo
self.folder_group.on_key_press_event(event)
# This is called when the folder menu changes the currently selected folder.
# It causes the coverViewer that's currently on display to roll out and new one come in
# Direction is negative for up, positive for down

View File

@ -0,0 +1,84 @@
import pango
import clutter
class video_details(clutter.Group):
font = "Lucida Grande "
title_font_size = 30
main_font_size = 22
plot_font_size = 18
backgroundImg = "ui/vid_details_bg.png"
def __init__(self, desired_width):
clutter.Group.__init__(self)
self.width = desired_width
"""
self.bgImg = clutter.Texture()
pixbuf = gtk.gdk.pixbuf_new_from_file(self.backgroundImg)
self.bgImg.set_pixbuf(pixbuf)
yx_ratio = float(self.bgImg.get_height()) / float(self.bgImg.get_width())
bg_height = int(desired_width * yx_ratio)
self.bgImg.set_size(desired_width, bg_height)
#self.bgImg.set_opacity(200)
self.bgImg.show()
self.add(self.bgImg)
"""
#Add the various labels
self.title = clutter.Label()
self.title.set_font_name(self.font + str(self.title_font_size))
self.title.set_color(clutter.color_parse('White'))
self.title.set_text("")
self.title.set_ellipsize(pango.ELLIPSIZE_END)
self.add(self.title)
#Not sure how to get the row height before the text is set :(
self.row_gap = self.title.get_height()
self.year = clutter.Label()
self.year.set_font_name(self.font + str(self.main_font_size))
self.year.set_color(clutter.color_parse('White'))
self.year.set_text("")
self.year.set_opacity(220)
self.year.set_ellipsize(pango.ELLIPSIZE_END)
self.year.set_position(0, self.row_gap)
self.add(self.year)
self.director = clutter.Label()
self.director.set_font_name(self.font + str(self.main_font_size))
self.director.set_color(clutter.color_parse('White'))
self.director.set_text("")
self.director.set_opacity(220)
self.director.set_ellipsize(pango.ELLIPSIZE_END)
self.director.set_position(int(self.year.get_width()), self.row_gap)
self.add(self.director)
self.plot = clutter.Label()
self.plot.set_font_name(self.font + str(self.plot_font_size))
self.plot.set_color(clutter.color_parse('White'))
self.plot.set_text("")
self.plot.set_opacity(220)
#self.plot.set_ellipsize(pango.ELLIPSIZE_END)
self.plot.set_position(0, int(self.row_gap*2))
self.add(self.plot)
self.show_all()
def set_video_bare(self,video):
self.timeline = clutter.Timeline(10,45)
self.set_video(video, self.timeline)
def set_video(self, video, timeline):
self.video = video
self.title.set_text(video.title)
self.title.set_width(self.width)
self.year.set_text("Year: " + str(video.year))
self.director.set_text(" Director: " + str(video.director))
self.director.set_position(int(self.year.get_width()), self.row_gap)
self.director.set_width(int(self.width - self.year.get_width()))
self.plot.set_text(video.plot)
self.plot.set_width(self.width)

View File

@ -0,0 +1,26 @@
class videoItem():
def __init(self):
self.mythID = None
def importFromMythObject(self, mythObject):
self.mythID = mythObject[0]
self.title = mythObject[1]
self.director = mythObject[2]
self.plot = mythObject[3]
self.rating = mythObject[4]
self.inetRef = mythObject[5]
self.year = mythObject[6]
self.userRating = mythObject[7]
self.length = mythObject[8]
self.showLevel = mythObject[9]
self.filename = mythObject[10]
self.coverfile = mythObject[11]
self.childID = mythObject[12]
self.browse = mythObject[13]
self.playCommand = mythObject[14]
self.category = mythObject[15]
def getTitle(self):
return self.title
def getCoverfile(self):
return self.coverfile

View File

@ -8,8 +8,10 @@ import clutter
import os
from clutter import cluttergst
from VideoController import VideoController
from modules.video_player.cover_viewer import coverViewer
from modules.video_player.folder_menu import folderMenu
from modules.video_player.elements.cover_viewer import coverViewer
from modules.video_player.elements.video_details import video_details
from modules.video_player.elements.folder_menu import folderMenu
from modules.video_player.video_object import videoItem
#===============================================================================
#This module displays a basic cover viewer for videos within myth's Mythvideo table
@ -56,6 +58,7 @@ class Module():
self.load_base_folders(self.baseDir, base_folder_menu)
self.currentViewer = base_folder_menu.get_current_viewer()
self.video_details = video_details(200)
def setup_ui(self):
self.menu_image = self.glossMgr.themeMgr.get_texture("video_menu_image", None, None)
@ -177,7 +180,15 @@ class Module():
#**********************************************************
elif self.controlState == self.STATE_COVERS:
if (event.keyval == up) or (event.keyval == down) or (event.keyval == left) or (event.keyval == right):
self.currentViewer.on_key_press_event(event)
timeline = self.currentViewer.on_key_press_event(event)
video = self.currentViewer.get_current_video()
#Do a check to see if the input queue is currently processing
#
if not self.currentViewer.input_queue.is_in_queue():
self.video_details.set_video_bare(video)
self.currentViewer.set_details_update(False, None)
else:
self.currentViewer.set_details_update(True, self.video_details)
if event.keyval == clutter.keysyms.Return:
#Find whether the current item is a folder or video
@ -215,18 +226,22 @@ class Module():
self.stage.add(self.covers_background)
#Add the folders menu
self.stage.add(self.folderLibrary[0])
self.folderLibrary[0].set_opacity(0)
self.folderLibrary[0].show()
self.stage.add(self.folderLibrary[0])
#Add the cover viewer
self.currentViewer.set_opacity(0)
self.currentViewer.show_all()
self.currentViewer.show()
#self.currentViewer_clip.show()
self.currentViewer.set_position(self.coverViewerPosX, self.coverViewerPosY)
#self.stage.add(self.currentViewer)
self.stage.add(self.currentViewer)
#Add the video details
self.video_details.set_opacity(0)
self.video_details.show_all()
self.video_details.show()
self.stage.add(self.video_details)
#Fade everything in
@ -236,13 +251,14 @@ class Module():
self.begin_behaviour.apply(self.backdrop)
self.begin_behaviour.apply(self.folderLibrary[0])
self.begin_behaviour.apply(self.covers_background)
self.begin_behaviour.apply(self.currentViewer)
self.begin_behaviour.apply(self.video_details)
#self.viewerLibrary[0].set_position(50, 40)
self.currentViewer.toggle_details() #Turns the details group on
#self.currentViewer.toggle_details() #Turns the details group on
#self.currentViewer.select_first()
@ -261,12 +277,16 @@ class Module():
self.stop_behaviour.apply(self.currentViewer)
self.stop_behaviour.apply(self.backdrop)
self.stop_behaviour.apply(self.folderLibrary[self.folder_level])
self.stop_behaviour.apply(self.video_details)
self.stop_behaviour.apply(self.covers_background)
timeline_stop.connect('completed', self.destroyPlugin)
timeline_stop.start()
def destroyPlugin(self, data):
self.stage.remove(self.currentViewer)
self.stage.remove(self.folderLibrary[self.folder_level])
self.stage.remove(self.video_details)
self.stage.remove(self.covers_background)
self.backdrop.hide()
#self.stage.remove(self.overlay)
@ -300,32 +320,6 @@ class Module():
def unpause(self):
pass
class videoItem():
def __init(self):
self.mythID = None
def importFromMythObject(self, mythObject):
self.mythID = mythObject[0]
self.title = mythObject[1]
self.director = mythObject[2]
self.plot = mythObject[3]
self.rating = mythObject[4]
self.inetRef = mythObject[5]
self.year = mythObject[6]
self.userRating = mythObject[7]
self.length = mythObject[8]
self.showLevel = mythObject[9]
self.filename = mythObject[10]
self.coverfile = mythObject[11]
self.childID = mythObject[12]
self.browse = mythObject[13]
self.playCommand = mythObject[14]
self.category = mythObject[15]
def getTitle(self):
return self.title
def getCoverfile(self):
return self.coverfile