# Python imports # Lib imports import gi gi.require_version('Gtk', '3.0') gi.require_version('Gdk', '3.0') gi.require_version('GtkSource', '4') from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GtkSource # Application imports from .template.dynamic_widget_template import DynamicWidget class DragArea(GtkSource.View): # class DragArea(Gtk.Fixed): def __init__(self): super(DragArea, self).__init__() self.buffer = self.get_buffer() self._children_content = [] self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() def _setup_styling(self): self.set_size_request(1800, 1800) self.set_cursor_visible(False) def _setup_signals(self): ... def _subscribe_to_events(self): ... def _load_widgets(self): ... def add_fixed_base_widgets(self, name = None, date = None, update_header_callback = None): entry = Gtk.Entry(text = name) wrapped_entry = self.wrap_widget_in_trap( entry ) date_label = Gtk.Label(label = date) wrapped_date = self.wrap_widget_in_trap( date_label ) ctx = entry.get_style_context() ctx.add_class("drag-area-title") entry.connect("changed", update_header_callback) entry.set_width_chars(25) entry.set_max_length(25) # self.put(wrapped_entry, 30, 30) # self.put(wrapped_date, 30, 65) self.add_child_in_window(wrapped_entry, Gtk.TextWindowType.WIDGET, 30, 30) self.add_child_in_window(wrapped_date, Gtk.TextWindowType.WIDGET, 30, 65) def add_or_select_widget(self, widget = None, eve = None): dynamic_widget = DynamicWidget(self._move_callback, eve.x, eve.y) dynamic_widget_wrapped = self.wrap_widget_in_trap(dynamic_widget) self._children_content.append(dynamic_widget) # self.put(dynamic_widget, eve.x, eve.y) self.add_child_in_window(dynamic_widget_wrapped, Gtk.TextWindowType.WIDGET, eve.x, eve.y) def _move_callback(self, widget = None, x = None, y = None): # self.move(widget.get_parent(), x, y) self.move_child(widget.get_parent(), x, y) def wrap_widget_in_trap(self, widget): eve_trap_box = Gtk.EventBox() eve_trap_box.connect("enter-notify-event", self._enter_event) eve_trap_box.connect("motion-notify-event", self._motion_event) eve_trap_box.connect("button-release-event", self._release_event) eve_trap_box.add(widget) eve_trap_box.show() return eve_trap_box def _enter_event(self, widget = None, eve = None): ... def _motion_event(self, widget = None, eve = None): ... def _release_event(self, widget = None, eve = None): return True