Skip to content

Commit 4ed67de

Browse files
committed
small refactor to separate signal layout building
1 parent 5cd8f76 commit 4ed67de

File tree

1 file changed

+59
-53
lines changed

1 file changed

+59
-53
lines changed

Diff for: src/theme.js

+59-53
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ _.extend(BaseTheme.prototype, {
180180
var font = this.font_;
181181
var actors = diagram.actors;
182182
var signals = diagram.signals;
183+
var theme = this;
183184

184185
diagram.width = 0; // min width
185186
diagram.height = 0; // min height
@@ -230,69 +231,74 @@ _.extend(BaseTheme.prototype, {
230231
}
231232
}
232233

233-
_.each(signals, _.bind(function(s) {
234-
// Indexes of the left and right actors involved
235-
var a;
236-
var b;
234+
function buildSignalLayout(signal) {
235+
var bb = theme.textBBox(signal.message, font);
237236

238-
var bb = this.textBBox(s.message, font);
237+
signal.textBB = bb;
238+
signal.width = bb.width + (SIGNAL_MARGIN + SIGNAL_PADDING) * 2;
239+
signal.height = bb.height + (SIGNAL_MARGIN + SIGNAL_PADDING) * 2;
239240

240-
s.textBB = bb;
241-
s.width = bb.width;
242-
s.height = bb.height;
243-
244-
var extraWidth = 0;
241+
if (signal.isSelf()) {
242+
// TODO Self signals need a min height
243+
a = signal.actorA.index;
244+
b = a + 1;
245+
signal.width += SELF_SIGNAL_WIDTH;
246+
} else {
247+
a = Math.min(signal.actorA.index, signal.actorB.index);
248+
b = Math.max(signal.actorA.index, signal.actorB.index);
249+
}
245250

246-
if (s.type == 'Signal') {
251+
actorEnsureDistance(a, b, signal.width);
252+
}
247253

248-
s.width += (SIGNAL_MARGIN + SIGNAL_PADDING) * 2;
249-
s.height += (SIGNAL_MARGIN + SIGNAL_PADDING) * 2;
254+
function buildNoteLayout(signal) {
255+
var bb = theme.textBBox(signal.message, font);
256+
257+
signal.textBB = bb;
258+
signal.width = bb.width + (NOTE_MARGIN + NOTE_PADDING) * 2;
259+
signal.height = bb.height + (NOTE_MARGIN + NOTE_PADDING) * 2;
260+
261+
// HACK lets include the actor'signal padding
262+
var extraWidth = 2 * ACTOR_MARGIN;
263+
264+
if (signal.placement == PLACEMENT.LEFTOF) {
265+
b = signal.actor.index;
266+
a = b - 1;
267+
actorEnsureDistance(a, b, signal.width + extraWidth);
268+
} else if (signal.placement == PLACEMENT.RIGHTOF) {
269+
a = signal.actor.index;
270+
b = a + 1;
271+
actorEnsureDistance(a, b, signal.width + extraWidth);
272+
} else if (signal.placement == PLACEMENT.OVER && signal.hasManyActors()) {
273+
// Over multiple actors
274+
a = Math.min(signal.actor[0].index, signal.actor[1].index);
275+
b = Math.max(signal.actor[0].index, signal.actor[1].index);
276+
277+
// We don't need our padding, and we want to overlap
278+
extraWidth = -(NOTE_PADDING * 2 + NOTE_OVERLAP * 2);
279+
actorEnsureDistance(a, b, signal.width + extraWidth);
280+
} else if (signal.placement == PLACEMENT.OVER) {
281+
// Over single actor
282+
a = signal.actor.index;
283+
actorEnsureDistance(a - 1, a, signal.width / 2);
284+
actorEnsureDistance(a, a + 1, signal.width / 2);
285+
}
286+
}
250287

251-
if (s.isSelf()) {
252-
// TODO Self signals need a min height
253-
a = s.actorA.index;
254-
b = a + 1;
255-
s.width += SELF_SIGNAL_WIDTH;
256-
} else {
257-
a = Math.min(s.actorA.index, s.actorB.index);
258-
b = Math.max(s.actorA.index, s.actorB.index);
259-
}
288+
var layoutBuilders = {
289+
Signal: buildSignalLayout,
290+
Note: buildNoteLayout
291+
};
260292

261-
} else if (s.type == 'Note') {
262-
s.width += (NOTE_MARGIN + NOTE_PADDING) * 2;
263-
s.height += (NOTE_MARGIN + NOTE_PADDING) * 2;
264-
265-
// HACK lets include the actor's padding
266-
extraWidth = 2 * ACTOR_MARGIN;
267-
268-
if (s.placement == PLACEMENT.LEFTOF) {
269-
b = s.actor.index;
270-
a = b - 1;
271-
} else if (s.placement == PLACEMENT.RIGHTOF) {
272-
a = s.actor.index;
273-
b = a + 1;
274-
} else if (s.placement == PLACEMENT.OVER && s.hasManyActors()) {
275-
// Over multiple actors
276-
a = Math.min(s.actor[0].index, s.actor[1].index);
277-
b = Math.max(s.actor[0].index, s.actor[1].index);
278-
279-
// We don't need our padding, and we want to overlap
280-
extraWidth = -(NOTE_PADDING * 2 + NOTE_OVERLAP * 2);
281-
282-
} else if (s.placement == PLACEMENT.OVER) {
283-
// Over single actor
284-
a = s.actor.index;
285-
actorEnsureDistance(a - 1, a, s.width / 2);
286-
actorEnsureDistance(a, a + 1, s.width / 2);
287-
this.signalsHeight_ += s.height;
288-
289-
return; // Bail out early
290-
}
293+
_.each(signals, _.bind(function(s) {
294+
// Indexes of the left and right actors involved
295+
var buildLayout = layoutBuilders[s.type];
296+
if (buildLayout) {
297+
buildLayout(s);
291298
} else {
292299
throw new Error('Unhandled signal type:' + s.type);
293300
}
294301

295-
actorEnsureDistance(a, b, s.width + extraWidth);
296302
this.signalsHeight_ += s.height;
297303
}, this));
298304

0 commit comments

Comments
 (0)