(no commit message)
[drlaunch] / drlaunch / src / about0.py
1 #!/usr/bin/env python
2 # coding=UTF-8
3 #
4 # gPodder - A media aggregator and podcast client
5 # Copyright (c) 2005-2010 Thomas Perl and the gPodder Team
6 #
7 # gPodder is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # gPodder is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #
20
21 # Python implementation of HeAboutDialog from hildon-extras
22 # Copyright (c) 2010-04-11 Thomas Perl <thp@thpinfo.com>
23
24 import hildon
25 import gtk
26 import dbus
27
28 _ = str
29
30 class HeAboutDialog(gtk.Dialog):
31     RESPONSE_WEBSITE, \
32     RESPONSE_BUGTRACKER, \
33     RESPONSE_DONATE = range(3)
34
35     def __init__(self):
36         gtk.Dialog.__init__(self)
37
38         self.website_url = None
39         self.bugtracker_url = None
40         self.donate_url = None
41
42         self.set_title(_('About'))
43
44         self.image_icon = gtk.Image()
45         self.label_app_name = gtk.Label()
46         self.label_version = gtk.Label()
47         self.label_description = gtk.Label()
48         self.label_copyright = gtk.Label()
49         self.table_layout = gtk.Table(3, 3, False)
50
51         hildon.hildon_helper_set_logical_font(self.label_app_name, 'X-LargeSystemFont')
52         hildon.hildon_helper_set_logical_font(self.label_version, 'LargeSystemFont')
53         hildon.hildon_helper_set_logical_font(self.label_copyright, 'SmallSystemFont')
54         hildon.hildon_helper_set_logical_color(self.label_copyright, gtk.RC_FG, gtk.STATE_NORMAL, 'SecondaryTextColor')
55
56         self.label_app_name.set_alignment(0, 1)
57         self.label_version.set_alignment(0, 1)
58         self.label_description.set_alignment(0, 0)
59         self.label_copyright.set_alignment(0, 1)
60         self.label_version.set_padding(10, 0)
61         self.label_copyright.set_padding(0, 5)
62         self.image_icon.set_padding(5, 5)
63
64         #content_area = self.get_content_area() # Starting with PyGTK 2.14
65         self.set_size_request(800,800)
66         pa=hildon.PannableArea()
67         pa.set_property('mov-mode', 
68                 hildon.MOVEMENT_MODE_HORIZ | hildon.MOVEMENT_MODE_VERT )
69         vbox=gtk.VBox()
70         self.vbox.add(pa)
71         pa.add_with_viewport(vbox)
72         content_area = vbox
73
74         self.table_layout.attach(self.image_icon, 0, 1, 0, 2, 0, gtk.EXPAND, 0, 0)
75         self.table_layout.attach(self.label_app_name, 1, 2, 0, 1, 0, gtk.EXPAND | gtk.FILL, 0, 0)
76         self.table_layout.attach(self.label_version, 2, 3, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
77         self.table_layout.attach(self.label_description, 1, 3, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
78         self.table_layout.attach(self.label_copyright, 0, 3, 2, 3, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
79         content_area.add(self.table_layout)
80         self.connect('response', self._on_response)
81         self.show_all()
82
83     def _on_response(self, dialog, response_id):
84         if response_id == HeAboutDialog.RESPONSE_WEBSITE:
85             self.open_webbrowser(self.website_url)
86         elif response_id == HeAboutDialog.RESPONSE_BUGTRACKER:
87             self.open_webbrowser(self.bugtracker_url)
88         elif response_id == HeAboutDialog.RESPONSE_DONATE:
89             self.open_webbrowser(self.donate_url)
90
91     def set_app_name(self, app_name):
92         self.label_app_name.set_text(app_name)
93         self.set_title(_('About %s') % app_name)
94
95     def set_icon_name(self, icon_name):
96         self.image_icon.set_from_icon_name(icon_name, gtk.ICON_SIZE_DIALOG)
97
98     def set_version(self, version):
99         self.label_version.set_text(version)
100
101     def set_description(self, description):
102         self.label_description.set_text(description)
103
104     def set_copyright(self, copyright):
105         self.label_copyright.set_text(copyright)
106
107     def set_website(self, url):
108         if self.website_url is None:
109             self.add_button(_('Visit website'), HeAboutDialog.RESPONSE_WEBSITE)
110         self.website_url = url
111
112     def set_bugtracker(self, url):
113         if self.bugtracker_url is None:
114             self.add_button(_('Report bug'), HeAboutDialog.RESPONSE_BUGTRACKER)
115         self.bugtracker_url = url
116
117     def set_donate_url(self, url):
118         if self.donate_url is None:
119             self.add_button(_('Donate'), HeAboutDialog.RESPONSE_DONATE)
120         self.donate_url = url
121
122     def open_webbrowser(self, url):
123         bus = dbus.SessionBus()
124         proxy = bus.get_object('com.nokia.osso_browser', '/com/nokia/osso_browser/request', 'com.nokia.osso_browser')
125         proxy.load_url(url, dbus_interface='com.nokia.osso_browser')
126
127     @classmethod
128     def present(cls, parent=None, app_name=None, icon_name=None, \
129             version=None, description=None, copyright=None, \
130             website_url=None, bugtracker_url=None, donate_url=None):
131         ad = cls()
132
133         if parent is not None:
134             ad.set_transient_for(parent)
135             ad.set_destroy_with_parent(True)
136
137         if app_name is not None:
138             ad.set_app_name(app_name)
139
140         ad.set_icon_name(icon_name)
141         ad.set_version(version)
142         ad.set_description(description)
143         ad.set_copyright(copyright)
144
145         if website_url is not None:
146             ad.set_website(website_url)
147
148         if bugtracker_url is not None:
149             ad.set_bugtracker(bugtracker_url)
150
151         if donate_url is not None:
152             ad.set_donate_url(donate_url)
153
154         ad.run()
155         ad.destroy()
156