Advertisement
NoxDeleo

Untitled

Feb 9th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.17 KB | None | 0 0
  1. import gi
  2. gi.require_version('Clutter', '1.0')
  3. gi.require_version('GObject', '2.0')
  4. gi.require_version('Mx', '1.0')
  5. from gi.repository import Clutter, GObject, Mx
  6.  
  7. GObject.threads_init()
  8. Clutter.init(None)
  9.  
  10.  
  11. class GUI:
  12.  
  13.     def __init__(self, tracks):
  14.         self.application, args = Mx.Application.new([], 'AudioVox', 0)
  15.         self.window = self.application.create_window()
  16.         self.window.set_window_size(1360, 668)
  17.         self.window.set_has_toolbar(False)
  18.         self.stage = self.window.get_clutter_stage()
  19.        
  20.         self.viewport = Clutter.ScrollActor()
  21.         Clutter.Container.add_actor(self.stage, self.viewport)
  22.        
  23.         self.library_view_area = Clutter.Rect()
  24.         self.library_view_area.init(0, 0, 1360, 668)
  25.        
  26.         self.normal_view_area = Clutter.Rect()
  27.         self.normal_view_area.init(620, 0, 1360, 668)
  28.        
  29.         self.voip_view_area = Clutter.Rect()
  30.         self.voip_view_area.init(2280, 0, -1360, 668)
  31.        
  32.         self.viewport.scroll_to_rect(self.normal_view_area)
  33.        
  34.         self.viewport.set_easing_duration(500)
  35.        
  36.         playlist = Mx.Label.new_with_text('playlist')
  37.         controls = Mx.Label.new_with_text('controls')
  38.         voip = Mx.Label.new_with_text('voip')
  39.         self.viewport.add_child(playlist)
  40.         self.viewport.add_child(controls)
  41.         self.viewport.add_child(voip)
  42.        
  43.         playlist.set_position(680, 0)
  44.         controls.set_position(1360, 0)
  45.         voip.set_position(2040, 0)
  46.        
  47.         bgcolor = Clutter.Color.new(76, 76, 255, 255)
  48.         self.stage.set_color(bgcolor)
  49.        
  50.         self.library_view = LibraryView(tracks)
  51.         self.viewport.add_child(self.library_view)
  52.         self.library_view.set_position(0, 0)
  53.        
  54.         self.lp_toolbar = LibraryPlaylistToolbar()
  55.         self.viewport.add_child(self.lp_toolbar)
  56.         self.lp_toolbar.set_position(620, 0)
  57.         self.lp_toolbar.connect('view-toggled', self.on_toggle_library)
  58.        
  59.         self.pv_toolbar = PlaylistVOIPToolbar()
  60.         self.viewport.add_child(self.pv_toolbar)
  61.         self.pv_toolbar.set_position(1920, 0)
  62.         self.pv_toolbar.connect('view-toggled', self.on_toggle_voip)
  63.        
  64.         Mx.Style.get_default().load_from_file('assets/style.css')
  65.        
  66.         self.window.show()
  67.        
  68.         self.application.run()
  69.    
  70.     def on_toggle_library(self, actor, show_library):
  71.         if show_library:
  72.             self.viewport.scroll_to_rect(self.library_view_area)
  73.         else:
  74.             self.viewport.scroll_to_rect(self.normal_view_area)
  75.    
  76.     def on_toggle_voip(self, actor, show_voip):
  77.         if show_voip:
  78.             self.viewport.scroll_to_rect(self.voip_view_area)
  79.         else:
  80.             self.viewport.scroll_to_rect(self.normal_view_area)
  81.  
  82.  
  83. class LibraryPlaylistToolbar(Mx.BoxLayout):
  84.    
  85.     __gsignals__ = {
  86.         "view-toggled": (GObject.SIGNAL_RUN_FIRST, None, (bool,))
  87.     }
  88.    
  89.     def __init__(self):
  90.         super(Mx.BoxLayout, self).__init__()
  91.        
  92.         self.set_size(60, 668)
  93.         self.set_orientation(Mx.Orientation.VERTICAL)
  94.         self.set_style_class('LibraryPlaylistToolbar')
  95.        
  96.         toggle_library = Mx.Button()
  97.         toggle_library.set_style_class('Toggle')
  98.         toggle_library.set_size(60, 60)
  99.         toggle_library.set_pivot_point(0.5, 0.5)
  100.         toggle_library.set_is_toggle(True)
  101.         toggle_library.connect('clicked', self.on_toggle_library)
  102.         toggle_library.set_position(0, 300)
  103.         self.add_actor(toggle_library, 1)
  104.         #toggle_library.set_background_color(Clutter.Color.new(255, 0, 0, 255))
  105.        
  106.         self.add_track_button = Mx.Button()
  107.         self.add_track_button.set_size(60, 60)
  108.         self.add_actor(self.add_track_button, 1)
  109.    
  110.     def on_toggle_library(self, button):
  111.         self.emit('view-toggled', button.get_toggled())
  112.         button.set_easing_duration(500)
  113.         if button.get_toggled():
  114.             button.set_rotation_angle(Clutter.RotateAxis.Z_AXIS, 180)
  115.         else:
  116.             button.set_rotation_angle(Clutter.RotateAxis.Z_AXIS, 360)
  117.  
  118.  
  119. class LibraryView(Mx.Widget):
  120.  
  121.     active_item = GObject.Property(type=Clutter.Actor, flags=GObject.PARAM_READWRITE)
  122.    
  123.     def __init__(self, tracks):
  124.         super(Mx.Widget, self).__init__()
  125.        
  126.         self.set_style_class('LibraryView')
  127.        
  128.         self.set_size(620, 668)
  129.        
  130.         self.search = Mx.Entry.new_with_text('Search Song/Artist/Album')
  131.         self.search.set_width(550)
  132.         self.search.set_position(5, 5)
  133.         self.add_child(self.search)
  134.        
  135.         self.scrollview = Mx.ScrollView()
  136.         self.scrollview.set_size(620, 628)
  137.         self.scrollview.set_position(0, 40)
  138.         self.scrollview.set_scroll_policy(Mx.ScrollPolicy.VERTICAL)
  139.         self.add_child(self.scrollview)
  140.        
  141.         self.view = Mx.ItemView()
  142.         self.scrollview.set_child(self.view)
  143.        
  144.         types = [str, str, str, str, str, str, int]
  145.         names = ['id', 'uri', 'Title', 'Artist', 'Album', 'Genre', 'Duration']
  146.         self.model = Clutter.ListModel.newv(types, names)
  147.        
  148.         self.view.set_homogenous_rows(True)
  149.         self.view.set_homogenous_columns(True)
  150.         self.view.set_row_spacing(20)
  151.         self.view.set_column_spacing(20)
  152.        
  153.         self.view.set_model(self.model)
  154.         self.view.add_attribute('oid', 0)
  155.         self.view.add_attribute('uri', 1)
  156.         self.view.add_attribute('title', 2)
  157.         self.view.add_attribute('artist', 3)
  158.         self.view.add_attribute('album', 4)
  159.         self.view.add_attribute('genre', 5)
  160.         self.view.add_attribute('duration', 6)
  161.         self.view.connect('actor-added', self.on_new_item)
  162.        
  163.         self.highlight_effect = Clutter.ColorizeEffect.new(Clutter.Color.new(174, 143, 0, 255))
  164.        
  165.         #self.view.set_item_type(LibraryViewGridItem)
  166.         self.view.set_item_type(LibraryViewListItem)
  167.        
  168.         for track in tracks.find():
  169.             try:
  170.                 if track['artist'] == 'Epic Games':
  171.                     columns = [0, 1, 2, 3, 4, 5, 6]
  172.                     values = [str(track['_id']), track['uri'], track['title'], track['artist'], track['album'], track['genre'], track['duration']]
  173.                     self.model.appendv(columns, values)
  174.             except KeyError:
  175.                 # TODO: Handle this.
  176.                 pass
  177.    
  178.     def do_paint(self):
  179.         for child in self.get_children():
  180.             child.paint()
  181.    
  182.     def on_new_item(self, container, actor, *user_data):
  183.         actor.connect('selected', self.on_item_selected)
  184.    
  185.     def on_item_selected(self, actor):
  186.         if self.get_property('active-item'):
  187.             self.get_property('active-item').remove_effect(self.highlight_effect)
  188.        
  189.         self.set_property('active-item', actor)
  190.         actor.add_effect(self.highlight_effect)
  191.  
  192. class LibraryViewGridItem(Mx.Stack):
  193.  
  194.     oid = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  195.     uri = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  196.     title = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  197.     artist = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  198.     album = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  199.     genre = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  200.     duration = GObject.Property(type=int, default=0, flags=GObject.PARAM_READWRITE)
  201.    
  202.     __gsignals__ = {
  203.         "selected": (GObject.SIGNAL_RUN_FIRST, None, ())
  204.     }
  205.    
  206.     def __init__(self):
  207.         super(Mx.Stack, self).__init__()
  208.        
  209.         self.set_size(175, 175)
  210.         white = Clutter.Color.new(255, 255, 255, 255)
  211.         self.set_background_color(white)
  212.        
  213.         art = Mx.Image()
  214.         art.set_from_file_at_size('assets/blank_cd.svg', self.get_width(), self.get_height())
  215.         art.set_x_align(Clutter.ActorAlign.CENTER)
  216.         art.set_y_align(Clutter.ActorAlign.CENTER)
  217.         self.add_actor(art)
  218.        
  219.         label_layout = Mx.Table()
  220.         label_layout.set_width(self.get_width())
  221.         label_layout.set_row_spacing(1)
  222.         label_bg_color = Clutter.Color.new(0, 0, 0, 150)
  223.         label_layout.set_background_color(label_bg_color)
  224.         label_layout.set_y_align(Clutter.ActorAlign.END)
  225.         self.add_actor(label_layout)
  226.        
  227.         self.label_title = Mx.Label()
  228.         self.label_artist = Mx.Label()
  229.         self.label_album = Mx.Label()
  230.         self.label_genre = Mx.Label()
  231.         self.label_duration = Mx.Label()
  232.        
  233.         self.label_title.set_line_wrap(False)
  234.         self.label_artist.set_line_wrap(False)
  235.         self.label_album.set_line_wrap(False)
  236.         self.label_genre.set_line_wrap(False)
  237.         self.label_duration.set_line_wrap(False)
  238.        
  239.         label_layout.add_actor(self.label_title, 1, 1)
  240.         label_layout.add_actor(self.label_artist, 2, 1)
  241.         label_layout.add_actor(self.label_album, 3, 1)
  242.         label_layout.add_actor(self.label_genre, 4, 1)
  243.         label_layout.add_actor(self.label_duration, 5, 1)
  244.        
  245.         click_action = Clutter.ClickAction.new()
  246.         click_action.connect('clicked', self.on_clicked)
  247.         self.add_action(click_action)
  248.         self.set_reactive(True)
  249.        
  250.         self.bind_property('title', self.label_title, 'text', GObject.BindingFlags.DEFAULT)
  251.         self.bind_property('artist', self.label_artist, 'text', GObject.BindingFlags.DEFAULT)
  252.         self.bind_property('album', self.label_album, 'text', GObject.BindingFlags.DEFAULT)
  253.         self.bind_property('genre', self.label_genre, 'text', GObject.BindingFlags.DEFAULT)
  254.         self.bind_property('duration', self.label_duration, 'text', GObject.BindingFlags.DEFAULT)
  255.    
  256.     def on_clicked(self, action, actor, *user_data):
  257.         self.emit('selected')
  258.  
  259.  
  260. class LibraryViewListItem(Mx.BoxLayout):
  261.  
  262.     oid = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  263.     uri = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  264.     title = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  265.     artist = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  266.     album = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  267.     genre = GObject.Property(type=str, default='', flags=GObject.PARAM_READWRITE)
  268.     duration = GObject.Property(type=int, default=0, flags=GObject.PARAM_READWRITE)
  269.    
  270.     __gsignals__ = {
  271.         "selected": (GObject.SIGNAL_RUN_FIRST, None, ())
  272.     }
  273.  
  274.     def __init__(self):
  275.         super(Mx.BoxLayout, self).__init__()
  276.        
  277.         self.set_size(600, 60)
  278.         self.set_spacing(5)
  279.        
  280.         self.set_style_class('LibraryViewListItem')
  281.        
  282.         art = Mx.Image()
  283.         art.set_from_file_at_size('assets/blank_cd.svg', self.get_height(), self.get_height())
  284.         art.set_x_align(Clutter.ActorAlign.CENTER)
  285.         art.set_y_align(Clutter.ActorAlign.CENTER)
  286.         self.add_actor(art, 0)
  287.        
  288.         self.label_title = Mx.Label()
  289.         self.label_artist = Mx.Label()
  290.         self.label_album = Mx.Label()
  291.         self.label_genre = Mx.Label()
  292.         self.label_duration = Mx.Label()
  293.        
  294.         # TODO: Is this default? Remove if so.
  295.         self.label_title.set_line_wrap(True)
  296.         self.label_artist.set_line_wrap(True)
  297.         self.label_album.set_line_wrap(True)
  298.         self.label_genre.set_line_wrap(True)
  299.         self.label_duration.set_line_wrap(True)
  300.        
  301.         self.add_actor(self.label_title, 1)
  302.         self.add_actor(self.label_artist, 2)
  303.         self.add_actor(self.label_album, 3)
  304.         self.add_actor(self.label_genre, 4)
  305.         self.add_actor(self.label_duration, 5)
  306.        
  307.         click_action = Clutter.ClickAction.new()
  308.         click_action.connect('clicked', self.on_clicked)
  309.         self.add_action(click_action)
  310.         self.set_reactive(True)
  311.        
  312.         self.bind_property('title', self.label_title, 'text', GObject.BindingFlags.DEFAULT)
  313.         self.bind_property('artist', self.label_artist, 'text', GObject.BindingFlags.DEFAULT)
  314.         self.bind_property('album', self.label_album, 'text', GObject.BindingFlags.DEFAULT)
  315.         self.bind_property('genre', self.label_genre, 'text', GObject.BindingFlags.DEFAULT)
  316.         self.bind_property('duration', self.label_duration, 'text', GObject.BindingFlags.DEFAULT)
  317.    
  318.     def on_clicked(self, action, actor, *user_data):
  319.         self.emit('selected')
  320.  
  321.  
  322. class PlaylistView(Clutter.Actor):
  323.    
  324.     def __init__(self):
  325.         super(Clutter.Actor, self).__init__()
  326.        
  327.         self.model = types = [str, str, str, str, str, str, int]
  328.         names = ['id', 'uri', 'Title', 'Artist', 'Album', 'Genre', 'Duration']
  329.         self.model = Clutter.ListModel.newv(types, names)
  330.  
  331.  
  332. class PlaylistVOIPToolbar(Mx.BoxLayout):
  333.  
  334.     #view_toggled = GObject.Signal(arg_types=(bool,), return_type=None, flags=GObject.SIGNAL_RUN_FIRST)
  335.    
  336.     __gsignals__ = {
  337.         "view-toggled": (GObject.SIGNAL_RUN_FIRST, None, (bool,))
  338.     }
  339.    
  340.     def __init__(self):
  341.         super(Mx.BoxLayout, self).__init__()
  342.        
  343.         self.set_size(60, 668)
  344.         self.set_orientation(Mx.Orientation.VERTICAL)
  345.         self.set_style_class('PlaylistVOIPToolbar')
  346.        
  347.         toggle_voip = Mx.Button()
  348.         toggle_voip.set_style_class('Toggle')
  349.         toggle_voip.set_size(60, 60)
  350.         toggle_voip.set_pivot_point(0.5, 0.5)
  351.         toggle_voip.set_is_toggle(True)
  352.         toggle_voip.connect('clicked', self.on_toggle_voip)
  353.         toggle_voip.set_position(0, 300)
  354.         self.add_actor(toggle_voip, 1)
  355.    
  356.     def on_toggle_voip(self, button):
  357.         self.emit('view-toggled', button.get_toggled())
  358.         button.set_easing_duration(500)
  359.         if button.get_toggled():
  360.             button.set_rotation_angle(Clutter.RotateAxis.Z_AXIS, 180)
  361.         else:
  362.             button.set_rotation_angle(Clutter.RotateAxis.Z_AXIS, 360)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement