panorama_panel.py
Python script, ASCII text executable
1import gi 2gi.require_version("Gtk", "4.0") 3 4from gi.repository import Gtk, Gdk, GObject, GLib 5 6 7class Applet(Gtk.Box): 8name = "Generic applet" 9description = "" 10 11__gsignals__ = { 12"config-changed": (GObject.SIGNAL_RUN_FIRST, None, ()) 13} 14 15def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None): 16super().__init__(orientation=orientation) 17self.add_css_class("panorama-panel-applet") 18if orientation == Gtk.Orientation.VERTICAL: 19self.set_hexpand(True) 20self.set_vexpand(False) 21self.add_css_class("vertical") 22elif orientation == Gtk.Orientation.HORIZONTAL: 23self.set_vexpand(True) 24self.set_hexpand(False) 25self.add_css_class("horizontal") 26 27self.drag_source = Gtk.DragSource(actions=Gdk.DragAction.MOVE) 28self.drag_source.connect("prepare", self.provide_drag_data) 29self.drag_source.connect("drag-begin", self.drag_begin) 30self.drag_source.connect("drag-cancel", self.drag_cancel) 31 32def set_orientation(self, orientation): 33Gtk.Box.set_orientation(self, orientation) 34if orientation == Gtk.Orientation.HORIZONTAL: 35self.remove_css_class("vertical") 36self.add_css_class("horizontal") 37else: 38self.remove_css_class("horizontal") 39self.add_css_class("vertical") 40 41def provide_drag_data(self, source: Gtk.DragSource, x: float, y: float): 42app = self.get_root().get_application() 43app.drags[id(self)] = self 44value = GObject.Value() 45value.init(GObject.TYPE_UINT64) 46value.set_uint64(id(self)) 47return Gdk.ContentProvider.new_for_value(value) 48 49def drag_begin(self, source: Gtk.DragSource, drag: Gdk.Drag): 50paintable = Gtk.WidgetPaintable.new(self).get_current_image() 51source.set_icon(paintable, 0, 0) 52self.hide() 53 54def drag_cancel(self, source: Gtk.DragSource, drag: Gdk.Drag, reason: Gdk.DragCancelReason): 55self.show() 56return False 57 58def get_config(self): 59return {} 60 61def shutdown(self, app: Gtk.Application): 62return 63 64def set_panel_position(self, position: Gtk.PositionType): 65return 66 67def make_draggable(self): 68self.add_controller(self.drag_source) 69 70def restore_drag(self): 71self.remove_controller(self.drag_source) 72 73def output_changed(self): 74return 75 76@classmethod 77def print_log(cls, *args, **kwargs): 78print(f"{cls.__name__}:", *args, **kwargs) 79 80def wl_output_enter(self, output, name): 81pass 82 83def foreign_toplevel_new(self, manager, toplevel): 84pass 85 86def foreign_toplevel_output_enter(self, toplevel, output): 87pass 88 89def foreign_toplevel_output_leave(self, toplevel, output): 90pass 91 92def foreign_toplevel_app_id(self, toplevel, app_id): 93pass 94 95def foreign_toplevel_title(self, toplevel, title): 96pass 97 98def foreign_toplevel_state(self, toplevel, state): 99pass 100 101def foreign_toplevel_closed(self, toplevel): 102pass 103 104def foreign_toplevel_refresh(self): 105pass 106 107 108def track_popover(popover: Gtk.Popover): 109popover.connect("show", lambda *args: _popover_shown(popover)) 110popover.connect("closed", lambda *args: _popover_hidden(popover)) 111 112 113def _popover_shown(popover: Gtk.Popover): 114popover.get_root().open_popovers.add(id(popover)) 115if popover.get_root().autohide: 116GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1), 117popover.get_root().slide_in) 118 119 120def _popover_hidden(popover: Gtk.Popover): 121popover.get_root().open_popovers.remove(id(popover)) 122if popover.get_root().autohide and not popover.get_root().open_popovers: 123GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1), 124popover.get_root().slide_out) 125 126 127def get_panel_position(applet: Applet) -> Gtk.PositionType: 128return applet.get_root().position 129 130 131OPPOSITE_POSITION = { 132Gtk.PositionType.TOP: Gtk.PositionType.BOTTOM, 133Gtk.PositionType.BOTTOM: Gtk.PositionType.TOP, 134Gtk.PositionType.LEFT: Gtk.PositionType.RIGHT, 135Gtk.PositionType.RIGHT: Gtk.PositionType.LEFT, 136} 137 138POSITION_TO_ARROW = { 139Gtk.PositionType.TOP: Gtk.ArrowType.UP, 140Gtk.PositionType.BOTTOM: Gtk.ArrowType.DOWN, 141Gtk.PositionType.LEFT: Gtk.ArrowType.LEFT, 142Gtk.PositionType.RIGHT: Gtk.ArrowType.RIGHT, 143} 144