summaryrefslogtreecommitdiff
path: root/wikipedia/views/category_layout_manager.js
blob: a7be3bb17fcd8401144e0fd66c2416e45ecdd241 (plain)
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();