This development deserves a new version number!
[pylooper.git] / pylooper.py
blob7037e31e243f11635862aa7f616d488a9bd11ff7
1 #!/usr/bin/python
3 try:
4 import gtk
5 import gtk.glade
6 except:
7 raise ImportError('You need gtk and glade')
8 try:
9 import gobject
10 except:
11 raise ImportError('You need gobject')
12 try:
13 import gnome.ui
14 except:
15 raise ImportError('You need python-gnome')
17 from looperwidget import LooperWidget
18 from loopertreeview import LooperTreeView
19 from gstplayer import GstPlayer
20 import settings
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,
35 player=self.player)
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')
44 self.connect_all()
45 self.window.show_all()
47 def connect_all(self):
48 connections = {
49 'gtk_main_quit': self.exit,
50 'show_about_dialog': self.show_about_dialog,
51 'gtk_widget_destroy': gtk.Widget.destroy,
52 'open': self.open,
53 'playpause': self.playpause,
54 'add': self.add,
55 'save': self.save,
56 'delete': self.loopertreeview.delete
58 self.wTree.signal_autoconnect(connections)
60 def show_about_dialog(self, widget):
61 self.aboutdialog.show()
62 return True
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)
69 else:
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)
75 return True
77 def save(self, widget):
78 response, path = self.savefilechooserdialog.show()
79 if response == gtk.RESPONSE_OK:
80 self.loopertreeview.save(path)
81 return True
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')
87 else:
88 if self.player.pause():
89 widget.set_label('gtk-media-play')
90 return True
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)
99 else:
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):
107 gtk.main_quit()
109 class AboutDialog(object):
110 def __init__(self, wTree):
111 self.dlg = wTree.get_widget('aboutdialog1')
113 def show(self):
114 self.dlg.run()
115 self.dlg.hide()
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)
125 def show(self):
126 response = self.dlg.run()
127 path = self.dlg.get_filename()
128 self.dlg.hide()
129 return response, path
131 if __name__ == '__main__':
132 window = PyLooper()
133 gtk.gdk.threads_init()
134 gtk.main()