Merge lp:~elachuni/software-center/pep8-test-part4 into lp:software-center

Proposed by Anthony Lenton
Status: Merged
Merged at revision: 2838
Proposed branch: lp:~elachuni/software-center/pep8-test-part4
Merge into: lp:software-center
Diff against target: 1180 lines (+218/-210)
6 files modified
softwarecenter/ui/gtk3/widgets/reviews.py (+148/-130)
softwarecenter/ui/gtk3/widgets/searchaid.py (+22/-38)
softwarecenter/ui/gtk3/widgets/searchentry.py (+14/-12)
softwarecenter/ui/gtk3/widgets/sections.py (+15/-13)
softwarecenter/ui/gtk3/widgets/spinner.py (+18/-15)
test/test_pep8.py (+1/-2)
To merge this branch: bzr merge lp:~elachuni/software-center/pep8-test-part4
Reviewer Review Type Date Requested Status
software-store-developers Pending
Review via email: mp+96676@code.launchpad.net

Description of the change

More pep8 goodness.

I'm not sure about the specific format for comments to Translators, please check that I didn't break anything on lines 635 and 780 of the diff.

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
=== modified file 'softwarecenter/ui/gtk3/widgets/reviews.py'
--- softwarecenter/ui/gtk3/widgets/reviews.py 2012-01-18 18:21:04 +0000
+++ softwarecenter/ui/gtk3/widgets/reviews.py 2012-03-08 22:37:21 +0000
@@ -32,21 +32,27 @@
32from stars import Star32from stars import Star
33from softwarecenter.utils import (33from softwarecenter.utils import (
34 get_person_from_config,34 get_person_from_config,
35 get_nice_date_string, 35 get_nice_date_string,
36 upstream_version_compare, 36 upstream_version_compare,
37 upstream_version,37 upstream_version,
38 utf8,38 utf8,
39 )39 )
4040
4141
42from softwarecenter.i18n import get_languages, langcode_to_name42from softwarecenter.i18n import (
43 get_languages,
44 langcode_to_name,
45 )
4346
44from softwarecenter.netstatus import network_state_is_connected, get_network_watcher47from softwarecenter.netstatus import (
48 network_state_is_connected,
49 get_network_watcher,
50 )
45from softwarecenter.enums import (51from softwarecenter.enums import (
46 PkgStates, 52 PkgStates,
47 ReviewSortMethods,53 ReviewSortMethods,
48 )54 )
49 55
50from softwarecenter.backend.reviews import UsefulnessCache56from softwarecenter.backend.reviews import UsefulnessCache
5157
52from softwarecenter.ui.gtk3.em import StockEms58from softwarecenter.ui.gtk3.em import StockEms
@@ -58,33 +64,34 @@
58(COL_LANGNAME,64(COL_LANGNAME,
59 COL_LANGCODE) = range(2)65 COL_LANGCODE) = range(2)
6066
67
61class UIReviewsList(Gtk.VBox):68class UIReviewsList(Gtk.VBox):
6269
63 __gsignals__ = {70 __gsignals__ = {
64 'new-review':(GObject.SignalFlags.RUN_FIRST,71 'new-review': (GObject.SignalFlags.RUN_FIRST,
65 None,72 None,
66 ()),73 ()),
67 'report-abuse':(GObject.SignalFlags.RUN_FIRST,74 'report-abuse': (GObject.SignalFlags.RUN_FIRST,
68 None,75 None,
69 (GObject.TYPE_PYOBJECT,)),76 (GObject.TYPE_PYOBJECT,)),
70 'submit-usefulness':(GObject.SignalFlags.RUN_FIRST,77 'submit-usefulness': (GObject.SignalFlags.RUN_FIRST,
71 None,78 None,
72 (GObject.TYPE_PYOBJECT, bool)),79 (GObject.TYPE_PYOBJECT, bool)),
73 'modify-review':(GObject.SignalFlags.RUN_FIRST,80 'modify-review': (GObject.SignalFlags.RUN_FIRST,
74 None,81 None,
75 (GObject.TYPE_PYOBJECT,)),82 (GObject.TYPE_PYOBJECT,)),
76 'delete-review':(GObject.SignalFlags.RUN_FIRST,83 'delete-review': (GObject.SignalFlags.RUN_FIRST,
77 None,84 None,
78 (GObject.TYPE_PYOBJECT,)),85 (GObject.TYPE_PYOBJECT,)),
79 'more-reviews-clicked':(GObject.SignalFlags.RUN_FIRST,86 'more-reviews-clicked': (GObject.SignalFlags.RUN_FIRST,
80 None,87 None,
81 () ),88 ()),
82 'different-review-language-clicked':(GObject.SignalFlags.RUN_FIRST,89 'different-review-language-clicked': (GObject.SignalFlags.RUN_FIRST,
83 None,90 None,
84 (GObject.TYPE_STRING,) ),91 (GObject.TYPE_STRING,)),
85 'review-sort-changed':(GObject.SignalFlags.RUN_FIRST,92 'review-sort-changed': (GObject.SignalFlags.RUN_FIRST,
86 None,93 None,
87 (GObject.TYPE_INT,) ),94 (GObject.TYPE_INT,)),
88 }95 }
8996
90 def __init__(self, parent):97 def __init__(self, parent):
@@ -109,7 +116,7 @@
109 label.set_alignment(0, 0.5)116 label.set_alignment(0, 0.5)
110 self.pack_start(label, False, False, 0)117 self.pack_start(label, False, False, 0)
111118
112 # header 119 # header
113 self.header = Gtk.HBox()120 self.header = Gtk.HBox()
114 self.header.set_spacing(StockEms.MEDIUM)121 self.header.set_spacing(StockEms.MEDIUM)
115122
@@ -136,8 +143,8 @@
136 self.review_language.add_attribute(cell, "text", COL_LANGNAME)143 self.review_language.add_attribute(cell, "text", COL_LANGNAME)
137 self.review_language_model = Gtk.ListStore(str, str)144 self.review_language_model = Gtk.ListStore(str, str)
138 for lang in get_languages():145 for lang in get_languages():
139 self.review_language_model.append( (langcode_to_name(lang), lang) )146 self.review_language_model.append((langcode_to_name(lang), lang))
140 self.review_language_model.append( (_('Any language'), 'any') )147 self.review_language_model.append((_('Any language'), 'any'))
141 self.review_language.set_model(self.review_language_model)148 self.review_language.set_model(self.review_language_model)
142 self.review_language.set_active(0)149 self.review_language.set_active(0)
143 self.review_language.connect(150 self.review_language.connect(
@@ -153,10 +160,9 @@
153 self.no_network_msg = None160 self.no_network_msg = None
154 watcher = get_network_watcher()161 watcher = get_network_watcher()
155 watcher.connect(162 watcher.connect(
156 "changed", lambda w,s: self._on_network_state_change())163 "changed", lambda w, s: self._on_network_state_change())
157164
158 self.show_all()165 self.show_all()
159 return
160166
161 def _on_network_state_change(self):167 def _on_network_state_change(self):
162 is_connected = network_state_is_connected()168 is_connected = network_state_is_connected()
@@ -171,7 +177,7 @@
171177
172 def _on_button_new_clicked(self, button):178 def _on_button_new_clicked(self, button):
173 self.emit("new-review")179 self.emit("new-review")
174 180
175 def _on_sort_method_changed(self, cb):181 def _on_sort_method_changed(self, cb):
176 selection = self.sort_combo.get_active()182 selection = self.sort_combo.get_active()
177 if selection == self._current_sort:183 if selection == self._current_sort:
@@ -179,7 +185,7 @@
179 else:185 else:
180 self._current_sort = selection186 self._current_sort = selection
181 self.emit("review-sort-changed", selection)187 self.emit("review-sort-changed", selection)
182 188
183 def update_useful_votes(self, my_votes):189 def update_useful_votes(self, my_votes):
184 self.useful_votes = my_votes190 self.useful_votes = my_votes
185191
@@ -191,26 +197,25 @@
191 if self.reviews:197 if self.reviews:
192 for r in self.reviews:198 for r in self.reviews:
193 pkgversion = self._parent.app_details.version199 pkgversion = self._parent.app_details.version
194 review = UIReview(r, pkgversion, self.logged_in_person, self.useful_votes)200 review = UIReview(r, pkgversion, self.logged_in_person,
201 self.useful_votes)
195 self.vbox.pack_start(review, True, True, 0)202 self.vbox.pack_start(review, True, True, 0)
196 return
197203
198 def _be_the_first_to_review(self):204 def _be_the_first_to_review(self):
199 s = _('Be the first to review it')205 s = _('Be the first to review it')
200 self.new_review.set_label(s)206 self.new_review.set_label(s)
201 self.vbox.pack_start(NoReviewYetWriteOne(), True, True, 0)207 self.vbox.pack_start(NoReviewYetWriteOne(), True, True, 0)
202 self.vbox.show_all()208 self.vbox.show_all()
203 return
204209
205 def _install_to_review(self):210 def _install_to_review(self):
206 s = '<small>%s</small>' % _("You need to install this before you can review it")211 s = ('<small>%s</small>' %
212 _("You need to install this before you can review it"))
207 self.install_first_label = Gtk.Label(label=s)213 self.install_first_label = Gtk.Label(label=s)
208 self.install_first_label.set_use_markup(True)214 self.install_first_label.set_use_markup(True)
209 self.install_first_label.set_alignment(1.0, 0.5)215 self.install_first_label.set_alignment(1.0, 0.5)
210 self.header.pack_start(self.install_first_label, False, False, 0)216 self.header.pack_start(self.install_first_label, False, False, 0)
211 self.install_first_label.show()217 self.install_first_label.show()
212 return218
213
214 # FIXME: this needs to be smarter in the future as we will219 # FIXME: this needs to be smarter in the future as we will
215 # not allow multiple reviews for the same software version220 # not allow multiple reviews for the same software version
216 def _any_reviews_current_user(self):221 def _any_reviews_current_user(self):
@@ -225,14 +230,14 @@
225 m = EmbeddedMessage(title, msg, 'network-offline')230 m = EmbeddedMessage(title, msg, 'network-offline')
226 self.vbox.pack_start(m, True, True, 0)231 self.vbox.pack_start(m, True, True, 0)
227 return m232 return m
228 233
229 def _clear_vbox(self, vbox):234 def _clear_vbox(self, vbox):
230 children = vbox.get_children()235 children = vbox.get_children()
231 for child in children:236 for child in children:
232 child.destroy()237 child.destroy()
233238
234 # FIXME: instead of clear/add_reviews/configure_reviews_ui we should provide239 # FIXME: instead of clear/add_reviews/configure_reviews_ui we should
235 # a single show_reviews(reviews_data_list)240 # provide a single show_reviews(reviews_data_list)
236 def configure_reviews_ui(self):241 def configure_reviews_ui(self):
237 """ this needs to be called after add_reviews, it will actually242 """ this needs to be called after add_reviews, it will actually
238 show the reviews243 show the reviews
@@ -243,7 +248,7 @@
243 self.install_first_label.hide()248 self.install_first_label.hide()
244 except AttributeError:249 except AttributeError:
245 pass250 pass
246 251
247 self._clear_vbox(self.vbox)252 self._clear_vbox(self.vbox)
248253
249 # network sensitive stuff, only show write_review if connected,254 # network sensitive stuff, only show write_review if connected,
@@ -253,14 +258,14 @@
253258
254 # only show new_review for installed stuff259 # only show new_review for installed stuff
255 is_installed = (self._parent.app_details and260 is_installed = (self._parent.app_details and
256 self._parent.app_details.pkg_state == PkgStates.INSTALLED)261 self._parent.app_details.pkg_state == PkgStates.INSTALLED)
257262
258 # show/hide new review button263 # show/hide new review button
259 if is_installed:264 if is_installed:
260 self.new_review.show()265 self.new_review.show()
261 else:266 else:
262 self.new_review.hide()267 self.new_review.hide()
263 # if there are no reviews, the install to review text appears 268 # if there are no reviews, the install to review text appears
264 # where the reviews usually are (LP #823255)269 # where the reviews usually are (LP #823255)
265 if self.reviews:270 if self.reviews:
266 self._install_to_review()271 self._install_to_review()
@@ -301,7 +306,6 @@
301 # always run this here to make update the current ui based on the306 # always run this here to make update the current ui based on the
302 # network state307 # network state
303 self._on_network_state_change()308 self._on_network_state_change()
304 return
305309
306 def _on_more_reviews_clicked(self, button):310 def _on_more_reviews_clicked(self, button):
307 # remove buttn and emit signal311 # remove buttn and emit signal
@@ -323,11 +327,10 @@
323 ids = []327 ids = []
324 for review in self.reviews:328 for review in self.reviews:
325 ids.append(review.id)329 ids.append(review.id)
326 return ids 330 return ids
327331
328 def add_review(self, review):332 def add_review(self, review):
329 self.reviews.append(review)333 self.reviews.append(review)
330 return
331334
332 def replace_review(self, review):335 def replace_review(self, review):
333 for r in self.reviews:336 for r in self.reviews:
@@ -336,14 +339,12 @@
336 self.reviews.remove(r)339 self.reviews.remove(r)
337 self.reviews.insert(pos, review)340 self.reviews.insert(pos, review)
338 break341 break
339 return
340342
341 def remove_review(self, review):343 def remove_review(self, review):
342 for r in self.reviews:344 for r in self.reviews:
343 if r.id == review.id:345 if r.id == review.id:
344 self.reviews.remove(r)346 self.reviews.remove(r)
345 break347 break
346 return
347348
348 def clear(self):349 def clear(self):
349 self.reviews = []350 self.reviews = []
@@ -358,7 +359,7 @@
358 self.install_first_label.hide()359 self.install_first_label.hide()
359 except AttributeError:360 except AttributeError:
360 pass361 pass
361 362
362 a = Gtk.Alignment.new(0.5, 0.5, 1.0, 1.0)363 a = Gtk.Alignment.new(0.5, 0.5, 1.0, 1.0)
363 hb = Gtk.HBox(spacing=12)364 hb = Gtk.HBox(spacing=12)
364 hb.show()365 hb.show()
@@ -380,26 +381,23 @@
380381
381 self.vbox.pack_start(a, False, False, 0)382 self.vbox.pack_start(a, False, False, 0)
382 self.vbox.show()383 self.vbox.show()
383 return
384384
385 def hide_spinner(self):385 def hide_spinner(self):
386 for child in self.vbox.get_children():386 for child in self.vbox.get_children():
387 if isinstance(child, Gtk.Alignment):387 if isinstance(child, Gtk.Alignment):
388 child.destroy()388 child.destroy()
389 return
390389
391 def draw(self, cr, a):390 def draw(self, cr, a):
392 for r in self.vbox:391 for r in self.vbox:
393 if isinstance(r, (UIReview)):392 if isinstance(r, (UIReview)):
394 r.draw(cr, r.get_allocation())393 r.draw(cr, r.get_allocation())
395 return
396394
397395
398class UIReview(Gtk.VBox):396class UIReview(Gtk.VBox):
399 """ the UI for a individual review including all button to mark397 """ the UI for a individual review including all button to mark
400 useful/inappropriate etc398 useful/inappropriate etc
401 """399 """
402 def __init__(self, review_data=None, app_version=None, 400 def __init__(self, review_data=None, app_version=None,
403 logged_in_person=None, useful_votes=None):401 logged_in_person=None, useful_votes=None):
404 GObject.GObject.__init__(self)402 GObject.GObject.__init__(self)
405 self.set_spacing(StockEms.SMALL)403 self.set_spacing(StockEms.SMALL)
@@ -420,15 +418,15 @@
420 self.delete_error_img = Gtk.Image()418 self.delete_error_img = Gtk.Image()
421 self.delete_error_img.set_from_stock(419 self.delete_error_img.set_from_stock(
422 Gtk.STOCK_DIALOG_ERROR,420 Gtk.STOCK_DIALOG_ERROR,
423 Gtk.IconSize.SMALL_TOOLBAR) 421 Gtk.IconSize.SMALL_TOOLBAR)
424 self.submit_error_img = Gtk.Image()422 self.submit_error_img = Gtk.Image()
425 self.submit_error_img.set_from_stock(423 self.submit_error_img.set_from_stock(
426 Gtk.STOCK_DIALOG_ERROR,424 Gtk.STOCK_DIALOG_ERROR,
427 Gtk.IconSize.SMALL_TOOLBAR)425 Gtk.IconSize.SMALL_TOOLBAR)
428 self.submit_status_spinner = Gtk.Spinner()426 self.submit_status_spinner = Gtk.Spinner()
429 self.submit_status_spinner.set_size_request(12,12)427 self.submit_status_spinner.set_size_request(12, 12)
430 self.delete_status_spinner = Gtk.Spinner()428 self.delete_status_spinner = Gtk.Spinner()
431 self.delete_status_spinner.set_size_request(12,12)429 self.delete_status_spinner.set_size_request(12, 12)
432 self.acknowledge_error = Gtk.Button()430 self.acknowledge_error = Gtk.Button()
433 label = Gtk.Label()431 label = Gtk.Label()
434 label.set_markup('<small>%s</small>' % _("OK"))432 label.set_markup('<small>%s</small>' % _("OK"))
@@ -465,7 +463,6 @@
465463
466 def _on_realize(self, widget, *content):464 def _on_realize(self, widget, *content):
467 self._build(*content)465 self._build(*content)
468 return
469466
470 def _on_report_abuse_clicked(self, button):467 def _on_report_abuse_clicked(self, button):
471 reviews = self.get_ancestor(UIReviewsList)468 reviews = self.get_ancestor(UIReviewsList)
@@ -476,46 +473,54 @@
476 reviews = self.get_ancestor(UIReviewsList)473 reviews = self.get_ancestor(UIReviewsList)
477 if reviews:474 if reviews:
478 reviews.emit("modify-review", self.id)475 reviews.emit("modify-review", self.id)
479 476
480 def _on_useful_clicked(self, btn, is_useful):477 def _on_useful_clicked(self, btn, is_useful):
481 reviews = self.get_ancestor(UIReviewsList)478 reviews = self.get_ancestor(UIReviewsList)
482 if reviews:479 if reviews:
483 self._usefulness_ui_update('progress')480 self._usefulness_ui_update('progress')
484 reviews.emit("submit-usefulness", self.id, is_useful)481 reviews.emit("submit-usefulness", self.id, is_useful)
485 482
486 def _on_error_acknowledged(self, button, current_user_reviewer, useful_total, useful_favorable):483 def _on_error_acknowledged(self, button, current_user_reviewer,
484 useful_total, useful_favorable):
487 self.usefulness_error = False485 self.usefulness_error = False
488 self._usefulness_ui_update('renew', current_user_reviewer, useful_total, useful_favorable)486 self._usefulness_ui_update('renew', current_user_reviewer,
489 487 useful_total, useful_favorable)
490 def _usefulness_ui_update(self, type, current_user_reviewer=False, useful_total=0, useful_favorable=0):488
489 def _usefulness_ui_update(self, type, current_user_reviewer=False,
490 useful_total=0, useful_favorable=0):
491 self._hide_usefulness_elements()491 self._hide_usefulness_elements()
492 #print "_usefulness_ui_update: %s" % type492 #print "_usefulness_ui_update: %s" % type
493 if type == 'renew':493 if type == 'renew':
494 self._build_usefulness_ui(current_user_reviewer, useful_total, useful_favorable, self.useful_votes)494 self._build_usefulness_ui(current_user_reviewer, useful_total,
495 useful_favorable, self.useful_votes)
495 return496 return
496 if type == 'progress':497 if type == 'progress':
497 self.status_label = Gtk.Label.new("<small>%s</small>" % _(u"Submitting now\u2026"))498 self.status_label = Gtk.Label.new(
499 "<small>%s</small>" % _(u"Submitting now\u2026"))
498 self.status_label.set_use_markup(True)500 self.status_label.set_use_markup(True)
499 self.status_box.pack_start(self.submit_status_spinner, False, False, 0)501 self.status_box.pack_start(self.submit_status_spinner, False,
502 False, 0)
500 self.submit_status_spinner.show()503 self.submit_status_spinner.show()
501 self.submit_status_spinner.start()504 self.submit_status_spinner.start()
502 self.status_label.set_padding(2,0)505 self.status_label.set_padding(2, 0)
503 self.status_box.pack_start(self.status_label, False, False, 0)506 self.status_box.pack_start(self.status_label, False, False, 0)
504 self.status_label.show()507 self.status_label.show()
505 if type == 'error':508 if type == 'error':
506 self.submit_error_img.show()509 self.submit_error_img.show()
507 self.status_label = Gtk.Label.new("<small>%s</small>" % _("Error submitting usefulness"))510 self.status_label = Gtk.Label.new(
511 "<small>%s</small>" % _("Error submitting usefulness"))
508 self.status_label.set_use_markup(True)512 self.status_label.set_use_markup(True)
509 self.status_box.pack_start(self.submit_error_img, False, False, 0)513 self.status_box.pack_start(self.submit_error_img, False, False, 0)
510 self.status_label.set_padding(2,0)514 self.status_label.set_padding(2, 0)
511 self.status_box.pack_start(self.status_label, False, False, 0)515 self.status_box.pack_start(self.status_label, False, False, 0)
512 self.status_label.show()516 self.status_label.show()
513 self.acknowledge_error.show()517 self.acknowledge_error.show()
514 self.status_box.pack_start(self.acknowledge_error, False, False, 0)518 self.status_box.pack_start(self.acknowledge_error, False, False, 0)
515 self.acknowledge_error.connect('clicked', self._on_error_acknowledged, current_user_reviewer, useful_total, useful_favorable)519 self.acknowledge_error.connect('clicked',
520 self._on_error_acknowledged, current_user_reviewer,
521 useful_total, useful_favorable)
516 self.status_box.show()522 self.status_box.show()
517 self.footer.pack_start(self.status_box, False, False, 0)523 self.footer.pack_start(self.status_box, False, False, 0)
518 return
519524
520 def _hide_usefulness_elements(self):525 def _hide_usefulness_elements(self):
521 """ hide all usefulness elements """526 """ hide all usefulness elements """
@@ -526,13 +531,13 @@
526 widget = getattr(self, attr, None)531 widget = getattr(self, attr, None)
527 if widget:532 if widget:
528 widget.hide()533 widget.hide()
529 return
530534
531 def _get_datetime_from_review_date(self, raw_date_str):535 def _get_datetime_from_review_date(self, raw_date_str):
532 # example raw_date str format: 2011-01-28 19:15:21536 # example raw_date str format: 2011-01-28 19:15:21
533 return datetime.datetime.strptime(raw_date_str, '%Y-%m-%d %H:%M:%S')537 return datetime.datetime.strptime(raw_date_str, '%Y-%m-%d %H:%M:%S')
534538
535 def _delete_ui_update(self, type, current_user_reviewer=False, action=None):539 def _delete_ui_update(self, type, current_user_reviewer=False,
540 action=None):
536 self._hide_delete_elements()541 self._hide_delete_elements()
537 if type == 'renew':542 if type == 'renew':
538 self._build_delete_flag_ui(current_user_reviewer)543 self._build_delete_flag_ui(current_user_reviewer)
@@ -540,35 +545,42 @@
540 if type == 'progress':545 if type == 'progress':
541 self.delete_status_spinner.start()546 self.delete_status_spinner.start()
542 self.delete_status_spinner.show()547 self.delete_status_spinner.show()
543 self.delete_status_label = Gtk.Label("<small><b>%s</b></small>" % _(u"Deleting now\u2026"))548 self.delete_status_label = Gtk.Label(
544 self.delete_status_box.pack_start(self.delete_status_spinner, False, False, 0)549 "<small><b>%s</b></small>" % _(u"Deleting now\u2026"))
550 self.delete_status_box.pack_start(self.delete_status_spinner,
551 False, False, 0)
545 self.delete_status_label.set_use_markup(True)552 self.delete_status_label.set_use_markup(True)
546 self.delete_status_label.set_padding(2,0)553 self.delete_status_label.set_padding(2, 0)
547 self.delete_status_box.pack_start(self.delete_status_label, False, False, 0)554 self.delete_status_box.pack_start(self.delete_status_label, False,
555 False, 0)
548 self.delete_status_label.show()556 self.delete_status_label.show()
549 if type == 'error':557 if type == 'error':
550 self.delete_error_img.show()558 self.delete_error_img.show()
551 # build full strings for easier i18n 559 # build full strings for easier i18n
552 if action == 'deleting':560 if action == 'deleting':
553 s = _("Error deleting review")561 s = _("Error deleting review")
554 elif action == 'modifying':562 elif action == 'modifying':
555 s = _("Error modifying review")563 s = _("Error modifying review")
556 else:564 else:
557 # or unknown error, but we are in string freeze, 565 # or unknown error, but we are in string freeze,
558 # should never happen anyway566 # should never happen anyway
559 s = _("Internal Error")567 s = _("Internal Error")
560 self.delete_status_label = Gtk.Label("<small><b>%s</b></small>" % s)568 self.delete_status_label = Gtk.Label(
561 self.delete_status_box.pack_start(self.delete_error_img, False, False, 0)569 "<small><b>%s</b></small>" % s)
570 self.delete_status_box.pack_start(self.delete_error_img,
571 False, False, 0)
562 self.delete_status_label.set_use_markup(True)572 self.delete_status_label.set_use_markup(True)
563 self.delete_status_label.set_padding(2,0)573 self.delete_status_label.set_padding(2, 0)
564 self.delete_status_box.pack_start(self.delete_status_label, False, False, 0)574 self.delete_status_box.pack_start(self.delete_status_label,
575 False, False, 0)
565 self.delete_status_label.show()576 self.delete_status_label.show()
566 self.delete_acknowledge_error.show()577 self.delete_acknowledge_error.show()
567 self.delete_status_box.pack_start(self.delete_acknowledge_error, False, False, 0)578 self.delete_status_box.pack_start(self.delete_acknowledge_error,
568 self.delete_acknowledge_error.connect('clicked', self._on_delete_error_acknowledged, current_user_reviewer)579 False, False, 0)
580 self.delete_acknowledge_error.connect('clicked',
581 self._on_delete_error_acknowledged, current_user_reviewer)
569 self.delete_status_box.show()582 self.delete_status_box.show()
570 self.footer.pack_end(self.delete_status_box, False, False, 0)583 self.footer.pack_end(self.delete_status_box, False, False, 0)
571 return
572584
573 def _on_delete_clicked(self, btn):585 def _on_delete_clicked(self, btn):
574 reviews = self.get_ancestor(UIReviewsList)586 reviews = self.get_ancestor(UIReviewsList)
@@ -583,16 +595,16 @@
583 def _hide_delete_elements(self):595 def _hide_delete_elements(self):
584 """ hide all delete elements """596 """ hide all delete elements """
585 for attr in ["complain", "edit", "delete", "delete_status_spinner",597 for attr in ["complain", "edit", "delete", "delete_status_spinner",
586 "delete_error_img", "delete_status_box", "delete_status_label",598 "delete_error_img", "delete_status_box",
587 "delete_acknowledge_error", "flagbox"599 "delete_status_label", "delete_acknowledge_error",
600 "flagbox"
588 ]:601 ]:
589 o = getattr(self, attr, None)602 o = getattr(self, attr, None)
590 if o:603 if o:
591 o.hide()604 o.hide()
592 return
593605
594 def _build(self, review_data, app_version, logged_in_person, useful_votes):606 def _build(self, review_data, app_version, logged_in_person, useful_votes):
595 # all the attributes of review_data may need markup escape, 607 # all the attributes of review_data may need markup escape,
596 # depening on if they are used as text or markup608 # depening on if they are used as text or markup
597 self.id = review_data.id609 self.id = review_data.id
598 self.person = review_data.reviewer_username610 self.person = review_data.reviewer_username
@@ -610,15 +622,15 @@
610 # upstream version622 # upstream version
611 version = GObject.markup_escape_text(upstream_version(review_version))623 version = GObject.markup_escape_text(upstream_version(review_version))
612 # default string624 # default string
613 version_string = _("For version %(version)s") % { 625 version_string = _("For version %(version)s") % {
614 'version' : version,626 'version': version,
615 }627 }
616 # If its for the same version, show it as such628 # If its for the same version, show it as such
617 if (review_version and629 if (review_version and
618 app_version and630 app_version and
619 upstream_version_compare(review_version, app_version) == 0):631 upstream_version_compare(review_version, app_version) == 0):
620 version_string = _("For this version (%(version)s)") % { 632 version_string = _("For this version (%(version)s)") % {
621 'version' : version,633 'version': version,
622 }634 }
623635
624 m = '<small>%s</small>'636 m = '<small>%s</small>'
@@ -663,31 +675,34 @@
663 current_user_reviewer = True675 current_user_reviewer = True
664676
665 self._build_usefulness_ui(current_user_reviewer, useful_total,677 self._build_usefulness_ui(current_user_reviewer, useful_total,
666 useful_favorable, useful_votes, useful_submit_error)678 useful_favorable, useful_votes,
679 useful_submit_error)
667680
668 self.flagbox = Gtk.HBox()681 self.flagbox = Gtk.HBox()
669 self.flagbox.set_spacing(4)682 self.flagbox.set_spacing(4)
670 self._build_delete_flag_ui(current_user_reviewer, delete_error, modify_error)683 self._build_delete_flag_ui(current_user_reviewer, delete_error,
684 modify_error)
671 self.footer.pack_end(self.flagbox, False, False, 0)685 self.footer.pack_end(self.flagbox, False, False, 0)
672686
673 # connect network signals687 # connect network signals
674 self.connect("realize", lambda w: self._on_network_state_change())688 self.connect("realize", lambda w: self._on_network_state_change())
675 watcher = get_network_watcher()689 watcher = get_network_watcher()
676 watcher.connect(690 watcher.connect(
677 "changed", lambda w,s: self._on_network_state_change())691 "changed", lambda w, s: self._on_network_state_change())
678 return692
679 693 def _build_usefulness_ui(self, current_user_reviewer, useful_total,
680 def _build_usefulness_ui(self, current_user_reviewer, useful_total, 694 useful_favorable, useful_votes,
681 useful_favorable, useful_votes, usefulness_submit_error=False):695 usefulness_submit_error=False):
682 if usefulness_submit_error:696 if usefulness_submit_error:
683 self._usefulness_ui_update('error', current_user_reviewer, 697 self._usefulness_ui_update('error', current_user_reviewer,
684 useful_total, useful_favorable)698 useful_total, useful_favorable)
685 else:699 else:
686 already_voted = useful_votes.check_for_usefulness(self.id)700 already_voted = useful_votes.check_for_usefulness(self.id)
687 #get correct label based on retrieved usefulness totals and 701 #get correct label based on retrieved usefulness totals and
688 # if user is reviewer702 # if user is reviewer
689 self.useful = self._get_usefulness_label(703 self.useful = self._get_usefulness_label(
690 current_user_reviewer, useful_total, useful_favorable, already_voted)704 current_user_reviewer, useful_total, useful_favorable,
705 already_voted)
691 self.useful.set_use_markup(True)706 self.useful.set_use_markup(True)
692 #vertically centre so it lines up with the Yes and No buttons707 #vertically centre so it lines up with the Yes and No buttons
693 self.useful.set_alignment(0, 0.5)708 self.useful.set_alignment(0, 0.5)
@@ -714,7 +729,6 @@
714 self.likebox.pack_start(self.yes_no_separator, False, False, 0)729 self.likebox.pack_start(self.yes_no_separator, False, False, 0)
715 self.likebox.pack_start(self.no_like, False, False, 0)730 self.likebox.pack_start(self.no_like, False, False, 0)
716 self.footer.pack_start(self.likebox, False, False, 0)731 self.footer.pack_start(self.likebox, False, False, 0)
717 return
718732
719 def _on_network_state_change(self):733 def _on_network_state_change(self):
720 """ show/hide widgets based on network connection state """734 """ show/hide widgets based on network connection state """
@@ -732,10 +746,10 @@
732 # actually submit anything without network746 # actually submit anything without network
733 self.useful.hide()747 self.useful.hide()
734 self.complain.hide()748 self.complain.hide()
735 749
736 def _get_usefulness_label(self, current_user_reviewer, 750 def _get_usefulness_label(self, current_user_reviewer,
737 useful_total, useful_favorable, already_voted):751 useful_total, useful_favorable, already_voted):
738 '''returns Gtk.Label() to be used as usefulness label depending 752 '''returns Gtk.Label() to be used as usefulness label depending
739 on passed in parameters753 on passed in parameters
740 '''754 '''
741 if already_voted == None:755 if already_voted == None:
@@ -751,9 +765,10 @@
751 "found this review helpful.",765 "found this review helpful.",
752 "%(useful_favorable)s of %(useful_total)s people "766 "%(useful_favorable)s of %(useful_total)s people "
753 "found this review helpful.",767 "found this review helpful.",
754 useful_total) % { 'useful_total' : useful_total,768 useful_total) % {
755 'useful_favorable' : useful_favorable,769 'useful_total': useful_total,
756 }770 'useful_favorable': useful_favorable,
771 }
757 else:772 else:
758 # user has not already voted for the review773 # user has not already voted for the review
759 s = gettext.ngettext(774 s = gettext.ngettext(
@@ -761,9 +776,10 @@
761 "found this review helpful. Did you?",776 "found this review helpful. Did you?",
762 "%(useful_favorable)s of %(useful_total)s people "777 "%(useful_favorable)s of %(useful_total)s people "
763 "found this review helpful. Did you?",778 "found this review helpful. Did you?",
764 useful_total) % { 'useful_total' : useful_total,779 useful_total) % {
765 'useful_favorable' : useful_favorable,780 'useful_total': useful_total,
766 }781 'useful_favorable': useful_favorable,
782 }
767 else:783 else:
768 #only display these special strings if the user voted either way784 #only display these special strings if the user voted either way
769 if already_voted:785 if already_voted:
@@ -775,9 +791,10 @@
775 "found this review helpful, including you",791 "found this review helpful, including you",
776 "%(useful_favorable)s of %(useful_total)s people "792 "%(useful_favorable)s of %(useful_total)s people "
777 "found this review helpful, including you.",793 "found this review helpful, including you.",
778 useful_total) % { 'useful_total' : useful_total,794 useful_total) % {
779 'useful_favorable' : useful_favorable,795 'useful_total': useful_total,
780 }796 'useful_favorable': useful_favorable,
797 }
781 else:798 else:
782 if useful_total == 1:799 if useful_total == 1:
783 s = _("You found this review unhelpful.")800 s = _("You found this review unhelpful.")
@@ -787,17 +804,19 @@
787 "found this review helpful; you did not.",804 "found this review helpful; you did not.",
788 "%(useful_favorable)s of %(useful_total)s people "805 "%(useful_favorable)s of %(useful_total)s people "
789 "found this review helpful; you did not.",806 "found this review helpful; you did not.",
790 useful_total) % { 'useful_total' : useful_total,807 useful_total) % {
791 'useful_favorable' : useful_favorable,808 'useful_total': useful_total,
792 }809 'useful_favorable': useful_favorable,
810 }
793811
794 m = '<small>%s</small>'812 m = '<small>%s</small>'
795 label = Gtk.Label()813 label = Gtk.Label()
796 label.set_name("subtle-label")814 label.set_name("subtle-label")
797 label.set_markup(m % s)815 label.set_markup(m % s)
798 return label816 return label
799 817
800 def _build_delete_flag_ui(self, current_user_reviewer, delete_error=False, modify_error=False):818 def _build_delete_flag_ui(self, current_user_reviewer, delete_error=False,
819 modify_error=False):
801 if delete_error:820 if delete_error:
802 self._delete_ui_update('error', current_user_reviewer, 'deleting')821 self._delete_ui_update('error', current_user_reviewer, 'deleting')
803 elif modify_error:822 elif modify_error:
@@ -814,16 +833,16 @@
814 self.edit.connect('clicked', self._on_modify_clicked)833 self.edit.connect('clicked', self._on_modify_clicked)
815 self.delete.connect('clicked', self._on_delete_clicked)834 self.delete.connect('clicked', self._on_delete_clicked)
816 else:835 else:
817 # Translators: This link is for flagging a review as inappropriate.836 # Translators: This link is for flagging a review as
818 # To minimize repetition, if at all possible, keep it to a single word.837 # inappropriate. To minimize repetition, if at all possible,
819 # If your language has an obvious verb, it won't need a question mark.838 # keep it to a single word. If your language has an obvious
839 # verb, it won't need a question mark.
820 self.complain = Link(m % _('Inappropriate?'))840 self.complain = Link(m % _('Inappropriate?'))
821 self.complain.set_name("subtle-label")841 self.complain.set_name("subtle-label")
822 self.complain.set_sensitive(network_state_is_connected())842 self.complain.set_sensitive(network_state_is_connected())
823 self.flagbox.pack_start(self.complain, False, False, 0)843 self.flagbox.pack_start(self.complain, False, False, 0)
824 self.complain.connect('clicked', self._on_report_abuse_clicked)844 self.complain.connect('clicked', self._on_report_abuse_clicked)
825 self.flagbox.show_all()845 self.flagbox.show_all()
826 return
827846
828 def _whom_when_markup(self, person, displayname, cur_t):847 def _whom_when_markup(self, person, displayname, cur_t):
829 nice_date = get_nice_date_string(cur_t)848 nice_date = get_nice_date_string(cur_t)
@@ -851,7 +870,7 @@
851 return m870 return m
852871
853 def draw(self, widget, cr):872 def draw(self, widget, cr):
854 return873 pass
855874
856875
857class EmbeddedMessage(UIReview):876class EmbeddedMessage(UIReview):
@@ -860,7 +879,7 @@
860 UIReview.__init__(self)879 UIReview.__init__(self)
861 self.label = None880 self.label = None
862 self.image = None881 self.image = None
863 882
864 a = Gtk.Alignment.new(0.5, 0.5, 1.0, 1.0)883 a = Gtk.Alignment.new(0.5, 0.5, 1.0, 1.0)
865 self.body.pack_start(a, False, False, 0)884 self.body.pack_start(a, False, False, 0)
866885
@@ -878,16 +897,16 @@
878 self.label.set_alignment(0, 0.5)897 self.label.set_alignment(0, 0.5)
879898
880 if title:899 if title:
881 self.label.set_markup('<b><big>%s</big></b>\n%s' % (title, message))900 self.label.set_markup('<b><big>%s</big></b>\n%s' %
901 (title, message))
882 else:902 else:
883 self.label.set_markup(message)903 self.label.set_markup(message)
884904
885 hb.pack_start(self.label, True, True, 0)905 hb.pack_start(self.label, True, True, 0)
886 self.show_all()906 self.show_all()
887 return
888907
889 def draw(self, cr, a):908 def draw(self, cr, a):
890 return909 pass
891910
892911
893class NoReviewRelaxLanguage(EmbeddedMessage):912class NoReviewRelaxLanguage(EmbeddedMessage):
@@ -922,7 +941,6 @@
922 msg = _('Be the first to contribute a review for this application')941 msg = _('Be the first to contribute a review for this application')
923942
924 EmbeddedMessage.__init__(self, title, msg, 'text-editor')943 EmbeddedMessage.__init__(self, title, msg, 'text-editor')
925 return
926944
927945
928def get_test_reviews_window():946def get_test_reviews_window():
929947
=== modified file 'softwarecenter/ui/gtk3/widgets/searchaid.py'
--- softwarecenter/ui/gtk3/widgets/searchaid.py 2011-10-08 17:22:54 +0000
+++ softwarecenter/ui/gtk3/widgets/searchaid.py 2012-03-08 22:37:21 +0000
@@ -10,10 +10,10 @@
10class Suggestions(Gtk.VBox):10class Suggestions(Gtk.VBox):
1111
12 __gsignals__ = {12 __gsignals__ = {
13 "activate-link" : (GObject.SignalFlags.RUN_LAST,13 "activate-link": (GObject.SignalFlags.RUN_LAST,
14 None, 14 None,
15 (GObject.TYPE_PYOBJECT, str),15 (GObject.TYPE_PYOBJECT, str),
16 ),16 ),
17 }17 }
1818
19 def __init__(self):19 def __init__(self):
@@ -29,28 +29,24 @@
2929
30 self._labels = []30 self._labels = []
31 self._handlers = []31 self._handlers = []
32 return
3332
34 def on_link_activate(self, widget, uri):33 def on_link_activate(self, widget, uri):
35 self.reset_all()34 self.reset_all()
36 self.emit("activate-link", widget, uri)35 self.emit("activate-link", widget, uri)
37 return True #silences the gtk-warning36 return True # silences the gtk-warning
3837
39 def foreach(self, label_func, *args):38 def foreach(self, label_func, *args):
40 for label in [self.title,] + self._labels:39 for label in [self.title] + self._labels:
41 label_func(label, *args)40 label_func(label, *args)
42 return
4341
44 def set_alignment(self, xalign, yalign):42 def set_alignment(self, xalign, yalign):
45 self.xalign = xalign43 self.xalign = xalign
46 self.yalign = yalign44 self.yalign = yalign
4745
48 self.foreach(Gtk.Label.set_alignment, xalign, yalign)46 self.foreach(Gtk.Label.set_alignment, xalign, yalign)
49 return
5047
51 def set_title(self, title_markup):48 def set_title(self, title_markup):
52 self.title.set_markup(title_markup)49 self.title.set_markup(title_markup)
53 return
5450
55 def append_suggestion(self, suggestion_markup):51 def append_suggestion(self, suggestion_markup):
56 label = Gtk.Label()52 label = Gtk.Label()
@@ -62,13 +58,12 @@
62 self._handlers.append(58 self._handlers.append(
63 label.connect("activate-link", self.on_link_activate))59 label.connect("activate-link", self.on_link_activate))
64 self._labels.append(label)60 self._labels.append(label)
65 return
6661
67 def set_suggestions(self, suggestions):62 def set_suggestions(self, suggestions):
68 if self._labels: self.reset()63 if self._labels:
64 self.reset()
69 for s in suggestions:65 for s in suggestions:
70 self.append_suggestion(s)66 self.append_suggestion(s)
71 return
7267
73 def reset(self):68 def reset(self):
74 for label, handler in zip(self._labels, self._handlers):69 for label, handler in zip(self._labels, self._handlers):
@@ -77,26 +72,24 @@
7772
78 self._labels = []73 self._labels = []
79 self._handlers = []74 self._handlers = []
80 return
8175
82 def reset_all(self):76 def reset_all(self):
83 self.title.set_text('')77 self.title.set_text('')
84 self.reset()78 self.reset()
85 return
8679
8780
88class SearchAidLogic(object):81class SearchAidLogic(object):
8982
90 HEADER_ICON_NAME = "face-sad"83 HEADER_ICON_NAME = "face-sad"
91 HEADER_MARKUP = '<b><big>%s</big></b>'84 HEADER_MARKUP = '<b><big>%s</big></b>'
92 #TRANSLATORS: this is the layout of an indented line starting with a bullet point85 #TRANSLATORS: this is the layout of an indented
86 # line starting with a bullet point
93 BULLET = unicode(_("\t• %s"), 'utf8').encode('utf8')87 BULLET = unicode(_("\t• %s"), 'utf8').encode('utf8')
9488
95 def __init__(self, pane):89 def __init__(self, pane):
96 self.pane = pane90 self.pane = pane
97 self.db = pane.db91 self.db = pane.db
98 self.enquirer = pane.enquirer92 self.enquirer = pane.enquirer
99 return
10093
101 def is_search_aid_required(self, state):94 def is_search_aid_required(self, state):
102 return (state.search_term and95 return (state.search_term and
@@ -115,7 +108,7 @@
115 return category.name108 return category.name
116 plain_text = _("%(category_name)s → %(subcategory_name)s")109 plain_text = _("%(category_name)s → %(subcategory_name)s")
117 usable_text = unicode(plain_text, 'utf8').encode('utf8')110 usable_text = unicode(plain_text, 'utf8').encode('utf8')
118 return usable_text % {'category_name': category.name, 111 return usable_text % {'category_name': category.name,
119 'subcategory_name': state.subcategory.name}112 'subcategory_name': state.subcategory.name}
120113
121 if not category:114 if not category:
@@ -172,7 +165,8 @@
172 "suggestions that may aid you in your search")165 "suggestions that may aid you in your search")
173166
174 def get_include_parent_suggestion_text(self, term, category, state):167 def get_include_parent_suggestion_text(self, term, category, state):
175 if not state.subcategory: return None168 if not state.subcategory:
169 return
176170
177 enq = self.enquirer171 enq = self.enquirer
178 query = self.db.get_query_list_from_search_entry(172 query = self.db.get_query_list_from_search_entry(
@@ -195,14 +189,13 @@
195 n=enq.nr_apps) % \189 n=enq.nr_apps) % \
196 {'category': category.name, 'n': enq.nr_apps}190 {'category': category.name, 'n': enq.nr_apps}
197 return text191 return text
198 return None
199192
200 def get_unsupported_suggestion_text(self, term, category, state):193 def get_unsupported_suggestion_text(self, term, category, state):
201 if state.filter is None:194 if state.filter is None:
202 return None195 return
203 supported_only = state.filter.get_supported_only()196 supported_only = state.filter.get_supported_only()
204 if not supported_only:197 if not supported_only:
205 return None198 return
206199
207 state.filter.set_supported_only(False)200 state.filter.set_supported_only(False)
208201
@@ -224,12 +217,11 @@
224 if enq.nr_apps > 0:217 if enq.nr_apps > 0:
225 text = self.BULLET % gettext.ngettext("Try "218 text = self.BULLET % gettext.ngettext("Try "
226 "<a href=\"search-unsupported:\">the %(amount)d item "219 "<a href=\"search-unsupported:\">the %(amount)d item "
227 "that matches</a> in software not maintained by Canonical", 220 "that matches</a> in software not maintained by Canonical",
228 "Try <a href=\"search-unsupported:\">the %(amount)d items "221 "Try <a href=\"search-unsupported:\">the %(amount)d items "
229 "that match</a> in software not maintained by Canonical",222 "that match</a> in software not maintained by Canonical",
230 enq.nr_apps) % {'amount': enq.nr_apps}223 enq.nr_apps) % {'amount': enq.nr_apps}
231 return text224 return text
232 return None
233225
234 def update_search_help(self, state):226 def update_search_help(self, state):
235 # do any non toolkit logic here227 # do any non toolkit logic here
@@ -238,12 +230,10 @@
238 # do toolkit stuff here230 # do toolkit stuff here
239 if hasattr(self, 'on_update_search_help'):231 if hasattr(self, 'on_update_search_help'):
240 self.on_update_search_help(state)232 self.on_update_search_help(state)
241 return
242233
243 def reset(self):234 def reset(self):
244 if hasattr(self, 'on_reset'):235 if hasattr(self, 'on_reset'):
245 self.on_reset()236 self.on_reset()
246 return
247237
248238
249class SearchAid(Gtk.Table, SearchAidLogic):239class SearchAid(Gtk.Table, SearchAidLogic):
@@ -259,8 +249,8 @@
259 image = Gtk.Image.new_from_icon_name(self.HEADER_ICON_NAME,249 image = Gtk.Image.new_from_icon_name(self.HEADER_ICON_NAME,
260 Gtk.IconSize.DIALOG)250 Gtk.IconSize.DIALOG)
261 self.attach(image,251 self.attach(image,
262 0, 1, # left_attach, right_attach252 0, 1, # left_attach, right_attach
263 0, 1, # top_attach, bottom_attach253 0, 1, # top_attach, bottom_attach
264 Gtk.AttachOptions.SHRINK,254 Gtk.AttachOptions.SHRINK,
265 Gtk.AttachOptions.SHRINK,255 Gtk.AttachOptions.SHRINK,
266 StockEms.LARGE, 0)256 StockEms.LARGE, 0)
@@ -270,8 +260,8 @@
270 self.title.set_use_markup(True)260 self.title.set_use_markup(True)
271 self.title.set_alignment(0.0, 0.5)261 self.title.set_alignment(0.0, 0.5)
272 self.attach(self.title,262 self.attach(self.title,
273 1, 2, # left_attach, right_attach263 1, 2, # left_attach, right_attach
274 0, 1, # top_attach, bottom_attach264 0, 1, # top_attach, bottom_attach
275 Gtk.AttachOptions.FILL,265 Gtk.AttachOptions.FILL,
276 Gtk.AttachOptions.FILL,266 Gtk.AttachOptions.FILL,
277 StockEms.MEDIUM, 0)267 StockEms.MEDIUM, 0)
@@ -280,17 +270,15 @@
280 self.suggestion = Suggestions()270 self.suggestion = Suggestions()
281 self.suggestion.set_alignment(0.0, 0.5)271 self.suggestion.set_alignment(0.0, 0.5)
282 self.attach(self.suggestion,272 self.attach(self.suggestion,
283 1, 2, # left_attach, right_attach273 1, 2, # left_attach, right_attach
284 1, 2, # top_attach, bottom_attach274 1, 2, # top_attach, bottom_attach
285 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND,275 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND,
286 Gtk.AttachOptions.FILL,276 Gtk.AttachOptions.FILL,
287 StockEms.MEDIUM, StockEms.MEDIUM)277 StockEms.MEDIUM, StockEms.MEDIUM)
288278
289 self.suggestion.connect("activate-link", self.on_link_activate)279 self.suggestion.connect("activate-link", self.on_link_activate)
290 return
291280
292 def on_update_search_help(self, state):281 def on_update_search_help(self, state):
293
294 if not self.is_search_aid_required(state):282 if not self.is_search_aid_required(state):
295 # catchall283 # catchall
296 self.pane.app_view.set_visible(True)284 self.pane.app_view.set_visible(True)
@@ -311,17 +299,14 @@
311 suggestions_title = self.get_suggestion_title_text(suggestions)299 suggestions_title = self.get_suggestion_title_text(suggestions)
312 self.suggestion.set_title(suggestions_title)300 self.suggestion.set_title(suggestions_title)
313 self.suggestion.set_suggestions(suggestions)301 self.suggestion.set_suggestions(suggestions)
314 return
315302
316 def on_reset(self):303 def on_reset(self):
317 self.suggestion.reset_all()304 self.suggestion.reset_all()
318 return
319305
320 def on_link_activate(self, suggestions, link, uri):306 def on_link_activate(self, suggestions, link, uri):
321 markup = self.HEADER_MARKUP % _('Trying suggestion ...')307 markup = self.HEADER_MARKUP % _('Trying suggestion ...')
322 self.title.set_markup(markup)308 self.title.set_markup(markup)
323 GObject.timeout_add(750, self._handle_suggestion_action, uri)309 GObject.timeout_add(750, self._handle_suggestion_action, uri)
324 return
325310
326 def _handle_suggestion_action(self, uri):311 def _handle_suggestion_action(self, uri):
327 self = self.pane312 self = self.pane
@@ -339,4 +324,3 @@
339 # FIXME: add ability to remove categories restriction here324 # FIXME: add ability to remove categories restriction here
340 # True stops event propergation325 # True stops event propergation
341 return False326 return False
342
343327
=== modified file 'softwarecenter/ui/gtk3/widgets/searchentry.py'
--- softwarecenter/ui/gtk3/widgets/searchentry.py 2011-09-27 11:35:12 +0000
+++ softwarecenter/ui/gtk3/widgets/searchentry.py 2012-03-08 22:37:21 +0000
@@ -30,13 +30,12 @@
30class SearchEntry(Gtk.Entry):30class SearchEntry(Gtk.Entry):
3131
32 # FIMXE: we need "can-undo", "can-redo" signals32 # FIMXE: we need "can-undo", "can-redo" signals
33 __gsignals__ = {'terms-changed':(GObject.SignalFlags.RUN_FIRST,33 __gsignals__ = {'terms-changed': (GObject.SignalFlags.RUN_FIRST,
34 None,34 None,
35 (GObject.TYPE_STRING,))}35 (GObject.TYPE_STRING,))}
3636
37 SEARCH_TIMEOUT = 60037 SEARCH_TIMEOUT = 600
3838
39
40 def __init__(self, icon_theme=None):39 def __init__(self, icon_theme=None):
41 """40 """
42 Creates an enhanced IconEntry that triggers a timeout when typing41 Creates an enhanced IconEntry that triggers a timeout when typing
@@ -52,7 +51,8 @@
5251
53 self.connect("icon-press", self._on_icon_pressed)52 self.connect("icon-press", self._on_icon_pressed)
5453
55 self.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY, 'edit-find-symbolic')54 self.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY,
55 'edit-find-symbolic')
56 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, None)56 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, None)
5757
58 # set sensible atk name58 # set sensible atk name
@@ -90,7 +90,7 @@
90 text = self._undo_stack.pop()90 text = self._undo_stack.pop()
91 self.set_text(text)91 self.set_text(text)
92 self.set_position(-1)92 self.set_position(-1)
93 93
94 def redo(self):94 def redo(self):
95 if not self._redo_stack:95 if not self._redo_stack:
96 return96 return
@@ -106,7 +106,6 @@
106 def set_text(self, text, cursor_to_end=True):106 def set_text(self, text, cursor_to_end=True):
107 Gtk.Entry.set_text(self, text)107 Gtk.Entry.set_text(self, text)
108 self.emit("move-cursor", Gtk.MovementStep.BUFFER_ENDS, 1, False)108 self.emit("move-cursor", Gtk.MovementStep.BUFFER_ENDS, 1, False)
109 return
110109
111 def set_text_with_no_signal(self, text):110 def set_text_with_no_signal(self, text):
112 """Clear and do not send a term-changed signal"""111 """Clear and do not send a term-changed signal"""
@@ -143,17 +142,21 @@
143 Show the clear icon whenever the field is not empty142 Show the clear icon whenever the field is not empty
144 """143 """
145 if self.get_text() != "":144 if self.get_text() != "":
146 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, Gtk.STOCK_CLEAR)145 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY,
146 Gtk.STOCK_CLEAR)
147 # reverse the icon if we are in an rtl environment147 # reverse the icon if we are in an rtl environment
148 if self.get_direction() == Gtk.TextDirection.RTL:148 if self.get_direction() == Gtk.TextDirection.RTL:
149 pb = self.get_icon_pixbuf(Gtk.EntryIconPosition.SECONDARY).flip(True)149 pb = self.get_icon_pixbuf(
150 Gtk.EntryIconPosition.SECONDARY).flip(True)
150 self.set_icon_from_pixbuf(Gtk.EntryIconPosition.SECONDARY, pb)151 self.set_icon_from_pixbuf(Gtk.EntryIconPosition.SECONDARY, pb)
151 else:152 else:
152 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, None)153 self.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, None)
153154
155
154def on_entry_changed(self, terms):156def on_entry_changed(self, terms):
155 print(terms)157 print(terms)
156158
159
157def get_test_searchentry_window():160def get_test_searchentry_window():
158 icons = Gtk.IconTheme.get_default()161 icons = Gtk.IconTheme.get_default()
159 entry = SearchEntry(icons)162 entry = SearchEntry(icons)
@@ -162,12 +165,11 @@
162 win = Gtk.Window()165 win = Gtk.Window()
163 win.connect("destroy", Gtk.main_quit)166 win.connect("destroy", Gtk.main_quit)
164 win.add(entry)167 win.add(entry)
165 win.set_size_request(400,400)168 win.set_size_request(400, 400)
166 win.show_all()169 win.show_all()
167 win.entry = entry170 win.entry = entry
168 return win171 return win
169 172
170if __name__ == "__main__":173if __name__ == "__main__":
171 win = get_test_searchentry_window()174 win = get_test_searchentry_window()
172 Gtk.main()175 Gtk.main()
173
174176
=== modified file 'softwarecenter/ui/gtk3/widgets/sections.py'
--- softwarecenter/ui/gtk3/widgets/sections.py 2011-08-09 08:47:43 +0000
+++ softwarecenter/ui/gtk3/widgets/sections.py 2012-03-08 22:37:21 +0000
@@ -1,30 +1,32 @@
1#from gi.repository import Gtk1#from gi.repository import Gtk
22
3import cairo, os3import cairo
4import os
45
5from softwarecenter.enums import ViewPages6from softwarecenter.enums import ViewPages
6from softwarecenter.paths import datadir7from softwarecenter.paths import datadir
7from mkit import floats_from_string8from mkit import floats_from_string
89
10
9class SectionPainter(object):11class SectionPainter(object):
10 12
11 # specify background overlay image and color mappings for available and installed view ids13 # specify background overlay image and color mappings for available and
12 BACKGROUND_IMAGES = {ViewPages.AVAILABLE : cairo.ImageSurface.create_from_png(14 # installed view ids
13 os.path.join(datadir, 'images/clouds.png')),15 BACKGROUND_IMAGES = {
14 ViewPages.INSTALLED : cairo.ImageSurface.create_from_png(16 ViewPages.AVAILABLE: cairo.ImageSurface.create_from_png(
15 os.path.join(datadir, 'images/arrows.png')),17 os.path.join(datadir, 'images/clouds.png')),
18 ViewPages.INSTALLED: cairo.ImageSurface.create_from_png(
19 os.path.join(datadir, 'images/arrows.png')),
16 }20 }
17 BACKGROUND_COLORS = {ViewPages.AVAILABLE : floats_from_string('#0769BC'),21 BACKGROUND_COLORS = {ViewPages.AVAILABLE: floats_from_string('#0769BC'),
18 ViewPages.INSTALLED : floats_from_string('#aea79f'),22 ViewPages.INSTALLED: floats_from_string('#aea79f'),
19 }23 }
2024
21 def __init__(self):25 def __init__(self):
22 self._view_id = None26 self._view_id = None
23 return27
24
25 def set_view_id(self, id):28 def set_view_id(self, id):
26 self._view_id = id29 self._view_id = id
27 return
2830
29 def draw(self, widget, cr):31 def draw(self, widget, cr):
30 # sky32 # sky
@@ -43,7 +45,7 @@
43 # cr.set_source_surface(s, a.x, 0)45 # cr.set_source_surface(s, a.x, 0)
4446
45 #cr.paint()47 #cr.paint()
46 return48 pass
4749
48 def get_background_color(self):50 def get_background_color(self):
49 return self.BACKGROUND_COLORS[self._view_id]51 return self.BACKGROUND_COLORS[self._view_id]
5052
=== modified file 'softwarecenter/ui/gtk3/widgets/spinner.py'
--- softwarecenter/ui/gtk3/widgets/spinner.py 2012-03-01 11:32:37 +0000
+++ softwarecenter/ui/gtk3/widgets/spinner.py 2012-03-08 22:37:21 +0000
@@ -22,6 +22,7 @@
2222
23from gi.repository import Gtk, GObject23from gi.repository import Gtk, GObject
2424
25
25class SpinnerView(Gtk.Viewport):26class SpinnerView(Gtk.Viewport):
26 """27 """
27 a panel that contains a spinner preset to a standard size and centered28 a panel that contains a spinner preset to a standard size and centered
@@ -31,7 +32,7 @@
31 Gtk.Viewport.__init__(self)32 Gtk.Viewport.__init__(self)
32 self.spinner = Gtk.Spinner()33 self.spinner = Gtk.Spinner()
33 self.spinner.set_size_request(48, 48)34 self.spinner.set_size_request(48, 48)
34 35
35 # use a table for the spinner (otherwise the spinner is massive!)36 # use a table for the spinner (otherwise the spinner is massive!)
36 spinner_table = Gtk.Table(3, 3, False)37 spinner_table = Gtk.Table(3, 3, False)
37 self.spinner_label = Gtk.Label()38 self.spinner_label = Gtk.Label()
@@ -39,39 +40,40 @@
39 spinner_vbox = Gtk.VBox()40 spinner_vbox = Gtk.VBox()
40 spinner_vbox.pack_start(self.spinner, True, True, 0)41 spinner_vbox.pack_start(self.spinner, True, True, 0)
41 spinner_vbox.pack_start(self.spinner_label, True, True, 10)42 spinner_vbox.pack_start(self.spinner_label, True, True, 10)
42 spinner_table.attach(spinner_vbox, 1, 2, 1, 2, Gtk.AttachOptions.EXPAND, Gtk.AttachOptions.EXPAND)43 spinner_table.attach(spinner_vbox, 1, 2, 1, 2,
43 44 Gtk.AttachOptions.EXPAND, Gtk.AttachOptions.EXPAND)
45
44 #~ self.modify_bg(Gtk.StateType.NORMAL, Gdk.Color(1.0, 1.0, 1.0))46 #~ self.modify_bg(Gtk.StateType.NORMAL, Gdk.Color(1.0, 1.0, 1.0))
45 self.add(spinner_table)47 self.add(spinner_table)
46 self.set_shadow_type(Gtk.ShadowType.NONE)48 self.set_shadow_type(Gtk.ShadowType.NONE)
47 49
48 def start_and_show(self):50 def start_and_show(self):
49 """51 """
50 start the spinner and show it52 start the spinner and show it
51 """53 """
52 self.spinner.start()54 self.spinner.start()
53 self.spinner.show()55 self.spinner.show()
54 56
55 def stop_and_hide(self):57 def stop_and_hide(self):
56 """58 """
57 stop the spinner and hide it59 stop the spinner and hide it
58 """60 """
59 self.spinner.stop()61 self.spinner.stop()
60 self.spinner.hide()62 self.spinner.hide()
61 63
62 def set_text(self, spinner_text = ""):64 def set_text(self, spinner_text=""):
63 """65 """
64 useful for adding/removing/changing the label text after the spinner instance has been created66 useful for adding/removing/changing the label text after the spinner
67 instance has been created
65 """68 """
66 self.spinner_label.set_markup('<big>%s</big>' % spinner_text)69 self.spinner_label.set_markup('<big>%s</big>' % spinner_text)
6770
71
68class SpinnerNotebook(Gtk.Notebook):72class SpinnerNotebook(Gtk.Notebook):
69 """ this provides a Gtk.Notebook that contains a content page73 """ this provides a Gtk.Notebook that contains a content page
70 and a spinner page.74 and a spinner page.
71 """75 """
7276 (CONTENT_PAGE,
73
74 (CONTENT_PAGE,
75 SPINNER_PAGE) = range(2)77 SPINNER_PAGE) = range(2)
7678
77 def __init__(self, content, msg=""):79 def __init__(self, content, msg=""):
@@ -79,7 +81,7 @@
79 self.spinner_view = SpinnerView(msg)81 self.spinner_view = SpinnerView(msg)
80 # its critical to show() the spinner early as otherwise82 # its critical to show() the spinner early as otherwise
81 # gtk_notebook_set_active_page() will not switch to it83 # gtk_notebook_set_active_page() will not switch to it
82 self.spinner_view.show() 84 self.spinner_view.show()
83 if not "SOFTWARE_CENTER_DEBUG_TABS" in os.environ:85 if not "SOFTWARE_CENTER_DEBUG_TABS" in os.environ:
84 self.set_show_tabs(False)86 self.set_show_tabs(False)
85 self.set_show_border(False)87 self.set_show_border(False)
@@ -106,15 +108,16 @@
106 self.spinner_view.stop_and_hide()108 self.spinner_view.stop_and_hide()
107 self.set_current_page(self.CONTENT_PAGE)109 self.set_current_page(self.CONTENT_PAGE)
108110
109def get_test_spinner_window(): 111
112def get_test_spinner_window():
110 label = Gtk.Label("foo")113 label = Gtk.Label("foo")
111 spinner_notebook = SpinnerNotebook(label, "random msg")114 spinner_notebook = SpinnerNotebook(label, "random msg")
112 115
113 window = Gtk.Window()116 window = Gtk.Window()
114 window.add(spinner_notebook)117 window.add(spinner_notebook)
115 window.set_size_request(600, 500)118 window.set_size_request(600, 500)
116 window.set_position(Gtk.WindowPosition.CENTER)119 window.set_position(Gtk.WindowPosition.CENTER)
117 window.show_all() 120 window.show_all()
118 window.connect('destroy', Gtk.main_quit)121 window.connect('destroy', Gtk.main_quit)
119 spinner_notebook.show_spinner("Loading for 1s ...")122 spinner_notebook.show_spinner("Loading for 1s ...")
120 GObject.timeout_add_seconds(1, lambda: spinner_notebook.hide_spinner())123 GObject.timeout_add_seconds(1, lambda: spinner_notebook.hide_spinner())
121124
=== modified file 'test/test_pep8.py'
--- test/test_pep8.py 2012-03-08 17:42:36 +0000
+++ test/test_pep8.py 2012-03-08 22:37:21 +0000
@@ -16,8 +16,7 @@
16 packages = [softwarecenter.ui.qml,16 packages = [softwarecenter.ui.qml,
17 softwarecenter.ui.gtk3.widgets,17 softwarecenter.ui.gtk3.widgets,
18 softwarecenter.db.pkginfo_impl]18 softwarecenter.db.pkginfo_impl]
19 exclude = ['spinner.py', 'sections.py', 'searchentry.py', 'searchaid.py',19 exclude = ['recommendations.py', 'oneconfviews.py', 'menubutton.py',
20 'reviews.py', 'recommendations.py', 'oneconfviews.py', 'menubutton.py',
21 'labels.py', 'imagedialog.py', 'exhibits.py', 'description.py',20 'labels.py', 'imagedialog.py', 'exhibits.py', 'description.py',
22 'containers.py', 'cellrenderers.py', 'buttons.py', 'backforward.py',21 'containers.py', 'cellrenderers.py', 'buttons.py', 'backforward.py',
23 'apptreeview.py', 'animatedimage.py', 'actionbar.py']22 'apptreeview.py', 'animatedimage.py', 'actionbar.py']