class CategoriesViewGtk(Viewport, CategoriesParser): __gsignals__ = { "category-selected": (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "application-selected": (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "application-activated": (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "show-category-applist": (GObject.SignalFlags.RUN_LAST, None, (),) } SPACING = PADDING = 3 # art stuff STIPPLE = os.path.join(softwarecenter.paths.datadir, "ui/gtk3/art/stipple.png") def __init__(self, datadir, desktopdir, cache, db, icons, apps_filter=None, # FIXME: kill this, its not needed anymore? apps_limit=0): """ init the widget, takes datadir - the base directory of the app-store data desktopdir - the dir where the applications.menu file can be found db - a Database object icons - a Gtk.IconTheme apps_filter - ? apps_limit - the maximum amount of items to display to query for """ self.cache = cache self.db = db self.icons = icons self.properties_helper = AppPropertiesHelper( self.db, self.cache, self.icons) self.section = None Viewport.__init__(self) CategoriesParser.__init__(self, db) self.set_name("category-view") # setup base widgets # we have our own viewport so we know when the viewport grows/shrinks # setup widgets self.vbox = Gtk.VBox() self.add(self.vbox) # atk stuff atk_desc = self.get_accessible() atk_desc.set_name(_("Departments")) # appstore stuff self.categories = [] self.header = "" #~ self.apps_filter = apps_filter self.apps_limit = apps_limit # for comparing on refreshes self._supported_only = False # more stuff self._poster_sigs = [] self._allocation = None self._cache_art_assets() #~ assets = self._cache_art_assets() #~ self.vbox.connect("draw", self.on_draw, assets) self._prev_alloc = None self.connect("size-allocate", self.on_size_allocate) return def _add_tiles_to_flowgrid(self, docs, flowgrid, amount): '''Adds application tiles to a FlowableGrid: docs = xapian documents (apps) flowgrid = the FlowableGrid to add tiles to amount = number of tiles to add from start of doc range''' amount = min(len(docs), amount) for doc in docs[0:amount]: tile = FeaturedTile(self.properties_helper, doc) tile.connect('clicked', self.on_app_clicked, self.properties_helper.get_application(doc)) flowgrid.add_child(tile) return def on_size_allocate(self, widget, _): a = widget.get_allocation() prev = self._prev_alloc if prev is None or a.width != prev.width or a.height != prev.height: self._prev_alloc = a self.queue_draw() return def _cache_art_assets(self): global _asset_cache if _asset_cache: return _asset_cache assets = _asset_cache # cache the bg pattern surf = cairo.ImageSurface.create_from_png(self.STIPPLE) ptrn = cairo.SurfacePattern(surf) ptrn.set_extend(cairo.EXTEND_REPEAT) assets["stipple"] = ptrn return assets def on_app_clicked(self, btn, app): """emit the category-selected signal when a category was clicked""" def timeout_emit(): self.emit("application-selected", app) self.emit("application-activated", app) return False GObject.timeout_add(50, timeout_emit) def on_category_clicked(self, btn, cat): """emit the category-selected signal when a category was clicked""" def timeout_emit(): self.emit("category-selected", cat) return False GObject.timeout_add(50, timeout_emit) def build(self, desktopdir): pass def do_draw(self, cr): cr.set_source(_asset_cache["stipple"]) cr.paint_with_alpha(0.5) for child in self: self.propagate_draw(child, cr) def set_section(self, section): self.section = section def refresh_apps(self): raise NotImplementedError
class CategoriesViewGtk(Viewport, CategoriesParser): __gsignals__ = { "category-selected": ( GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "application-selected": ( GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "application-activated": ( GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT, ), ), "show-category-applist": ( GObject.SignalFlags.RUN_LAST, None, (), ) } SPACING = PADDING = 3 # art stuff STIPPLE = os.path.join(softwarecenter.paths.datadir, "ui/gtk3/art/stipple.png") def __init__( self, datadir, desktopdir, cache, db, icons, apps_filter=None, # FIXME: kill this, its not needed anymore? apps_limit=0): """ init the widget, takes datadir - the base directory of the app-store data desktopdir - the dir where the applications.menu file can be found db - a Database object icons - a Gtk.IconTheme apps_filter - ? apps_limit - the maximum amount of items to display to query for """ self.cache = cache self.db = db self.icons = icons self.properties_helper = AppPropertiesHelper(self.db, self.cache, self.icons) self.section = None Viewport.__init__(self) CategoriesParser.__init__(self, db) self.set_name("category-view") # setup base widgets # we have our own viewport so we know when the viewport grows/shrinks # setup widgets self.vbox = Gtk.VBox() self.add(self.vbox) # atk stuff atk_desc = self.get_accessible() atk_desc.set_name(_("Departments")) # appstore stuff self.categories = [] self.header = "" #~ self.apps_filter = apps_filter self.apps_limit = apps_limit # for comparing on refreshes self._supported_only = False # more stuff self._poster_sigs = [] self._allocation = None self._cache_art_assets() #~ assets = self._cache_art_assets() #~ self.vbox.connect("draw", self.on_draw, assets) self._prev_alloc = None self.connect("size-allocate", self.on_size_allocate) return def _add_tiles_to_flowgrid(self, docs, flowgrid, amount): '''Adds application tiles to a FlowableGrid: docs = xapian documents (apps) flowgrid = the FlowableGrid to add tiles to amount = number of tiles to add from start of doc range''' amount = min(len(docs), amount) for doc in docs[0:amount]: tile = FeaturedTile(self.properties_helper, doc) tile.connect('clicked', self.on_app_clicked, self.properties_helper.get_application(doc)) flowgrid.add_child(tile) return def on_size_allocate(self, widget, _): a = widget.get_allocation() prev = self._prev_alloc if prev is None or a.width != prev.width or a.height != prev.height: self._prev_alloc = a self.queue_draw() return def _cache_art_assets(self): global _asset_cache if _asset_cache: return _asset_cache assets = _asset_cache # cache the bg pattern surf = cairo.ImageSurface.create_from_png(self.STIPPLE) ptrn = cairo.SurfacePattern(surf) ptrn.set_extend(cairo.EXTEND_REPEAT) assets["stipple"] = ptrn return assets def on_app_clicked(self, btn, app): """emit the category-selected signal when a category was clicked""" def timeout_emit(): self.emit("application-selected", app) self.emit("application-activated", app) return False GObject.timeout_add(50, timeout_emit) def on_category_clicked(self, btn, cat): """emit the category-selected signal when a category was clicked""" def timeout_emit(): self.emit("category-selected", cat) return False GObject.timeout_add(50, timeout_emit) def build(self, desktopdir): pass def do_draw(self, cr): cr.set_source(_asset_cache["stipple"]) cr.paint_with_alpha(0.5) for child in self: self.propagate_draw(child, cr) def set_section(self, section): self.section = section def refresh_apps(self): raise NotImplementedError