53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
import gi
|
|
|
|
gi.require_version("Gtk", "3.0")
|
|
from gi.repository import Gtk
|
|
|
|
|
|
class AutoGrid(Gtk.Grid):
|
|
"""
|
|
A subclass of Gtk.Grid that auto-arranges its children on init
|
|
|
|
Args:
|
|
items (list): All the widgets to be arranged.
|
|
max_columns (int: 4): The maximum number of columns, up to 4.
|
|
expand_last (bool: False): expand the last widget to double width.
|
|
vertical (bool: False): optimize for vertical orientation.
|
|
|
|
Example:
|
|
grid = Autogrid([Gtk.Button(), Gtk.Button()])
|
|
"""
|
|
|
|
def __init__(self, items=None, max_columns=None, expand_last=False, vertical=False):
|
|
super().__init__(row_homogeneous=True, column_homogeneous=True)
|
|
if not max_columns:
|
|
max_columns = 3 if vertical else 4
|
|
self.expand_last = expand_last
|
|
if not items:
|
|
return
|
|
length = len(items)
|
|
if vertical and length < 4:
|
|
# Arrange 1 x 4
|
|
columns = 1
|
|
elif length in {4, 2}:
|
|
# Arrange 2 x 2
|
|
columns = min(2, max_columns)
|
|
elif length in {3, 5, 6}:
|
|
# Arrange 3 x 2
|
|
columns = min(3, max_columns)
|
|
else:
|
|
# Arrange 4 x n
|
|
columns = min(4, max_columns)
|
|
|
|
for i, widget in enumerate(items):
|
|
col = i % columns
|
|
row = int(i / columns)
|
|
if self.expand_last and (i + 1) == length and length % 2 == 1:
|
|
self.attach(widget, col, row, 2, 1)
|
|
else:
|
|
self.attach(widget, col, row, 1, 1)
|
|
|
|
def clear(self):
|
|
for i in self.get_children():
|
|
self.remove(i)
|