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;
 | |
|     }
 | |
| }
 |