import logging
from typing import Optional
from gi.repository import GdkPixbuf, Gtk
[docs]class SpinnerImage(Gtk.Overlay):
[docs]    def __init__(
        self,
        loading: bool = True,
        image_name: str | None = None,
        spinner_name: str | None = None,
        image_size: int | None = None,
        **kwargs,
    ):
        """An image with a loading overlay."""
        Gtk.Overlay.__init__(self)
        self.image_size = image_size
        self.filename: Optional[str] = None
        self.image = Gtk.Image(name=image_name, **kwargs)
        self.add(self.image)
        self.spinner = Gtk.Spinner(
            name=spinner_name,
            active=loading,
            halign=Gtk.Align.CENTER,
            valign=Gtk.Align.CENTER,
        )
        self.add_overlay(self.spinner) 
[docs]    def set_from_file(self, filename: Optional[str]):
        """Set the image to the given filename."""
        if filename == "":
            filename = None
        self.filename = filename
        if self.image_size is not None and filename:
            try:
                pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
                    filename, self.image_size, self.image_size, True
                )
                self.image.set_from_pixbuf(pixbuf)
            except Exception as e:
                logging.warn(f"could not load {filename}. Probably not an image. {e}")
        else:
            self.image.set_from_file(filename) 
[docs]    def set_loading(self, loading_status: bool):
        if loading_status:
            self.spinner.start()
            self.spinner.show()
        else:
            self.spinner.stop()
            self.spinner.hide() 
[docs]    def set_image_size(self, size: int):
        self.image_size = size
        self.set_from_file(self.filename)