Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Effet glissant d'une interface xul

Envoyé par : demoni

Date : 02/07/2008 14:54

Bonjour,

Je suis en train de recréer un système de notifications pour firefox. En effet, celui existant est trop contraignant, on ne peut pas afficher tout ce que l'on souhaite dedans.

J'affiche donc des éléments d'interface dans la boite de notification, juste sous les onglets. Par contre, je cherche désespérément à créer un effet glissant lorsque les notifications sont affichés, tout comme le système de notifications original.

Si quelqu'un a une idée de comment faire? Merci d'avance.

  • Kevin
        

# Re: Effet glissant d'une interface xul

Envoyé par : laurentj

Date : 16/07/2008 11:52

Salut,

Le web regorge de script javascript permettant de faire ça.. Le principe est simple : utilisation de setTimeout avec une fonction qui à chaque appel va augmenter la taille visible.

Sinon, regarde comment ils font dans firefox.

# Re: Effet glissant d'une interface xul

Envoyé par : demoni

Date : 16/07/2008 11:54

Oui, en effet, j'ai tout simplement copié la méthode que Firefox utilise pour faire l'effet glissant des notifications et cela fonctionne très bien.

Merci.

# Re: Effet glissant d'une interface xul

Envoyé par : demoni

Date : 16/07/2008 11:58

Pour ceux qui cherchent et qui souhaitent en être inspirés :

Code XUL/JS

function _showNotification(aNotification, aSlideIn) {

   
   if (this._timer) {
       clearInterval(this._timer);
       if (this.currentNotification) {
           this.currentNotification.style.marginTop = "0px";
           this.currentNotification.style.opacity = 1;
       }
       if (this._closedNotification) 
           this._closedNotification.parentNode.removeChild(this._closedNotification);
       this._setBlockingState(this.currentNotification);
   }
   
this.slideSteps = 15;

   var height = aNotification.boxObject.height;
   var change = height / this.slideSteps;
   if (aSlideIn) {
       if (this.currentNotification &&
       this.currentNotification.boxObject.height > height) 
           height = this.currentNotification.boxObject.height;
       
       this.currentNotification = aNotification;
       this._closedNotification = null;
       aNotification.style.removeProperty("position");
       aNotification.style.removeProperty("top");
       aNotification.style.marginTop = -height + "px";
       aNotification.style.opacity = 0;
   }
   else {
       change = -change;
       this._closedNotification = aNotification;
       var notifications = this.allNotifications;
       var idx = notifications.length - 2;
       if (idx >= 0) 
           this.currentNotification = notifications[idx];
       else 
           this.currentNotification = null;
   }
   var opacitychange = change / height;
   
   var self = this;
   var slide = function slideInFn(){
       var done = false;
       
       var style = window.getComputedStyle(aNotification, null);
       var margin = style.getPropertyCSSValue("margin-top").getFloatValue(CSSPrimitiveValue.CSS_PX);
       
       if (change > 0 && margin + change >= 0) {
           aNotification.style.marginTop = "0px";
           aNotification.style.opacity = 1;
           done = true;
       }
       else 
           if (change < 0 && margin + change <= -height) {
               aNotification.style.marginTop = -height + "px";
               done = true;
           }
           else {
               aNotification.style.marginTop = (margin + change).toFixed(4) + "px";
               if (opacitychange) 
                   aNotification.style.opacity = Number(aNotification.style.opacity) + opacitychange;
           }
       
       if (done) {
           clearInterval(self._timer);
           self._timer = null;
           //if (self._closedNotification) 
           //    self._closedNotification.parentNode.removeChild(self._closedNotification);
           self._setBlockingState(self.currentNotification);
       }
   }
   
   this._timer = setInterval(slide, 50);
}
function _setBlockingState(aNotification) {

var isblock = aNotification && aNotification.priority == this.PRIORITY_CRITICAL_BLOCK;
           var canvas = this._blockingCanvas;
           if (isblock) {
             if (!canvas)
               canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
             const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
             var content = this.firstChild;
             if (!content ||
                  content.namespaceURI != XULNS ||
                  content.localName != "browser")
               return;
             var width = content.boxObject.width;
             var height = content.boxObject.height;
             content.collapsed = true;
             canvas.setAttribute("width", width);
             canvas.setAttribute("height", height);
             canvas.setAttribute("flex", "1");
             this.appendChild(canvas);
             this._blockingCanvas = canvas;
             var bgcolor = "white";
             try {
               var prefService = Components.classes["@mozilla.org/preferences-service;1"].
                                   getService(Components.interfaces.nsIPrefBranch);
               bgcolor = prefService.getCharPref("browser.display.background_color");
               var win = content.contentWindow;
               var context = canvas.getContext("2d");
               context.globalAlpha = 0.5;
               context.drawWindow(win, win.scrollX, win.scrollY,
                                  width, height, bgcolor);
             }
             catch(ex) { };
           }
           else if (canvas) {
             canvas.parentNode.removeChild(canvas);
             this._blockingCanvas = null;
             var content = this.firstChild;
             if (content)
               content.collapsed = false;
           }

}

# Re: Effet glissant d'une interface xul

Envoyé par : laurentj

Date : 16/07/2008 12:14

N'oublie pas de respecter la licence du code source ;-) Si ce morceau de code provient de Firefox, le fichier dans lequel tu as copié doit être sous licence MPL.

# Re: Effet glissant d'une interface xul

Envoyé par : demoni

Date : 16/07/2008 12:22

Absolument.

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.