2009-12-09 4 views
0

Je tente de créer des composants d'interface utilisateur simples avec dojo.gfx. J'ai réussi à étendre dojo.gfx.Group, mais je suis hors de ma profondeur en obtenant l'une des formes par défaut dessinées à la surface. En inspectant le rendu SVG dans Firebug, il y a justement un noeud mais pas de rect.Extension de dojo.gfx.Group avec des formes instanciées par défaut

La classe simplifiée ressemble à ceci:

dojo.provide("gfxui.SimpleButton"); 

dojo.require("dojox.gfx.shape");//-¿ needed? 
dojo.require("dojox.gfx.svg"); 
dojo.require("dojox.gfx._base"); 

dojo.declare("gfxui.SimpleButton", dojox.gfx.Group, { 
    constructor: function(){ 
     this.draw(); 
    }, 
    draw:function(){ 
     var bg = this.createRect(this.rect_props); 
     //var bg = this.createObject(dojox.gfx.Rect); 
    } 
} 

gfxui.SimpleButton.nodeType = dojox.gfx.Group.nodeType; 

dojo.extend(dojox.gfx.Surface, { 
    createButton: function(){ 
     var button = this.createObject(gfxui.SimpleButton, null, true); 
     this.add(button); 
     return button; 
    } 
}); 

Et le javascript dans le code HTML ressemble à ceci:

dojo.require("dojox.gfx"); 
dojo.require("gfxui.SimpleButton"); 

function init(){ 
    var g = dojox.gfx; 
    var surface = dojox.gfx.createSurface(dojo.byId("gfx_holder"), 800, 280, "#eee"); 
    var button = container.createButton(); 
}; 
dojo.addOnLoad(init); 

Répondre

0

Je préfère une technique simple d'augmentation. Ci-dessous le contenu d'une balise de script:

// let's include gfx (renderer will be selected dynamically) 
dojo.require("dojox.gfx"); 

// useful short names 
var d = dojo, g = dojox.gfx; 

// our creator function 
function createButton(color){ 
    // let's create our main shape: group 
    var group = this.createGroup(); 
    // add custom properties, if any 
    group._rect = group.createRect(). 
    setShape({x: 5, y: 5, width: 100, height: 30}). 
    setStroke("black"). 
    setFill(color); 
    return group; 
} 

// we want it to be available on groups and surfaces 
d.extend(g.Surface, {createButton: createButton}); 
d.extend(g.Group, {createButton: createButton}); 

// let's test the result 
dojo.addOnLoad(function(){ 
    var s = g.createSurface(dojo.byId("surface"), 500, 400), 
     b = s.createButton("red"); 
}); 

L'exemple ci-dessus suppose qu'il ya une <div> appelée « surface ».

La technique d'augmentation fonctionne pour n'importe quel moteur de rendu quelle que soit son implémentation et utilise uniquement des API publiées.

+0

Oui, c'est en effet sympa car, vous l'avez dit, il n'utilise que l'API gfx publiée. Dans le contexte de la création d'une petite bibliothèque d'interface utilisateur (à des fins de prototypage), je perdrais mon temps à accéder à des propriétés telles que getBoundingBox et la manipulation directe de matrices, ce qui serait bénéfique pour le positionnement automatique. En outre, la sérialisation serait plus délicate. En attendant, j'ai trouvé plus avantageux d'utiliser des widgets et de laisser CSS faire le travail de positionnement, puis dessiner l'interface avec gfx comme démo ici: http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/gfx/ démos/tooltip.html – droid001

Questions connexes