forked from qt-creator/qt-creator
		
	
		
			
	
	
		
			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; | ||
|  |     } | ||
|  | } |