Source code for libqtile.widget.image

import os

from libqtile import bar
from libqtile.command.base import expose_command
from libqtile.images import Img
from libqtile.log_utils import logger
from libqtile.widget import base


[docs] class Image(base._Widget, base.MarginMixin): """Display a PNG image on the bar""" orientations = base.ORIENTATION_BOTH defaults = [ ("scale", True, "Enable/Disable image scaling"), ("rotate", 0.0, "rotate the image in degrees counter-clockwise"), ("filename", None, "Image filename. Can contain '~'"), ("margin", 0, "Margin inside the box. Defaults to 0."), ] def __init__(self, length=bar.CALCULATED, **config): base._Widget.__init__(self, length, **config) self.add_defaults(Image.defaults) def _configure(self, qtile, bar): base._Widget._configure(self, qtile, bar) self._update_image() def _update_image(self): self.img = None if not self.filename: logger.warning("Image filename not set!") return self.filename = os.path.expanduser(self.filename) if not os.path.exists(self.filename): logger.warning("Image does not exist: %s", self.filename) return img = Img.from_path(self.filename) self.img = img img.theta = self.rotate if not self.scale: return new_height = self.bar.size - (self.margin_top * 2) img.resize(height=new_height) def draw(self): if self.img is None: return self.drawer.clear(self.background or self.bar.background) self.drawer.ctx.save() self.drawer.ctx.translate(self.margin_x, self.margin_y) self.drawer.ctx.set_source(self.img.pattern) self.drawer.ctx.paint() self.drawer.ctx.restore() self.draw_at_default_position() def calculate_length(self): if self.img is None: return 0 img_length = self.img.width if self.bar.horizontal else self.img.height return img_length + (self.margin_side * 2)
[docs] @expose_command() def update(self, filename): old_length = self.calculate_length() self.filename = filename self._update_image() if self.calculate_length() == old_length: self.draw() else: self.bar.draw()