Fixing everything that broke in the implementation of interfaces

This commit is contained in:
noisymime 2008-01-31 04:20:44 +00:00
parent d5c4a760ea
commit b474bf0ad1
10 changed files with 190 additions and 47 deletions

View File

@ -68,8 +68,8 @@ class GlossMgr:
self.currentMenu.show_all() self.currentMenu.show_all()
self.currentMenu.show() self.currentMenu.show()
self.stage.add(self.currentMenu) #self.stage.add(self.currentMenu)
self.stage.add(self.currentMenu.getItemGroup()) #self.stage.add(self.currentMenu.getItemGroup())
#This is a bit hacky, but we set the selector bar size based on the font size #This is a bit hacky, but we set the selector bar size based on the font size
tmpLabel = clutter.Label() tmpLabel = clutter.Label()
@ -79,6 +79,7 @@ class GlossMgr:
self.selector_bar.set_height( int(tmpLabel.get_height()*self.selector_bar.height_percent) ) self.selector_bar.set_height( int(tmpLabel.get_height()*self.selector_bar.height_percent) )
self.selector_bar.set_menu(self.currentMenu) self.selector_bar.set_menu(self.currentMenu)
tmpLabel = None tmpLabel = None
def get_selector_bar(self): def get_selector_bar(self):
return self.selector_bar return self.selector_bar
@ -130,7 +131,6 @@ class GlossMgr:
#hide any unnecesary actors #hide any unnecesary actors
self.currentMenu.hide() self.currentMenu.hide()
#self.stage.remove(self.currentMenu.getItemGroup()) #self.stage.remove(self.currentMenu.getItemGroup())
#And begin the plugin #And begin the plugin
action.begin( self ) action.begin( self )
# This is tres bodge # This is tres bodge

View File

@ -55,15 +55,7 @@ class MainApp:
#Update splash status msg #Update splash status msg
self.splashScreen.set_msg("Creating menus") self.splashScreen.set_msg("Creating menus")
MainMenu = self.glossMgr.create_menu() #Menu(self.glossMgr) MainMenu = self.glossMgr.create_menu()
#menu1.addItem("nothing", "ui/dvd.png")
#menu1.addItem("nothing", "ui/dvd.png")
#menu1.addItem("nothing", "ui/dvd.png")
#menu1.setListFont('Tahoma 42')
MainMenu.setMenuPositionByName("center")
#self.MainMenu = menu
#Update splash status msg #Update splash status msg
self.splashScreen.set_msg("Connecting to MythTV server") self.splashScreen.set_msg("Connecting to MythTV server")
@ -79,9 +71,8 @@ class MainApp:
self.splashScreen.set_msg("Loading "+title) self.splashScreen.set_msg("Loading "+title)
temp_menu_item = MainMenu.addItem(title) temp_menu_item = MainMenu.addItem(title)
temp_menu_item.add_image_from_texture(tempMod.menu_image) temp_menu_item.add_image_from_texture(tempMod.menu_image)
temp_menu_item.setAction(tempMod.action()) temp_menu_item.setAction(tempMod.action())
self.splashScreen.remove() self.splashScreen.remove()
self.stage.connect('key-press-event', self.glossMgr.on_key_press_event) self.stage.connect('key-press-event', self.glossMgr.on_key_press_event)
MainMenu.display() MainMenu.display()
@ -89,8 +80,6 @@ class MainApp:
return False return False
#print self.menuMgr.get_selector_bar().get_abs_position()
#self.menuMgr.get_selector_bar().set_spinner(True)
def on_button_press_event (self, stage, event): def on_button_press_event (self, stage, event):

View File

@ -0,0 +1,32 @@
The main interface filename must be the same as the directory its in:
<intefaces>
<ListMenu>
ListMenu.py
<WheelMenu>
WheelMenu.py
Class name must be 'Interface' and be a subclass of clutter.Group
__init__ function takes form (self, glossMgr)
####################################################
#Interfaces require the following to be implemented:
####################################################
Class Name = Interface
- addItem(label)
- display()
- getItem(index)
- Returns the menu item identified by index
- selectNext()
- selectPrevious()
- selectFirst()
- get_current_item()
- Returns the currently selected item
#####################################################
HIGHLY RECOMMENDED:
Implement the inputQueue mgr with the following:
#Setup input queue controller
self.input_queue = InputQueue()
self.input_queue.set_action(InputQueue.NORTH, self.selectPrevious)
self.input_queue.set_action(InputQueue.SOUTH, self.selectNext)

92
interfaces/MenuItem.py Normal file
View File

@ -0,0 +1,92 @@
import clutter
import pango
class MenuItem (clutter.Label):
zoomLevel = 0.5
opacityStep = 120
def __init__ (self, menu, itemLabel, y):
clutter.Label.__init__ (self)
glossMgr = menu.getGlossMgr()
self.menu = menu
self.stage = glossMgr.get_stage()
#ItemTexturesGroup is what shows any images / reflections associated with the item
self.itemTexturesGroup = clutter.Group()
self.itemTexturesGroup.set_position(menu.menu_image_x, menu.menu_image_y)
#setup the label
font = menu.font
self.set_font_name(font)
self.set_text(itemLabel)
self.color = clutter.Color(0xff, 0xff, 0xff, 0xdd)
self.set_color(self.color)
self.currentOpacity = 255
self.data = itemLabel #By default the items data is simply its label
#The width is the length of the selector bar minus its offset
width = glossMgr.get_selector_bar().get_width() + glossMgr.get_selector_bar().get_x_offset()
self.set_width(width)
self.set_ellipsize(pango.ELLIPSIZE_END)
#Text is actually scaled down in 'regular' position so that it doesn't get jaggies when zoomed in
self.set_scale(self.zoomLevel, self.zoomLevel)
self.currentZoom = 0
#(label_width, label_height) = self.label.get_size()
label_x = 0 #x #self.stage.get_width() - label_width - 50
label_y = y #self.stage.get_height() - label_height
self.set_position(0, y)
#Add textures group and mark whether or not the textures are currently on the stage
self.itemTexturesGroup.show_all()
self.onStage = False
def add_image_from_path(self, path, x, y):
self.tempTexture = clutter.Texture()
pixbuf = gtk.gdk.pixbuf_new_from_file(path)
tempTexture.set_pixbuf(pixbuf)
self.add_image_from_texture(tempTexture, x, y)
def add_image_from_texture(self, texture):
if texture is None:
print "NO TEXTURE!"
"""
Removing as this is currently already handled in individual module files
#Set the image to the size in the theme
if not self.menu.menu_image_height is None:
texture.set_height(self.menu.menu_image_height)
if not self.menu.menu_image_width is None:
texture.set_width(self.menu.menu_image_width)
"""
#Rotate appropriately
rotation = self.menu.menu_image_rotation
x_rotation = (texture.get_width())
texture.set_rotation(clutter.Y_AXIS, rotation, x_rotation, 0, 0)
self.itemTexturesGroup.add(texture)
#If reflection is turned on in the theme, add a reflection texture
if self.menu.useReflection:
self.reflectionTexture = Texture_Reflection(texture)
self.itemTexturesGroup.add(self.reflectionTexture)
self.itemTexturesGroup.show_all()
def set_data(self, data):
self.data = data
def get_data(self):
return self.data
def setAction(self, newAction):
self.action = newAction
def getAction(self):
return self.action
def get_menu(self):
return self.menu

View File

@ -0,0 +1,39 @@
import clutter
import pygtk
import gtk
import pango
import time
import math
from ReflectionTexture import Texture_Reflection
from interfaces.ListItem import ListItem
from InputQueue import InputQueue
class Interface(clutter.Group):
itemGroup = clutter.Group()
def __init__ (self, glossMgr):
clutter.Group.__init__(self)
self.glossMgr = glossMgr
self.stage = self.glossMgr.get_stage()
self.itemGroup = clutter.Group()
self.setup_ui(self.glossMgr.themeMgr, "main", self)
#Setup input queue controller
self.input_queue = InputQueue()
self.input_queue.set_action(InputQueue.NORTH, self.selectPrevious)
self.input_queue.set_action(InputQueue.SOUTH, self.selectNext)
def addItem(self, itemLabel):
if len(self.itemsGroup) == 0:
tempLabel = clutter.Label()
tempLabel.set_font_name(self.font)
tempLabel.set_text("S")
self.label_height = tempLabel.get_height()
label_width = 0
label_y = len(self.menuItems) * (self.label_height + self.item_gap)
#print "Label height: " + str(self.label_height)
newItem = MenuListItem(self, itemLabel, label_y)
self.menuItems.append(newItem)
self.itemGroup.add(newItem)

0
interfaces/__init__.py Normal file
View File

View File

@ -359,9 +359,9 @@ class Module:
self.nexttSong = None self.nexttSong = None
#The following generates a menu with an option for each of the slideshows in the base menu #The following generates a menu with an option for each of the slideshows in the base menu
def generateMenu(self): def generateMenu(self):
tempMenu = self.glossMgr.create_menu() #Menu(self.glossMgr) tempMenu = self.glossMgr.create_menu() #Menu(self.glossMgr)
self.menu = tempMenu self.menu = tempMenu
#print self.baseDir #print self.baseDir
#This occurs when there are not slideshows or we could not connect to the db to establish baseDir #This occurs when there are not slideshows or we could not connect to the db to establish baseDir

View File

@ -7,7 +7,7 @@ from xml.dom import minidom
class ThemeMgr: class ThemeMgr:
defaultTheme = "default" defaultTheme = "default"
currentTheme = "default" currentTheme = "default"
#currentTheme = "Pear" currentTheme = "Pear"
def __init__(self, glossMgr): def __init__(self, glossMgr):
self.stage = glossMgr.stage self.stage = glossMgr.stage

View File

@ -8,11 +8,8 @@ class Transition:
def do_transition(self, fromMenu, toMenu): def do_transition(self, fromMenu, toMenu):
oldGroup = fromMenu.getItemGroup() oldGroup = fromMenu.getItemGroup()
oldMenuGroup = fromMenu #.getMenuGroup()
newGroup = toMenu.getItemGroup() newGroup = toMenu.getItemGroup()
newMenuGroup = toMenu #.getMenuGroup()
oldGroup.set_opacity(255) oldGroup.set_opacity(255)
@ -24,16 +21,16 @@ class Transition:
#Setup some knots #Setup some knots
knots_exiting = (\ knots_exiting = (\
(oldGroup.get_x(), oldGroup.get_y()),\ (fromMenu.get_x(), fromMenu.get_y()),\
#(-oldGroup.get_x(), int(fromMenu.getStage().get_height()/2)) #(-oldGroup.get_x(), int(fromMenu.getStage().get_height()/2))
(-oldGroup.get_x(), oldGroup.get_y())\ (-fromMenu.get_x(), fromMenu.get_y())\
) )
self.exit_behaviour_path = clutter.BehaviourPath(knots=knots_exiting, alpha=self.alpha) self.exit_behaviour_path = clutter.BehaviourPath(knots=knots_exiting, alpha=self.alpha)
#self.exit_behaviour_scale.apply(oldGroup) #self.exit_behaviour_scale.apply(oldGroup)
self.exit_behaviour_opacity.apply(oldGroup) self.exit_behaviour_opacity.apply(fromMenu.get_current_item().itemTexturesGroup)
self.exit_behaviour_opacity.apply(oldMenuGroup) self.exit_behaviour_opacity.apply(fromMenu)
self.exit_behaviour_path.apply(oldGroup) self.exit_behaviour_path.apply(fromMenu)
################################################################## ##################################################################
@ -42,43 +39,36 @@ class Transition:
self.entrance_behaviour_opacity = clutter.BehaviourOpacity(opacity_start=0, opacity_end=255, alpha=self.alpha) self.entrance_behaviour_opacity = clutter.BehaviourOpacity(opacity_start=0, opacity_end=255, alpha=self.alpha)
#Setup some knots #Setup some knots
start_y = oldGroup.get_y()#int(self.stage.get_height()/2 - newGroup.get_height()/2) start_y = fromMenu.get_y()#int(self.stage.get_height()/2 - newGroup.get_height()/2)
start_x = int(self.stage.get_width()) start_x = int(self.stage.get_width())
newGroup.set_position(start_x, start_y)
#end_x = int(self.stage.get_width() - newGroup.get_width())/2 (end_x, end_y) = fromMenu.get_position()
(end_x, end_y) = toMenu.get_display_position()
end_x = oldGroup.get_x() #int(end_x)
end_y = oldGroup.get_y() #int(end_y)
knots_entering = (\ knots_entering = (\
(newGroup.get_x(), newGroup.get_y()),\ #(toMenu.get_x(), toMenu.get_y()),\
(start_x, start_y),\
#(-oldGroup.get_x(), int(fromMenu.getStage().get_height()/2)) #(-oldGroup.get_x(), int(fromMenu.getStage().get_height()/2))
(end_x, end_y) \ (end_x, end_y) \
#toMenu.get_display_position() #toMenu.get_display_position()
) )
self.entrance_behaviour_path = clutter.BehaviourPath(self.alpha, knots_entering) self.entrance_behaviour_path = clutter.BehaviourPath(self.alpha, knots_entering)
self.entrance_behaviour_opacity.apply(newGroup) self.entrance_behaviour_opacity.apply(toMenu.get_current_item().itemTexturesGroup)
self.entrance_behaviour_opacity.apply(newMenuGroup) self.entrance_behaviour_opacity.apply(toMenu)
self.entrance_behaviour_path.apply(newGroup) self.entrance_behaviour_path.apply(toMenu)
#newGroup.show_all() #newGroup.show_all()
#newMenuGroup.show_all() #newMenuGroup.show_all()
#This takes care of adding the new menu to the stage etc
toMenu.display() toMenu.display()
#Add relevant new items to stage
self.stage.add(toMenu)
self.stage.add(newGroup)
#Finally, move the selector bar #Finally, move the selector bar
(bar_x, bar_y) = self.glossMgr.selector_bar.position_0 (bar_x, bar_y) = self.glossMgr.selector_bar.position_0
self.glossMgr.selector_bar.move_to(bar_x, bar_y, self.timeline) self.glossMgr.selector_bar.move_to(bar_x, bar_y, self.timeline)
toMenu.selectFirst(False) toMenu.selectFirst(False)
self.timeline.start() self.timeline.start()
self.glossMgr.currentMenu = toMenu self.glossMgr.currentMenu = toMenu
def slide_complete(self, timeline, fromMenu): def slide_complete(self, timeline, fromMenu):
self.stage.remove(fromMenu) self.stage.remove(fromMenu)
self.stage.remove(fromMenu.getItemGroup()) self.stage.remove(fromMenu.get_current_item().itemTexturesGroup)

View File

@ -1,6 +1,7 @@
<gloss-theme> <gloss-theme>
<menu id="main"> <menu id="main">
<interface>ListMenu</interface>
<font id="main"> <font id="main">
<face>Tahoma</face> <face>Tahoma</face>
<size id="default">30</size> <size id="default">30</size>
@ -48,7 +49,7 @@
<!-- Used for transitioning between menus --> <!-- Used for transitioning between menus -->
<menu_transition> <menu_transition>
<name>zoom_fade</name> <name>slide</name>
<options>None</options> <options>None</options>
</menu_transition> </menu_transition>