Coherence/src/core/widgets/widget_selector/widget_selector_grid.py

118 lines
2.9 KiB
Python

# Python imports
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
# Application imports
from .widgets import *
widgets_list = []
for item in dir():
if "Widget" in f"{item}":
widgets_list.append(item)
class WidgetSelectorGrid(Gtk.Grid):
def __init__(self):
super(WidgetSelectorGrid, self).__init__()
self._seleced_widget_type = Gtk.Label(label="NO WIDGET SELECTED!")
self._row = 0
self._col = 0
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
self.show_all()
def _setup_styling(self):
...
def _setup_signals(self):
self.set_column_homogeneous(True)
self.set_row_homogeneous(False)
self.set_column_spacing(10)
self.set_row_spacing(10)
def _subscribe_to_events(self):
event_system.subscribe("register_widget_type", self._register_widget_type)
event_system.subscribe("get_widget_type", self._get_widget_type)
event_system.subscribe("set_widget_type", self._set_widget_type)
def _load_widgets(self):
for widget in widgets_list:
self._register_widget_type(globals()[widget])
def _register_widget_type(self, Widget):
selection = Gtk.EventBox()
widget = Widget()
ctx = widget.get_style_context()
ctx.add_class("selection-widget")
selection.set_above_child(True)
selection.add(widget)
selection.connect("button-release-event", self._set_widget_type_eve)
self.attach(selection, self._col, self._row, 1, 1)
self._col += 1
if self._col > 4:
self._col = 0
self._row += 1
def _get_widget_type(self):
try:
return self._seleced_widget_type.new()
except Exception:
return self._seleced_widget_type().new()
def _set_widget_type_eve(self, widget = None, eve = None):
self._seleced_widget_type = widget.get_children()[0]
def _set_widget_type(self, type):
widget = globals()[type] if isinstance(type, str) else type
self._seleced_widget_type = widget
class WidgetSelector(Gtk.Popover):
def __init__(self):
super(WidgetSelector, self).__init__()
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
def _setup_styling(self):
self.set_size_request(256, 480)
def _setup_signals(self):
...
def _subscribe_to_events(self):
event_system.subscribe("show_widget_types", self._show_widget_types)
def _load_widgets(self):
scroll_win = Gtk.ScrolledWindow()
viewport = Gtk.Viewport()
viewport.add(WidgetSelectorGrid())
scroll_win.add(viewport)
self.add(scroll_win)
scroll_win.show_all()
def _show_widget_types(self):
self.show()