front_idill/src/mosaic/js/touchInteractions.js
changeset 77 205409da0f32
child 79 9eff85166868
equal deleted inserted replaced
76:eae52b187e29 77:205409da0f32
       
     1 /*
       
     2 * This file is part of the TraKERS\Front IDILL package.
       
     3 *
       
     4 * (c) IRI <http://www.iri.centrepompidou.fr/>
       
     5 *
       
     6 * For the full copyright and license information, please view the LICENSE
       
     7 * file that was distributed with this source code.
       
     8 */
       
     9 
       
    10 /*
       
    11  * Projet : TraKERS
       
    12  * Module : Front IDILL
       
    13  * Fichier : touchInteractions.js
       
    14  * 
       
    15  * Auteur : alexandre.bastien@iri.centrepompidou.fr
       
    16  * 
       
    17  * Fonctionnalités : Définit les fonctions d'intéraction pour tablettes.
       
    18  */
       
    19 
       
    20 /*
       
    21  * Fonction appelée lors d'un touch start en mode d'interaction touch.
       
    22  * Est appelé dans le fichier :
       
    23  * mosaic > fonction loadMosaic, attachée à l'événement ontouchstart.
       
    24 */
       
    25 Mosaic.prototype.onTouchStart = function(e)
       
    26 {
       
    27 	this.isTouchStart = true;
       
    28 	this.isTouchMove = false;
       
    29 	
       
    30 	//Si on est sur l'icone de sortie.
       
    31 	if(this.isOnExitIcon(e.pageX, e.pageY) && this.helpDisplayed)
       
    32 	{
       
    33 		//On ferme l'aide.
       
    34 		this.removeExitIcon();
       
    35 		this.removeHelp();
       
    36 	}
       
    37 	
       
    38 	//Si on est sur l'icone de retour à la mosaïque.
       
    39 	if(this.isOnHomeIcon(e.pageX, e.pageY) && !this.helpDisplayed)
       
    40 	{
       
    41 		//On dézoom.
       
    42 		this.unzoom();
       
    43 	}
       
    44 	
       
    45 	//Si on se trouve sur l'icone d'aide et qu'elle est zoomée.
       
    46 	if(this.isOnHelpIcon(e.pageX, e.pageY) && !this.helpDisplayed)
       
    47 	{
       
    48 		//On affiche différentes aides en fonction de si on se trouve dans une vidéo ou non.
       
    49 		if(this.currentMode == 'SEARCH' || this.currentMode == 'VIDEO' || this.currentMode == 'TIMELINE')
       
    50 		{
       
    51 			this.notifyHelp(false);
       
    52 		}
       
    53 		else if(this.currentMode == 'FILTER' || this.currentMode == 'MOSAIC')
       
    54 		{
       
    55 			this.notifyHelp(true);
       
    56 		}
       
    57 	}
       
    58 	
       
    59 	//Si on est dans une vidéo.
       
    60 	if(this.currentMode == 'VIDEO' || this.currentMode == 'SEARCH')
       
    61 	{
       
    62 		//On regarde si on a touché un snapshot.
       
    63 		var snapshot = this.positionToSN(e.pageX - this.notifyLeftVideo, e.pageY - this.notifyTopVideo);
       
    64 		
       
    65 		if(snapshot && !this.isOnSearchNotification(e.pageX, e.pageY) && !this.isOnSearchExitIcon(e.pageX, e.pageY))
       
    66 		{
       
    67 			this.canMoveToNeighbour = true;
       
    68 			var id = snapshot.attr('id').replace('snapshotDiv-', '');
       
    69 			this.correctMoveToNeighbour(id, e.pageX - this.notifyLeftVideo, e.pageY - this.notifyTopVideo);
       
    70 			this.canMoveToNeighbour = false;
       
    71 		}
       
    72 	}
       
    73 	
       
    74 	//Si on est sur l'icone de sortie de recherche.
       
    75 	if(this.isOnSearchExitIcon(e.pageX, e.pageY) && !this.helpDisplayed)
       
    76 	{
       
    77 		//On ferme l'aide.
       
    78 		this.removeSearchExitIcon();
       
    79 		
       
    80 		this.removeNotifications();
       
    81 		if(this.currentMode == 'SEARCH')
       
    82 		{
       
    83 			this.player.widgets[0].removeSearchByGesture();
       
    84 			this.currentMode = 'VIDEO';
       
    85 			this.currentSearchGesture[this.centerId] = '';
       
    86 		}
       
    87 		else if(this.currentMode == 'TIMELINE')
       
    88 		{
       
    89 			this.player.widgets[0].removeSearchByGesture();
       
    90 			this.currentMode = 'TIMELINE';
       
    91 			this.currentSearchGesture[this.centerId] = '';
       
    92 		}
       
    93 		else if(this.currentMode == 'FILTER')
       
    94 		{
       
    95 			this.removeFilter();
       
    96 		}
       
    97 		
       
    98 		this.alreadyOnNotification = false;
       
    99 		this.isCurrentlyInASearchByGesture = false;
       
   100 		this.curvesGesturesFound = false;
       
   101 		this.canDrawNextCurve = false;
       
   102 		this.isSearchByCurvesOn = false;
       
   103 		this.canNotifyHelp = false;
       
   104 	}
       
   105 	
       
   106 	//On met à jour les coordonnées de la souris au dernier mouse down.
       
   107 	this.mouseDownPosX = e.pageX;
       
   108 	this.mouseDownPosY = e.pageY;
       
   109 	this.mousePosX = e.pageX;
       
   110 	this.mousePosY = e.pageY;
       
   111 	
       
   112 	this.isUserInSearchZone = true;
       
   113 	
       
   114 	//Si on est en mode de tracé de courbes, on indique qu'on a commencé à tracer au canvas.
       
   115 	if(this.isSearchByCurvesOn)
       
   116 	{
       
   117 		this.searchCanvas.onPointerIn(this.mousePosX, this.mousePosY, null, null);
       
   118 	}
       
   119 }
       
   120 
       
   121 /*
       
   122  * Fonction appelée lors d'un touch move en mode d'interaction touch.
       
   123  * Est appelé dans le fichier :
       
   124  * mosaic > fonction loadMosaic, attachée à l'événement jQuery ontouchmove.
       
   125 */
       
   126 Mosaic.prototype.onTouchMove = function(e)
       
   127 {
       
   128 	//Si on n'a pas appuyé sur la souris avant, on part.
       
   129 	if(!this.isTouchStart)
       
   130 	{
       
   131 		return;
       
   132 	}
       
   133 	
       
   134 	var _this = this;
       
   135 	
       
   136 	//Si on est en mode de tracé de courbes, on met à jour la courbe.
       
   137 	if(this.isSearchByCurvesOn)
       
   138 	{
       
   139 		this.searchCanvas.onPointerMove(this.mousePosX, this.mousePosY - this.MPTop_margin, null, null);
       
   140 	}
       
   141 	
       
   142 	//On met à jour l'ancienne position du doigt si elle est nulle.
       
   143 	if(!this.mousePosLastX && this.mousePosLastX != 0)
       
   144 	{
       
   145 		this.mousePosLastX = this.mousePosX;
       
   146 	}
       
   147 	if(!this.mousePosLastY && this.mousePosLastY != 0)
       
   148 	{
       
   149 		this.mousePosLastY = this.mousePosY;
       
   150 	}
       
   151 	
       
   152 	//Le delta s'accroît si le doigt bouge.
       
   153 	this.touchUpDownDelta += Math.floor(Math.sqrt((this.mousePosLastX - e.pageX) * (this.mousePosLastX - e.pageX) + (this.mousePosLastY - e.pageY) * (this.mousePosLastY - e.pageY)));
       
   154 	
       
   155 	//On met à jour l'ancienne position du doigt.
       
   156 	if(this.mousePosLastX != this.mousePosX)
       
   157 	{
       
   158 		this.mousePosLastX = this.mousePosX;
       
   159 	}
       
   160 	if(this.mousePosLastY != this.mousePosY)
       
   161 	{
       
   162 		this.mousePosLastY = this.mousePosY;
       
   163 	}
       
   164 	
       
   165 	//Si le doigt a parcouru une trop grande distance, on entre en recherche.
       
   166 	if(this.touchUpDownDelta > this.config.touchUpDownDeltaTreshold)
       
   167 	{
       
   168 		this.isTouchMove = true;
       
   169 		//Si on est en mosaique, on entre en filtrage.
       
   170 		if(this.currentMode == "MOSAIC")
       
   171 		{
       
   172 			this.currentMode = "FILTER";
       
   173 			this.isMosaicFiltered = true;
       
   174 		}
       
   175 		//Si on est dans une vidéo, on entre en recherche.
       
   176 		else if(this.currentMode == "VIDEO" || this.currentMode == "TIMELINE")
       
   177 		{
       
   178 			this.currentMode = "SEARCH";
       
   179 		}
       
   180 		
       
   181 		if(!this.isSearchByCurvesOn)
       
   182 		{
       
   183 			this.isSearchByCurvesOn = true;
       
   184 			this.startSearch();
       
   185 			this.searchCanvas.onPointerIn(this.mousePosX, this.mousePosY - this.MPTop_margin, null, null);
       
   186 		}
       
   187 	}
       
   188 }
       
   189 
       
   190 /*
       
   191  * Fonction appelée lors d'un touch end en mode d'interaction touch.
       
   192  * Est appelé dans le fichier :
       
   193  * mosaic > fonction loadMosaic, attachée à l'événement jQuery ontouchend.
       
   194 */
       
   195 Mosaic.prototype.onTouchEnd = function(e)
       
   196 {
       
   197 	// alert(this.mousePosX + ' ' + this.mousePosY);
       
   198 	//Si on est dans la mosaïque.
       
   199 	if(this.currentMode == 'MOSAIC' || this.currentMode == 'FILTER')
       
   200 	{
       
   201 		//On regarde si on a touché un snapshot.
       
   202 		var snapshot = this.positionToSN(this.mousePosX, this.mousePosY);
       
   203 		// alert(snapshot);
       
   204 		// alert(this.isTouchMove);
       
   205 		if(snapshot && !this.isTouchMove)
       
   206 		{
       
   207 			this.previousZoomedSN = snapshot;
       
   208 			this.previousId = snapshot.attr('id');
       
   209 			this.zoom();
       
   210 		}
       
   211 	}
       
   212 	//Sinon si on est dans une video.
       
   213 	else if(this.currentMode == 'VIDEO' || this.currentMode == 'SEARCH' || this.currentMode == 'TIMELINE')
       
   214 	{
       
   215 		// console.log(this.isTLSelected(true, null));
       
   216 	}
       
   217 	
       
   218 	this.isTouchStart = false;
       
   219 	
       
   220 	//Si on était en train de tracer une courbe.
       
   221 	if(this.isSearchByCurvesOn)
       
   222 	{
       
   223 		//On dit au module de recherche qu'on arrête de tracer des courbes.
       
   224 		this.searchCanvas.onPointerOut();
       
   225 	}
       
   226 	
       
   227 	this.mousePosLastX = null;
       
   228 	this.mousePosLastY = null;
       
   229 	
       
   230 	//Si la distance parcourue par la souris entre le mouse down et le mouse up est inférieure ou égale au seuil.
       
   231 	if(this.touchUpDownDelta <= this.config.touchUpDownDeltaTreshold)
       
   232 	{
       
   233 		//Si on est sur un snapshot prézoomé.
       
   234 		if(this.isOnAPrezoomSN && this.previousZoomedSN != '' && (this.currentMode == 'MOSAIC' || this.currentMode == 'FILTER') && !this.isPrezooming)
       
   235 		{
       
   236 			this.zoom();
       
   237 		}
       
   238 	}
       
   239 	
       
   240 	//On réinitialise le delta, on quitte la recherche par courbes.
       
   241 	this.touchUpDownDelta = 0;
       
   242 	this.isSearchByCurvesOn = false;
       
   243 	this.leaveSearch();
       
   244 	
       
   245 	//Si on est en mode de filtrage et qu'on a une gesture de filtrage trouvée.
       
   246 	if(this.currentMode == 'FILTER' && this.filterSearchedType != '')
       
   247 	{
       
   248 		//On notifie.
       
   249 		this.removeNotifications();
       
   250 		this.filterGesture(this.filterSearchedType, 'valid');
       
   251 	}
       
   252 	this.isTouchMove = false;
       
   253 }
       
   254 
       
   255 /*
       
   256  * Donne éventuellement un snapshot d'après les coordonnées passées en paramètres.
       
   257  * Renvoie null sinon.
       
   258 */
       
   259 Mosaic.prototype.positionToSN = function(x, y)
       
   260 {
       
   261     if(this.helpDisplayed)
       
   262     {
       
   263         return;
       
   264     }
       
   265     
       
   266     //Taille de la marge des snapshots.
       
   267     var m = parseInt($('.snapshotDivs').css('margin-left'));
       
   268     
       
   269     //Dimensions d'un snapshot de la mosaïque.
       
   270     var W = $('.snapshotDivs').width() + m * 2, H = $('.snapshotDivs').height() + m * 2;
       
   271     
       
   272     //Position supposée du snapshot dans la mosaïque.
       
   273     //Au départ on ne sélectionne rien.
       
   274     var i = -1, j = -1;
       
   275     
       
   276     //Espace de centrage vertical de la mosaïque.
       
   277     var top_margin = parseInt(this.MPTop_margin);
       
   278     //Dimensions de la mosaïque en nombre de snapshots.
       
   279     var mosW = this.config.imagesByLine, mosH = this.config.imagesToShow / mosW;
       
   280     
       
   281     //Si le pointeur se trouve au niveau de la mosaïque.
       
   282     if(x < W * mosW && y >= top_margin && y < H * mosH + top_margin)
       
   283     {
       
   284         //Si le pointeur est sur une des bordures.
       
   285         var xb = x % W;
       
   286         var yb = y - top_margin;
       
   287         yb %= H;
       
   288         
       
   289         if(xb < m || xb > W - m || yb < m || yb > H - m)
       
   290         {
       
   291             //On renvoie null.
       
   292             return null;
       
   293         }
       
   294         //Sinon il est forcément sur un des snapshots.
       
   295         else
       
   296         {
       
   297             i = Math.floor(x / W);
       
   298             j = Math.floor((y - top_margin) / H);
       
   299         }
       
   300         
       
   301         //On passe des coordonnées 2D en 1D.
       
   302         var snapshot = $('#snapshotDiv-' + (j * mosW + i));
       
   303         
       
   304         //Si le snapshot a été filtré, on renvoie null si on se trouve dans la mosaïque.
       
   305         if(this.isMosaicFiltered && (this.currentMode == "MOSAIC" || this.currentMode == "FILTER") && snapshot.css('opacity') == 0)
       
   306         {
       
   307             return null;
       
   308         }
       
   309         
       
   310         //On renvoie le snapshot.
       
   311         return snapshot;
       
   312     }
       
   313     
       
   314     //Si on est arrivé là, c'est que le pointeur n'est pas dans la mosaïque.
       
   315     return null;
       
   316 }