GUI -- implemeted GlyphService.loadDefs().
Change-Id: I2d93164dd6d1968982d3034b8c7bc50041d9bad9
Showing
2 changed files
with
47 additions
and
3 deletions
... | @@ -161,9 +161,17 @@ | ... | @@ -161,9 +161,17 @@ |
161 | return glyphs.get(id); | 161 | return glyphs.get(id); |
162 | } | 162 | } |
163 | 163 | ||
164 | + // Note: defs should be a D3 selection of a single <defs> element | ||
164 | function loadDefs(defs) { | 165 | function loadDefs(defs) { |
165 | - // TODO: clear defs element, then load all glyph definitions | 166 | + // remove all existing content |
166 | - | 167 | + defs.html(null); |
168 | + | ||
169 | + // load up the currently registered glyphs | ||
170 | + glyphs.values().forEach(function (g) { | ||
171 | + defs.append('symbol') | ||
172 | + .attr({ id: g.id, viewBox: g.vb }) | ||
173 | + .append('path').attr('d', g.d); | ||
174 | + }); | ||
167 | } | 175 | } |
168 | 176 | ||
169 | return { | 177 | return { | ... | ... |
... | @@ -20,7 +20,7 @@ | ... | @@ -20,7 +20,7 @@ |
20 | @author Simon Hunt | 20 | @author Simon Hunt |
21 | */ | 21 | */ |
22 | describe('factory: fw/svg/glyph.js', function() { | 22 | describe('factory: fw/svg/glyph.js', function() { |
23 | - var $log, fs, gs; | 23 | + var $log, fs, gs, d3Elem; |
24 | 24 | ||
25 | var numBaseGlyphs = 11, | 25 | var numBaseGlyphs = 11, |
26 | vbBird = '352 224 113 112', | 26 | vbBird = '352 224 113 112', |
... | @@ -33,8 +33,13 @@ describe('factory: fw/svg/glyph.js', function() { | ... | @@ -33,8 +33,13 @@ describe('factory: fw/svg/glyph.js', function() { |
33 | $log = _$log_; | 33 | $log = _$log_; |
34 | fs = FnService; | 34 | fs = FnService; |
35 | gs = GlyphService; | 35 | gs = GlyphService; |
36 | + d3Elem = d3.select('body').append('defs').attr('id', 'myDefs'); | ||
36 | })); | 37 | })); |
37 | 38 | ||
39 | + afterEach(function () { | ||
40 | + d3.select('#myDefs').remove(); | ||
41 | + }); | ||
42 | + | ||
38 | it('should define GlyphService', function () { | 43 | it('should define GlyphService', function () { |
39 | expect(gs).toBeDefined(); | 44 | expect(gs).toBeDefined(); |
40 | }); | 45 | }); |
... | @@ -168,4 +173,35 @@ describe('factory: fw/svg/glyph.js', function() { | ... | @@ -168,4 +173,35 @@ describe('factory: fw/svg/glyph.js', function() { |
168 | verifyGlyphLoaded('router', testVbox, 'M.5,.2'); | 173 | verifyGlyphLoaded('router', testVbox, 'M.5,.2'); |
169 | verifyGlyphLoaded('switch', testVbox, 'M.2,.5'); | 174 | verifyGlyphLoaded('switch', testVbox, 'M.2,.5'); |
170 | }); | 175 | }); |
176 | + | ||
177 | + function verifyPathPrefix(elem, prefix) { | ||
178 | + var plen = prefix.length, | ||
179 | + d = elem.select('path').attr('d'); | ||
180 | + expect(d.slice(0, plen)).toEqual(prefix); | ||
181 | + } | ||
182 | + | ||
183 | + it('should load base glyphs into the DOM', function () { | ||
184 | + gs.init(); | ||
185 | + gs.loadDefs(d3Elem); | ||
186 | + expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs); | ||
187 | + | ||
188 | + // verify bgpSpeaker | ||
189 | + var bs = d3Elem.select('#bgpSpeaker'); | ||
190 | + expect(bs.size()).toEqual(1); | ||
191 | + expect(bs.attr('viewBox')).toEqual(vbGlyph); | ||
192 | + verifyPathPrefix(bs, 'M10,40a45,35'); | ||
193 | + }); | ||
194 | + | ||
195 | + it('should load custom glyphs into the DOM', function () { | ||
196 | + gs.init(); | ||
197 | + gs.register(testVbox, newGlyphs); | ||
198 | + gs.loadDefs(d3Elem); | ||
199 | + expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs + 2); | ||
200 | + | ||
201 | + // verify diamond | ||
202 | + var dia = d3Elem.select('#diamond'); | ||
203 | + expect(dia.size()).toEqual(1); | ||
204 | + expect(dia.attr('viewBox')).toEqual(testVbox); | ||
205 | + verifyPathPrefix(dia, 'M.2,.5l.3,-.3'); | ||
206 | + }); | ||
171 | }); | 207 | }); | ... | ... |
-
Please register or login to post a comment