def __init__(self, parent): GObject.GObject.__init__(self) self.set_spacing(12) self.logged_in_person = get_person_from_config() self._parent = parent # this is a list of review data (softwarecenter.backend.reviews.Review) self.reviews = [] # global review stats, this includes ratings in different languages self.global_review_stats = None # usefulness stuff self.useful_votes = UsefulnessCache() self.logged_in_person = None label = Gtk.Label() label.set_markup('<big><b>%s</b></big>' % _("Reviews")) label.set_use_markup(True) label.set_alignment(0, 0.5) self.header = Gtk.HBox() self.header.set_spacing(StockEms.MEDIUM) self.new_review = Gtk.Button(_('Write your own review')) inner_vb = Gtk.VBox() inner_vb.pack_start(label, False, False, 0) inner_vb.pack_start(self.new_review, False, False, StockEms.SMALL) self.header.pack_start(inner_vb, False, False, 0) self.pack_start(self.header, False, False, 0) self.vbox = Gtk.VBox() self.vbox.set_spacing(24) self.pack_start(self.vbox, True, True, 0) self.no_network_msg = None self.new_review.connect('clicked', lambda w: self.emit('new-review')) # ensure network state updates watcher = get_network_watcher() watcher.connect( "changed", lambda w,s: self._on_network_state_change()) self.show_all() return
def __init__(self, app_view, db, icons, show_ratings, store=None): Gtk.TreeView.__init__(self) self._logger = logging.getLogger("softwarecenter.view.appview") self.app_view = app_view self.db = db self.pressed = False self.focal_btn = None self._action_block_list = [] self._needs_collapse = [] self.expanded_path = None self.selected_row_renderer = None # pixbuf for the icon that is displayed in the selected row self.selected_row_icon = None #~ # if this hacked mode is available everything will be fast #~ # and we can set fixed_height mode and still have growing rows #~ # (see upstream gnome #607447) try: self.set_property("ubuntu-almost-fixed-height-mode", True) self.set_fixed_height_mode(True) except: self._logger.warn( "ubuntu-almost-fixed-height-mode extension not available") self.set_headers_visible(False) # our custom renderer self._renderer = CellRendererAppView(icons, self.create_pango_layout(''), show_ratings, Icons.INSTALLED_OVERLAY) self._renderer.set_pixbuf_width(32) self._renderer.set_button_spacing(em(0.3)) # create buttons and set initial strings info = CellButtonRenderer(self, name=CellButtonIDs.INFO) info.set_markup_variants({self.VARIANT_INFO: _('More Info')}) action = CellButtonRenderer(self, name=CellButtonIDs.ACTION) action.set_markup_variants({ self.VARIANT_INSTALL: _('Install'), self.VARIANT_REMOVE: _('Remove'), self.VARIANT_PURCHASE: _(u'Buy\u2026') }) self._renderer.button_pack_start(info) self._renderer.button_pack_end(action) self._column = Gtk.TreeViewColumn( "Applications", self._renderer, application=AppGenericStore.COL_ROW_DATA) self._column.set_cell_data_func(self._renderer, self._cell_data_func_cb) self._column.set_fixed_width(200) self._column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self.append_column(self._column) # network status watcher watcher = get_network_watcher() watcher.connect("changed", self._on_net_state_changed, self._renderer) # custom cursor self._cursor_hand = Gdk.Cursor.new(Gdk.CursorType.HAND2) self.connect("style-updated", self._on_style_updated, self._renderer) # button and motion are "special" self.connect("button-press-event", self._on_button_press_event, self._renderer) self.connect("button-release-event", self._on_button_release_event, self._renderer) self.connect("key-press-event", self._on_key_press_event, self._renderer) self.connect("key-release-event", self._on_key_release_event, self._renderer) self.connect("motion-notify-event", self._on_motion, self._renderer) self.connect("cursor-changed", self._on_cursor_changed, self._renderer) # our own "activate" handler self.connect("row-activated", self._on_row_activated, self._renderer) self.backend = get_install_backend() self._transactions_connected = False self.connect('realize', self._on_realize, self._renderer)
def __init__(self, parent): Gtk.VBox.__init__(self) self.set_spacing(12) self.logged_in_person = get_person_from_config() self._parent = parent # this is a list of review data (softwarecenter.backend.reviews.Review) self.reviews = [] # global review stats, this includes ratings in different languages self.global_review_stats = None # usefulness stuff self.useful_votes = UsefulnessCache() self.logged_in_person = None # add header label label = Gtk.Label() label.set_markup('<big><b>%s</b></big>' % _("Reviews")) label.set_padding(6, 6) label.set_use_markup(True) label.set_alignment(0, 0.5) self.header = Gtk.HBox() self.header.pack_start(label, False, False, 0) # header self.header.set_spacing(StockEms.MEDIUM) # review sort method self.sort_combo = Gtk.ComboBoxText() self._current_sort = 0 for sort_method in ReviewSortMethods.REVIEW_SORT_LIST_ENTRIES: self.sort_combo.append_text(_(sort_method)) self.sort_combo.set_active(self._current_sort) self.sort_combo.connect('changed', self._on_sort_method_changed) self.header.pack_end(self.sort_combo, False, False, 3) # change language self.review_language = Gtk.ComboBox() cell = Gtk.CellRendererText() self.review_language.pack_start(cell, True) self.review_language.add_attribute(cell, "text", COL_LANGNAME) self.review_language_model = Gtk.ListStore(str, str) for lang in get_languages(): self.review_language_model.append((langcode_to_name(lang), lang)) self.review_language_model.append((_('Any language'), 'any')) self.review_language.set_model(self.review_language_model) self.review_language.set_active(0) self.review_language.connect( "changed", self._on_different_review_language_clicked) self.header.pack_end(self.review_language, False, True, 0) self.pack_start(self.header, False, False, 0) self.reviews_info_hbox = Gtk.HBox() self.new_review = Link(_('Write your own review')) self.new_review.connect('clicked', lambda w: self.emit('new-review')) self.reviews_info_hbox.pack_start(self.new_review, False, False, StockEms.SMALL) self.pack_start(self.reviews_info_hbox, True, True, 0) # this is where the reviews end up self.vbox = Gtk.VBox() self.vbox.set_spacing(24) self.pack_end(self.vbox, True, True, 0) # ensure network state updates self.no_network_msg = None watcher = get_network_watcher() watcher.connect("changed", lambda w, s: self._on_network_state_change()) self.show_all()
def _build(self, review_data, app_version, logged_in_person, useful_votes): # all the attributes of review_data may need markup escape, # depending on if they are used as text or markup self.id = review_data.id self.person = review_data.reviewer_username displayname = review_data.reviewer_displayname # example raw_date str format: 2011-01-28 19:15:21 cur_t = self._get_datetime_from_review_date(review_data.date_created) review_version = review_data.version self.useful_total = useful_total = review_data.usefulness_total useful_favorable = review_data.usefulness_favorable useful_submit_error = review_data.usefulness_submit_error delete_error = review_data.delete_error modify_error = review_data.modify_error # upstream version version = GLib.markup_escape_text(upstream_version(review_version)) # default string version_string = _("For version %(version)s") % { 'version': version, } # If its for the same version, show it as such if (review_version and app_version and upstream_version_compare( review_version, app_version) == 0): version_string = _("For this version (%(version)s)") % { 'version': version, } m = '<small>%s</small>' self.version_label.set_markup(m % version_string) m = self._whom_when_markup(self.person, displayname, cur_t) who_when = Gtk.Label() who_when.set_name("subtle-label") who_when.set_justify(Gtk.Justification.RIGHT) who_when.set_markup(m) summary = Gtk.Label() try: s = GLib.markup_escape_text(review_data.summary.encode("utf-8")) summary.set_markup('<b>%s</b>' % s) except Exception: LOG.exception("_build() failed") summary.set_text("Error parsing summary") summary.set_ellipsize(Pango.EllipsizeMode.END) summary.set_selectable(True) summary.set_alignment(0, 0.5) text = Gtk.Label() text.set_text(review_data.review_text) text.set_line_wrap(True) text.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) text.set_selectable(True) text.set_alignment(0, 0) stars = Star() stars.set_rating(review_data.rating) a = Gtk.Alignment.new(0.5, 0.5, 0, 0) a.add(stars) self.header.pack_start(a, False, False, 0) self.header.pack_start(summary, False, False, 0) self.header.pack_end(who_when, False, False, 0) self.body.pack_start(text, False, False, 0) current_user_reviewer = False if self.person == self.logged_in_person: current_user_reviewer = True self._build_usefulness_ui(current_user_reviewer, useful_total, useful_favorable, useful_votes, useful_submit_error) self.flagbox = Gtk.HBox() self.flagbox.set_spacing(4) self._build_delete_flag_ui(current_user_reviewer, delete_error, modify_error) self.footer.pack_end(self.flagbox, False, False, 0) # connect network signals self.connect("realize", lambda w: self._on_network_state_change()) watcher = get_network_watcher() watcher.connect("changed", lambda w, s: self._on_network_state_change())
def __init__(self, app_view, db, icons, show_ratings, store=None): Gtk.TreeView.__init__(self) self._logger = logging.getLogger("softwarecenter.view.appview") self.app_view = app_view self.db = db self.pressed = False self.focal_btn = None self._action_block_list = [] self._needs_collapse = [] self.expanded_path = None #~ # if this hacked mode is available everything will be fast #~ # and we can set fixed_height mode and still have growing rows #~ # (see upstream gnome #607447) try: self.set_property("ubuntu-almost-fixed-height-mode", True) self.set_fixed_height_mode(True) except: self._logger.warn("ubuntu-almost-fixed-height-mode extension not available") self.set_headers_visible(False) # a11y: this is a cell renderer that only displays a icon, but still # has a markup property for orca and friends # we use it so that orca and other a11y tools get proper text to read # it needs to be the first one, because that is what the tools look # at by default tr = CellRendererAppView(icons, self.create_pango_layout(''), show_ratings, Icons.INSTALLED_OVERLAY) tr.set_pixbuf_width(32) tr.set_button_spacing(em(0.3)) # create buttons and set initial strings info = CellButtonRenderer(self, name=CellButtonIDs.INFO) info.set_markup_variants( {self.VARIANT_INFO: _('More Info')}) action = CellButtonRenderer(self, name=CellButtonIDs.ACTION) action.set_markup_variants( {self.VARIANT_INSTALL: _('Install'), self.VARIANT_REMOVE: _('Remove'), self.VARIANT_PURCHASE: _(u'Buy\u2026')}) tr.button_pack_start(info) tr.button_pack_end(action) column = Gtk.TreeViewColumn("Applications", tr, application=AppGenericStore.COL_ROW_DATA) column.set_cell_data_func(tr, self._cell_data_func_cb) column.set_fixed_width(200) column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self.append_column(column) # network status watcher watcher = get_network_watcher() watcher.connect("changed", self._on_net_state_changed, tr) # custom cursor self._cursor_hand = Gdk.Cursor.new(Gdk.CursorType.HAND2) self.connect("style-updated", self._on_style_updated, tr) # button and motion are "special" self.connect("button-press-event", self._on_button_press_event, tr) self.connect("button-release-event", self._on_button_release_event, tr) self.connect("key-press-event", self._on_key_press_event, tr) self.connect("key-release-event", self._on_key_release_event, tr) self.connect("motion-notify-event", self._on_motion, tr) self.connect("cursor-changed", self._on_cursor_changed, tr) # our own "activate" handler self.connect("row-activated", self._on_row_activated, tr) self.backend = get_install_backend() self._transactions_connected = False self.connect('realize', self._on_realize, tr)
def test_netstaus(self): from softwarecenter.netstatus import get_network_watcher watcher = get_network_watcher() # FIXME: do something with the watcher watcher
def __init__(self, parent): Gtk.VBox.__init__(self) self.set_spacing(12) self.logged_in_person = get_person_from_config() self._parent = parent # this is a list of review data (softwarecenter.backend.reviews.Review) self.reviews = [] # global review stats, this includes ratings in different languages self.global_review_stats = None # usefulness stuff self.useful_votes = UsefulnessCache() self.logged_in_person = None # add header label label = Gtk.Label() label.set_markup('<big><b>%s</b></big>' % _("Reviews")) label.set_padding(6, 6) label.set_use_markup(True) label.set_alignment(0, 0.5) self.header = Gtk.HBox() self.header.pack_start(label, False, False, 0) # header self.header.set_spacing(StockEms.MEDIUM) # review sort method self.sort_combo = Gtk.ComboBoxText() self._current_sort = 0 for sort_method in ReviewSortMethods.REVIEW_SORT_LIST_ENTRIES: self.sort_combo.append_text(_(sort_method)) self.sort_combo.set_active(self._current_sort) self.sort_combo.connect('changed', self._on_sort_method_changed) self.header.pack_end(self.sort_combo, False, False, 3) # change language self.review_language = Gtk.ComboBox() cell = Gtk.CellRendererText() self.review_language.pack_start(cell, True) self.review_language.add_attribute(cell, "text", COL_LANGNAME) self.review_language_model = Gtk.ListStore(str, str) for lang in get_languages(): self.review_language_model.append((langcode_to_name(lang), lang)) self.review_language_model.append((_('Any language'), 'any')) self.review_language.set_model(self.review_language_model) self.review_language.set_active(0) self.review_language.connect( "changed", self._on_different_review_language_clicked) self.header.pack_end(self.review_language, False, True, 0) self.pack_start(self.header, False, False, 0) self.reviews_info_hbox = Gtk.HBox() self.new_review = Link(_('Write your own review')) self.new_review.connect('clicked', lambda w: self.emit('new-review')) self.reviews_info_hbox.pack_start( self.new_review, False, False, StockEms.SMALL) self.pack_start(self.reviews_info_hbox, True, True, 0) # this is where the reviews end up self.vbox = Gtk.VBox() self.vbox.set_spacing(24) self.pack_end(self.vbox, True, True, 0) # ensure network state updates self.no_network_msg = None watcher = get_network_watcher() watcher.connect( "changed", lambda w, s: self._on_network_state_change()) self.show_all()
def _build(self, review_data, app_version, logged_in_person, useful_votes): # all the attributes of review_data may need markup escape, # depending on if they are used as text or markup self.id = review_data.id self.person = review_data.reviewer_username displayname = review_data.reviewer_displayname # example raw_date str format: 2011-01-28 19:15:21 cur_t = self._get_datetime_from_review_date(review_data.date_created) review_version = review_data.version self.useful_total = useful_total = review_data.usefulness_total useful_favorable = review_data.usefulness_favorable useful_submit_error = review_data.usefulness_submit_error delete_error = review_data.delete_error modify_error = review_data.modify_error # upstream version version = GLib.markup_escape_text(upstream_version(review_version)) # default string version_string = _("For version %(version)s") % { 'version': version, } # If its for the same version, show it as such if (review_version and app_version and upstream_version_compare(review_version, app_version) == 0): version_string = _("For this version (%(version)s)") % { 'version': version, } m = '<small>%s</small>' self.version_label.set_markup(m % version_string) m = self._whom_when_markup(self.person, displayname, cur_t) who_when = Gtk.Label() who_when.set_name("subtle-label") who_when.set_justify(Gtk.Justification.RIGHT) who_when.set_markup(m) summary = Gtk.Label() try: s = GLib.markup_escape_text(review_data.summary.encode("utf-8")) summary.set_markup('<b>%s</b>' % s) except Exception: LOG.exception("_build() failed") summary.set_text("Error parsing summary") summary.set_ellipsize(Pango.EllipsizeMode.END) summary.set_selectable(True) summary.set_alignment(0, 0.5) text = Gtk.Label() text.set_text(review_data.review_text) text.set_line_wrap(True) text.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) text.set_selectable(True) text.set_alignment(0, 0) stars = Star() stars.set_rating(review_data.rating) a = Gtk.Alignment.new(0.5, 0.5, 0, 0) a.add(stars) self.header.pack_start(a, False, False, 0) self.header.pack_start(summary, False, False, 0) self.header.pack_end(who_when, False, False, 0) self.body.pack_start(text, False, False, 0) current_user_reviewer = False if self.person == self.logged_in_person: current_user_reviewer = True self._build_usefulness_ui(current_user_reviewer, useful_total, useful_favorable, useful_votes, useful_submit_error) self.flagbox = Gtk.HBox() self.flagbox.set_spacing(4) self._build_delete_flag_ui(current_user_reviewer, delete_error, modify_error) self.footer.pack_end(self.flagbox, False, False, 0) # connect network signals self.connect("realize", lambda w: self._on_network_state_change()) watcher = get_network_watcher() watcher.connect( "changed", lambda w, s: self._on_network_state_change())