Skip to content

Instantly share code, notes, and snippets.

@lithid
Created February 20, 2013 02:05
Show Gist options
  • Save lithid/4992092 to your computer and use it in GitHub Desktop.
Save lithid/4992092 to your computer and use it in GitHub Desktop.

Revisions

  1. lithid created this gist Feb 20, 2013.
    90 changes: 90 additions & 0 deletions Grid
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,90 @@
    #!/usr/bin/env python2
    from gi.repository import Gtk

    class Grid(Gtk.Window):
    widget_list = []
    WIDGET_SIZE = 140
    COLS = 1
    NUM = 100

    def calcule_columns(self, scroll, grid):
    cols = scroll.get_allocated_width() / (self.WIDGET_SIZE + grid.get_column_spacing())
    if (cols > len(self.widget_list)): cols = len(self.widget_list)
    return cols

    def on_resize(self, arg1, arg2, scroll, grid):
    new_cols = self.calcule_columns(scroll, grid)
    if new_cols == self.COLS or new_cols == 0 or new_cols > len(self.widget_list): return
    self.COLS = new_cols
    self.remove_widgets(grid)
    self.load_widgets(grid)

    def remove_widgets(self, grid):
    if self.widget_list == 0: return
    for wid in grid.get_children():
    grid.remove(wid)

    def create_grid(self):
    grid = Gtk.Grid()
    grid.set_column_spacing(10)
    grid.set_row_spacing(10)
    grid.set_column_homogeneous(True)
    grid.set_row_homogeneous(False)
    grid.set_border_width(0)
    return grid

    def load_widgets(self, grid):
    i,j = 0,0
    COLS = self.COLS

    if len(self.widget_list) == 0: return

    for wid in self.widget_list:
    grid.attach(wid, i, j, 1, 1)
    i+=1
    if i == COLS:
    i=0
    j+=1

    def __init__(self):
    def callback(widget):
    this = widget.get_label()
    dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL,
    message_type=Gtk.MessageType.QUESTION,
    buttons=Gtk.ButtonsType.OK)
    dialog.set_title("Window title %s" % this.split(" ")[1])
    dialog.set_markup("You chose <b>%s</b>, try it again!" % this)
    dialog.run()
    dialog.destroy()

    Gtk.Window.__init__(self, title="Grid")

    self.resize(self.WIDGET_SIZE*6, self.WIDGET_SIZE*2)
    self.set_position(Gtk.WindowPosition.CENTER)

    grid_main = self.create_grid()
    viewport = Gtk.Viewport(None, None);
    viewport.add(grid_main)
    viewport.set_shadow_type (Gtk.ShadowType.NONE)
    scroll = Gtk.ScrolledWindow()
    scroll.set_border_width(0)
    scroll.add(viewport)
    scroll.connect("size-allocate", self.on_resize, scroll, grid_main)
    scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
    self.add(scroll)

    z = 1
    while z is not self.NUM+1:
    button = Gtk.Button()
    button.set_label("Button %s" % z)
    button.connect("clicked", callback)
    self.widget_list.append(button)
    z+=1

    self.load_widgets(grid_main)


    win = Grid()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()