8babaf5ce73cfad87bf5288d1a7ce7e61c5a94c9
[jamaendo] / jamaui / ui.py
1 import os, sys
2 import gtk
3 import gobject
4 import util
5 import logging
6
7 import ossohelper
8
9 gobject.threads_init()
10
11 log = logging.getLogger(__name__)
12
13 try:
14     import hildon
15 except:
16     if util.platform == 'maemo':
17         log.critical('Using GTK widgets, install "python2.5-hildon" '
18             'for this to work properly.')
19     else:
20         log.critical('This ui only works in maemo')
21         sys.exit(1)
22
23 from dbus.mainloop.glib import DBusGMainLoop
24
25 DBusGMainLoop(set_as_default=True)
26
27 from playerwindow import open_playerwindow
28 from search import SearchWindow
29
30 class ArtistWindow(hildon.StackableWindow):
31     def __init__(self):
32         hildon.StackableWindow.__init__(self)
33         self.set_title("View Artist")
34
35         label = gtk.Label("Artist information")
36         vbox = gtk.VBox(False, 0)
37         vbox.pack_start(label, True, True, 0)
38         self.add(vbox)
39
40 class AlbumWindow(hildon.StackableWindow):
41     def __init__(self):
42         hildon.StackableWindow.__init__(self)
43         self.set_title("View Album")
44
45         label = gtk.Label("Album information")
46         vbox = gtk.VBox(False, 0)
47         vbox.pack_start(label, True, True, 0)
48         self.add(vbox)
49
50 class RadiosWindow(hildon.StackableWindow):
51     def __init__(self):
52         hildon.StackableWindow.__init__(self)
53         self.set_title("Radios")
54
55         label = gtk.Label("Radios")
56         vbox = gtk.VBox(False, 0)
57         vbox.pack_start(label, True, True, 0)
58         self.add(vbox)
59
60 class FeaturedWindow(hildon.StackableWindow):
61     def __init__(self):
62         hildon.StackableWindow.__init__(self)
63         self.set_title("Featured")
64
65         label = gtk.Label("featured")
66         vbox = gtk.VBox(False, 0)
67         vbox.pack_start(label, True, True, 0)
68         self.add(vbox)
69
70 class PlaylistsWindow(hildon.StackableWindow):
71     def __init__(self):
72         hildon.StackableWindow.__init__(self)
73         self.set_title("Playlists")
74
75         label = gtk.Label("playlists")
76         vbox = gtk.VBox(False, 0)
77         vbox.pack_start(label, True, True, 0)
78         self.add(vbox)
79
80 class FavoritesWindow(hildon.StackableWindow):
81     def __init__(self):
82         hildon.StackableWindow.__init__(self)
83         self.set_title("Favorites")
84
85         label = gtk.Label("favorites")
86         vbox = gtk.VBox(False, 0)
87         vbox.pack_start(label, True, True, 0)
88         self.add(vbox)
89
90 class Jamaui(object):
91     _BG = 'bg.png' # /opt/jamaendo/data/bg.png
92
93     def __init__(self):
94         self.app = None
95         self.menu = None
96         self.window = None
97
98     def create_window(self):
99         self.app = hildon.Program()
100         self.window = hildon.StackableWindow()
101         self.app.add_window(self.window)
102
103         self.window.set_title("jamaendo")
104         self.window.connect("destroy", self.destroy)
105
106     def create_menu(self):
107         self.menu = hildon.AppMenu()
108
109         #search = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
110         #search.set_label("Search")
111         #search.connect("clicked", self.on_search)
112         #self.menu.append(search)
113
114         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
115         player.set_label("Open player")
116         player.connect("clicked", self.on_player)
117         self.menu.append(player)
118
119         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
120         player.set_label("Favorites")
121         player.connect("clicked", self.on_favorites)
122         self.menu.append(player)
123
124         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
125         player.set_label("Playlists")
126         player.connect("clicked", self.on_playlists)
127         self.menu.append(player)
128
129         # Don't use localdb ATM
130         #refresh = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
131         #refresh.set_label("Refresh")
132         #refresh.connect("clicked", self.on_refresh)
133         #self.menu.append(refresh)
134
135         menu_about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
136         menu_about.set_label("About")
137         menu_about.connect("clicked", self.show_about, self.window)
138         self.menu.append(menu_about)
139         gtk.about_dialog_set_url_hook(self.open_link, None)
140
141         self.menu.show_all()
142         self.window.set_app_menu(self.menu)
143
144     def find_resource(self, name):
145         if os.path.isfile(os.path.join('data', name)):
146             return os.path.join('data', name)
147         elif os.path.isfile(os.path.join('/opt/jaemendo', name)):
148             return os.path.join('/opt/jaemendo', name)
149         elif os.path.isfile(os.path.join('/usr/share/jaemendo', name)):
150             return os.path.join('/usr/share/jaemendo', name)
151         else:
152             return None
153
154     def setup_widgets(self):
155         bgimg = self.find_resource(self._BG)
156         if bgimg:
157             background, mask = gtk.gdk.pixbuf_new_from_file(bgimg).render_pixmap_and_mask()
158             self.window.realize()
159             self.window.window.set_back_pixmap(background, False)
160
161         bbox = gtk.HButtonBox()
162         alignment = gtk.Alignment(xalign=0.2, yalign=0.925, xscale=1.0)
163         alignment.add(bbox)
164         bbox.set_property('layout-style', gtk.BUTTONBOX_SPREAD)
165         self.bbox = bbox
166         self.window.add(alignment)
167
168         self.add_mainscreen_button("Featured", "Most listened to", self.on_featured)
169         self.add_mainscreen_button("Radios", "The best in free music", self.on_radios)
170         self.add_mainscreen_button("Search", "Search for artists/albums", self.on_search)
171
172         self.window.show_all()
173
174     def add_mainscreen_button(self, title, subtitle, callback):
175         btn = hildon.Button(gtk.HILDON_SIZE_THUMB_HEIGHT,
176                             hildon.BUTTON_ARRANGEMENT_VERTICAL)
177         btn.set_text(title, subtitle)
178         btn.set_property('width-request', 225)
179         btn.connect('clicked', callback)
180         self.bbox.add(btn)
181
182     def destroy(self, widget):
183         gtk.main_quit()
184
185     def show_about(self, w, win):
186         dialog = gtk.AboutDialog()
187         dialog.set_website("http://github.com/krig")
188         dialog.set_website_label("http://github.com/krig")
189         dialog.set_authors(("Kristoffer Gronlund (Purple Scout AB)",))
190         dialog.set_comments("""Jamaendo plays music from the music catalog of JAMENDO.
191
192 JAMENDO is an online platform that distributes musical works under Creative Commons licenses.""")
193         dialog.set_version('')
194         dialog.run()
195         dialog.destroy()
196
197     def open_link(self, d, url, data):
198         import webbrowser
199         webbrowser.open_new(url)
200
201
202     #def on_refresh(self, button):
203     #    dialog = RefreshDialog()
204     #    dialog.show_all()
205     #    dialog.run()
206     #    dialog.hide()
207
208     def on_featured(self, button):
209         self.featuredwnd = FeaturedWindow()
210         self.featuredwnd.show_all()
211
212     def on_radios(self, button):
213         self.radioswnd = RadiosWindow()
214         self.radioswnd.show_all()
215
216     def on_search(self, button):
217         self.searchwnd = SearchWindow()
218         self.searchwnd.show_all()
219
220     def on_playlists(self, button):
221         self.playlistswnd = PlaylistsWindow()
222         self.playlistswnd.show_all()
223
224     def on_favorites(self, button):
225         self.favoriteswnd = FavoritesWindow()
226         self.favoriteswnd.show_all()
227
228     def on_player(self, button):
229         open_playerwindow([])
230
231     '''
232     def on_search(self, button):
233         if self.searchbar:
234             self.searchbar.show()
235         else:
236             self.searchstore = gtk.ListStore(gobject.TYPE_STRING)
237             iter = self.searchstore.append()
238             self.searchstore.set(iter, 0, "Test1")
239             iter = self.searchstore.append()
240             self.searchstore.set(iter, 0, "Test2")
241             self.searchbar = hildon.FindToolbar("Search", self.searchstore, 0)
242             self.searchbar.set_active(0)
243             self.window.add_toolbar(self.searchbar)
244             self.searchbar.show()
245     '''
246
247     def run(self):
248         ossohelper.application_init('org.jamaendo', '0.1')
249         self.create_window()
250         self.create_menu()
251         self.setup_widgets()
252         self.window.show_all()
253         gtk.main()
254         ossohelper.application_exit()
255
256 if __name__=="__main__":
257     ui = Jamaui()
258     ui.run()
259