By using this site, you agree to have cookies stored on your device, strictly for functional purposes, such as storing your session and preferences.

Dismiss

 panorama_panel.py

View raw Download
text/x-script.python • 3.34 kiB
Python script, ASCII text executable
        
            
1
import gi
2
gi.require_version("Gtk", "4.0")
3
4
from gi.repository import Gtk, Gdk, GObject, GLib
5
6
7
class Applet(Gtk.Box):
8
name = "Generic applet"
9
description = ""
10
11
__gsignals__ = {
12
"config-changed": (GObject.SIGNAL_RUN_FIRST, None, ())
13
}
14
15
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
16
super().__init__(orientation=orientation)
17
self.add_css_class("panorama-panel-applet")
18
if orientation == Gtk.Orientation.VERTICAL:
19
self.set_hexpand(True)
20
self.set_vexpand(False)
21
elif orientation == Gtk.Orientation.HORIZONTAL:
22
self.set_vexpand(True)
23
self.set_hexpand(False)
24
25
self.drag_source = Gtk.DragSource(actions=Gdk.DragAction.MOVE)
26
self.drag_source.connect("prepare", self.provide_drag_data)
27
self.drag_source.connect("drag-begin", self.drag_begin)
28
self.drag_source.connect("drag-cancel", self.drag_cancel)
29
30
def provide_drag_data(self, source: Gtk.DragSource, x: float, y: float):
31
app = self.get_root().get_application()
32
app.drags[id(self)] = self
33
value = GObject.Value()
34
value.init(GObject.TYPE_UINT64)
35
value.set_uint64(id(self))
36
return Gdk.ContentProvider.new_for_value(value)
37
38
def drag_begin(self, source: Gtk.DragSource, drag: Gdk.Drag):
39
paintable = Gtk.WidgetPaintable.new(self).get_current_image()
40
source.set_icon(paintable, 0, 0)
41
self.hide()
42
43
def drag_cancel(self, source: Gtk.DragSource, drag: Gdk.Drag, reason: Gdk.DragCancelReason):
44
self.show()
45
return False
46
47
def get_config(self):
48
return {}
49
50
def shutdown(self):
51
return
52
53
def set_panel_position(self, position: Gtk.PositionType):
54
return
55
56
def make_draggable(self):
57
self.add_controller(self.drag_source)
58
59
def restore_drag(self):
60
self.remove_controller(self.drag_source)
61
62
def output_changed(self):
63
return
64
65
@classmethod
66
def print_log(cls, *args, **kwargs):
67
print(f"{cls.__name__}:", *args, **kwargs)
68
69
70
def track_popover(popover: Gtk.Popover):
71
popover.connect("show", lambda *args: _popover_shown(popover))
72
popover.connect("closed", lambda *args: _popover_hidden(popover))
73
74
75
def _popover_shown(popover: Gtk.Popover):
76
popover.get_root().open_popovers.add(id(popover))
77
if popover.get_root().autohide:
78
GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1),
79
popover.get_root().slide_in)
80
81
82
def _popover_hidden(popover: Gtk.Popover):
83
popover.get_root().open_popovers.remove(id(popover))
84
if popover.get_root().autohide and not popover.get_root().open_popovers:
85
GLib.timeout_add(popover.get_root().hide_time // (popover.get_root().size - 1),
86
popover.get_root().slide_out)
87
88
89
def get_panel_position(applet: Applet) -> Gtk.PositionType:
90
return applet.get_root().position
91
92
93
OPPOSITE_POSITION = {
94
Gtk.PositionType.TOP: Gtk.PositionType.BOTTOM,
95
Gtk.PositionType.BOTTOM: Gtk.PositionType.TOP,
96
Gtk.PositionType.LEFT: Gtk.PositionType.RIGHT,
97
Gtk.PositionType.RIGHT: Gtk.PositionType.LEFT,
98
}
99
100
POSITION_TO_ARROW = {
101
Gtk.PositionType.TOP: Gtk.ArrowType.UP,
102
Gtk.PositionType.BOTTOM: Gtk.ArrowType.DOWN,
103
Gtk.PositionType.LEFT: Gtk.ArrowType.LEFT,
104
Gtk.PositionType.RIGHT: Gtk.ArrowType.RIGHT,
105
}
106