1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const CategoryLayoutManager = new Lang.Class({
Name: 'CategoryLayoutManager',
Extends: Gtk.Grid,
_init: function(props) {
props = props || {};
props.column_homogeneous = true;
props.row_homogeneous = true;
this.parent(props);
this._childWidgets = [];
},
// Distribute children in two columns, except for the last one if an odd
// number; that should span two columns
_redistributeChildren: function() {
let numChildren = this._childWidgets.length;
let oddNumber = numChildren % 2 == 1;
this._childWidgets.forEach(function(child, index) {
let column = index % 2;
let row = Math.floor(index / 2);
if(child.get_parent() === this)
Gtk.Container.prototype.remove.call(this,
this._childWidgets[index]);
if(oddNumber && index == numChildren - 1)
this.attach(child, 0, row, 2, 1);
else
this.attach(child, column, row, 1, 1);
}, this);
},
add: function(child) {
this._childWidgets.push(child);
this._redistributeChildren();
},
remove: function(child) {
let index = this._childWidgets.indexOf(child);
if(index == -1) {
printerr('Widget', System.addressOf(child),
'is not contained in CategoryLayoutManager');
return;
}
this._childWidgets.splice(index, 1); // remove
this._redistributeChildren();
}
});
// Gtk.init(null);
// let w = new Gtk.Window();
// let g = new CategoryLayoutManager();
// let count = 7;
// for(let i = 0; i < count; i++) {
// let widget = new Gtk.Button({label: 'Widget ' + i});
// g.add(widget);
// }
// w.add(g);
// w.connect('destroy', Gtk.main_quit);
// w.show_all();
// Gtk.main();
|