<!DOCTYPE html>
<html>
<head>
<link data-require="bootstrap-css@3.0.2" data-semver="3.0.2" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css" />
<script data-require="angular.js@*" data-semver="1.2.9" src="http://code.angularjs.org/1.2.9/angular.js"></script>
<script data-require="jquery@*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script data-require="bootstrap@*" data-semver="3.0.2" src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
<script data-require="ui-bootstrap@*" data-semver="0.10.0" src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="panes.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="paneApp" ng-controller="AppCtrl">
<div class="btn-group">
<button type="button" class="btn btn-primary" ng-model="pane.a" btn-checkbox>A</button>
<button type="button" class="btn btn-primary" ng-model="pane.b" btn-checkbox>B</button>
<button type="button" class="btn btn-primary" ng-model="pane.c" btn-checkbox>C</button>
<button type="button" class="btn btn-primary" ng-model="pane.d" btn-checkbox>D</button>
</div>
Visible: {{pane.a}} {{pane.b}} {{pane.c}} {{pane.d}}
<pane-container>
<pane ng-attr-hidden="!pane.a">A</pane>
<pane ng-attr-hidden="!pane.b">B</pane>
<pane ng-attr-hidden="!pane.c">C</pane>
<pane ng-attr-hidden="!pane.d">D</pane>
</pane-container>
</body>
</html>
var app = angular.module('paneApp', ['ui.bootstrap', 'panes']);
app.controller('AppCtrl', function($scope) {
$scope.pane = {
a: true,
b: true,
c: true,
d: true
};
});
.pane-container {
background: red;
}
.pane-container .pane {
background: -moz-linear-gradient(-45deg, #b5bdc8 0%, #828c95 36%, #28343b 100%);
background: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #b5bdc8), color-stop(36%, #828c95), color-stop(100%, #28343b));
background: -webkit-linear-gradient(-45deg, #b5bdc8 0%, #828c95 36%, #28343b 100%);
background: -o-linear-gradient(-45deg, #b5bdc8 0%, #828c95 36%, #28343b 100%);
background: -ms-linear-gradient(-45deg, #b5bdc8 0%, #828c95 36%, #28343b 100%);
background: linear-gradient(135deg, #b5bdc8 0%, #828c95 36%, #28343b 100%);
text-align: center;
color: #fff;
font-weight: bold;
}
<div class="pane-container clearfix">
Pane container: {{paneContainer.childrenCount}}
<div ng-transclude></div>
</div>
<div class="pane" ng-style="style()" ng-hide="hidden">
<div ng-transclude></div>
</div>
angular.module('panes', [])
.directive('paneContainer', function() {
var controller = function($scope) {
var visibleChildrenCount = 0;
var children = [];
var resizeChildren = function() {
angular.forEach(children, function(pane, key) {
pane.resize(1 / visibleChildrenCount);
});
};
this.addPane = function(pane) {
children.push(pane);
};
this.showPane = function(pane) {
visibleChildrenCount += 1;
resizeChildren();
};
this.hidePane = function(pane) {
visibleChildrenCount -= 1;
resizeChildren();
};
};
return {
restrict: 'E',
transclude: true,
templateUrl: 'pane-container.html',
controller: controller,
scope: {}
};
})
.directive('pane', function() {
var link = function(scope, element, attrs, PaneContainerCtrl) {
PaneContainerCtrl.addPane(scope);
scope.container = PaneContainerCtrl;
};
var controller = function($scope) {
var width = 1;
$scope.show = function() {
$scope.container.showPane($scope);
};
$scope.hide = function() {
$scope.container.hidePane($scope);
};
$scope.style = function() {
return {
width: (100 * width) + '%',
float: 'left'
};
};
$scope.resize = function(w) {
width = w;
};
$scope.$watch('hidden', function() {
console.log('hidden', $scope.hidden);
if ($scope.hidden === true) {
$scope.hide();
} else if ($scope.hidden === false) {
$scope.show();
}
});
};
return {
restrict: 'E',
link: link,
transclude: true,
templateUrl: 'pane.html',
controller: controller,
require: '^paneContainer',
scope: {
hidden: '=hidden'
}
};
});