Merge lp:~elachuni/software-center/pep8-test-part10 into lp:software-center
- pep8-test-part10
- Merge into trunk
Proposed by
Anthony Lenton
Status: | Merged |
---|---|
Merged at revision: | 2853 |
Proposed branch: | lp:~elachuni/software-center/pep8-test-part10 |
Merge into: | lp:software-center |
Diff against target: |
1214 lines (+179/-183) 2 files modified
softwarecenter/ui/gtk3/views/appdetailsview.py (+178/-182) test/test_pep8.py (+1/-1) |
To merge this branch: | bzr merge lp:~elachuni/software-center/pep8-test-part10 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Gary Lasker (community) | Approve | ||
Review via email: mp+97540@code.launchpad.net |
Commit message
Description of the change
This branch makes a single (large) file pass the pep8 test, softwarecenter/
There were a couple of places where splitting long lines got tricky:
- Lines 120-125 of the diff, I chose to make a variable name shorter. I think my second option would have been to use a backslash to cut the line before the last period.
- Lines 628-630 of the diff, here I preferred to create a new local variable. I think my second option again would have been to use a backslash before the last period. In both cases I'm a bit on the fence and open to suggestions, let me know what you think.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'softwarecenter/ui/gtk3/views/appdetailsview.py' | |||
2 | --- softwarecenter/ui/gtk3/views/appdetailsview.py 2012-02-27 16:05:43 +0000 | |||
3 | +++ softwarecenter/ui/gtk3/views/appdetailsview.py 2012-03-14 23:52:20 +0000 | |||
4 | @@ -38,11 +38,11 @@ | |||
5 | 38 | from softwarecenter.db import DebFileApplication | 38 | from softwarecenter.db import DebFileApplication |
6 | 39 | from softwarecenter.backend.reviews import ReviewStats | 39 | from softwarecenter.backend.reviews import ReviewStats |
7 | 40 | #from softwarecenter.backend.zeitgeist_simple import zeitgeist_singleton | 40 | #from softwarecenter.backend.zeitgeist_simple import zeitgeist_singleton |
9 | 41 | from softwarecenter.enums import (AppActions, | 41 | from softwarecenter.enums import (AppActions, |
10 | 42 | PkgStates, | 42 | PkgStates, |
12 | 43 | Icons, | 43 | Icons, |
13 | 44 | SOFTWARE_CENTER_PKGNAME) | 44 | SOFTWARE_CENTER_PKGNAME) |
15 | 45 | from softwarecenter.utils import (is_unity_running, | 45 | from softwarecenter.utils import (is_unity_running, |
16 | 46 | upstream_version, | 46 | upstream_version, |
17 | 47 | get_exec_line_from_desktop, | 47 | get_exec_line_from_desktop, |
18 | 48 | SimpleFileDownloader, | 48 | SimpleFileDownloader, |
19 | @@ -82,10 +82,11 @@ | |||
20 | 82 | from softwarecenter.backend import get_install_backend | 82 | from softwarecenter.backend import get_install_backend |
21 | 83 | 83 | ||
22 | 84 | 84 | ||
24 | 85 | LOG=logging.getLogger(__name__) | 85 | LOG = logging.getLogger(__name__) |
25 | 86 | |||
26 | 86 | 87 | ||
27 | 87 | class StatusBar(Gtk.Alignment): | 88 | class StatusBar(Gtk.Alignment): |
29 | 88 | """ Subclass of Gtk.Alignment that draws a small dash border | 89 | """ Subclass of Gtk.Alignment that draws a small dash border |
30 | 89 | around the rectangle. | 90 | around the rectangle. |
31 | 90 | """ | 91 | """ |
32 | 91 | 92 | ||
33 | @@ -102,7 +103,6 @@ | |||
34 | 102 | self._bg = [1, 1, 1, 0.3] | 103 | self._bg = [1, 1, 1, 0.3] |
35 | 103 | 104 | ||
36 | 104 | self.connect("style-updated", self.on_style_updated) | 105 | self.connect("style-updated", self.on_style_updated) |
37 | 105 | return | ||
38 | 106 | 106 | ||
39 | 107 | def on_style_updated(self, widget): | 107 | def on_style_updated(self, widget): |
40 | 108 | context = self.get_style_context() | 108 | context = self.get_style_context() |
41 | @@ -110,7 +110,6 @@ | |||
42 | 110 | context = widget.get_style_context() | 110 | context = widget.get_style_context() |
43 | 111 | border = context.get_border(Gtk.StateFlags.NORMAL) | 111 | border = context.get_border(Gtk.StateFlags.NORMAL) |
44 | 112 | self._border_width = max(1, max(border.top, border.bottom)) | 112 | self._border_width = max(1, max(border.top, border.bottom)) |
45 | 113 | return | ||
46 | 114 | 113 | ||
47 | 115 | def do_draw(self, cr): | 114 | def do_draw(self, cr): |
48 | 116 | cr.save() | 115 | cr.save() |
49 | @@ -118,7 +117,7 @@ | |||
50 | 118 | width = self._border_width | 117 | width = self._border_width |
51 | 119 | 118 | ||
52 | 120 | # fill bg | 119 | # fill bg |
54 | 121 | cr.rectangle(-width, 0, a.width+2*width, a.height) | 120 | cr.rectangle(-width, 0, a.width + 2 * width, a.height) |
55 | 122 | cr.set_source_rgba(*self._bg) | 121 | cr.set_source_rgba(*self._bg) |
56 | 123 | cr.fill_preserve() | 122 | cr.fill_preserve() |
57 | 124 | 123 | ||
58 | @@ -130,14 +129,15 @@ | |||
59 | 130 | context.restore() | 129 | context.restore() |
60 | 131 | 130 | ||
61 | 132 | Gdk.cairo_set_source_rgba(cr, bc) | 131 | Gdk.cairo_set_source_rgba(cr, bc) |
64 | 133 | cr.set_dash((width, 2*width), 1) | 132 | cr.set_dash((width, 2 * width), 1) |
65 | 134 | cr.set_line_width(2*width) | 133 | cr.set_line_width(2 * width) |
66 | 135 | cr.stroke() | 134 | cr.stroke() |
67 | 136 | 135 | ||
68 | 137 | cr.restore() | 136 | cr.restore() |
70 | 138 | for child in self: | 137 | for child in self: |
71 | 139 | self.propagate_draw(child, cr) | 138 | self.propagate_draw(child, cr) |
72 | 140 | 139 | ||
73 | 140 | |||
74 | 141 | class WarningStatusBar(StatusBar): | 141 | class WarningStatusBar(StatusBar): |
75 | 142 | 142 | ||
76 | 143 | def __init__(self, view): | 143 | def __init__(self, view): |
77 | @@ -153,6 +153,7 @@ | |||
78 | 153 | # override _bg | 153 | # override _bg |
79 | 154 | self._bg = [1, 1, 0, 0.3] | 154 | self._bg = [1, 1, 0, 0.3] |
80 | 155 | 155 | ||
81 | 156 | |||
82 | 156 | class PackageStatusBar(StatusBar): | 157 | class PackageStatusBar(StatusBar): |
83 | 157 | """ Package specific status bar that contains a state label, | 158 | """ Package specific status bar that contains a state label, |
84 | 158 | a action button and a progress bar. | 159 | a action button and a progress bar. |
85 | @@ -160,7 +161,7 @@ | |||
86 | 160 | 161 | ||
87 | 161 | def __init__(self, view): | 162 | def __init__(self, view): |
88 | 162 | StatusBar.__init__(self, view) | 163 | StatusBar.__init__(self, view) |
90 | 163 | self.installed_icon = Gtk.Image.new_from_icon_name( | 164 | self.installed_icon = Gtk.Image.new_from_icon_name( |
91 | 164 | Icons.INSTALLED_OVERLAY, Gtk.IconSize.DIALOG) | 165 | Icons.INSTALLED_OVERLAY, Gtk.IconSize.DIALOG) |
92 | 165 | self.label = Gtk.Label() | 166 | self.label = Gtk.Label() |
93 | 166 | self.label.set_line_wrap(True) | 167 | self.label.set_line_wrap(True) |
94 | @@ -242,20 +243,17 @@ | |||
95 | 242 | app, addons_to_install, addons_to_remove) | 243 | app, addons_to_install, addons_to_remove) |
96 | 243 | elif state == PkgStates.NEEDS_SOURCE: | 244 | elif state == PkgStates.NEEDS_SOURCE: |
97 | 244 | app_manager.enable_software_source(app) | 245 | app_manager.enable_software_source(app) |
98 | 245 | return | ||
99 | 246 | 246 | ||
100 | 247 | def set_label(self, label): | 247 | def set_label(self, label): |
101 | 248 | m = '<big><b>%s</b></big>' % label | 248 | m = '<big><b>%s</b></big>' % label |
102 | 249 | self.label.set_markup(m) | 249 | self.label.set_markup(m) |
103 | 250 | return | ||
104 | 251 | 250 | ||
105 | 252 | def get_label(self): | 251 | def get_label(self): |
106 | 253 | return self.label.get_text() | 252 | return self.label.get_text() |
107 | 254 | 253 | ||
108 | 255 | def set_button_label(self, label): | 254 | def set_button_label(self, label): |
109 | 256 | self.button.set_label(label) | 255 | self.button.set_label(label) |
112 | 257 | return | 256 | |
111 | 258 | |||
113 | 259 | def get_button_label(self): | 257 | def get_button_label(self): |
114 | 260 | return self.button.get_label() | 258 | return self.button.get_label() |
115 | 261 | 259 | ||
116 | @@ -263,14 +261,14 @@ | |||
117 | 263 | # the currently forced archive_suite for the given app | 261 | # the currently forced archive_suite for the given app |
118 | 264 | app_version = self.app_details.version | 262 | app_version = self.app_details.version |
119 | 265 | # all available not-automatic (version, archive_suits) | 263 | # all available not-automatic (version, archive_suits) |
123 | 266 | not_automatic_suites = self.app_details.get_not_automatic_archive_versions() | 264 | not_auto_suites = self.app_details.get_not_automatic_archive_versions() |
124 | 267 | # populat the combobox if | 265 | # populat the combobox if |
125 | 268 | if not_automatic_suites: | 266 | if not_auto_suites: |
126 | 269 | combo = self.combo_multiple_versions | 267 | combo = self.combo_multiple_versions |
127 | 270 | combo.disconnect_by_func(self._on_combo_multiple_versions_changed) | 268 | combo.disconnect_by_func(self._on_combo_multiple_versions_changed) |
128 | 271 | model = self.combo_multiple_versions.get_model() | 269 | model = self.combo_multiple_versions.get_model() |
129 | 272 | model.clear() | 270 | model.clear() |
131 | 273 | for i, archive_suite in enumerate(not_automatic_suites): | 271 | for i, archive_suite in enumerate(not_auto_suites): |
132 | 274 | # get the version, archive_suite | 272 | # get the version, archive_suite |
133 | 275 | ver, archive_suite = archive_suite | 273 | ver, archive_suite = archive_suite |
134 | 276 | # the string to display is something like: | 274 | # the string to display is something like: |
135 | @@ -278,9 +276,9 @@ | |||
136 | 278 | displayed_archive_suite = archive_suite | 276 | displayed_archive_suite = archive_suite |
137 | 279 | if i == 0: | 277 | if i == 0: |
138 | 280 | displayed_archive_suite = _("default") | 278 | displayed_archive_suite = _("default") |
140 | 281 | s = "v%s (%s)" % (upstream_version(ver), | 279 | s = "v%s (%s)" % (upstream_version(ver), |
141 | 282 | displayed_archive_suite) | 280 | displayed_archive_suite) |
143 | 283 | model.append( (s, archive_suite) ) | 281 | model.append((s, archive_suite)) |
144 | 284 | if app_version == ver: | 282 | if app_version == ver: |
145 | 285 | self.combo_multiple_versions.set_active(i) | 283 | self.combo_multiple_versions.set_active(i) |
146 | 286 | # if nothing is found, set to default | 284 | # if nothing is found, set to default |
147 | @@ -321,9 +319,9 @@ | |||
148 | 321 | self.progress.hide() | 319 | self.progress.hide() |
149 | 322 | self.installed_icon.hide() | 320 | self.installed_icon.hide() |
150 | 323 | 321 | ||
152 | 324 | # FIXME: Use a Gtk.Action for the Install/Remove/Buy/Add | 322 | # FIXME: Use a Gtk.Action for the Install/Remove/Buy/Add |
153 | 325 | # Source/Update Now action so that all UI controls | 323 | # Source/Update Now action so that all UI controls |
155 | 326 | # (menu item, applist view button and appdetails view button) | 324 | # (menu item, applist view button and appdetails view button) |
156 | 327 | # are managed centrally: button text, button sensitivity, | 325 | # are managed centrally: button text, button sensitivity, |
157 | 328 | # and the associated callback. | 326 | # and the associated callback. |
158 | 329 | if state == PkgStates.INSTALLING: | 327 | if state == PkgStates.INSTALLING: |
159 | @@ -340,32 +338,34 @@ | |||
160 | 340 | self.set_label(_(u'Upgrading\u2026')) | 338 | self.set_label(_(u'Upgrading\u2026')) |
161 | 341 | self.button.set_sensitive(False) | 339 | self.button.set_sensitive(False) |
162 | 342 | elif state == PkgStates.INSTALLED or state == PkgStates.REINSTALLABLE: | 340 | elif state == PkgStates.INSTALLED or state == PkgStates.REINSTALLABLE: |
164 | 343 | #special label only if the app being viewed is software centre itself | 341 | # special label only if the app being viewed is software centre |
165 | 342 | # itself | ||
166 | 344 | self.installed_icon.show() | 343 | self.installed_icon.show() |
169 | 345 | if app_details.pkgname== SOFTWARE_CENTER_PKGNAME: | 344 | if app_details.pkgname == SOFTWARE_CENTER_PKGNAME: |
170 | 346 | self.set_label(_(u'Installed (you\u2019re using it right now)')) | 345 | self.set_label( |
171 | 346 | _(u'Installed (you\u2019re using it right now)')) | ||
172 | 347 | else: | 347 | else: |
173 | 348 | if app_details.purchase_date: | 348 | if app_details.purchase_date: |
175 | 349 | # purchase_date is a string, must first convert to | 349 | # purchase_date is a string, must first convert to |
176 | 350 | # datetime.datetime | 350 | # datetime.datetime |
177 | 351 | pdate = self._convert_purchase_date_str_to_datetime( | 351 | pdate = self._convert_purchase_date_str_to_datetime( |
178 | 352 | app_details.purchase_date) | 352 | app_details.purchase_date) |
182 | 353 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, | 353 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, |
183 | 354 | # please specify a format per your locale (if you prefer, | 354 | # please specify a format per your locale (if you prefer, |
184 | 355 | # %x can be used to provide a default locale-specific date | 355 | # %x can be used to provide a default locale-specific date |
185 | 356 | # representation) | 356 | # representation) |
186 | 357 | self.set_label(pdate.strftime(_('Purchased on %Y-%m-%d'))) | 357 | self.set_label(pdate.strftime(_('Purchased on %Y-%m-%d'))) |
187 | 358 | elif app_details.installation_date: | 358 | elif app_details.installation_date: |
191 | 359 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, | 359 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, |
192 | 360 | # please specify a format per your locale (if you prefer, | 360 | # please specify a format per your locale (if you prefer, |
193 | 361 | # %x can be used to provide a default locale-specific date | 361 | # %x can be used to provide a default locale-specific date |
194 | 362 | # representation) | 362 | # representation) |
195 | 363 | template = _('Installed on %Y-%m-%d') | 363 | template = _('Installed on %Y-%m-%d') |
196 | 364 | self.set_label(app_details.installation_date.strftime( | 364 | self.set_label(app_details.installation_date.strftime( |
197 | 365 | template)) | 365 | template)) |
198 | 366 | else: | 366 | else: |
199 | 367 | self.set_label(_('Installed')) | 367 | self.set_label(_('Installed')) |
201 | 368 | if state == PkgStates.REINSTALLABLE: # only deb files atm | 368 | if state == PkgStates.REINSTALLABLE: # only deb files atm |
202 | 369 | self.set_button_label(_('Reinstall')) | 369 | self.set_button_label(_('Reinstall')) |
203 | 370 | elif state == PkgStates.INSTALLED: | 370 | elif state == PkgStates.INSTALLED: |
204 | 371 | self.set_button_label(_('Remove')) | 371 | self.set_button_label(_('Remove')) |
205 | @@ -374,7 +374,7 @@ | |||
206 | 374 | # get that info from the software-center-agent/payments | 374 | # get that info from the software-center-agent/payments |
207 | 375 | # service. | 375 | # service. |
208 | 376 | # NOTE: the currency string for this label is purposely not | 376 | # NOTE: the currency string for this label is purposely not |
210 | 377 | # translatable when hardcoded, since it (currently) | 377 | # translatable when hardcoded, since it (currently) |
211 | 378 | # won't vary based on locale and as such we don't want | 378 | # won't vary based on locale and as such we don't want |
212 | 379 | # it translated | 379 | # it translated |
213 | 380 | self.set_label("US$ %s" % app_details.price) | 380 | self.set_label("US$ %s" % app_details.price) |
214 | @@ -389,11 +389,12 @@ | |||
215 | 389 | PkgStates.PURCHASED_BUT_REPO_MUST_BE_ENABLED, | 389 | PkgStates.PURCHASED_BUT_REPO_MUST_BE_ENABLED, |
216 | 390 | PkgStates.PURCHASED_BUT_NOT_AVAILABLE_FOR_SERIES): | 390 | PkgStates.PURCHASED_BUT_NOT_AVAILABLE_FOR_SERIES): |
217 | 391 | 391 | ||
219 | 392 | # purchase_date is a string, must first convert to datetime.datetime | 392 | # purchase_date is a string, must first convert to |
220 | 393 | # datetime.datetime | ||
221 | 393 | pdate = self._convert_purchase_date_str_to_datetime( | 394 | pdate = self._convert_purchase_date_str_to_datetime( |
222 | 394 | app_details.purchase_date) | 395 | app_details.purchase_date) |
225 | 395 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, please | 396 | # TRANSLATORS : %Y-%m-%d formats the date as 2011-03-31, please |
226 | 396 | # specify a format per your locale (if you prefer, %x can be used | 397 | # specify a format per your locale (if you prefer, %x can be used |
227 | 397 | # to provide a default locale-specific date representation) | 398 | # to provide a default locale-specific date representation) |
228 | 398 | label = pdate.strftime(_('Purchased on %Y-%m-%d')) | 399 | label = pdate.strftime(_('Purchased on %Y-%m-%d')) |
229 | 399 | self.set_button_label(_('Install')) | 400 | self.set_button_label(_('Install')) |
230 | @@ -408,7 +409,7 @@ | |||
231 | 408 | elif state == PkgStates.UNINSTALLED: | 409 | elif state == PkgStates.UNINSTALLED: |
232 | 409 | #special label only if the app being viewed is software centre | 410 | #special label only if the app being viewed is software centre |
233 | 410 | # itself | 411 | # itself |
235 | 411 | if app_details.pkgname== SOFTWARE_CENTER_PKGNAME: | 412 | if app_details.pkgname == SOFTWARE_CENTER_PKGNAME: |
236 | 412 | self.set_label(_(u'Removed (close it and it\u2019ll be gone)')) | 413 | self.set_label(_(u'Removed (close it and it\u2019ll be gone)')) |
237 | 413 | else: | 414 | else: |
238 | 414 | # TRANSLATORS: Free here means Gratis | 415 | # TRANSLATORS: Free here means Gratis |
239 | @@ -436,12 +437,12 @@ | |||
240 | 436 | self.set_label(_("Error")) | 437 | self.set_label(_("Error")) |
241 | 437 | elif state == PkgStates.NOT_FOUND: | 438 | elif state == PkgStates.NOT_FOUND: |
242 | 438 | # this is used when the pkg is not in the cache and there is no | 439 | # this is used when the pkg is not in the cache and there is no |
244 | 439 | # request we display the error in the summary field and hide the | 440 | # request we display the error in the summary field and hide the |
245 | 440 | # rest | 441 | # rest |
246 | 441 | pass | 442 | pass |
247 | 442 | elif state == PkgStates.NEEDS_SOURCE: | 443 | elif state == PkgStates.NEEDS_SOURCE: |
248 | 443 | channelfile = self.app_details.channelfile | 444 | channelfile = self.app_details.channelfile |
250 | 444 | # it has a price and is not available | 445 | # it has a price and is not available |
251 | 445 | if channelfile: | 446 | if channelfile: |
252 | 446 | self.set_button_label(_("Use This Source")) | 447 | self.set_button_label(_("Use This Source")) |
253 | 447 | # check if it comes from a non-enabled component | 448 | # check if it comes from a non-enabled component |
254 | @@ -460,13 +461,13 @@ | |||
255 | 460 | 461 | ||
256 | 461 | sensitive = network_state_is_connected() | 462 | sensitive = network_state_is_connected() |
257 | 462 | self.button.set_sensitive(sensitive) | 463 | self.button.set_sensitive(sensitive) |
260 | 463 | return | 464 | |
259 | 464 | |||
261 | 465 | def _convert_purchase_date_str_to_datetime(self, purchase_date): | 465 | def _convert_purchase_date_str_to_datetime(self, purchase_date): |
262 | 466 | if purchase_date is not None: | 466 | if purchase_date is not None: |
263 | 467 | return datetime.datetime.strptime( | 467 | return datetime.datetime.strptime( |
264 | 468 | purchase_date, "%Y-%m-%d %H:%M:%S") | 468 | purchase_date, "%Y-%m-%d %H:%M:%S") |
265 | 469 | 469 | ||
266 | 470 | |||
267 | 470 | class PackageInfo(Gtk.HBox): | 471 | class PackageInfo(Gtk.HBox): |
268 | 471 | """ Box with labels for package specific information like version info | 472 | """ Box with labels for package specific information like version info |
269 | 472 | """ | 473 | """ |
270 | @@ -485,14 +486,13 @@ | |||
271 | 485 | self.a11y = self.get_accessible() | 486 | self.a11y = self.get_accessible() |
272 | 486 | 487 | ||
273 | 487 | self.connect('realize', self._on_realize) | 488 | self.connect('realize', self._on_realize) |
274 | 488 | return | ||
275 | 489 | 489 | ||
276 | 490 | def _on_realize(self, widget): | 490 | def _on_realize(self, widget): |
277 | 491 | # key | 491 | # key |
278 | 492 | k = Gtk.Label() | 492 | k = Gtk.Label() |
279 | 493 | k.set_name("subtle-label") | 493 | k.set_name("subtle-label") |
280 | 494 | key_markup = '<b>%s</b>' | 494 | key_markup = '<b>%s</b>' |
282 | 495 | k.set_markup(key_markup % self.key) | 495 | k.set_markup(key_markup % self.key) |
283 | 496 | k.set_alignment(1, 0) | 496 | k.set_alignment(1, 0) |
284 | 497 | 497 | ||
285 | 498 | # determine max width of all keys | 498 | # determine max width of all keys |
286 | @@ -516,22 +516,23 @@ | |||
287 | 516 | 516 | ||
288 | 517 | self.set_property("can-focus", True) | 517 | self.set_property("can-focus", True) |
289 | 518 | self.show_all() | 518 | self.show_all() |
292 | 519 | return | 519 | |
291 | 520 | |||
293 | 521 | def set_width(self, width): | 520 | def set_width(self, width): |
295 | 522 | return | 521 | pass |
296 | 523 | 522 | ||
297 | 524 | def set_value(self, value): | 523 | def set_value(self, value): |
298 | 525 | self.value_label.set_markup(value) | 524 | self.value_label.set_markup(value) |
299 | 526 | self.a11y.set_name(utf8(self.key) + ' ' + utf8(value)) | 525 | self.a11y.set_name(utf8(self.key) + ' ' + utf8(value)) |
300 | 527 | 526 | ||
301 | 527 | |||
302 | 528 | class PackageInfoHW(PackageInfo): | 528 | class PackageInfoHW(PackageInfo): |
304 | 529 | """ special version of packageinfo that uses the custom | 529 | """ special version of packageinfo that uses the custom |
305 | 530 | HardwareRequirementsBox as the "label" | 530 | HardwareRequirementsBox as the "label" |
306 | 531 | """ | 531 | """ |
307 | 532 | def __init__(self, *args): | 532 | def __init__(self, *args): |
308 | 533 | super(PackageInfoHW, self).__init__(*args) | 533 | super(PackageInfoHW, self).__init__(*args) |
309 | 534 | self.value_label = HardwareRequirementsBox() | 534 | self.value_label = HardwareRequirementsBox() |
310 | 535 | |||
311 | 535 | def set_value(self, value): | 536 | def set_value(self, value): |
312 | 536 | self.value_label.set_hardware_requirements(value) | 537 | self.value_label.set_hardware_requirements(value) |
313 | 537 | 538 | ||
314 | @@ -553,7 +554,6 @@ | |||
315 | 553 | self.checkbutton.pkgname = self.app.pkgname | 554 | self.checkbutton.pkgname = self.app.pkgname |
316 | 554 | self.pack_start(self.checkbutton, False, False, 12) | 555 | self.pack_start(self.checkbutton, False, False, 12) |
317 | 555 | self.connect('realize', self._on_realize, icons, pkgname) | 556 | self.connect('realize', self._on_realize, icons, pkgname) |
318 | 556 | return | ||
319 | 557 | 557 | ||
320 | 558 | def _on_realize(self, widget, icons, pkgname): | 558 | def _on_realize(self, widget, icons, pkgname): |
321 | 559 | # icon | 559 | # icon |
322 | @@ -610,15 +610,15 @@ | |||
323 | 610 | self.checkbutton.set_active(is_active) | 610 | self.checkbutton.set_active(is_active) |
324 | 611 | 611 | ||
325 | 612 | def set_width(self, width): | 612 | def set_width(self, width): |
327 | 613 | return | 613 | pass |
328 | 614 | 614 | ||
329 | 615 | 615 | ||
330 | 616 | class AddonsTable(Gtk.VBox): | 616 | class AddonsTable(Gtk.VBox): |
331 | 617 | """ Widget to display a table of addons. """ | 617 | """ Widget to display a table of addons. """ |
332 | 618 | 618 | ||
336 | 619 | __gsignals__ = {'table-built' : (GObject.SignalFlags.RUN_FIRST, | 619 | __gsignals__ = {'table-built': (GObject.SignalFlags.RUN_FIRST, |
337 | 620 | None, | 620 | None, |
338 | 621 | ()), | 621 | ()), |
339 | 622 | } | 622 | } |
340 | 623 | 623 | ||
341 | 624 | def __init__(self, addons_manager): | 624 | def __init__(self, addons_manager): |
342 | @@ -687,18 +687,18 @@ | |||
343 | 687 | This will become visible if any addons are scheduled for install | 687 | This will become visible if any addons are scheduled for install |
344 | 688 | or remove. | 688 | or remove. |
345 | 689 | """ | 689 | """ |
347 | 690 | 690 | ||
348 | 691 | def __init__(self, addons_manager): | 691 | def __init__(self, addons_manager): |
349 | 692 | StatusBar.__init__(self, addons_manager.view) | 692 | StatusBar.__init__(self, addons_manager.view) |
350 | 693 | self.addons_manager = addons_manager | 693 | self.addons_manager = addons_manager |
351 | 694 | self.cache = self.addons_manager.view.cache | 694 | self.cache = self.addons_manager.view.cache |
352 | 695 | 695 | ||
353 | 696 | self.applying = False | 696 | self.applying = False |
356 | 697 | 697 | ||
357 | 698 | # TRANSLATORS: Free here means Gratis | 698 | # TRANSLATORS: Free here means Gratis |
358 | 699 | self.label_price = Gtk.Label(_("Free")) | 699 | self.label_price = Gtk.Label(_("Free")) |
359 | 700 | self.hbox.pack_start(self.label_price, False, False, 0) | 700 | self.hbox.pack_start(self.label_price, False, False, 0) |
361 | 701 | 701 | ||
362 | 702 | self.hbuttonbox = Gtk.HButtonBox() | 702 | self.hbuttonbox = Gtk.HButtonBox() |
363 | 703 | self.hbuttonbox.set_layout(Gtk.ButtonBoxStyle.END) | 703 | self.hbuttonbox.set_layout(Gtk.ButtonBoxStyle.END) |
364 | 704 | self.button_apply = Gtk.Button(_("Apply Changes")) | 704 | self.button_apply = Gtk.Button(_("Apply Changes")) |
365 | @@ -711,9 +711,9 @@ | |||
366 | 711 | 711 | ||
367 | 712 | def configure(self): | 712 | def configure(self): |
368 | 713 | LOG.debug("AddonsStatusBarConfigure") | 713 | LOG.debug("AddonsStatusBarConfigure") |
370 | 714 | # FIXME: addons are not always free, but the old implementation | 714 | # FIXME: addons are not always free, but the old implementation |
371 | 715 | # of determining price was buggy | 715 | # of determining price was buggy |
373 | 716 | if (not self.addons_manager.addons_to_install and | 716 | if (not self.addons_manager.addons_to_install and |
374 | 717 | not self.addons_manager.addons_to_remove): | 717 | not self.addons_manager.addons_to_remove): |
375 | 718 | self.hide() | 718 | self.hide() |
376 | 719 | else: | 719 | else: |
377 | @@ -721,7 +721,7 @@ | |||
378 | 721 | self.button_apply.set_sensitive(sensitive) | 721 | self.button_apply.set_sensitive(sensitive) |
379 | 722 | self.button_cancel.set_sensitive(sensitive) | 722 | self.button_cancel.set_sensitive(sensitive) |
380 | 723 | self.show_all() | 723 | self.show_all() |
382 | 724 | 724 | ||
383 | 725 | def _on_button_apply_clicked(self, button): | 725 | def _on_button_apply_clicked(self, button): |
384 | 726 | self.applying = True | 726 | self.applying = True |
385 | 727 | self.button_apply.set_sensitive(False) | 727 | self.button_apply.set_sensitive(False) |
386 | @@ -791,27 +791,28 @@ | |||
387 | 791 | 791 | ||
388 | 792 | 792 | ||
389 | 793 | _asset_cache = {} | 793 | _asset_cache = {} |
390 | 794 | |||
391 | 795 | |||
392 | 794 | class AppDetailsView(Viewport): | 796 | class AppDetailsView(Viewport): |
393 | 795 | """ The view that shows the application details """ | 797 | """ The view that shows the application details """ |
394 | 796 | 798 | ||
395 | 797 | # the size of the icon on the left side | 799 | # the size of the icon on the left side |
397 | 798 | APP_ICON_SIZE = 96 # Gtk.IconSize.DIALOG ? | 800 | APP_ICON_SIZE = 96 # Gtk.IconSize.DIALOG ? |
398 | 799 | # art stuff | 801 | # art stuff |
399 | 800 | BACKGROUND = os.path.join(softwarecenter.paths.datadir, | 802 | BACKGROUND = os.path.join(softwarecenter.paths.datadir, |
400 | 801 | "ui/gtk3/art/itemview-background.png") | 803 | "ui/gtk3/art/itemview-background.png") |
401 | 802 | 804 | ||
404 | 803 | 805 | # need to include application-request-action here also since we are | |
403 | 804 | # need to include application-request-action here also since we are | ||
405 | 805 | # multiple-inheriting | 806 | # multiple-inheriting |
412 | 806 | __gsignals__ = {'selected':(GObject.SignalFlags.RUN_FIRST, | 807 | __gsignals__ = {'selected': (GObject.SignalFlags.RUN_FIRST, |
413 | 807 | None, | 808 | None, |
414 | 808 | (GObject.TYPE_PYOBJECT,)), | 809 | (GObject.TYPE_PYOBJECT,)), |
415 | 809 | "different-application-selected" : (GObject.SignalFlags.RUN_LAST, | 810 | "different-application-selected": ( |
416 | 810 | None, | 811 | GObject.SignalFlags.RUN_LAST, |
417 | 811 | (GObject.TYPE_PYOBJECT, )), | 812 | None, |
418 | 813 | (GObject.TYPE_PYOBJECT, )), | ||
419 | 812 | } | 814 | } |
420 | 813 | 815 | ||
421 | 814 | |||
422 | 815 | def __init__(self, db, distro, icons, cache, datadir): | 816 | def __init__(self, db, distro, icons, cache, datadir): |
423 | 816 | Viewport.__init__(self) | 817 | Viewport.__init__(self) |
424 | 817 | # basic stuff | 818 | # basic stuff |
425 | @@ -856,7 +857,7 @@ | |||
426 | 856 | self.backend.connect( | 857 | self.backend.connect( |
427 | 857 | "transaction-finished", self._on_transaction_finished) | 858 | "transaction-finished", self._on_transaction_finished) |
428 | 858 | self.backend.connect( | 859 | self.backend.connect( |
430 | 859 | "transaction-progress-changed", | 860 | "transaction-progress-changed", |
431 | 860 | self._on_transaction_progress_changed) | 861 | self._on_transaction_progress_changed) |
432 | 861 | 862 | ||
433 | 862 | # network status watcher | 863 | # network status watcher |
434 | @@ -874,7 +875,7 @@ | |||
435 | 874 | self._reviews_server_language = None | 875 | self._reviews_server_language = None |
436 | 875 | self._reviews_relaxed = False | 876 | self._reviews_relaxed = False |
437 | 876 | self._review_sort_method = 0 | 877 | self._review_sort_method = 0 |
439 | 877 | 878 | ||
440 | 878 | # switches | 879 | # switches |
441 | 879 | self._show_overlay = False | 880 | self._show_overlay = False |
442 | 880 | 881 | ||
443 | @@ -883,14 +884,14 @@ | |||
444 | 883 | self._cache_art_assets() | 884 | self._cache_art_assets() |
445 | 884 | self.connect('realize', self._on_realize) | 885 | self.connect('realize', self._on_realize) |
446 | 885 | self.loaded = True | 886 | self.loaded = True |
447 | 886 | return | ||
448 | 887 | 887 | ||
449 | 888 | def _on_destroy(self, widget): | 888 | def _on_destroy(self, widget): |
450 | 889 | self.cache.disconnect_by_func(self._on_cache_ready) | 889 | self.cache.disconnect_by_func(self._on_cache_ready) |
451 | 890 | 890 | ||
452 | 891 | def _cache_art_assets(self): | 891 | def _cache_art_assets(self): |
453 | 892 | global _asset_cache | 892 | global _asset_cache |
455 | 893 | if _asset_cache: return _asset_cache | 893 | if _asset_cache: |
456 | 894 | return _asset_cache | ||
457 | 894 | assets = _asset_cache | 895 | assets = _asset_cache |
458 | 895 | # cache the bg pattern | 896 | # cache the bg pattern |
459 | 896 | surf = cairo.ImageSurface.create_from_png(self.BACKGROUND) | 897 | surf = cairo.ImageSurface.create_from_png(self.BACKGROUND) |
460 | @@ -911,8 +912,7 @@ | |||
461 | 911 | self.addon_view.addons_set_sensitive(sensitive) | 912 | self.addon_view.addons_set_sensitive(sensitive) |
462 | 912 | self.addons_statusbar.button_apply.set_sensitive(sensitive) | 913 | self.addons_statusbar.button_apply.set_sensitive(sensitive) |
463 | 913 | self.addons_statusbar.button_cancel.set_sensitive(sensitive) | 914 | self.addons_statusbar.button_cancel.set_sensitive(sensitive) |
466 | 914 | return | 915 | |
465 | 915 | |||
467 | 916 | def _update_recommendations(self, pkgname): | 916 | def _update_recommendations(self, pkgname): |
468 | 917 | self.recommended_for_app_panel.set_pkgname(pkgname) | 917 | self.recommended_for_app_panel.set_pkgname(pkgname) |
469 | 918 | 918 | ||
470 | @@ -920,10 +920,9 @@ | |||
471 | 920 | def _update_reviews(self, app_details): | 920 | def _update_reviews(self, app_details): |
472 | 921 | self.reviews.clear() | 921 | self.reviews.clear() |
473 | 922 | self._check_for_reviews() | 922 | self._check_for_reviews() |
474 | 923 | return | ||
475 | 924 | 923 | ||
476 | 925 | def _check_for_reviews(self): | 924 | def _check_for_reviews(self): |
478 | 926 | # self.app may be undefined on network state change events | 925 | # self.app may be undefined on network state change events |
479 | 927 | # (LP: #742635) | 926 | # (LP: #742635) |
480 | 928 | if not self.app: | 927 | if not self.app: |
481 | 929 | return | 928 | return |
482 | @@ -936,7 +935,7 @@ | |||
483 | 936 | def _on_more_reviews_clicked(self, uilist): | 935 | def _on_more_reviews_clicked(self, uilist): |
484 | 937 | self._reviews_server_page += 1 | 936 | self._reviews_server_page += 1 |
485 | 938 | self._do_load_reviews() | 937 | self._do_load_reviews() |
487 | 939 | 938 | ||
488 | 940 | def _on_review_sort_method_changed(self, uilist, sort_method): | 939 | def _on_review_sort_method_changed(self, uilist, sort_method): |
489 | 941 | self._reviews_server_page = 1 | 940 | self._reviews_server_page = 1 |
490 | 942 | self._reviews_relaxed = False | 941 | self._reviews_relaxed = False |
491 | @@ -954,7 +953,7 @@ | |||
492 | 954 | def _do_load_reviews(self): | 953 | def _do_load_reviews(self): |
493 | 955 | self.reviews.show_spinner_with_message(_('Checking for reviews...')) | 954 | self.reviews.show_spinner_with_message(_('Checking for reviews...')) |
494 | 956 | self.review_loader.get_reviews( | 955 | self.review_loader.get_reviews( |
496 | 957 | self.app, self._reviews_ready_callback, | 956 | self.app, self._reviews_ready_callback, |
497 | 958 | page=self._reviews_server_page, | 957 | page=self._reviews_server_page, |
498 | 959 | language=self._reviews_server_language, | 958 | language=self._reviews_server_language, |
499 | 960 | sort=self._review_sort_method, | 959 | sort=self._review_sort_method, |
500 | @@ -965,11 +964,10 @@ | |||
501 | 965 | self.reviews.replace_review(review) | 964 | self.reviews.replace_review(review) |
502 | 966 | elif action == 'remove': | 965 | elif action == 'remove': |
503 | 967 | self.reviews.remove_review(review) | 966 | self.reviews.remove_review(review) |
504 | 968 | return | ||
505 | 969 | 967 | ||
506 | 970 | def _update_review_stats_widget(self, stats): | 968 | def _update_review_stats_widget(self, stats): |
507 | 971 | if stats: | 969 | if stats: |
509 | 972 | # ensure that the review UI knows about the stats | 970 | # ensure that the review UI knows about the stats |
510 | 973 | self.reviews.global_review_stats = stats | 971 | self.reviews.global_review_stats = stats |
511 | 974 | # update the widget | 972 | # update the widget |
512 | 975 | self.review_stats_widget.set_avg_rating(stats.ratings_average) | 973 | self.review_stats_widget.set_avg_rating(stats.ratings_average) |
513 | @@ -988,7 +986,7 @@ | |||
514 | 988 | """ | 986 | """ |
515 | 989 | LOG.debug("_review_ready_callback: %s" % app) | 987 | LOG.debug("_review_ready_callback: %s" % app) |
516 | 990 | # avoid possible race if we already moved to a new app when | 988 | # avoid possible race if we already moved to a new app when |
518 | 991 | # the reviews become ready | 989 | # the reviews become ready |
519 | 992 | # (we only check for pkgname currently to avoid breaking on | 990 | # (we only check for pkgname currently to avoid breaking on |
520 | 993 | # software-center totem) | 991 | # software-center totem) |
521 | 994 | if self.app.pkgname != app.pkgname: | 992 | if self.app.pkgname != app.pkgname: |
522 | @@ -1000,7 +998,7 @@ | |||
523 | 1000 | self._reviews_relaxed = True | 998 | self._reviews_relaxed = True |
524 | 1001 | self._reviews_server_page = 1 | 999 | self._reviews_server_page = 1 |
525 | 1002 | self.review_loader.get_reviews( | 1000 | self.review_loader.get_reviews( |
527 | 1003 | self.app, self._reviews_ready_callback, | 1001 | self.app, self._reviews_ready_callback, |
528 | 1004 | page=self._reviews_server_page, | 1002 | page=self._reviews_server_page, |
529 | 1005 | language=self._reviews_server_language, | 1003 | language=self._reviews_server_language, |
530 | 1006 | sort=self._review_sort_method, | 1004 | sort=self._review_sort_method, |
531 | @@ -1020,15 +1018,16 @@ | |||
532 | 1020 | if stats.ratings_total == 0: | 1018 | if stats.ratings_total == 0: |
533 | 1021 | stats.ratings_average = 0 | 1019 | stats.ratings_average = 0 |
534 | 1022 | else: | 1020 | else: |
536 | 1023 | stats.ratings_average = sum([x.rating for x in reviews_data]) / float(stats.ratings_total) | 1021 | stats.ratings_average = (sum([x.rating for x in reviews_data]) |
537 | 1022 | / float(stats.ratings_total)) | ||
538 | 1024 | # update UI | 1023 | # update UI |
539 | 1025 | self._update_review_stats_widget(stats) | 1024 | self._update_review_stats_widget(stats) |
540 | 1026 | # update global stats cache as well | 1025 | # update global stats cache as well |
541 | 1027 | self.review_loader.update_review_stats(app, stats) | 1026 | self.review_loader.update_review_stats(app, stats) |
543 | 1028 | 1027 | ||
544 | 1029 | if my_votes: | 1028 | if my_votes: |
545 | 1030 | self.reviews.update_useful_votes(my_votes) | 1029 | self.reviews.update_useful_votes(my_votes) |
547 | 1031 | 1030 | ||
548 | 1032 | if action: | 1031 | if action: |
549 | 1033 | self._review_update_single(action, single_review) | 1032 | self._review_update_single(action, single_review) |
550 | 1034 | else: | 1033 | else: |
551 | @@ -1042,7 +1041,7 @@ | |||
552 | 1042 | # We retrieved data, but nothing new. Keep going. | 1041 | # We retrieved data, but nothing new. Keep going. |
553 | 1043 | self._reviews_server_page += 1 | 1042 | self._reviews_server_page += 1 |
554 | 1044 | self.review_loader.get_reviews( | 1043 | self.review_loader.get_reviews( |
556 | 1045 | self.app, self._reviews_ready_callback, | 1044 | self.app, self._reviews_ready_callback, |
557 | 1046 | page=self._reviews_server_page, | 1045 | page=self._reviews_server_page, |
558 | 1047 | language=self._reviews_server_language, | 1046 | language=self._reviews_server_language, |
559 | 1048 | sort=self._review_sort_method, | 1047 | sort=self._review_sort_method, |
560 | @@ -1069,13 +1068,13 @@ | |||
561 | 1069 | 1068 | ||
562 | 1070 | def on_weblive_exception(self, weblive, exception): | 1069 | def on_weblive_exception(self, weblive, exception): |
563 | 1071 | """ When receiving an exception, reset button and show the error """ | 1070 | """ When receiving an exception, reset button and show the error """ |
565 | 1072 | error(None,"WebLive exception", exception) | 1071 | error(None, "WebLive exception", exception) |
566 | 1073 | self.test_drive.set_label(_("Test drive")) | 1072 | self.test_drive.set_label(_("Test drive")) |
567 | 1074 | self.test_drive.set_sensitive(True) | 1073 | self.test_drive.set_sensitive(True) |
568 | 1075 | 1074 | ||
569 | 1076 | def on_weblive_warning(self, weblive, warning): | 1075 | def on_weblive_warning(self, weblive, warning): |
570 | 1077 | """ When receiving a warning, just show it """ | 1076 | """ When receiving a warning, just show it """ |
572 | 1078 | error(None,"WebLive warning", warning) | 1077 | error(None, "WebLive warning", warning) |
573 | 1079 | 1078 | ||
574 | 1080 | def on_test_drive_clicked(self, button): | 1079 | def on_test_drive_clicked(self, button): |
575 | 1081 | if self.weblive.client.state == "disconnected": | 1080 | if self.weblive.client.state == "disconnected": |
576 | @@ -1090,20 +1089,20 @@ | |||
577 | 1090 | 1089 | ||
578 | 1091 | if len(servers) == 0: | 1090 | if len(servers) == 0: |
579 | 1092 | error(None, | 1091 | error(None, |
581 | 1093 | "No available server", | 1092 | "No available server", |
582 | 1094 | "There is currently no available WebLive server " | 1093 | "There is currently no available WebLive server " |
583 | 1095 | "for this application.\nPlease try again later.") | 1094 | "for this application.\nPlease try again later.") |
584 | 1096 | elif len(servers) == 1: | 1095 | elif len(servers) == 1: |
585 | 1097 | self.weblive.create_automatic_user_and_run_session( | 1096 | self.weblive.create_automatic_user_and_run_session( |
587 | 1098 | session=cmd,serverid=servers[0].name) | 1097 | session=cmd, serverid=servers[0].name) |
588 | 1099 | button.set_sensitive(False) | 1098 | button.set_sensitive(False) |
589 | 1100 | else: | 1099 | else: |
590 | 1101 | d = ShowWebLiveServerChooserDialog(servers, self.app.pkgname) | 1100 | d = ShowWebLiveServerChooserDialog(servers, self.app.pkgname) |
592 | 1102 | serverid=None | 1101 | serverid = None |
593 | 1103 | if d.run() == Gtk.ResponseType.OK: | 1102 | if d.run() == Gtk.ResponseType.OK: |
594 | 1104 | for server in d.servers_vbox: | 1103 | for server in d.servers_vbox: |
595 | 1105 | if server.get_active(): | 1104 | if server.get_active(): |
597 | 1106 | serverid=server.serverid | 1105 | serverid = server.serverid |
598 | 1107 | break | 1106 | break |
599 | 1108 | d.destroy() | 1107 | d.destroy() |
600 | 1109 | 1108 | ||
601 | @@ -1122,13 +1121,11 @@ | |||
602 | 1122 | self.info_vb.reorder_child(table, 0) | 1121 | self.info_vb.reorder_child(table, 0) |
603 | 1123 | if not table.get_property('visible'): | 1122 | if not table.get_property('visible'): |
604 | 1124 | table.show_all() | 1123 | table.show_all() |
605 | 1125 | return | ||
606 | 1126 | 1124 | ||
607 | 1127 | def _on_realize(self, widget): | 1125 | def _on_realize(self, widget): |
608 | 1128 | self.addons_statusbar.hide() | 1126 | self.addons_statusbar.hide() |
609 | 1129 | # the install button gets initial focus | 1127 | # the install button gets initial focus |
610 | 1130 | self.pkg_statusbar.button.grab_focus() | 1128 | self.pkg_statusbar.button.grab_focus() |
611 | 1131 | return | ||
612 | 1132 | 1129 | ||
613 | 1133 | def _on_homepage_clicked(self, label, link): | 1130 | def _on_homepage_clicked(self, label, link): |
614 | 1134 | import webbrowser | 1131 | import webbrowser |
615 | @@ -1160,7 +1157,7 @@ | |||
616 | 1160 | self.title.set_selectable(True) | 1157 | self.title.set_selectable(True) |
617 | 1161 | self.subtitle.set_line_wrap(True) | 1158 | self.subtitle.set_line_wrap(True) |
618 | 1162 | self.subtitle.set_selectable(True) | 1159 | self.subtitle.set_selectable(True) |
620 | 1163 | vb_inner=Gtk.VBox() | 1160 | vb_inner = Gtk.VBox() |
621 | 1164 | vb_inner.pack_start(self.title, False, False, 0) | 1161 | vb_inner.pack_start(self.title, False, False, 0) |
622 | 1165 | vb_inner.pack_start(self.subtitle, False, False, 0) | 1162 | vb_inner.pack_start(self.subtitle, False, False, 0) |
623 | 1166 | 1163 | ||
624 | @@ -1189,10 +1186,11 @@ | |||
625 | 1189 | # installed where widget | 1186 | # installed where widget |
626 | 1190 | self.installed_where_hbox = Gtk.HBox() | 1187 | self.installed_where_hbox = Gtk.HBox() |
627 | 1191 | self.installed_where_hbox.set_spacing(6) | 1188 | self.installed_where_hbox.set_spacing(6) |
629 | 1192 | self.installed_where_hbox.a11y = self.installed_where_hbox.get_accessible() | 1189 | hbox_a11y = self.installed_where_hbox.get_accessible() |
630 | 1190 | self.installed_where_hbox.a11y = hbox_a11y | ||
631 | 1193 | vb.pack_start(self.installed_where_hbox, False, False, 0) | 1191 | vb.pack_start(self.installed_where_hbox, False, False, 0) |
632 | 1194 | 1192 | ||
634 | 1195 | # the hbox that hold the description on the left and the screenshot | 1193 | # the hbox that hold the description on the left and the screenshot |
635 | 1196 | # thumbnail on the right | 1194 | # thumbnail on the right |
636 | 1197 | body_hb = Gtk.HBox() | 1195 | body_hb = Gtk.HBox() |
637 | 1198 | body_hb.set_spacing(12) | 1196 | body_hb.set_spacing(12) |
638 | @@ -1240,7 +1238,7 @@ | |||
639 | 1240 | self.homepage_btn = Gtk.Label() | 1238 | self.homepage_btn = Gtk.Label() |
640 | 1241 | self.homepage_btn.set_name("subtle-label") | 1239 | self.homepage_btn.set_name("subtle-label") |
641 | 1242 | self.homepage_btn.connect('activate-link', self._on_homepage_clicked) | 1240 | self.homepage_btn.connect('activate-link', self._on_homepage_clicked) |
643 | 1243 | 1241 | ||
644 | 1244 | # support site | 1242 | # support site |
645 | 1245 | self.support_btn = Gtk.Label() | 1243 | self.support_btn = Gtk.Label() |
646 | 1246 | self.support_btn.set_name("subtle-label") | 1244 | self.support_btn.set_name("subtle-label") |
647 | @@ -1275,10 +1273,12 @@ | |||
648 | 1275 | self.datadir, None, self.cache, self.db, self.icons, None) | 1273 | self.datadir, None, self.cache, self.db, self.icons, None) |
649 | 1276 | self.recommended_for_app_panel = RecommendationsPanelDetails(catview) | 1274 | self.recommended_for_app_panel = RecommendationsPanelDetails(catview) |
650 | 1277 | self.recommended_for_app_panel.connect( | 1275 | self.recommended_for_app_panel.connect( |
652 | 1278 | "application-activated", self._on_recommended_application_activated) | 1276 | "application-activated", |
653 | 1277 | self._on_recommended_application_activated) | ||
654 | 1279 | self.recommended_for_app_panel.show_all() | 1278 | self.recommended_for_app_panel.show_all() |
657 | 1280 | self.info_vb.pack_start(self.recommended_for_app_panel, False, False, 0) | 1279 | self.info_vb.pack_start(self.recommended_for_app_panel, False, |
658 | 1281 | 1280 | False, 0) | |
659 | 1281 | |||
660 | 1282 | # package info | 1282 | # package info |
661 | 1283 | self.info_keys = [] | 1283 | self.info_keys = [] |
662 | 1284 | 1284 | ||
663 | @@ -1310,14 +1310,15 @@ | |||
664 | 1310 | # reviews cascade | 1310 | # reviews cascade |
665 | 1311 | self.reviews.connect("new-review", self._on_review_new) | 1311 | self.reviews.connect("new-review", self._on_review_new) |
666 | 1312 | self.reviews.connect("report-abuse", self._on_review_report_abuse) | 1312 | self.reviews.connect("report-abuse", self._on_review_report_abuse) |
668 | 1313 | self.reviews.connect("submit-usefulness", self._on_review_submit_usefulness) | 1313 | self.reviews.connect("submit-usefulness", |
669 | 1314 | self._on_review_submit_usefulness) | ||
670 | 1314 | self.reviews.connect("modify-review", self._on_review_modify) | 1315 | self.reviews.connect("modify-review", self._on_review_modify) |
671 | 1315 | self.reviews.connect("delete-review", self._on_review_delete) | 1316 | self.reviews.connect("delete-review", self._on_review_delete) |
672 | 1316 | self.reviews.connect("more-reviews-clicked", | 1317 | self.reviews.connect("more-reviews-clicked", |
673 | 1317 | self._on_more_reviews_clicked) | 1318 | self._on_more_reviews_clicked) |
675 | 1318 | self.reviews.connect("different-review-language-clicked", | 1319 | self.reviews.connect("different-review-language-clicked", |
676 | 1319 | self._on_reviews_in_different_language_clicked) | 1320 | self._on_reviews_in_different_language_clicked) |
678 | 1320 | self.reviews.connect("review-sort-changed", | 1321 | self.reviews.connect("review-sort-changed", |
679 | 1321 | self._on_review_sort_method_changed) | 1322 | self._on_review_sort_method_changed) |
680 | 1322 | if get_distro().REVIEWS_SERVER: | 1323 | if get_distro().REVIEWS_SERVER: |
681 | 1323 | vb.pack_start(self.reviews, False, False, 0) | 1324 | vb.pack_start(self.reviews, False, False, 0) |
682 | @@ -1325,15 +1326,14 @@ | |||
683 | 1325 | self.show_all() | 1326 | self.show_all() |
684 | 1326 | 1327 | ||
685 | 1327 | # signals! | 1328 | # signals! |
688 | 1328 | self.connect('size-allocate', lambda w,a: w.queue_draw()) | 1329 | self.connect('size-allocate', lambda w, a: w.queue_draw()) |
687 | 1329 | return | ||
689 | 1330 | 1330 | ||
690 | 1331 | def _on_recommended_application_activated(self, recwidget, app): | 1331 | def _on_recommended_application_activated(self, recwidget, app): |
691 | 1332 | self.emit("different-application-selected", app) | 1332 | self.emit("different-application-selected", app) |
692 | 1333 | 1333 | ||
693 | 1334 | def _on_review_new(self, button): | 1334 | def _on_review_new(self, button): |
694 | 1335 | self._review_write_new() | 1335 | self._review_write_new() |
696 | 1336 | 1336 | ||
697 | 1337 | def _on_review_modify(self, button, review_id): | 1337 | def _on_review_modify(self, button, review_id): |
698 | 1338 | self._review_modify(review_id) | 1338 | self._review_modify(review_id) |
699 | 1339 | 1339 | ||
700 | @@ -1347,7 +1347,7 @@ | |||
701 | 1347 | self._review_submit_usefulness(review_id, is_useful) | 1347 | self._review_submit_usefulness(review_id, is_useful) |
702 | 1348 | 1348 | ||
703 | 1349 | def _update_title_markup(self, appname, summary): | 1349 | def _update_title_markup(self, appname, summary): |
705 | 1350 | # make title font size fixed as they should look good compared to the | 1350 | # make title font size fixed as they should look good compared to the |
706 | 1351 | # icon (also fixed). | 1351 | # icon (also fixed). |
707 | 1352 | font_size = em(1.6) * Pango.SCALE | 1352 | font_size = em(1.6) * Pango.SCALE |
708 | 1353 | markup = '<span font_size="%s"><b>%s</b></span>' | 1353 | markup = '<span font_size="%s"><b>%s</b></span>' |
709 | @@ -1355,7 +1355,6 @@ | |||
710 | 1355 | self.title.set_markup(markup) | 1355 | self.title.set_markup(markup) |
711 | 1356 | self.title.a11y.set_name(appname + '. ' + summary) | 1356 | self.title.a11y.set_name(appname + '. ' + summary) |
712 | 1357 | self.subtitle.set_markup(summary) | 1357 | self.subtitle.set_markup(summary) |
713 | 1358 | return | ||
714 | 1359 | 1358 | ||
715 | 1360 | def _update_app_icon(self, app_details): | 1359 | def _update_app_icon(self, app_details): |
716 | 1361 | pb = self._get_icon_as_pixbuf(app_details) | 1360 | pb = self._get_icon_as_pixbuf(app_details) |
717 | @@ -1363,13 +1362,12 @@ | |||
718 | 1363 | # self._show_overlay = app_details.pkg_state == PkgStates.INSTALLED | 1362 | # self._show_overlay = app_details.pkg_state == PkgStates.INSTALLED |
719 | 1364 | w, h = pb.get_width(), pb.get_height() | 1363 | w, h = pb.get_width(), pb.get_height() |
720 | 1365 | 1364 | ||
722 | 1366 | tw = self.APP_ICON_SIZE # target width | 1365 | tw = self.APP_ICON_SIZE # target width |
723 | 1367 | if pb.get_width() < tw: | 1366 | if pb.get_width() < tw: |
724 | 1368 | pb = pb.scale_simple(tw, tw, GdkPixbuf.InterpType.TILES) | 1367 | pb = pb.scale_simple(tw, tw, GdkPixbuf.InterpType.TILES) |
725 | 1369 | 1368 | ||
726 | 1370 | self.icon.set_from_pixbuf(pb) | 1369 | self.icon.set_from_pixbuf(pb) |
727 | 1371 | self.icon.set_size_request(self.APP_ICON_SIZE, self.APP_ICON_SIZE) | 1370 | self.icon.set_size_request(self.APP_ICON_SIZE, self.APP_ICON_SIZE) |
728 | 1372 | return | ||
729 | 1373 | 1371 | ||
730 | 1374 | def _update_layout_error_status(self, pkg_error): | 1372 | def _update_layout_error_status(self, pkg_error): |
731 | 1375 | # if we have an error or if we need to enable a source | 1373 | # if we have an error or if we need to enable a source |
732 | @@ -1390,7 +1388,6 @@ | |||
733 | 1390 | self.info_vb.show() | 1388 | self.info_vb.show() |
734 | 1391 | for hbar in self._hbars: | 1389 | for hbar in self._hbars: |
735 | 1392 | hbar.show() | 1390 | hbar.show() |
736 | 1393 | return | ||
737 | 1394 | 1391 | ||
738 | 1395 | def _update_app_description(self, app_details, appname): | 1392 | def _update_app_description(self, app_details, appname): |
739 | 1396 | # format new app description | 1393 | # format new app description |
740 | @@ -1401,9 +1398,8 @@ | |||
741 | 1401 | 1398 | ||
742 | 1402 | # a11y for description | 1399 | # a11y for description |
743 | 1403 | self.desc.description.a11y.set_name(description) | 1400 | self.desc.description.a11y.set_name(description) |
744 | 1404 | return | ||
745 | 1405 | 1401 | ||
747 | 1406 | def _update_description_footer_links(self, app_details): | 1402 | def _update_description_footer_links(self, app_details): |
748 | 1407 | # show or hide the homepage button and set uri if homepage specified | 1403 | # show or hide the homepage button and set uri if homepage specified |
749 | 1408 | if app_details.website: | 1404 | if app_details.website: |
750 | 1409 | self.homepage_btn.show() | 1405 | self.homepage_btn.show() |
751 | @@ -1420,7 +1416,6 @@ | |||
752 | 1420 | self.support_btn.set_tooltip_text(app_details.supportsite) | 1416 | self.support_btn.set_tooltip_text(app_details.supportsite) |
753 | 1421 | else: | 1417 | else: |
754 | 1422 | self.support_btn.hide() | 1418 | self.support_btn.hide() |
755 | 1423 | return | ||
756 | 1424 | 1419 | ||
757 | 1425 | def _update_app_video(self, app_details): | 1420 | def _update_app_video(self, app_details): |
758 | 1426 | self.videoplayer.uri = app_details.video_url | 1421 | self.videoplayer.uri = app_details.video_url |
759 | @@ -1433,20 +1428,20 @@ | |||
760 | 1433 | # get screenshot urls and configure the ScreenshotView... | 1428 | # get screenshot urls and configure the ScreenshotView... |
761 | 1434 | if app_details.thumbnail and app_details.screenshot: | 1429 | if app_details.thumbnail and app_details.screenshot: |
762 | 1435 | self.screenshot.fetch_screenshots(app_details) | 1430 | self.screenshot.fetch_screenshots(app_details) |
763 | 1436 | return | ||
764 | 1437 | 1431 | ||
765 | 1438 | def _update_weblive(self, app_details): | 1432 | def _update_weblive(self, app_details): |
767 | 1439 | if self.weblive.client is None: return | 1433 | if self.weblive.client is None: |
768 | 1434 | return | ||
769 | 1440 | self.desktop_file = app_details.desktop_file | 1435 | self.desktop_file = app_details.desktop_file |
770 | 1441 | # only enable test drive if we have a desktop file and exec line | 1436 | # only enable test drive if we have a desktop file and exec line |
771 | 1442 | if (not self.weblive.ready or | 1437 | if (not self.weblive.ready or |
773 | 1443 | not self.weblive.is_pkgname_available_on_server(app_details.pkgname) or | 1438 | not self.weblive.is_pkgname_available_on_server( |
774 | 1439 | app_details.pkgname) or | ||
775 | 1444 | not os.path.exists(self.desktop_file) or | 1440 | not os.path.exists(self.desktop_file) or |
776 | 1445 | not get_exec_line_from_desktop(self.desktop_file)): | 1441 | not get_exec_line_from_desktop(self.desktop_file)): |
777 | 1446 | self.test_drive.hide() | 1442 | self.test_drive.hide() |
778 | 1447 | else: | 1443 | else: |
779 | 1448 | self.test_drive.show() | 1444 | self.test_drive.show() |
780 | 1449 | return | ||
781 | 1450 | 1445 | ||
782 | 1451 | def _update_warning_bar(self, app_details): | 1446 | def _update_warning_bar(self, app_details): |
783 | 1452 | # generic error wins over HW issue | 1447 | # generic error wins over HW issue |
784 | @@ -1462,7 +1457,7 @@ | |||
785 | 1462 | app_details.hardware_requirements) | 1457 | app_details.hardware_requirements) |
786 | 1463 | if not app_details.region_requirements_satisfied: | 1458 | if not app_details.region_requirements_satisfied: |
787 | 1464 | if len(s) > 0: | 1459 | if len(s) > 0: |
789 | 1465 | s += "\n"+REGION_WARNING_STRING | 1460 | s += "\n" + REGION_WARNING_STRING |
790 | 1466 | else: | 1461 | else: |
791 | 1467 | s = REGION_WARNING_STRING | 1462 | s = REGION_WARNING_STRING |
792 | 1468 | self.pkg_warningbar.label.set_text(s) | 1463 | self.pkg_warningbar.label.set_text(s) |
793 | @@ -1494,7 +1489,6 @@ | |||
794 | 1494 | self.hardware_info.show() | 1489 | self.hardware_info.show() |
795 | 1495 | else: | 1490 | else: |
796 | 1496 | self.hardware_info.hide() | 1491 | self.hardware_info.hide() |
797 | 1497 | return | ||
798 | 1498 | 1492 | ||
799 | 1499 | def _update_addons(self, app_details): | 1493 | def _update_addons(self, app_details): |
800 | 1500 | # refresh addons interface | 1494 | # refresh addons interface |
801 | @@ -1511,7 +1505,6 @@ | |||
802 | 1511 | 1505 | ||
803 | 1512 | # Update addons state bar | 1506 | # Update addons state bar |
804 | 1513 | self.addons_statusbar.configure() | 1507 | self.addons_statusbar.configure() |
805 | 1514 | return | ||
806 | 1515 | 1508 | ||
807 | 1516 | def _update_all(self, app_details, skip_update_addons=False): | 1509 | def _update_all(self, app_details, skip_update_addons=False): |
808 | 1517 | # reset view to top left | 1510 | # reset view to top left |
809 | @@ -1570,7 +1563,6 @@ | |||
810 | 1570 | 1563 | ||
811 | 1571 | # async query zeitgeist and rnr | 1564 | # async query zeitgeist and rnr |
812 | 1572 | self._update_usage_counter() | 1565 | self._update_usage_counter() |
813 | 1573 | return | ||
814 | 1574 | 1566 | ||
815 | 1575 | def _update_minimal(self, app_details): | 1567 | def _update_minimal(self, app_details): |
816 | 1576 | self._update_app_icon(app_details) | 1568 | self._update_app_icon(app_details) |
817 | @@ -1583,12 +1575,11 @@ | |||
818 | 1583 | 1575 | ||
819 | 1584 | # # show where it is | 1576 | # # show where it is |
820 | 1585 | self._configure_where_is_it() | 1577 | self._configure_where_is_it() |
821 | 1586 | return | ||
822 | 1587 | 1578 | ||
823 | 1588 | def _add_where_is_it_commandline(self, pkgname): | 1579 | def _add_where_is_it_commandline(self, pkgname): |
824 | 1589 | cmdfinder = CmdFinder(self.cache) | 1580 | cmdfinder = CmdFinder(self.cache) |
825 | 1590 | cmds = cmdfinder.find_cmds_from_pkgname(pkgname) | 1581 | cmds = cmdfinder.find_cmds_from_pkgname(pkgname) |
827 | 1591 | if not cmds: | 1582 | if not cmds: |
828 | 1592 | return | 1583 | return |
829 | 1593 | vb = Gtk.VBox() | 1584 | vb = Gtk.VBox() |
830 | 1594 | vb.set_spacing(12) | 1585 | vb.set_spacing(12) |
831 | @@ -1604,8 +1595,8 @@ | |||
832 | 1604 | #~ title.set_size_request(self.get_allocation().width-24, -1) | 1595 | #~ title.set_size_request(self.get_allocation().width-24, -1) |
833 | 1605 | vb.pack_start(title, False, False, 0) | 1596 | vb.pack_start(title, False, False, 0) |
834 | 1606 | cmds_str = ", ".join(cmds) | 1597 | cmds_str = ", ".join(cmds) |
837 | 1607 | cmd_label = Gtk.Label(label= | 1598 | cmd_label = Gtk.Label( |
838 | 1608 | '<span font_desc="monospace bold 9">%s</span>' % cmds_str) | 1599 | label='<span font_desc="monospace bold 9">%s</span>' % cmds_str) |
839 | 1609 | cmd_label.set_selectable(True) | 1600 | cmd_label.set_selectable(True) |
840 | 1610 | cmd_label.set_use_markup(True) | 1601 | cmd_label.set_use_markup(True) |
841 | 1611 | cmd_label.set_alignment(0, 0.5) | 1602 | cmd_label.set_alignment(0, 0.5) |
842 | @@ -1650,9 +1641,10 @@ | |||
843 | 1650 | label_name.set_text(app_info.get_name()) | 1641 | label_name.set_text(app_info.get_name()) |
844 | 1651 | 1642 | ||
845 | 1652 | self.installed_where_hbox.pack_start(label_name, False, False, 0) | 1643 | self.installed_where_hbox.pack_start(label_name, False, False, 0) |
849 | 1653 | if i+1 < len(where): | 1644 | if i + 1 < len(where): |
850 | 1654 | right_arrow = Gtk.Arrow.new(Gtk.ArrowType.RIGHT, Gtk.ShadowType.NONE) | 1645 | right_arrow = Gtk.Arrow.new(Gtk.ArrowType.RIGHT, |
851 | 1655 | self.installed_where_hbox.pack_start(right_arrow, | 1646 | Gtk.ShadowType.NONE) |
852 | 1647 | self.installed_where_hbox.pack_start(right_arrow, | ||
853 | 1656 | False, False, 0) | 1648 | False, False, 0) |
854 | 1657 | 1649 | ||
855 | 1658 | # create our a11y text | 1650 | # create our a11y text |
856 | @@ -1694,7 +1686,7 @@ | |||
857 | 1694 | # see if we have the location if its installed | 1686 | # see if we have the location if its installed |
858 | 1695 | if self.app_details.pkg_state == PkgStates.INSTALLED: | 1687 | if self.app_details.pkg_state == PkgStates.INSTALLED: |
859 | 1696 | # first try the desktop file from the DB, then see if | 1688 | # first try the desktop file from the DB, then see if |
861 | 1697 | # there is a local desktop file with the same name as | 1689 | # there is a local desktop file with the same name as |
862 | 1698 | # the package | 1690 | # the package |
863 | 1699 | # try to show menu location if there is a desktop file, but | 1691 | # try to show menu location if there is a desktop file, but |
864 | 1700 | # never show commandline programs for apps with a desktop file | 1692 | # never show commandline programs for apps with a desktop file |
865 | @@ -1705,7 +1697,6 @@ | |||
866 | 1705 | # if there is no desktop file, show commandline | 1697 | # if there is no desktop file, show commandline |
867 | 1706 | else: | 1698 | else: |
868 | 1707 | self._add_where_is_it_commandline(self.app_details.pkgname) | 1699 | self._add_where_is_it_commandline(self.app_details.pkgname) |
869 | 1708 | return | ||
870 | 1709 | 1700 | ||
871 | 1710 | # public API | 1701 | # public API |
872 | 1711 | def show_app(self, app, force=False): | 1702 | def show_app(self, app, force=False): |
873 | @@ -1714,8 +1705,8 @@ | |||
874 | 1714 | LOG.debug("no app selected") | 1705 | LOG.debug("no app selected") |
875 | 1715 | return | 1706 | return |
876 | 1716 | 1707 | ||
879 | 1717 | same_app = (self.app and | 1708 | same_app = (self.app and |
880 | 1718 | self.app.pkgname and | 1709 | self.app.pkgname and |
881 | 1719 | self.app.appname == app.appname and | 1710 | self.app.appname == app.appname and |
882 | 1720 | self.app.pkgname == app.pkgname) | 1711 | self.app.pkgname == app.pkgname) |
883 | 1721 | #print 'SameApp:', same_app | 1712 | #print 'SameApp:', same_app |
884 | @@ -1745,8 +1736,9 @@ | |||
885 | 1745 | # update all (but skip the addons calculation if this is a | 1736 | # update all (but skip the addons calculation if this is a |
886 | 1746 | # DebFileApplication as this is not useful for this case and it | 1737 | # DebFileApplication as this is not useful for this case and it |
887 | 1747 | # increases the view load time dramatically) | 1738 | # increases the view load time dramatically) |
888 | 1739 | skip_update_addons = type(self.app) == DebFileApplication | ||
889 | 1748 | self._update_all(self.app_details, | 1740 | self._update_all(self.app_details, |
891 | 1749 | skip_update_addons=(type(self.app)==DebFileApplication)) | 1741 | skip_update_addons=skip_update_addons) |
892 | 1750 | 1742 | ||
893 | 1751 | # this is a bit silly, but without it and self.title being selectable | 1743 | # this is a bit silly, but without it and self.title being selectable |
894 | 1752 | # gtk will select the entire title (which looks ugly). this grab works | 1744 | # gtk will select the entire title (which looks ugly). this grab works |
895 | @@ -1754,18 +1746,16 @@ | |||
896 | 1754 | self.pkg_statusbar.button.grab_focus() | 1746 | self.pkg_statusbar.button.grab_focus() |
897 | 1755 | 1747 | ||
898 | 1756 | self.emit("selected", self.app) | 1748 | self.emit("selected", self.app) |
899 | 1757 | return | ||
900 | 1758 | 1749 | ||
901 | 1759 | def refresh_app(self): | 1750 | def refresh_app(self): |
902 | 1760 | self.show_app(self.app) | 1751 | self.show_app(self.app) |
903 | 1761 | 1752 | ||
904 | 1762 | |||
905 | 1763 | # common code | 1753 | # common code |
906 | 1764 | def _review_write_new(self): | 1754 | def _review_write_new(self): |
907 | 1765 | if (not self.app or | 1755 | if (not self.app or |
908 | 1766 | not self.app.pkgname in self.cache or | 1756 | not self.app.pkgname in self.cache or |
909 | 1767 | not self.cache[self.app.pkgname].candidate): | 1757 | not self.cache[self.app.pkgname].candidate): |
911 | 1768 | dialogs.error(None, | 1758 | dialogs.error(None, |
912 | 1769 | _("Version unknown"), | 1759 | _("Version unknown"), |
913 | 1770 | _("The version of the application can not " | 1760 | _("The version of the application can not " |
914 | 1771 | "be detected. Entering a review is not " | 1761 | "be detected. Entering a review is not " |
915 | @@ -1778,7 +1768,7 @@ | |||
916 | 1778 | 1768 | ||
917 | 1779 | # FIXME: probably want to not display the ui if we can't review it | 1769 | # FIXME: probably want to not display the ui if we can't review it |
918 | 1780 | if not origin: | 1770 | if not origin: |
920 | 1781 | dialogs.error(None, | 1771 | dialogs.error(None, |
921 | 1782 | _("Origin unknown"), | 1772 | _("Origin unknown"), |
922 | 1783 | _("The origin of the application can not " | 1773 | _("The origin of the application can not " |
923 | 1784 | "be detected. Entering a review is not " | 1774 | "be detected. Entering a review is not " |
924 | @@ -1787,7 +1777,8 @@ | |||
925 | 1787 | 1777 | ||
926 | 1788 | if pkg.installed: | 1778 | if pkg.installed: |
927 | 1789 | version = pkg.installed.version | 1779 | version = pkg.installed.version |
929 | 1790 | # call the loader to do call out the right helper and collect the result | 1780 | # call the loader to do call out the right helper and collect the |
930 | 1781 | # result | ||
931 | 1791 | parent_xid = '' | 1782 | parent_xid = '' |
932 | 1792 | #parent_xid = get_parent_xid(self) | 1783 | #parent_xid = get_parent_xid(self) |
933 | 1793 | self.reviews.new_review.disable() | 1784 | self.reviews.new_review.disable() |
934 | @@ -1796,7 +1787,7 @@ | |||
935 | 1796 | parent_xid, self.datadir, | 1787 | parent_xid, self.datadir, |
936 | 1797 | self._reviews_ready_callback, | 1788 | self._reviews_ready_callback, |
937 | 1798 | done_callback=self._submit_reviews_done_callback) | 1789 | done_callback=self._submit_reviews_done_callback) |
939 | 1799 | 1790 | ||
940 | 1800 | def _review_report_abuse(self, review_id): | 1791 | def _review_report_abuse(self, review_id): |
941 | 1801 | parent_xid = '' | 1792 | parent_xid = '' |
942 | 1802 | #parent_xid = get_parent_xid(self) | 1793 | #parent_xid = get_parent_xid(self) |
943 | @@ -1809,7 +1800,7 @@ | |||
944 | 1809 | self.review_loader.spawn_submit_usefulness_ui( | 1800 | self.review_loader.spawn_submit_usefulness_ui( |
945 | 1810 | review_id, is_useful, parent_xid, self.datadir, | 1801 | review_id, is_useful, parent_xid, self.datadir, |
946 | 1811 | self._reviews_ready_callback) | 1802 | self._reviews_ready_callback) |
948 | 1812 | 1803 | ||
949 | 1813 | def _review_modify(self, review_id): | 1804 | def _review_modify(self, review_id): |
950 | 1814 | parent_xid = '' | 1805 | parent_xid = '' |
951 | 1815 | #parent_xid = get_parent_xid(self) | 1806 | #parent_xid = get_parent_xid(self) |
952 | @@ -1834,11 +1825,12 @@ | |||
953 | 1834 | state = self.pkg_statusbar.pkg_state | 1825 | state = self.pkg_statusbar.pkg_state |
954 | 1835 | 1826 | ||
955 | 1836 | # handle purchase: install purchased has multiple steps | 1827 | # handle purchase: install purchased has multiple steps |
957 | 1837 | if (state == PkgStates.INSTALLING_PURCHASED and | 1828 | if (state == PkgStates.INSTALLING_PURCHASED and |
958 | 1838 | result and | 1829 | result and |
959 | 1839 | not result.pkgname): | 1830 | not result.pkgname): |
962 | 1840 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLING_PURCHASED) | 1831 | self.pkg_statusbar.configure(self.app_details, |
963 | 1841 | elif (state == PkgStates.INSTALLING_PURCHASED and | 1832 | PkgStates.INSTALLING_PURCHASED) |
964 | 1833 | elif (state == PkgStates.INSTALLING_PURCHASED and | ||
965 | 1842 | result and | 1834 | result and |
966 | 1843 | result.pkgname): | 1835 | result.pkgname): |
967 | 1844 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLED) | 1836 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLED) |
968 | @@ -1846,7 +1838,8 @@ | |||
969 | 1846 | self.reviews.configure_reviews_ui() | 1838 | self.reviews.configure_reviews_ui() |
970 | 1847 | # normal states | 1839 | # normal states |
971 | 1848 | elif state == PkgStates.REMOVING: | 1840 | elif state == PkgStates.REMOVING: |
973 | 1849 | self.pkg_statusbar.configure(self.app_details, PkgStates.UNINSTALLED) | 1841 | self.pkg_statusbar.configure(self.app_details, |
974 | 1842 | PkgStates.UNINSTALLED) | ||
975 | 1850 | elif state == PkgStates.INSTALLING: | 1843 | elif state == PkgStates.INSTALLING: |
976 | 1851 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLED) | 1844 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLED) |
977 | 1852 | elif state == PkgStates.UPGRADING: | 1845 | elif state == PkgStates.UPGRADING: |
978 | @@ -1862,15 +1855,16 @@ | |||
979 | 1862 | # reset the reviews UI now that we have installed the package | 1855 | # reset the reviews UI now that we have installed the package |
980 | 1863 | self.reviews.configure_reviews_ui() | 1856 | self.reviews.configure_reviews_ui() |
981 | 1864 | elif state == PkgStates.UNINSTALLED: | 1857 | elif state == PkgStates.UNINSTALLED: |
983 | 1865 | self.pkg_statusbar.configure(self.app_details, PkgStates.UNINSTALLED) | 1858 | self.pkg_statusbar.configure(self.app_details, |
984 | 1859 | PkgStates.UNINSTALLED) | ||
985 | 1866 | self.adjustment_value = None | 1860 | self.adjustment_value = None |
987 | 1867 | 1861 | ||
988 | 1868 | if self.addons_statusbar.applying: | 1862 | if self.addons_statusbar.applying: |
989 | 1869 | self.addons_statusbar.applying = False | 1863 | self.addons_statusbar.applying = False |
990 | 1870 | 1864 | ||
991 | 1871 | return False | 1865 | return False |
992 | 1872 | 1866 | ||
994 | 1873 | def _on_transaction_started(self, backend, pkgname, appname, trans_id, | 1867 | def _on_transaction_started(self, backend, pkgname, appname, trans_id, |
995 | 1874 | trans_type): | 1868 | trans_type): |
996 | 1875 | if self.addons_statusbar.applying: | 1869 | if self.addons_statusbar.applying: |
997 | 1876 | self.pkg_statusbar.configure(self.app_details, AppActions.APPLY) | 1870 | self.pkg_statusbar.configure(self.app_details, AppActions.APPLY) |
998 | @@ -1879,32 +1873,32 @@ | |||
999 | 1879 | state = self.pkg_statusbar.pkg_state | 1873 | state = self.pkg_statusbar.pkg_state |
1000 | 1880 | LOG.debug("_on_transaction_started %s" % state) | 1874 | LOG.debug("_on_transaction_started %s" % state) |
1001 | 1881 | if state == PkgStates.NEEDS_PURCHASE: | 1875 | if state == PkgStates.NEEDS_PURCHASE: |
1003 | 1882 | self.pkg_statusbar.configure(self.app_details, | 1876 | self.pkg_statusbar.configure(self.app_details, |
1004 | 1883 | PkgStates.INSTALLING_PURCHASED) | 1877 | PkgStates.INSTALLING_PURCHASED) |
1005 | 1884 | elif (state == PkgStates.UNINSTALLED or | 1878 | elif (state == PkgStates.UNINSTALLED or |
1006 | 1885 | state == PkgStates.FORCE_VERSION): | 1879 | state == PkgStates.FORCE_VERSION): |
1008 | 1886 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLING) | 1880 | self.pkg_statusbar.configure(self.app_details, |
1009 | 1881 | PkgStates.INSTALLING) | ||
1010 | 1887 | elif state == PkgStates.INSTALLED: | 1882 | elif state == PkgStates.INSTALLED: |
1011 | 1888 | self.pkg_statusbar.configure(self.app_details, PkgStates.REMOVING) | 1883 | self.pkg_statusbar.configure(self.app_details, PkgStates.REMOVING) |
1012 | 1889 | elif state == PkgStates.UPGRADABLE: | 1884 | elif state == PkgStates.UPGRADABLE: |
1013 | 1890 | self.pkg_statusbar.configure(self.app_details, PkgStates.UPGRADING) | 1885 | self.pkg_statusbar.configure(self.app_details, PkgStates.UPGRADING) |
1014 | 1891 | elif state == PkgStates.REINSTALLABLE: | 1886 | elif state == PkgStates.REINSTALLABLE: |
1016 | 1892 | self.pkg_statusbar.configure(self.app_details, PkgStates.INSTALLING) | 1887 | self.pkg_statusbar.configure(self.app_details, |
1017 | 1888 | PkgStates.INSTALLING) | ||
1018 | 1893 | # FIXME: is there a way to tell if we are installing/removing? | 1889 | # FIXME: is there a way to tell if we are installing/removing? |
1019 | 1894 | # we will assume that it is being installed, but this means that | 1890 | # we will assume that it is being installed, but this means that |
1020 | 1895 | # during removals we get the text "Installing.." | 1891 | # during removals we get the text "Installing.." |
1023 | 1896 | # self.pkg_statusbar.configure(self.app_details, PkgStates.REMOVING) | 1892 | # self.pkg_statusbar.configure(self.app_details, |
1024 | 1897 | return | 1893 | # PkgStates.REMOVING) |
1025 | 1898 | 1894 | ||
1026 | 1899 | def _on_transaction_stopped(self, backend, result): | 1895 | def _on_transaction_stopped(self, backend, result): |
1027 | 1900 | self.pkg_statusbar.progress.hide() | 1896 | self.pkg_statusbar.progress.hide() |
1028 | 1901 | self._update_interface_on_trans_ended(result) | 1897 | self._update_interface_on_trans_ended(result) |
1029 | 1902 | return | ||
1030 | 1903 | 1898 | ||
1031 | 1904 | def _on_transaction_finished(self, backend, result): | 1899 | def _on_transaction_finished(self, backend, result): |
1032 | 1905 | self.pkg_statusbar.progress.hide() | 1900 | self.pkg_statusbar.progress.hide() |
1033 | 1906 | self._update_interface_on_trans_ended(result) | 1901 | self._update_interface_on_trans_ended(result) |
1034 | 1907 | return | ||
1035 | 1908 | 1902 | ||
1036 | 1909 | def _on_transaction_progress_changed(self, backend, pkgname, progress): | 1903 | def _on_transaction_progress_changed(self, backend, pkgname, progress): |
1037 | 1910 | if (self.app_details and | 1904 | if (self.app_details and |
1038 | @@ -1915,11 +1909,10 @@ | |||
1039 | 1915 | self.pkg_statusbar.combo_multiple_versions.hide() | 1909 | self.pkg_statusbar.combo_multiple_versions.hide() |
1040 | 1916 | self.pkg_statusbar.progress.show() | 1910 | self.pkg_statusbar.progress.show() |
1041 | 1917 | if pkgname in backend.pending_transactions: | 1911 | if pkgname in backend.pending_transactions: |
1043 | 1918 | self.pkg_statusbar.progress.set_fraction(progress/100.0) | 1912 | self.pkg_statusbar.progress.set_fraction(progress / 100.0) |
1044 | 1919 | if progress >= 100: | 1913 | if progress >= 100: |
1045 | 1920 | self.pkg_statusbar.progress.set_fraction(1) | 1914 | self.pkg_statusbar.progress.set_fraction(1) |
1046 | 1921 | self.adjustment_value = self.get_vadjustment().get_value() | 1915 | self.adjustment_value = self.get_vadjustment().get_value() |
1047 | 1922 | return | ||
1048 | 1923 | 1916 | ||
1049 | 1924 | def get_app_icon_details(self): | 1917 | def get_app_icon_details(self): |
1050 | 1925 | """ helper for unity dbus support to provide details about the | 1918 | """ helper for unity dbus support to provide details about the |
1051 | @@ -1941,7 +1934,7 @@ | |||
1052 | 1941 | else: | 1934 | else: |
1053 | 1942 | icon_size = pb.get_height() | 1935 | icon_size = pb.get_height() |
1054 | 1943 | return icon_size | 1936 | return icon_size |
1056 | 1944 | 1937 | ||
1057 | 1945 | def _get_app_icon_xy_position_on_screen(self): | 1938 | def _get_app_icon_xy_position_on_screen(self): |
1058 | 1946 | """ helper for unity dbus support to get the x,y position of | 1939 | """ helper for unity dbus support to get the x,y position of |
1059 | 1947 | the application icon as it is displayed on-screen. if the icon's | 1940 | the application icon as it is displayed on-screen. if the icon's |
1060 | @@ -1954,15 +1947,15 @@ | |||
1061 | 1954 | parent = parent.get_parent() | 1947 | parent = parent.get_parent() |
1062 | 1955 | # get x, y relative to toplevel | 1948 | # get x, y relative to toplevel |
1063 | 1956 | try: | 1949 | try: |
1065 | 1957 | (x,y) = self.icon.translate_coordinates(parent, 0, 0) | 1950 | (x, y) = self.icon.translate_coordinates(parent, 0, 0) |
1066 | 1958 | except Exception as e: | 1951 | except Exception as e: |
1067 | 1959 | LOG.warning("couldn't translate icon coordinates on-screen " | 1952 | LOG.warning("couldn't translate icon coordinates on-screen " |
1068 | 1960 | "for unity dbus message: %s" % e) | 1953 | "for unity dbus message: %s" % e) |
1070 | 1961 | return (0,0) | 1954 | return (0, 0) |
1071 | 1962 | # get toplevel window position | 1955 | # get toplevel window position |
1072 | 1963 | (px, py) = parent.get_position() | 1956 | (px, py) = parent.get_position() |
1075 | 1964 | return (px+x, py+y) | 1957 | return (px + x, py + y) |
1076 | 1965 | 1958 | ||
1077 | 1966 | def _get_icon_as_pixbuf(self, app_details): | 1959 | def _get_icon_as_pixbuf(self, app_details): |
1078 | 1967 | if app_details.icon: | 1960 | if app_details.icon: |
1079 | 1968 | if self.icons.has_icon(app_details.icon): | 1961 | if self.icons.has_icon(app_details.icon): |
1080 | @@ -1978,9 +1971,10 @@ | |||
1081 | 1978 | LOG.debug("did not find the icon locally, must download it") | 1971 | LOG.debug("did not find the icon locally, must download it") |
1082 | 1979 | 1972 | ||
1083 | 1980 | def on_image_download_complete(downloader, image_file_path): | 1973 | def on_image_download_complete(downloader, image_file_path): |
1085 | 1981 | # when the download is complete, replace the icon in the | 1974 | # when the download is complete, replace the icon in the |
1086 | 1982 | # view with the downloaded one | 1975 | # view with the downloaded one |
1088 | 1983 | logging.debug("_get_icon_as_pixbuf:image_downloaded() %s" % image_file_path) | 1976 | logging.debug("_get_icon_as_pixbuf:image_downloaded() %s" % |
1089 | 1977 | image_file_path) | ||
1090 | 1984 | try: | 1978 | try: |
1091 | 1985 | pb = GdkPixbuf.Pixbuf.new_from_file(image_file_path) | 1979 | pb = GdkPixbuf.Pixbuf.new_from_file(image_file_path) |
1092 | 1986 | # fixes crash in testsuite if window is destroyed | 1980 | # fixes crash in testsuite if window is destroyed |
1093 | @@ -1989,15 +1983,17 @@ | |||
1094 | 1989 | if self.icon.get_property("visible"): | 1983 | if self.icon.get_property("visible"): |
1095 | 1990 | self.icon.set_from_pixbuf(pb) | 1984 | self.icon.set_from_pixbuf(pb) |
1096 | 1991 | except Exception as e: | 1985 | except Exception as e: |
1099 | 1992 | LOG.warning("couldn't load downloadable icon file '%s': %s" % (image_file_path, e)) | 1986 | LOG.warning( |
1100 | 1993 | 1987 | "couldn't load downloadable icon file '%s': %s" % | |
1101 | 1988 | (image_file_path, e)) | ||
1102 | 1989 | |||
1103 | 1994 | image_downloader = SimpleFileDownloader() | 1990 | image_downloader = SimpleFileDownloader() |
1104 | 1995 | image_downloader.connect( | 1991 | image_downloader.connect( |
1105 | 1996 | 'file-download-complete', on_image_download_complete) | 1992 | 'file-download-complete', on_image_download_complete) |
1106 | 1997 | image_downloader.download_file( | 1993 | image_downloader.download_file( |
1107 | 1998 | app_details.icon_url, app_details.cached_icon_file_path) | 1994 | app_details.icon_url, app_details.cached_icon_file_path) |
1108 | 1999 | return self.icons.load_icon(Icons.MISSING_APP, self.APP_ICON_SIZE, 0) | 1995 | return self.icons.load_icon(Icons.MISSING_APP, self.APP_ICON_SIZE, 0) |
1110 | 2000 | 1996 | ||
1111 | 2001 | def update_totalsize(self): | 1997 | def update_totalsize(self): |
1112 | 2002 | if not self.totalsize_info.get_property('visible'): | 1998 | if not self.totalsize_info.get_property('visible'): |
1113 | 2003 | return False | 1999 | return False |
1114 | @@ -2013,7 +2009,7 @@ | |||
1115 | 2013 | self.addons_manager.addons_to_remove, | 2009 | self.addons_manager.addons_to_remove, |
1116 | 2014 | self.app.archive_suite) | 2010 | self.app.archive_suite) |
1117 | 2015 | total_download_size, total_install_size = res | 2011 | total_download_size, total_install_size = res |
1119 | 2016 | if res==(0,0) and type(self.app)==DebFileApplication: | 2012 | if res == (0, 0) and type(self.app) == DebFileApplication: |
1120 | 2017 | total_install_size = self.app_details.installed_size | 2013 | total_install_size = self.app_details.installed_size |
1121 | 2018 | if total_download_size > 0: | 2014 | if total_download_size > 0: |
1122 | 2019 | download_size = GLib.format_size(total_download_size) | 2015 | download_size = GLib.format_size(total_download_size) |
1123 | @@ -2032,22 +2028,21 @@ | |||
1124 | 2032 | elif total_install_size < 0: | 2028 | elif total_install_size < 0: |
1125 | 2033 | remove_size = GLib.format_size(-total_install_size) | 2029 | remove_size = GLib.format_size(-total_install_size) |
1126 | 2034 | label_string += _("%s to be freed") % (remove_size) | 2030 | label_string += _("%s to be freed") % (remove_size) |
1128 | 2035 | 2031 | ||
1129 | 2036 | self.totalsize_info.set_value(label_string or _("Unknown")) | 2032 | self.totalsize_info.set_value(label_string or _("Unknown")) |
1130 | 2037 | # self.totalsize_info.show_all() | 2033 | # self.totalsize_info.show_all() |
1131 | 2038 | return False | 2034 | return False |
1132 | 2039 | 2035 | ||
1133 | 2040 | def set_section(self, section): | 2036 | def set_section(self, section): |
1134 | 2041 | self.section = section | 2037 | self.section = section |
1137 | 2042 | return | 2038 | |
1136 | 2043 | |||
1138 | 2044 | def _update_usage_counter(self): | 2039 | def _update_usage_counter(self): |
1139 | 2045 | """ try to get the usage counter from zeitgeist """ | 2040 | """ try to get the usage counter from zeitgeist """ |
1140 | 2046 | def _zeitgeist_callback(counter): | 2041 | def _zeitgeist_callback(counter): |
1141 | 2047 | LOG.debug("zeitgeist usage: %s" % counter) | 2042 | LOG.debug("zeitgeist usage: %s" % counter) |
1142 | 2048 | if counter == 0: | 2043 | if counter == 0: |
1143 | 2049 | # this probably means we just have no idea about it, | 2044 | # this probably means we just have no idea about it, |
1145 | 2050 | # so instead of saying "Used: never" we just return | 2045 | # so instead of saying "Used: never" we just return |
1146 | 2051 | # this can go away when zeitgeist captures more events | 2046 | # this can go away when zeitgeist captures more events |
1147 | 2052 | # --there are still cases when we really do want to hide this | 2047 | # --there are still cases when we really do want to hide this |
1148 | 2053 | self.usage.hide() | 2048 | self.usage.hide() |
1149 | @@ -2055,7 +2050,7 @@ | |||
1150 | 2055 | if counter <= 100: | 2050 | if counter <= 100: |
1151 | 2056 | label_string = gettext.ngettext("Used: one time", | 2051 | label_string = gettext.ngettext("Used: one time", |
1152 | 2057 | "Used: %(amount)s times", | 2052 | "Used: %(amount)s times", |
1154 | 2058 | counter) % { 'amount' : counter, } | 2053 | counter) % {'amount': counter} |
1155 | 2059 | else: | 2054 | else: |
1156 | 2060 | label_string = _("Used: over 100 times") | 2055 | label_string = _("Used: over 100 times") |
1157 | 2061 | self.usage.set_text('<small>%s</small>' % label_string) | 2056 | self.usage.set_text('<small>%s</small>' % label_string) |
1158 | @@ -2070,6 +2065,7 @@ | |||
1159 | 2070 | # LOG.warning("could not update the usage counter: %s " % e) | 2065 | # LOG.warning("could not update the usage counter: %s " % e) |
1160 | 2071 | # self.usage.hide() | 2066 | # self.usage.hide() |
1161 | 2072 | 2067 | ||
1162 | 2068 | |||
1163 | 2073 | def get_test_window_appdetails(): | 2069 | def get_test_window_appdetails(): |
1164 | 2074 | 2070 | ||
1165 | 2075 | from softwarecenter.db.pkginfo import get_pkg_info | 2071 | from softwarecenter.db.pkginfo import get_pkg_info |
1166 | @@ -2082,7 +2078,7 @@ | |||
1167 | 2082 | db = StoreDatabase(pathname, cache) | 2078 | db = StoreDatabase(pathname, cache) |
1168 | 2083 | db.open() | 2079 | db.open() |
1169 | 2084 | 2080 | ||
1171 | 2085 | import softwarecenter.paths | 2081 | import softwarecenter.paths |
1172 | 2086 | datadir = softwarecenter.paths.datadir | 2082 | datadir = softwarecenter.paths.datadir |
1173 | 2087 | 2083 | ||
1174 | 2088 | from softwarecenter.ui.gtk3.utils import get_sc_icon_theme | 2084 | from softwarecenter.ui.gtk3.utils import get_sc_icon_theme |
1175 | @@ -2090,7 +2086,7 @@ | |||
1176 | 2090 | 2086 | ||
1177 | 2091 | import softwarecenter.distro | 2087 | import softwarecenter.distro |
1178 | 2092 | distro = softwarecenter.distro.get_distro() | 2088 | distro = softwarecenter.distro.get_distro() |
1180 | 2093 | 2089 | ||
1181 | 2094 | # gui | 2090 | # gui |
1182 | 2095 | win = Gtk.Window() | 2091 | win = Gtk.Window() |
1183 | 2096 | scroll = Gtk.ScrolledWindow() | 2092 | scroll = Gtk.ScrolledWindow() |
1184 | @@ -2118,7 +2114,7 @@ | |||
1185 | 2118 | scroll.add(view) | 2114 | scroll.add(view) |
1186 | 2119 | scroll.show() | 2115 | scroll.show() |
1187 | 2120 | win.add(scroll) | 2116 | win.add(scroll) |
1189 | 2121 | win.set_size_request(600,800) | 2117 | win.set_size_request(600, 800) |
1190 | 2122 | win.show() | 2118 | win.show() |
1191 | 2123 | win.connect('destroy', Gtk.main_quit) | 2119 | win.connect('destroy', Gtk.main_quit) |
1192 | 2124 | win.set_data("view", view) | 2120 | win.set_data("view", view) |
1193 | @@ -2132,7 +2128,7 @@ | |||
1194 | 2132 | else: | 2128 | else: |
1195 | 2133 | view.show_app(Application("Movie Player", "totem")) | 2129 | view.show_app(Application("Movie Player", "totem")) |
1196 | 2134 | return True | 2130 | return True |
1198 | 2135 | 2131 | ||
1199 | 2136 | win = get_test_window_appdetails() | 2132 | win = get_test_window_appdetails() |
1200 | 2137 | 2133 | ||
1201 | 2138 | # keep it spinning to test for re-draw issues and memleaks | 2134 | # keep it spinning to test for re-draw issues and memleaks |
1202 | 2139 | 2135 | ||
1203 | === modified file 'test/test_pep8.py' | |||
1204 | --- test/test_pep8.py 2012-03-14 16:34:56 +0000 | |||
1205 | +++ test/test_pep8.py 2012-03-14 23:52:20 +0000 | |||
1206 | @@ -18,7 +18,7 @@ | |||
1207 | 18 | softwarecenter.ui.gtk3.views, | 18 | softwarecenter.ui.gtk3.views, |
1208 | 19 | softwarecenter.ui.gtk3.widgets, | 19 | softwarecenter.ui.gtk3.widgets, |
1209 | 20 | softwarecenter.db.pkginfo_impl] | 20 | softwarecenter.db.pkginfo_impl] |
1211 | 21 | exclude = ['appdetailsview.py'] | 21 | exclude = [] |
1212 | 22 | 22 | ||
1213 | 23 | def message(self, text): | 23 | def message(self, text): |
1214 | 24 | self.errors.append(text) | 24 | self.errors.append(text) |
I think the two cases you mention look just fine. Thanks as always, Anthony!