panorama_panel.py
Python script, ASCII text executable
1import gi 2gi.require_version("Gtk", "4.0") 3 4from gi.repository import Gtk, Gdk, GObject 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) 22 23def provide_drag_data(self, source: Gtk.DragSource, x: float, y: float): 24app = self.get_root().get_application() 25app.drags[id(self)] = self 26value = GObject.Value() 27value.init(GObject.TYPE_UINT64) 28value.set_uint64(id(self)) 29print(value) 30return Gdk.ContentProvider.new_for_value(value) 31 32def get_config(self): 33return {} 34 35def set_panel_position(self, position: Gtk.PositionType): 36return 37 38def make_draggable(self): 39self.add_controller(self.drag_source) 40 41def restore_drag(self): 42self.remove_controller(self.drag_source) 43 44 45def get_panel_position(applet: Applet) -> Gtk.PositionType: 46return applet.get_root().position 47 48 49OPPOSITE_POSITION = { 50Gtk.PositionType.TOP: Gtk.PositionType.BOTTOM, 51Gtk.PositionType.BOTTOM: Gtk.PositionType.TOP, 52Gtk.PositionType.LEFT: Gtk.PositionType.RIGHT, 53Gtk.PositionType.RIGHT: Gtk.PositionType.LEFT, 54} 55 56POSITION_TO_ARROW = { 57Gtk.PositionType.TOP: Gtk.ArrowType.UP, 58Gtk.PositionType.BOTTOM: Gtk.ArrowType.DOWN, 59Gtk.PositionType.LEFT: Gtk.ArrowType.LEFT, 60Gtk.PositionType.RIGHT: Gtk.ArrowType.RIGHT, 61} 62