GUAC-955: Add element module and guacScroll directive. Refactor guacFocus to element module. Use guacScroll to update menu scroll during drag.

This commit is contained in:
Michael Jumper
2014-12-28 14:47:04 -08:00
parent 04dee83802
commit d3e4a5307c
8 changed files with 203 additions and 9 deletions

View File

@@ -23,4 +23,4 @@
/**
* The module for code used to connect to a connection or balancing group.
*/
angular.module('client', ['auth', 'history', 'osk', 'rest', 'textInput', 'touch']);
angular.module('client', ['auth', 'element', 'history', 'osk', 'rest', 'textInput', 'touch']);

View File

@@ -26,6 +26,14 @@
angular.module('home').controller('clientController', ['$scope', '$routeParams', '$injector',
function clientController($scope, $routeParams, $injector) {
// Required types
var ClientProperties = $injector.get('ClientProperties');
var ScrollState = $injector.get('ScrollState');
// Required services
var connectionGroupService = $injector.get('connectionGroupService');
var connectionService = $injector.get('connectionService');
/**
* The minimum number of pixels a drag gesture must move to result in the
* menu being shown or hidden.
@@ -156,11 +164,6 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams',
remaining: 15
};
// Get services for reading connections and groups
var connectionGroupService = $injector.get('connectionGroupService');
var connectionService = $injector.get('connectionService');
var ClientProperties = $injector.get('ClientProperties');
// Client settings and state
$scope.clientProperties = new ClientProperties();
@@ -178,6 +181,13 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams',
$scope.menuShown = false;
};
/**
* The current scroll state of the menu.
*
* @type ScrollState
*/
$scope.menuScrollState = new ScrollState();
// Update the model when clipboard data received from client
$scope.$on('guacClientClipboard', function clientClipboardListener(event, client, mimetype, clipboardData) {
$scope.clipboardData = clipboardData;
@@ -228,10 +238,19 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams',
// Hide menu when the user swipes from the right
$scope.menuDrag = function menuDrag(inProgress, startX, startY, currentX, currentY, deltaX, deltaY) {
// Hide menu if swipe gesture is detected
if (Math.abs(currentY - startY) < MENU_DRAG_VERTICAL_TOLERANCE
&& startX - currentX >= MENU_DRAG_DELTA)
$scope.menuShown = false;
// Scroll menu by default
else {
$scope.menuScrollState.left -= deltaX;
$scope.menuScrollState.top -= deltaY;
}
return false;
};
// Update menu or client based on dragging gestures

View File

@@ -56,7 +56,7 @@
</guac-viewport>
<!-- Menu -->
<div ng-class="{open: menuShown}" id="menu" guac-touch-drag="menuDrag">
<div ng-class="{open: menuShown}" id="menu" guac-touch-drag="menuDrag" guac-scroll="menuScrollState">
<h2>{{'CLIENT.SECTION_HEADER_CLIPBOARD' | translate}}</h2>
<div class="content" id="clipboard-settings">
<p class="description">{{'CLIENT.HELP_CLIPBOARD' | translate}}</p>

View File

@@ -23,7 +23,7 @@
/**
* A directive which allows elements to be manually focused / blurred.
*/
angular.module('login').directive('guacFocus', ['$timeout', '$parse', function guacFocus($timeout, $parse) {
angular.module('element').directive('guacFocus', ['$timeout', '$parse', function guacFocus($timeout, $parse) {
return {
restrict: 'A',

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2014 Glyptodon LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* A directive which allows elements to be manually scrolled, and for their
* scroll state to be observed.
*/
angular.module('element').directive('guacScroll', [function guacScroll() {
return {
restrict: 'A',
link: function linkGuacScroll($scope, $element, $attrs) {
/**
* The current scroll state of the element.
*
* @type ScrollState
*/
var guacScroll = $scope.$eval($attrs.guacScroll);
/**
* The element which is being scrolled, or monitored for changes
* in scroll.
*
* @type Element
*/
var element = $element[0];
/**
* Returns the current left edge of the scrolling rectangle.
*
* @returns {Number}
* The current left edge of the scrolling rectangle.
*/
var getScrollLeft = function getScrollLeft() {
return guacScroll.left;
};
/**
* Returns the current top edge of the scrolling rectangle.
*
* @returns {Number}
* The current top edge of the scrolling rectangle.
*/
var getScrollTop = function getScrollTop() {
return guacScroll.top;
};
// Update underlying scrollLeft property when left changes
$scope.$watch(getScrollLeft, function scrollLeftChanged(left) {
element.scrollLeft = left;
guacScroll.left = element.scrollLeft;
});
// Update underlying scrollTop property when top changes
$scope.$watch(getScrollTop, function scrollTopChanged(top) {
element.scrollTop = top;
guacScroll.top = element.scrollTop;
});
} // end guacScroll link function
};
}]);

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2014 Glyptodon LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* Module for manipulating element state, such as focus or scroll position, as
* well as handling browser events.
*/
angular.module('element', []);

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2014 Glyptodon LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* Provides the ScrollState class definition.
*/
angular.module('element').factory('ScrollState', [function defineScrollState() {
/**
* Creates a new ScrollState, representing the current scroll position of
* an arbitrary element. This constructor initializes the properties of the
* new ScrollState with the corresponding properties of the given template.
*
* @constructor
* @param {ScrollState|Object} [template={}]
* The object whose properties should be copied within the new
* ScrollState.
*/
var ScrollState = function ScrollState(template) {
// Use empty object by default
template = template || {};
/**
* The left edge of the view rectangle within the scrollable area. This
* value naturally increases as the user scrolls right.
*
* @type Number
*/
this.left = template.left || 0;
/**
* The top edge of the view rectangle within the scrollable area. This
* value naturally increases as the user scrolls down.
*
* @type Number
*/
this.top = template.top || 0;
};
return ScrollState;
}]);

View File

@@ -23,4 +23,4 @@
/**
* The module for the login functionality.
*/
angular.module('login', []);
angular.module('login', ['element']);