from fabric.widgets.box import Box from fabric.widgets.revealer import Revealer from fabric.widgets.wayland import WaylandWindow as Window from .components import ( AudioOSDContainer, BrightnessOSDContainer, MicrophoneOSDContainer, CapsLockOSDContainer, KeyboardLayoutOSDContainer, ) class OSD(Box): def __init__(self, window: Window, **kwargs): super().__init__(name="osd", **kwargs) self.window = window self.revealer = Revealer( transition_type="slide-up", transition_duration=100, child_revealed=False, ) self.children = [self.revealer] self.containers = { "audio": AudioOSDContainer(window), "brightness": BrightnessOSDContainer(window), "microphone": MicrophoneOSDContainer(window), "capslock": CapsLockOSDContainer(window), "kb_layout": KeyboardLayoutOSDContainer(window), } # Set the OSD reference in containers for container in self.containers.values(): container.osd = self self.current_container = None def show_container(self, container): if self.current_container != container: self.revealer.children = [container] self.current_container = container self.revealer.set_reveal_child(True) def show_audio_osd(self): self.show_container(self.containers.get("audio")) def show_brightness_osd(self): self.show_container(self.containers.get("brightness")) def show_microphone_osd(self): self.show_container(self.containers.get("microphone")) def show_capslock_osd(self): self.show_container(self.containers.get("capslock")) def show_kb_layout_osd(self): self.show_container(self.containers.get("kb_layout")) class OSDWindow(Window): def __init__(self, **kwargs): super().__init__( name="osd-window", title="modus-osd", anchor="bottom", margin="0px 0px 40px 0px", visible=False, all_visible=False, pass_through=True, layer="overlay", **kwargs, ) self.osd = OSD(window=self) self.add(self.osd) if __name__ == "__main__": from fabric import Application osd_window = OSDWindow() app = Application("modus-osd", osd_window) app.run()