Files
ionic-framework/js/ext/angular/src/directive/ionicSideMenu.js
2014-02-17 17:26:34 -05:00

180 lines
5.4 KiB
JavaScript

(function() {
'use strict';
/**
* @description
* The sideMenuCtrl lets you quickly have a draggable side
* left and/or right menu, which a center content area.
*/
angular.module('ionic.ui.sideMenu', ['ionic.service.gesture', 'ionic.service.view'])
/**
* The internal controller for the side menu controller. This
* extends our core Ionic side menu controller and exposes
* some side menu stuff on the current scope.
*/
.run(['$ionicViewService', function($ionicViewService) {
// set that the side-menus directive should not animate when transitioning to it
$ionicViewService.disableRegisterByTagName('side-menus');
}])
.directive('sideMenus', function() {
return {
restrict: 'ECA',
controller: ['$scope', '$attrs', function($scope, $attrs) {
var _this = this;
angular.extend(this, ionic.controllers.SideMenuController.prototype);
ionic.controllers.SideMenuController.call(this, {
left: { width: 275 },
right: { width: 275 }
});
$scope.sideMenuContentTranslateX = 0;
$scope.sideMenuController = this;
}],
replace: true,
transclude: true,
template: '<div class="pane" ng-transclude></div>'
};
})
.directive('sideMenuContent', ['$timeout', '$ionicGesture', function($timeout, $ionicGesture) {
return {
restrict: 'AC',
require: '^sideMenus',
scope: true,
compile: function(element, attr, transclude) {
return function($scope, $element, $attr, sideMenuCtrl) {
$element.addClass('menu-content');
if (angular.isDefined(attr.dragContent)) {
$scope.$watch(attr.dragContent, function(value) {
$scope.dragContent = value;
});
} else {
$scope.dragContent = true;
}
var defaultPrevented = false;
var isDragging = false;
// Listen for taps on the content to close the menu
/*
ionic.on('tap', function(e) {
sideMenuCtrl.close();
}, $element[0]);
*/
var dragFn = function(e) {
if($scope.dragContent) {
if(defaultPrevented || e.gesture.srcEvent.defaultPrevented) {
return;
}
isDragging = true;
sideMenuCtrl._handleDrag(e);
e.gesture.srcEvent.preventDefault();
}
};
var dragVertFn = function(e) {
if(isDragging) {
e.gesture.srcEvent.preventDefault();
}
};
//var dragGesture = Gesture.on('drag', dragFn, $element);
var dragRightGesture = $ionicGesture.on('dragright', dragFn, $element);
var dragLeftGesture = $ionicGesture.on('dragleft', dragFn, $element);
var dragUpGesture = $ionicGesture.on('dragup', dragVertFn, $element);
var dragDownGesture = $ionicGesture.on('dragdown', dragVertFn, $element);
var dragReleaseFn = function(e) {
isDragging = false;
if(!defaultPrevented) {
sideMenuCtrl._endDrag(e);
}
defaultPrevented = false;
};
var releaseGesture = $ionicGesture.on('release', dragReleaseFn, $element);
sideMenuCtrl.setContent({
onDrag: function(e) {},
endDrag: function(e) {},
getTranslateX: function() {
return $scope.sideMenuContentTranslateX || 0;
},
setTranslateX: ionic.animationFrameThrottle(function(amount) {
$element[0].style.webkitTransform = 'translate3d(' + amount + 'px, 0, 0)';
$timeout(function() {
$scope.sideMenuContentTranslateX = amount;
});
}),
enableAnimation: function() {
//this.el.classList.add(this.animateClass);
$scope.animationEnabled = true;
$element[0].classList.add('menu-animated');
},
disableAnimation: function() {
//this.el.classList.remove(this.animateClass);
$scope.animationEnabled = false;
$element[0].classList.remove('menu-animated');
}
});
// Cleanup
$scope.$on('$destroy', function() {
$ionicGesture.off(dragLeftGesture, 'dragleft', dragFn);
$ionicGesture.off(dragRightGesture, 'dragright', dragFn);
$ionicGesture.off(dragUpGesture, 'dragup', dragFn);
$ionicGesture.off(dragDownGesture, 'dragdown', dragFn);
$ionicGesture.off(releaseGesture, 'release', dragReleaseFn);
});
};
}
};
}])
.directive('sideMenu', function() {
return {
restrict: 'E',
require: '^sideMenus',
replace: true,
transclude: true,
scope: true,
template: '<div class="menu menu-{{side}}" ng-transclude></div>',
compile: function(element, attr, transclude) {
angular.isUndefined(attr.isEnabled) && attr.$set('isEnabled', 'true');
angular.isUndefined(attr.width) && attr.$set('width', '275');
return function($scope, $element, $attr, sideMenuCtrl) {
$scope.side = $attr.side;
var sideMenu = sideMenuCtrl[$scope.side] = new ionic.views.SideMenu({
width: 275,
el: $element[0],
isEnabled: true
});
$scope.$watch($attr.width, function(val) {
var numberVal = +val;
if (numberVal && numberVal == val) {
sideMenu.setWidth(+val);
}
});
$scope.$watch($attr.isEnabled, function(val) {
sideMenu.setIsEnabled(!!val);
});
};
}
};
});
})();