]> git.sesse.net Git - vlc/blob - bindings/python-ctypes/vlcwidget.py
phonon: Allow building against kdesupport libphonon.
[vlc] / bindings / python-ctypes / vlcwidget.py
1 #! /usr/bin/python
2
3 """VLC Widget classes.
4
5 This module provides two helper classes, to ease the embedding of a
6 VLC component inside a pygtk application.
7
8 VLCWidget is a simple VLC widget.
9
10 DecoratedVLCWidget provides simple player controls.
11
12 $Id$
13 """
14
15 import gtk
16 import sys
17 import vlc
18
19 from gettext import gettext as _
20
21 # Create a single vlc.Instance() to be share by (possible) multiple players.
22 instance=vlc.Instance()
23
24 class VLCWidget(gtk.DrawingArea):
25     """Simple VLC widget.
26
27     Its player can be controlled through the 'player' attribute, which
28     is a vlc.MediaPlayer() instance.
29     """
30     def __init__(self, *p):
31         gtk.DrawingArea.__init__(self)
32         self.player=instance.media_player_new()
33         def handle_embed(*args):
34             if sys.platform == 'win32':
35                 self.player.set_hwnd(self.window.handle)
36             else:
37                 self.player.set_xwindow(self.window.xid)
38             return True
39         self.connect("map-event", handle_embed)
40         self.set_size_request(320, 200)
41
42 class DecoratedVLCWidget(gtk.VBox):
43     """Decorated VLC widget.
44
45     VLC widget decorated with a player control toolbar.
46
47     Its player can be controlled through the 'player' attribute, which
48     is a MediaControl instance.
49     """
50     def __init__(self, *p):
51         gtk.VBox.__init__(self)
52         self._vlc_widget=VLCWidget(*p)
53         self.player=self._vlc_widget.player
54         self.pack_start(self._vlc_widget, expand=True)
55         self._toolbar = self.get_player_control_toolbar()
56         self.pack_start(self._toolbar, expand=False)
57
58     def get_player_control_toolbar(self):
59         """Return a player control toolbar
60         """
61         tb=gtk.Toolbar()
62         tb.set_style(gtk.TOOLBAR_ICONS)
63
64         tb_list = (
65             (_("Play"), _("Play"), gtk.STOCK_MEDIA_PLAY, lambda b: self.player.play()),
66             (_("Pause"), _("Pause"), gtk.STOCK_MEDIA_PAUSE, lambda b: self.player.pause()),
67             (_("Stop"), _("Stop"), gtk.STOCK_MEDIA_STOP, lambda b: self.player.stop()),
68             (_("Quit"), _("Quit"), gtk.STOCK_QUIT, lambda b: gtk.main_quit()),
69             )
70
71         for text, tooltip, stock, callback in tb_list:
72             b=gtk.ToolButton(stock)
73             b.connect("clicked", callback)
74             tb.insert(b, -1)
75         tb.show_all()
76         return tb
77
78 class VideoPlayer:
79     """Example simple video player.
80     """
81     def __init__(self):
82         self.vlc = DecoratedVLCWidget()
83
84     def main(self, fname):
85         self.vlc.player.set_media(instance.media_new(fname))
86         self.popup()
87         gtk.main()
88
89     def popup(self):
90         w=gtk.Window()
91         w.add(self.vlc)
92         w.show_all()
93         w.connect("destroy", gtk.main_quit)
94         return w
95
96 class MultiVideoPlayer:
97     """Example multi-video player.
98
99     It plays multiple files side-by-side, with per-view and global controls.
100     """
101     def main(self, filenames):
102         # Build main window
103         window=gtk.Window()
104         mainbox=gtk.VBox()
105         videos=gtk.HBox()
106
107         window.add(mainbox)
108         mainbox.add(videos)
109
110         # Create VLC widgets
111         for fname in filenames:
112             v=DecoratedVLCWidget()
113             v.player.set_media(instance.media_new(fname))
114             videos.add(v)
115
116         # Create global toolbar
117         tb=gtk.Toolbar()
118         tb.set_style(gtk.TOOLBAR_ICONS)
119
120         def execute(b, methodname):
121             """Execute the given method on all VLC widgets.
122             """
123             for v in videos.get_children():
124                 getattr(v.player, methodname)()
125             return True
126
127         for text, tooltip, stock, callback, arg in (
128             (_("Play"), _("Play"), gtk.STOCK_MEDIA_PLAY, execute, "play"),
129             (_("Pause"), _("Pause"), gtk.STOCK_MEDIA_PAUSE, execute, "pause"),
130             (_("Stop"), _("Stop"), gtk.STOCK_MEDIA_STOP, execute, "stop"),
131             (_("Quit"), _("Quit"), gtk.STOCK_QUIT, lambda b, d: gtk.main_quit(), None),
132             ):
133             b=gtk.ToolButton(stock)
134             b.connect("clicked", callback, arg)
135             tb.insert(b, -1)
136
137         mainbox.pack_start(tb, expand=False)
138
139         window.show_all()
140         window.connect("destroy", gtk.main_quit)
141         gtk.main()
142
143 if __name__ == '__main__':
144     if not sys.argv[1:]:
145        print "You must provide at least 1 movie filename"
146        sys.exit(1)
147     if len(sys.argv[1:]) == 1:
148         # Only 1 file. Simple interface
149         p=VideoPlayer()
150         p.main(sys.argv[1])
151     else:
152         # Multiple files.
153         p=MultiVideoPlayer()
154         p.main(sys.argv[1:])