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 11def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None): 12super().__init__(orientation=orientation) 13if orientation == Gtk.Orientation.VERTICAL: 14self.set_hexpand(True) 15self.set_vexpand(False) 16elif orientation == Gtk.Orientation.HORIZONTAL: 17self.set_vexpand(True) 18self.set_hexpand(False) 19 20self.drag_source = Gtk.DragSource(actions=Gdk.DragAction.MOVE) 21self.drag_source.connect("prepare", self.provide_drag_data) 22self.drag_source.connect("drag-begin", self.drag_begin) 23self.drag_source.connect("drag-cancel", self.drag_cancel) 24 25def provide_drag_data(self, source: Gtk.DragSource, x: float, y: float): 26app = self.get_root().get_application() 27app.drags[id(self)] = self 28value = GObject.Value() 29value.init(GObject.TYPE_UINT64) 30value.set_uint64(id(self)) 31print(value) 32return Gdk.ContentProvider.new_for_value(value) 33 34def drag_begin(self, source: Gtk.DragSource, drag: Gdk.Drag): 35paintable = Gtk.WidgetPaintable.new(self).get_current_image() 36source.set_icon(paintable, 0, 0) 37self.hide() 38 39def drag_cancel(self, source: Gtk.DragSource, drag: Gdk.Drag, reason: Gdk.DragCancelReason): 40self.show() 41return False 42 43def get_config(self): 44return {} 45 46def set_panel_position(self, position: Gtk.PositionType): 47return 48 49def make_draggable(self): 50self.add_controller(self.drag_source) 51 52def restore_drag(self): 53self.remove_controller(self.drag_source) 54 55def track_popover(self, popover: Gtk.Popover): 56popover.connect("show", lambda *args: _popover_shown(self, popover)) 57popover.connect("closed", lambda *args: _popover_hidden(self, popover)) 58 59def track_popover(popover: Gtk.Popover): 60popover.connect("show", lambda *args: _popover_shown(None, popover)) 61popover.connect("closed", lambda *args: _popover_hidden(None, popover)) 62 63 64def _popover_shown(applet, popover: Gtk.Popover): 65popover.get_root().open_popovers.add(id(popover)) 66if popover.get_root().autohide: 67GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1), 68popover.get_root().slide_in) 69 70 71def _popover_hidden(applet, popover: Gtk.Popover): 72popover.get_root().open_popovers.remove(id(popover)) 73if popover.get_root().autohide and not popover.get_root().open_popovers: 74GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1), 75popover.get_root().slide_out) 76 77 78def get_panel_position(applet: Applet) -> Gtk.PositionType: 79return applet.get_root().position 80 81 82OPPOSITE_POSITION = { 83Gtk.PositionType.TOP: Gtk.PositionType.BOTTOM, 84Gtk.PositionType.BOTTOM: Gtk.PositionType.TOP, 85Gtk.PositionType.LEFT: Gtk.PositionType.RIGHT, 86Gtk.PositionType.RIGHT: Gtk.PositionType.LEFT, 87} 88 89POSITION_TO_ARROW = { 90Gtk.PositionType.TOP: Gtk.ArrowType.UP, 91Gtk.PositionType.BOTTOM: Gtk.ArrowType.DOWN, 92Gtk.PositionType.LEFT: Gtk.ArrowType.LEFT, 93Gtk.PositionType.RIGHT: Gtk.ArrowType.RIGHT, 94} 95