forked from qt-creator/qt-creator
		
	Task-Number: QTCREATORBUG-5672 Done-with: Oswald Buddenhagen Change-Id: I61f8a83205bc338ba12e43b7471eaa957da2b004 Reviewed-on: http://codereview.qt.nokia.com/2451 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: Eike Ziller <eike.ziller@nokia.com>
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var self;
 | 
						|
var checkHandlers = [];
 | 
						|
var visibleButtons = [];
 | 
						|
var nonVisibleButtons = [];
 | 
						|
var direction;
 | 
						|
 | 
						|
function create(that, options) {
 | 
						|
    self = that;
 | 
						|
    direction = options.direction || Qt.Horizontal;
 | 
						|
    self.childrenChanged.connect(rebuild);
 | 
						|
//    self.widthChanged.connect(resizeChildren);
 | 
						|
    build();
 | 
						|
}
 | 
						|
 | 
						|
function isButton(item) {
 | 
						|
    if (item && item.hasOwnProperty("__position"))
 | 
						|
        return true;
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
function hasChecked(item) {
 | 
						|
    return (item && item.hasOwnProperty("checked"));
 | 
						|
}
 | 
						|
 | 
						|
function destroy() {
 | 
						|
    self.childrenChanged.disconnect(rebuild);
 | 
						|
//    self.widthChanged.disconnect(resizeChildren);
 | 
						|
    cleanup();
 | 
						|
}
 | 
						|
 | 
						|
function build() {
 | 
						|
    visibleButtons = [];
 | 
						|
    nonVisibleButtons = [];
 | 
						|
 | 
						|
    for (var i = 0, item; (item = self.children[i]); i++) {
 | 
						|
        if (!hasChecked(item))
 | 
						|
            continue;
 | 
						|
 | 
						|
        item.visibleChanged.connect(rebuild); // Not optimal, but hardly a bottleneck in your app
 | 
						|
        if (!item.visible) {
 | 
						|
            nonVisibleButtons.push(item);
 | 
						|
            continue;
 | 
						|
        }
 | 
						|
        visibleButtons.push(item);
 | 
						|
 | 
						|
        if (self.exclusive && item.hasOwnProperty("checkable"))
 | 
						|
            item.checkable = true;
 | 
						|
 | 
						|
        if (self.exclusive) {
 | 
						|
            item.checked = false;
 | 
						|
            checkHandlers.push(checkExclusive(item));
 | 
						|
            item.checkedChanged.connect(checkHandlers[checkHandlers.length - 1]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    var nrButtons = visibleButtons.length;
 | 
						|
    if (nrButtons == 0)
 | 
						|
        return;
 | 
						|
 | 
						|
    if (self.checkedButton)
 | 
						|
        self.checkedButton.checked = true;
 | 
						|
    else if (self.exclusive) {
 | 
						|
        self.checkedButton = visibleButtons[0];
 | 
						|
        self.checkedButton.checked = true;
 | 
						|
    }
 | 
						|
 | 
						|
    if (nrButtons == 1) {
 | 
						|
        finishButton(visibleButtons[0], "only");
 | 
						|
    } else {
 | 
						|
        finishButton(visibleButtons[0], direction == Qt.Horizontal ? "leftmost" : "top");
 | 
						|
        for (var i = 1; i < nrButtons - 1; i++)
 | 
						|
            finishButton(visibleButtons[i], direction == Qt.Horizontal ? "h_middle": "v_middle");
 | 
						|
        finishButton(visibleButtons[nrButtons - 1], direction == Qt.Horizontal ? "rightmost" : "bottom");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function finishButton(button, position) {
 | 
						|
    if (isButton(button)) {
 | 
						|
        button.__position = position;
 | 
						|
        if (direction == Qt.Vertical) {
 | 
						|
            button.anchors.left = self.left     //mm How to make this not cause binding loops? see QTBUG-17162
 | 
						|
            button.anchors.right = self.right
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function cleanup() {
 | 
						|
    visibleButtons.forEach(function(item, i) {
 | 
						|
        if (checkHandlers[i])
 | 
						|
            item.checkedChanged.disconnect(checkHandlers[i]);
 | 
						|
        item.visibleChanged.disconnect(rebuild);
 | 
						|
    });
 | 
						|
    checkHandlers = [];
 | 
						|
 | 
						|
    nonVisibleButtons.forEach(function(item, i) {
 | 
						|
        item.visibleChanged.disconnect(rebuild);
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
function rebuild() {
 | 
						|
    if (self == undefined)
 | 
						|
        return;
 | 
						|
 | 
						|
    cleanup();
 | 
						|
    build();
 | 
						|
}
 | 
						|
 | 
						|
function resizeChildren() {
 | 
						|
    if (direction != Qt.Horizontal)
 | 
						|
        return;
 | 
						|
 | 
						|
    var extraPixels = self.width % visibleButtons;
 | 
						|
    var buttonSize = (self.width - extraPixels) / visibleButtons;
 | 
						|
    visibleButtons.forEach(function(item, i) {
 | 
						|
        if (!item || !item.visible)
 | 
						|
            return;
 | 
						|
        item.width = buttonSize + (extraPixels > 0 ? 1 : 0);
 | 
						|
        if (extraPixels > 0)
 | 
						|
            extraPixels--;
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
function checkExclusive(item) {
 | 
						|
    var button = item;
 | 
						|
    return function() {
 | 
						|
        for (var i = 0, ref; (ref = visibleButtons[i]); i++) {
 | 
						|
            if (ref.checked == (button === ref))
 | 
						|
                continue;
 | 
						|
 | 
						|
            // Disconnect the signal to avoid recursive calls
 | 
						|
            ref.checkedChanged.disconnect(checkHandlers[i]);
 | 
						|
            ref.checked = !ref.checked;
 | 
						|
            ref.checkedChanged.connect(checkHandlers[i]);
 | 
						|
        }
 | 
						|
        self.checkedButton = button;
 | 
						|
    }
 | 
						|
}
 |