7 raise ImportError('You need gtk and glade')
11 raise ImportError('You need gobject')
15 raise ImportError('You need python-gnome')
17 from looperwidget
import LooperWidget
18 from loopertreeview
import LooperTreeView
19 from gstplayer
import GstPlayer
22 class PyLooper(object):
23 """The main class that creates windows and starts things going."""
25 def __init__(self
, gladefile
=settings
.GLADEFILE
):
26 gnome
.init('PyLooper', '0.1.0')
28 self
.gladefile
= gladefile
29 self
.wTree
= gtk
.glade
.XML(self
.gladefile
)
31 self
.player
= GstPlayer()
33 self
.window
= self
.wTree
.get_widget('app1')
34 self
.looperwidget
= LooperWidget(update_callback
=self
.update_interval
,
36 self
.wTree
.get_widget('vbox1').pack_start(self
.looperwidget
, expand
=False)
38 self
.aboutdialog
= AboutDialog(self
.wTree
)
39 self
.savefilechooserdialog
= SaveFileChooserDialog(self
.wTree
)
40 self
.loopertreeview
= LooperTreeView(self
.wTree
, self
)
41 self
.playpausebutton
= self
.wTree
.get_widget('playpausebutton')
42 self
.openfilechooserbutton
= self
.wTree
.get_widget('openfilechooserbutton')
45 self
.window
.show_all()
47 def connect_all(self
):
49 'gtk_main_quit': self
.exit
,
50 'show_about_dialog': self
.show_about_dialog
,
51 'gtk_widget_destroy': gtk
.Widget
.destroy
,
53 'playpause': self
.playpause
,
56 'delete': self
.loopertreeview
.delete
58 self
.wTree
.signal_autoconnect(connections
)
60 def show_about_dialog(self
, widget
):
61 self
.aboutdialog
.show()
64 def open(self
, widget
):
65 filepath
= self
.openfilechooserbutton
.get_filename()
66 # this ain't great, but it's alright
67 if filepath
and filepath
.endswith('.xml'):
68 self
.loopertreeview
.open(filepath
)
70 self
.player
.status
.filepath
= filepath
71 if self
.player
.status
.filepath
and self
.player
.load():
72 self
.playpausebutton
.set_label('gtk-media-play')
73 self
.loopertreeview
.clear()
74 self
.looperwidget
.set_interval(0, self
.player
.duration
, self
.player
.duration
)
77 def save(self
, widget
):
78 response
, path
= self
.savefilechooserdialog
.show()
79 if response
== gtk
.RESPONSE_OK
:
80 self
.loopertreeview
.save(path
)
83 def playpause(self
, widget
):
84 if widget
.get_label() == 'gtk-media-play':
85 if self
.player
.play():
86 widget
.set_label('gtk-media-pause')
88 if self
.player
.pause():
89 widget
.set_label('gtk-media-play')
92 def add(self
, widget
):
93 self
.loopertreeview
.add(*self
.player
.status
.interval
)
95 def update_interval(self
, begin
=None, end
=None):
96 if begin
is not None and end
is not None:
97 # we were called by loopertreeview, so we should update looperwidget
98 self
.looperwidget
.set_interval(begin
, end
, self
.player
.duration
)
100 # we were called by looperwidget, so we should update the treeview
101 self
.loopertreeview
.update_interval(*self
.looperwidget
.interval(self
.player
.duration
))
103 self
.player
.status
.interval
= self
.looperwidget
.interval(self
.player
.duration
)
104 self
.player
.check_status()
106 def exit(self
, widget
):
109 class AboutDialog(object):
110 def __init__(self
, wTree
):
111 self
.dlg
= wTree
.get_widget('aboutdialog1')
117 class SaveFileChooserDialog(object):
118 def __init__(self
, wTree
):
119 self
.dlg
= wTree
.get_widget('savefilechooserdialog')
120 filter = gtk
.FileFilter()
121 filter.set_name('Saved Loops (XML)')
122 filter.add_pattern('*.xml')
123 self
.dlg
.add_filter(filter)
126 response
= self
.dlg
.run()
127 path
= self
.dlg
.get_filename()
129 return response
, path
131 if __name__
== '__main__':
133 gtk
.gdk
.threads_init()