diff --git a/GlossMgr.py b/GlossMgr.py
index 881c85d..654db6b 100644
--- a/GlossMgr.py
+++ b/GlossMgr.py
@@ -50,9 +50,9 @@ class GlossMgr:
def transition_fade_zoom(self, fromMenu, toMenu):
oldGroup = fromMenu.getItemGroup()
- oldMenuGroup = fromMenu.getMenuGroup()
+ oldMenuGroup = fromMenu #.getMenuGroup()
newGroup = toMenu.getItemGroup()
- newMenuGroup = toMenu.getMenuGroup()
+ newMenuGroup = toMenu #.getMenuGroup()
oldGroup.set_opacity(255)
@@ -179,23 +179,16 @@ class GlossMgr:
class MenuSelector(clutter.Texture):
x_offset = -50
- width = 400
- def __init__ (self, menuMgr):
+ def __init__ (self, glossMgr):
clutter.Texture.__init__ (self)
- self.menuMgr = menuMgr
- pixbuf = gtk.gdk.pixbuf_new_from_file("ui/active_bar.png")
- self.set_pixbuf(pixbuf)
- self.set_width(self.width)
-
- #pixbuf = gtk.gdk.pixbuf_new_from_file("ui/spinner1.gif")
- #self.spinner = clutter.Texture()
- #self.spinner.set_pixbuf(pixbuf)
- #self.spinner.hide()
-
-
- def selectItem(self, selectee, timeline):
-
+ self.glossMgr = glossMgr
+ glossMgr.themeMgr.get_texture("selector_bar", glossMgr.stage, self)
+ self.set_position(0, self.get_y())
+ self.x_offset = int(glossMgr.themeMgr.get_value("texture", "selector_bar", "position.x"))
+
+ #This is a utility function that gets the coordinates of an that has been scaled
+ def get_true_abs_position(self, selectee):
#This whole clone label thing is a HORRIBLE hack but is there to compensate for the movement caused by scaling using GRAVITY_WEST
#Essentially a clone of the selectee is made and scaled to its final position to retrieve the final abs_position coords
cloneLabel = clutter.Label()
@@ -204,14 +197,20 @@ class MenuSelector(clutter.Texture):
(scale_x, scale_y) = selectee.get_scale()
cloneLabel.set_scale_with_gravity(scale_x, scale_y, clutter.GRAVITY_WEST)
selectee.get_parent().add(cloneLabel)
+
cloneLabel.set_position(selectee.get_x(), selectee.get_y())
#Now that all the cloning is done, find out what the scale is to become and set it on the clone
scale = selectee.currentZoom
cloneLabel.set_scale_with_gravity(scale, scale, clutter.GRAVITY_WEST)
+ return cloneLabel.get_abs_position()
+
+ def selectItem(self, selectee, timeline):
+
+
#Now get the end position of the clone
- (x, y) = cloneLabel.get_abs_position()
+ (x, y) = self.get_true_abs_position(selectee)
#Do some minor adjustments for centering etc
x = x + self.x_offset
@@ -274,8 +273,6 @@ class MenuSelector(clutter.Texture):
def get_x_offset(self):
return self.x_offset
- def get_width(self):
- return self.width
class message():
font = "Lucida Grande "
diff --git a/Menu.py b/Menu.py
index b0ebb83..ef578db 100644
--- a/Menu.py
+++ b/Menu.py
@@ -6,7 +6,6 @@ import time
from ReflectionTexture import Texture_Reflection
class Menu(clutter.Group):
- item_gap = 10 #Distance between items
font = ""
zoomLevel = 0.5
opacityStep = 120
@@ -15,6 +14,7 @@ class Menu(clutter.Group):
clutter.Group.__init__(self)
self.glossMgr = glossMgr
self.stage = self.glossMgr.get_stage()
+ self.itemGroup = clutter.Group()
self.glossMgr.themeMgr.setup_menu("main", self)
self.menuItems = []
@@ -23,33 +23,35 @@ class Menu(clutter.Group):
self.moveQueue = 0
self.displaySize = self.displayMax - self.displayMin
self.displayPosition = (0, 0)
- self.itemGroup = clutter.Group()
- #self.menuGroup = clutter.Group()
+
self.stage.add(self.itemGroup)
- #self.stage.add(self.menuGroup)
- #self.hasTimeline = False
self.timeline = clutter.Timeline(15, 75) #This timeline is used on any movements that occur when changing items
self.timeline_completed=True
self.glossMgr.addMenu(self)
- #self.itemGroup.hide_all()
self.stage.add(self)
def addItem(self, itemLabel, imagePath):
if len(self.menuItems) == 0:
- label_height = 0
+ tempLabel = clutter.Label()
+ tempLabel.set_font_name(self.font)
+ tempLabel.set_text("S")
+ #tempLabel.set_scale_with_gravity(self.zoomStep0, self.zoomStep0, clutter.GRAVITY_WEST)
+ self.label_height = tempLabel.get_height()
+ #self.label_height = self.label_height * self.zoomStep1
label_width = 0
- else:
- (label_width, label_height) = self.menuItems[0].get_size()
-
- label_y = label_height * len(self.menuItems)+self.item_gap
+ #else:
+ # (label_width, label_height) = self.menuItems[0].get_size()
+
+ label_y = len(self.menuItems) * (self.label_height + self.item_gap)
+ print "Label height: " + str(self.label_height)
newItem = ListItem(self, itemLabel, label_y, imagePath)
self.menuItems.append(newItem)
self.itemGroup.add(newItem)
- group_x = self.itemGroup.get_x()
- group_y = self.itemGroup.get_y() - (label_height)
- self.itemGroup.set_position(group_x, group_y)
+ #group_x = self.itemGroup.get_x()
+ #group_y = self.itemGroup.get_y() - (self.label_height)
+ #self.itemGroup.set_position(group_x, group_y)
return newItem
@@ -71,17 +73,17 @@ class Menu(clutter.Group):
return self.glossMgr
def setMenuPositionByName(self, location):
+ return None
if location == "center":
menu_y = (self.stage.get_height()-self.itemGroup.get_height())/2
menu_x = (self.stage.get_width()-self.itemGroup.get_width())/2
self.itemGroup.set_position(menu_x, menu_y)
- self.displayPosition = (menu_x, menu_y)
#print "Original Group size: " + str(self.itemGroup.get_width())
#print "Starting at : " + str(menu_x) + ":" + str(menu_y)
#The display position is the x, y coords of where the menu is when it is active
def get_display_position(self):
- return self.displayPosition
+ return (self.itemGroup.get_x(), self.itemGroup.get_y())
def setMenuPosition(self, x, y):
self.itemGroup.set_position(x,y)
@@ -89,9 +91,6 @@ class Menu(clutter.Group):
def getItemGroup(self):
return self.itemGroup
- def getMenuGroup(self):
- return self.menuGroup
-
def setListFont(self, newFont):
currentY= 0 #self.itemGroup.get_y()
self.font = newFont
@@ -228,26 +227,28 @@ class Menu(clutter.Group):
def rollMenu(self, incomingMenuItem, outgoingMenuItem, timeline):
(group_x, group_y) = self.itemGroup.get_abs_position()
(bar_x, bar_y) = self.glossMgr.get_selector_bar().get_abs_position() # incomingMenuItem.get_menu().getMenuMgr().
- (incoming_x, incoming_y) = incomingMenuItem.get_abs_position()
+ (incoming_x, incoming_y) = self.glossMgr.get_selector_bar().get_true_abs_position(incomingMenuItem) #incomingMenuItem.get_abs_position()
#print self.itemGroup.get_abs_position()
#print "Starting group position: " + self.itemGroup.get_abs_position()
if incoming_y > bar_y:
#Then the incoming item is below the selector bar
- gap = (incoming_y - bar_y - (self.item_gap/2)) * -1
+ height_diff = int(self.glossMgr.get_selector_bar().get_height() - self.glossMgr.get_selector_bar().get_height())
+ print "height diff: " + str(height_diff)
+ gap = (incoming_y - bar_y) * -1 #- (self.item_gap/2)) * -1
#gap = -65
self.displayMin = self.displayMin+1
self.displayMax = self.displayMax+1
else:
#Then the incoming item is above the selector bar
- gap = bar_y - incoming_y + (self.item_gap/2)
+ gap = bar_y - incoming_y# + (self.item_gap/2)
#gap = 65
self.displayMin = self.displayMin-1
self.displayMax = self.displayMax-1
#print "Gap: " + str(gap)
- new_y = (group_y+gap)
+ new_y = (group_y + gap)
knots = (\
(group_x, group_y),\
(group_x, new_y )\
@@ -320,21 +321,21 @@ class ListItem (clutter.Label):
self.onStage = True
#self.itemTexturesGroup.show_all()
if level==1:
- zoomTo = self.zoomLevel * self.menu.zoomStep1
+ zoomTo = self.menu.zoomStep1
opacityTo = self.menu.opacityStep1
if self.onStage:
self.menu.remove(self.itemTexturesGroup)
self.onStage = False
#self.itemTexturesGroup.hide_all()
if level==2:
- zoomTo = self.zoomLevel * self.menu.zoomStep2
+ zoomTo = self.menu.zoomStep2
opacityTo = self.menu.opacityStep2
if self.onStage:
self.menu.remove(self.itemTexturesGroup)
self.onStage = False
#self.itemTexturesGroup.hide_all()
- if zoomTo == self.currentZoom:
+ if (zoomTo == self.currentZoom) and (opacityTo == self.currentOpacity):
return None
alpha = clutter.Alpha(timeline, clutter.ramp_inc_func)
@@ -342,9 +343,13 @@ class ListItem (clutter.Label):
self.behaviour2 = clutter.BehaviourOpacity(alpha, self.currentOpacity, opacityTo)
self.behaviour1.apply(self)
self.behaviour2.apply(self)
-
+
+ #timeline.connect('completed', self.scale_end_event, zoomTo, opacityTo)
self.currentZoom = zoomTo
self.currentOpacity = opacityTo
+
+ def scale_end_event(self, data, zoomTo, opacityTo):
+ pass
def get_zoom_level(self):
return self.zoomLevel
diff --git a/VideoController.py b/VideoController.py
index 6538379..a3068a3 100644
--- a/VideoController.py
+++ b/VideoController.py
@@ -52,24 +52,24 @@ class VideoController:
#Now we can start the video
self.video_texture.set_playing(True)
#self.bin.set_state(gst.STATE_PAUSED)
- #self.bin.set_state(gst.STATE_PLAYING)
+ self.bin.set_state(gst.STATE_PLAYING)
self.isPlaying = True
- decodebin = self.bin.get_by_name("decodebin0")
+ #decodebin = self.bin.get_by_name("decodebin0")
#for element in decodebin.elements():
# print "GST Element 1: " + str(element.get_name())
#queue = decodebin.get_by_name("queue0")
#print queue.get_name()
#ypefind = decodebin.get_by_name("typefind")
- decodebin.connect("pad-added", self.on_pad_added)
+ #decodebin.connect("pad-added", self.on_pad_added)
#vid = demuxer.get_by_name("video_00")
- self.queue1 = gst.element_factory_make("queue", "queue1")
- self.queue1.set_property("max-size-time", 50000)
- self.queue1.set_property("max-size-buffers", 0)
+ #self.queue1 = gst.element_factory_make("queue", "queue1")
+ #self.queue1.set_property("max-size-time", 50000)
+ #self.queue1.set_property("max-size-buffers", 0)
#self.queue2 = gst.element_factory_make("queue", "queue2")
- self.bin.add(self.queue1)
+ #self.bin.add(self.queue1)
#self.bin.add(self.queue2)
#decodebin.link(self.queue1)
#self.queue1.link(decodebin)
diff --git a/modules/myth_tv_player/MythBackendConn.py b/modules/myth_tv_player/MythBackendConn.py
index f060d6a..2825998 100644
--- a/modules/myth_tv_player/MythBackendConn.py
+++ b/modules/myth_tv_player/MythBackendConn.py
@@ -174,22 +174,9 @@ class MythBackendConnection(threading.Thread):
max_request_size = 270000
request_size_step = 16384
- #Need to create a bit of a buffer so playback will begin
- """
- x=0
- while x<80:
- transfer_cmd = "QUERY_FILETRANSFER "+ str(socket_id) + "[]:[]REQUEST_BLOCK[]:[]"+str(request_size)
- self.send_cmd(cmd_sock, transfer_cmd)
- num_bytes = int(self.receive_reply(cmd_sock))
- data = data_sock.recv(num_bytes)
- self.buffer_file.write(data)
- x=x+1
- self.buffer_file.flush()
- """
-
- #self.videoPlayer.begin_playback(buffer_file_name)
- reader_fd = os.dup(data_sock.fileno())
- self.videoPlayer.begin_playback(reader_fd)
+ #Data is sent through a pipe to GStreamer
+ (pipe_rfd, pipe_wfd) = os.pipe()
+ self.videoPlayer.begin_playback(pipe_rfd)
print "BEGINNING PLAYBACK!"
self.Playing = True
@@ -197,12 +184,11 @@ class MythBackendConnection(threading.Thread):
transfer_cmd = "QUERY_FILETRANSFER "+ str(socket_id) + "[]:[]REQUEST_BLOCK[]:[]"+str(request_size)
self.send_cmd(cmd_sock, transfer_cmd)
num_bytes = int(self.receive_reply(cmd_sock))
- data_sock.recv(num_bytes)
- #self.buffer_file.write(data)
- #self.buffer_file.flush()
+ data = data_sock.recv(num_bytes)
+ os.write(pipe_wfd, data)
+
#This tries to optimise the request size
- #print "Received: " + str(num_bytes)
if (num_bytes == request_size) and (request_size < max_request_size):
request_size = request_size + request_size_step
if request_size > max_request_size:
@@ -212,7 +198,8 @@ class MythBackendConnection(threading.Thread):
print "Ending playback"
- #self.buffer_file.close()
+ os.close(pipe_wfd)
+ os.close(pipe_rfd)
def message_socket_mgr(self, msg_socket):
#Do the protocol version check
diff --git a/modules/video_player/video_player.py b/modules/video_player/video_player.py
index 29867c4..567006c 100644
--- a/modules/video_player/video_player.py
+++ b/modules/video_player/video_player.py
@@ -180,7 +180,7 @@ class Module():
return
#Create a backdrop for the player. In this case we just use the same background as the menus
- self.backdrop = glossMgr.get_themeMgr().get_texture("background", None) #clutter.CloneTexture(glossMgr.get_skinMgr().get_Background())
+ self.backdrop = glossMgr.get_themeMgr().get_texture("background", None, None) #clutter.CloneTexture(glossMgr.get_skinMgr().get_Background())
self.backdrop.set_size(self.stage.get_width(), self.stage.get_height())
self.backdrop.set_opacity(0)
self.backdrop.show()
diff --git a/themeMgr.py b/themeMgr.py
index 6477728..0441387 100644
--- a/themeMgr.py
+++ b/themeMgr.py
@@ -129,6 +129,14 @@ class ThemeMgr:
#This is the generic function for setting up an actor.
#It sets up all the 'common' properties:
#Currently: size, position, opacity
+ def get_value(self, type, name, property):
+ element = self.search_docs(type, name).childNodes
+ #Quick check to make sure we found something
+ if element is None:
+ return None
+
+ return self.find_child_value(element, property)
+
def setup_actor(self, actor, element, parent):
#Set the size
#First setup the parent
@@ -148,14 +156,15 @@ class ThemeMgr:
width = (float(width[:-1]) / 100.0) * parent.get_width()
#print "width: " + str(width)
- width = int(width)
+ width = int(width)
height = self.find_child_value(element, "dimensions.height")
if (not height == "default") and (not height is None):
if height[-1] == "%":
height = (float(height[:-1]) / 100.0) * parent.get_height()
- height = int(height)
+ height = int(height)
- actor.set_size(width, height)
+ if (not width is None) and (not width == "default"): actor.set_width(width)
+ if (not height is None) and (not height == "default"): actor.set_height(height)
#Set the position of the actor
(x,y) = (0,0)
@@ -284,4 +293,7 @@ class ThemeMgr:
menu.zoomStep2 = float(self.find_child_value(element, "scale_step2"))
menu.opacityStep0 = int(self.find_child_value(element, "opacity_step0"))
menu.opacityStep1 = int(self.find_child_value(element, "opacity_step1"))
- menu.opacityStep2 = int(self.find_child_value(element, "opacity_step2"))
\ No newline at end of file
+ menu.opacityStep2 = int(self.find_child_value(element, "opacity_step2"))
+
+ #Finally set general actor properties (position etc)
+ self.setup_actor(menu.getItemGroup(), element, self.stage)
\ No newline at end of file
diff --git a/ui/default/main.xml b/ui/default/main.xml
index 73c001b..058a71a 100644
--- a/ui/default/main.xml
+++ b/ui/default/main.xml
@@ -8,7 +8,16 @@
30
- 10
+
+ 40%
+ 40%
+
+
+ 60%
+ 30%
+
+
+ 0
6