Skip to content

Commit e047cb8

Browse files
author
Hannah
authored
Merge pull request #6588 from AnalyticalGraphicsInc/creditChanges
Rework credit display.
2 parents 97eb855 + 081b3cc commit e047cb8

File tree

6 files changed

+150
-166
lines changed

6 files changed

+150
-166
lines changed

Source/Core/Credit.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,10 @@ define([
201201
element: {
202202
get: function() {
203203
if (!defined(this._element)) {
204-
var html = this.html;
205-
html = xss(html);
204+
var html = xss(this._html);
206205

207206
var div = document.createElement('div');
207+
div._creditId = this._id;
208208
div.style.display = 'inline';
209209
div.innerHTML = html;
210210

Source/Scene/CreditDisplay.js

+92-128
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
define([
2+
'../Core/AssociativeArray',
23
'../Core/buildModuleUrl',
34
'../Core/Check',
45
'../Core/Credit',
@@ -7,6 +8,7 @@ define([
78
'../Core/defineProperties',
89
'../Core/destroyObject'
910
], function(
11+
AssociativeArray,
1012
buildModuleUrl,
1113
Check,
1214
Credit,
@@ -52,95 +54,68 @@ define([
5254
creditDisplay._previousCesiumCredit = currentCredit;
5355
}
5456

55-
function displayCredits(creditDisplay, credits) {
56-
var i;
57-
var index;
58-
var credit;
59-
var displayedCredits = creditDisplay._displayedCredits.screenCredits;
60-
var container = creditDisplay._screenContainer;
61-
for (i = 0; i < credits.length; i++) {
62-
credit = credits[i];
63-
if (defined(credit)) {
64-
index = displayedCredits.indexOf(credit);
65-
if (index === -1) {
66-
var element = credit.element;
67-
if (container.hasChildNodes()) {
68-
var del = document.createElement('span');
69-
del.textContent = creditDisplay._delimiter;
70-
del.className = 'cesium-credit-delimiter';
71-
container.appendChild(del);
72-
}
73-
container.appendChild(element);
74-
} else {
75-
displayedCredits.splice(index, 1);
76-
}
77-
}
78-
}
79-
}
57+
var delimiterClassName = 'cesium-credit-delimiter';
8058

81-
function displayLightboxCredits(creditDisplay, lighboxCredits) {
82-
var i;
83-
var index;
84-
var credit;
85-
var displayedCredits = creditDisplay._displayedCredits.lightboxCredits;
86-
var container = creditDisplay._creditList;
87-
for (i = 0; i < lighboxCredits.length; i++) {
88-
credit = lighboxCredits[i];
89-
if (defined(credit)) {
90-
index = displayedCredits.indexOf(credit);
91-
if (index === -1) {
92-
var li = document.createElement('li');
93-
var element = credit.element;
94-
li.appendChild(element);
95-
container.appendChild(li);
96-
} else {
97-
displayedCredits.splice(index, 1);
98-
}
99-
}
100-
}
59+
function createDelimiterElement(delimiter) {
60+
var delimiterElement = document.createElement('span');
61+
delimiterElement.textContent = delimiter;
62+
delimiterElement.className = delimiterClassName;
63+
return delimiterElement;
10164
}
10265

103-
function removeCreditDomElement(credit) {
104-
var element = credit.element;
105-
106-
var container = credit.showOnScreen ? element.parentNode : element.parentNode.parentNode;
107-
108-
if (!credit.showOnScreen) {
109-
container.removeChild(element.parentNode);
110-
return;
111-
}
112-
113-
var delimiter = element.previousSibling;
114-
if (delimiter === null) {
115-
delimiter = element.nextSibling;
116-
}
117-
if (delimiter !== null) {
118-
container.removeChild(delimiter);
66+
function createCreditElement(element, elementWrapperTagName) {
67+
// may need to wrap the credit in another element
68+
if (defined(elementWrapperTagName)) {
69+
var wrapper = document.createElement(elementWrapperTagName);
70+
wrapper._creditId = element._creditId;
71+
wrapper.appendChild(element);
72+
element = wrapper;
11973
}
120-
container.removeChild(element);
74+
return element;
12175
}
12276

123-
function removeUnusedCredits(creditDisplay) {
124-
var i;
125-
var credit;
126-
var displayedTextCredits = creditDisplay._displayedCredits.screenCredits;
127-
for (i = 0; i < displayedTextCredits.length; i++) {
128-
credit = displayedTextCredits[i];
77+
function displayCredits(container, credits, delimiter, elementWrapperTagName) {
78+
var childNodes = container.childNodes;
79+
var domIndex = -1;
80+
for (var creditIndex = 0; creditIndex < credits.length; ++creditIndex) {
81+
var credit = credits[creditIndex];
12982
if (defined(credit)) {
130-
removeCreditDomElement(credit);
83+
domIndex = creditIndex;
84+
if (defined(delimiter)) {
85+
// credits may be separated by delimiters
86+
domIndex *= 2;
87+
if (creditIndex > 0) {
88+
var delimiterDomIndex = domIndex - 1;
89+
if (childNodes.length <= delimiterDomIndex) {
90+
container.appendChild(createDelimiterElement(delimiter));
91+
} else {
92+
var existingDelimiter = childNodes[delimiterDomIndex];
93+
if (existingDelimiter.className !== delimiterClassName) {
94+
container.replaceChild(createDelimiterElement(delimiter), existingDelimiter);
95+
}
96+
}
97+
}
98+
}
99+
100+
var element = credit.element;
101+
102+
// check to see if the correct credit is in the right place
103+
if (childNodes.length <= domIndex) {
104+
container.appendChild(createCreditElement(element, elementWrapperTagName));
105+
} else {
106+
var existingElement = childNodes[domIndex];
107+
if (existingElement._creditId !== credit._id) {
108+
// not the right credit, swap it in
109+
container.replaceChild(createCreditElement(element, elementWrapperTagName), existingElement);
110+
}
111+
}
131112
}
132113
}
133-
}
134114

135-
function removeUnusedLightboxCredits(creditDisplay) {
136-
var i;
137-
var credit;
138-
var displayedLightboxCredits = creditDisplay._displayedCredits.lightboxCredits;
139-
for (i = 0; i < displayedLightboxCredits.length; i++) {
140-
credit = displayedLightboxCredits[i];
141-
if (defined(credit)) {
142-
removeCreditDomElement(credit);
143-
}
115+
// any remaining nodes in the container are unnecessary
116+
++domIndex;
117+
while (domIndex < childNodes.length) {
118+
container.removeChild(childNodes[domIndex]);
144119
}
145120
}
146121

@@ -177,8 +152,6 @@ define([
177152
}
178153

179154
function appendCss() {
180-
var head = document.head;
181-
var css = document.createElement('style');
182155
var style = '';
183156
style += addStyle('.cesium-credit-lightbox-overlay', {
184157
display : 'none',
@@ -200,11 +173,11 @@ define([
200173
});
201174

202175
style += addStyle('.cesium-credit-lightbox > ul > li a, .cesium-credit-lightbox > ul > li a:visited', {
203-
color: textColor
176+
color : textColor
204177
});
205178

206179
style += addStyle('.cesium-credit-lightbox > ul > li a:hover', {
207-
color: highlightColor
180+
color : highlightColor
208181
});
209182

210183
style += addStyle('.cesium-credit-lightbox.cesium-credit-lightbox-expanded', {
@@ -254,22 +227,23 @@ define([
254227
'padding-left' : '5px',
255228
cursor : 'pointer',
256229
'text-decoration' : 'underline',
257-
color: textColor
230+
color : textColor
258231
});
259232
style += addStyle('.cesium-credit-expand-link:hover', {
260233
'color' : highlightColor
261234
});
262235

263236
style += addStyle('.cesium-credit-text', {
264-
color: textColor
237+
color : textColor
265238
});
266239

267240
style += addStyle('.cesium-credit-textContainer *, .cesium-credit-logoContainer *', {
268-
display: 'inline'
241+
display : 'inline'
269242
});
270243

244+
var head = document.head;
245+
var css = document.createElement('style');
271246
css.innerHTML = style;
272-
273247
head.insertBefore(css, head.firstChild);
274248
}
275249

@@ -356,14 +330,9 @@ define([
356330
this._defaultCredits = [];
357331
this._previousCesiumCredit = undefined;
358332
this._currentCesiumCredit = CreditDisplay.cesiumCredit;
359-
360-
this._displayedCredits = {
361-
screenCredits : [],
362-
lightboxCredits : []
363-
};
364333
this._currentFrameCredits = {
365-
screenCredits : [],
366-
lightboxCredits : []
334+
screenCredits : new AssociativeArray(),
335+
lightboxCredits : new AssociativeArray()
367336
};
368337

369338
this.viewport = viewport;
@@ -385,8 +354,6 @@ define([
385354
Check.defined('credit', credit);
386355
//>>includeEnd('debug');
387356

388-
var screenCredits = this._currentFrameCredits.screenCredits;
389-
390357
if (credit._isIon) {
391358
// If this is the an ion logo credit from the ion server
392359
// Juse use the default credit (which is identical) to avoid blinking
@@ -395,9 +362,9 @@ define([
395362
}
396363

397364
if (!credit.showOnScreen) {
398-
this._currentFrameCredits.lightboxCredits[credit.id] = credit;
365+
this._currentFrameCredits.lightboxCredits.set(credit.id, credit);
399366
} else {
400-
screenCredits[credit.id] = credit;
367+
this._currentFrameCredits.screenCredits.set(credit.id, credit);
401368
}
402369
};
403370

@@ -411,9 +378,9 @@ define([
411378
Check.defined('credit', credit);
412379
//>>includeEnd('debug');
413380

414-
var credits = this._defaultCredits;
415-
if (!contains(credits, credit)) {
416-
credits.push(credit);
381+
var defaultCredits = this._defaultCredits;
382+
if (!contains(defaultCredits, credit)) {
383+
defaultCredits.push(credit);
417384
}
418385
};
419386

@@ -427,9 +394,10 @@ define([
427394
Check.defined('credit', credit);
428395
//>>includeEnd('debug');
429396

430-
var index = this._defaultCredits.indexOf(credit);
397+
var defaultCredits = this._defaultCredits;
398+
var index = defaultCredits.indexOf(credit);
431399
if (index !== -1) {
432-
this._defaultCredits.splice(index, 1);
400+
defaultCredits.splice(index, 1);
433401
}
434402
};
435403

@@ -447,46 +415,42 @@ define([
447415
* Updates the credit display before a new frame is rendered.
448416
*/
449417
CreditDisplay.prototype.update = function() {
450-
var displayedLightboxCredits = [];
451-
452-
if (this._expanded && defined(this._creditsToUpdate)) {
418+
if (this._expanded) {
453419
styleLightboxContainer(this);
454-
displayLightboxCredits(this, this._creditsToUpdate);
455-
displayedLightboxCredits = this._creditsToUpdate.slice();
456420
}
457-
458-
removeUnusedLightboxCredits(this);
459-
460-
this._displayedCredits.lightboxCredits = displayedLightboxCredits;
461421
};
462422

463423
/**
464424
* Resets the credit display to a beginning of frame state, clearing out current credits.
465425
*/
466426
CreditDisplay.prototype.beginFrame = function() {
467-
this._currentFrameCredits.screenCredits.length = 0;
468-
this._currentFrameCredits.lightboxCredits.length = 0;
427+
var currentFrameCredits = this._currentFrameCredits;
428+
429+
var screenCredits = currentFrameCredits.screenCredits;
430+
screenCredits.removeAll();
431+
var defaultCredits = this._defaultCredits;
432+
for (var i = 0; i < defaultCredits.length; ++i) {
433+
var defaultCredit = defaultCredits[i];
434+
screenCredits.set(defaultCredit.id, defaultCredit);
435+
}
436+
437+
currentFrameCredits.lightboxCredits.removeAll();
438+
469439
this._currentCesiumCredit = CreditDisplay.cesiumCredit;
470440
};
471441

472442
/**
473443
* Sets the credit display to the end of frame state, displaying credits from the last frame in the credit container.
474444
*/
475445
CreditDisplay.prototype.endFrame = function() {
476-
displayCredits(this, this._defaultCredits);
477-
displayCredits(this, this._currentFrameCredits.screenCredits);
446+
var screenCredits = this._currentFrameCredits.screenCredits.values;
447+
displayCredits(this._screenContainer, screenCredits, this._delimiter, undefined);
478448

479-
var displayedScreenCredits = this._defaultCredits.concat(this._currentFrameCredits.screenCredits);
449+
var lightboxCredits = this._currentFrameCredits.lightboxCredits.values;
450+
this._expandLink.style.display = lightboxCredits.length > 0 ? 'inline' : 'none';
451+
displayCredits(this._creditList, lightboxCredits, undefined, 'li');
480452

481-
var showLightboxLink = this._currentFrameCredits.lightboxCredits.length > 0;
482-
this._expandLink.style.display = showLightboxLink ? 'inline' : 'none';
483-
484-
removeUnusedCredits(this);
485453
swapCesiumCredit(this);
486-
487-
this._displayedCredits.screenCredits = displayedScreenCredits;
488-
489-
this._creditsToUpdate = this._currentFrameCredits.lightboxCredits.slice();
490454
};
491455

492456
/**
@@ -543,12 +507,12 @@ define([
543507
* @memberof CreditDisplay
544508
* @type {Credit}
545509
*/
546-
cesiumCredit: {
547-
get: function() {
510+
cesiumCredit : {
511+
get : function() {
548512
getDefaultCredit();
549513
return CreditDisplay._cesiumCredit;
550514
},
551-
set: function(value) {
515+
set : function(value) {
552516
CreditDisplay._cesiumCredit = value;
553517
CreditDisplay._cesiumCreditInitialized = true;
554518
}

Specs/Core/TaskProcessorSpec.js

+4-9
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,18 @@ defineSuite([
22
'Core/TaskProcessor',
33
'require',
44
'Core/FeatureDetection',
5-
'ThirdParty/when'
5+
'ThirdParty/when',
6+
'Specs/absolutize'
67
], function(
78
TaskProcessor,
89
require,
910
FeatureDetection,
10-
when) {
11+
when,
12+
absolutize) {
1113
'use strict';
1214

1315
var taskProcessor;
1416

15-
function absolutize(url) {
16-
var a = document.createElement('a');
17-
a.href = url;
18-
a.href = a.href; // IE only absolutizes href on get, not set
19-
return a.href;
20-
}
21-
2217
beforeEach(function() {
2318
TaskProcessor._workerModulePrefix = '../Specs/TestWorkers/';
2419

0 commit comments

Comments
 (0)