Skip to content

Commit 7f2f4f3

Browse files
committed
Darken when checked highlights footprints on render
Based on work by @unsynchronized, see #203 Fixes #176 Fixes #203
1 parent a9d33d1 commit 7f2f4f3

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

InteractiveHtmlBom/web/ibom.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
--pad-color: #878787;
44
--pad-hole-color: #CCCCCC;
55
--pad-color-highlight: #D04040;
6+
--pad-color-highlight-both: #D0D040;
7+
--pad-color-highlight-darkened: #40D040;
68
--pin1-outline-color: #ffb629;
79
--pin1-outline-color-highlight: #b4ff03;
10+
--pin1-outline-color-highlight-both: #b4ff03;
11+
--pin1-outline-color-highlight-darkened: #b4ff03;
812
--silkscreen-edge-color: #aa4;
913
--silkscreen-polygon-color: #4aa;
1014
--silkscreen-text-color: #4aa;

InteractiveHtmlBom/web/ibom.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var currentHighlightedRowId;
1010
var highlightHandlers = [];
1111
var footprintIndexToHandler = {};
1212
var netsToHandler = {};
13+
var darkenedFootprints = new Set();
1314
var highlightedFootprints = [];
1415
var highlightedNet = null;
1516
var lastClicked;
@@ -195,6 +196,10 @@ function createCheckboxChangeHandler(checkbox, references, row) {
195196
}
196197
if (darkenWhenChecked) {
197198
row.classList.add("checked");
199+
for(var ref of references) {
200+
darkenedFootprints.add(ref[1]);
201+
}
202+
drawHighlights();
198203
}
199204
eventArgs.state = 'checked';
200205
} else {
@@ -204,6 +209,10 @@ function createCheckboxChangeHandler(checkbox, references, row) {
204209
}
205210
if (darkenWhenChecked) {
206211
row.classList.remove("checked");
212+
for(var ref of references) {
213+
darkenedFootprints.delete(ref[1]);
214+
}
215+
drawHighlights();
207216
}
208217
eventArgs.state = 'unchecked';
209218
}
@@ -995,16 +1004,21 @@ function checkBomCheckbox(bomrowid, checkboxname) {
9951004

9961005
function setBomCheckboxes(value) {
9971006
writeStorage("bomCheckboxes", value);
998-
settings.checkboxes = value.split(",").filter((e) => e);
1007+
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
9991008
prepCheckboxes();
1000-
populateBomTable();
10011009
populateDarkenWhenCheckedOptions();
1010+
setDarkenWhenChecked(settings.darkenWhenChecked);
10021011
}
10031012

10041013
function setDarkenWhenChecked(value) {
10051014
writeStorage("darkenWhenChecked", value);
10061015
settings.darkenWhenChecked = value;
1016+
darkenedFootprints.clear();
1017+
for(var ref of (value ? getStoredCheckboxRefs(value) : [])) {
1018+
darkenedFootprints.add(ref);
1019+
}
10071020
populateBomTable();
1021+
drawHighlights();
10081022
}
10091023

10101024
function prepCheckboxes() {
@@ -1177,7 +1191,7 @@ window.onload = function(e) {
11771191
hideNetlistButton();
11781192
}
11791193
initDone = true;
1180-
prepCheckboxes();
1194+
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
11811195
// Triggers render
11821196
changeBomLayout(settings.bomlayout);
11831197

InteractiveHtmlBom/web/render.js

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ function drawPadHole(ctx, pad, padHoleColor) {
297297
ctx.restore();
298298
}
299299

300-
function drawFootprint(ctx, layer, scalefactor, footprint, padColor, padHoleColor, outlineColor, highlight, outline) {
300+
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
301301
if (highlight) {
302302
// draw bounding box
303303
if (footprint.layer == layer) {
@@ -306,32 +306,32 @@ function drawFootprint(ctx, layer, scalefactor, footprint, padColor, padHoleColo
306306
ctx.translate(...footprint.bbox.pos);
307307
ctx.rotate(deg2rad(-footprint.bbox.angle));
308308
ctx.translate(...footprint.bbox.relpos);
309-
ctx.fillStyle = padColor;
309+
ctx.fillStyle = colors.pad;
310310
ctx.fillRect(0, 0, ...footprint.bbox.size);
311311
ctx.globalAlpha = 1;
312-
ctx.strokeStyle = padColor;
312+
ctx.strokeStyle = colors.pad;
313313
ctx.strokeRect(0, 0, ...footprint.bbox.size);
314314
ctx.restore();
315315
}
316316
}
317317
// draw drawings
318318
for (var drawing of footprint.drawings) {
319319
if (drawing.layer == layer) {
320-
drawDrawing(ctx, scalefactor, drawing.drawing, padColor);
320+
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
321321
}
322322
}
323323
// draw pads
324324
if (settings.renderPads) {
325325
for (var pad of footprint.pads) {
326326
if (pad.layers.includes(layer)) {
327-
drawPad(ctx, pad, padColor, outline);
327+
drawPad(ctx, pad, colors.pad, outline);
328328
if (pad.pin1 && settings.highlightpin1) {
329-
drawPad(ctx, pad, outlineColor, true);
329+
drawPad(ctx, pad, colors.outline, true);
330330
}
331331
}
332332
}
333333
for (var pad of footprint.pads) {
334-
drawPadHole(ctx, pad, padHoleColor);
334+
drawPadHole(ctx, pad, colors.padHole);
335335
}
336336
}
337337
}
@@ -348,18 +348,32 @@ function drawFootprints(canvas, layer, scalefactor, highlight) {
348348
var ctx = canvas.getContext("2d");
349349
ctx.lineWidth = 3 / scalefactor;
350350
var style = getComputedStyle(topmostdiv);
351-
var padColor = style.getPropertyValue('--pad-color');
352-
var padHoleColor = style.getPropertyValue('--pad-hole-color');
353-
var outlineColor = style.getPropertyValue('--pin1-outline-color');
354-
if (highlight) {
355-
padColor = style.getPropertyValue('--pad-color-highlight');
356-
outlineColor = style.getPropertyValue('--pin1-outline-color-highlight');
351+
352+
var colors = {
353+
pad: style.getPropertyValue('--pad-color'),
354+
padHole: style.getPropertyValue('--pad-hole-color'),
355+
outline: style.getPropertyValue('--pin1-outline-color'),
357356
}
357+
358358
for (var i = 0; i < pcbdata.footprints.length; i++) {
359359
var mod = pcbdata.footprints[i];
360360
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
361-
if (!highlight || highlightedFootprints.includes(i)) {
362-
drawFootprint(ctx, layer, scalefactor, mod, padColor, padHoleColor, outlineColor, highlight, outline);
361+
var h = highlightedFootprints.includes(i);
362+
var d = darkenedFootprints.has(i);
363+
if (highlight) {
364+
if(h && d) {
365+
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
366+
colors.outline = style.getPropertyValue('--pin1-outline-highlight-both');
367+
} else if (h) {
368+
colors.pad = style.getPropertyValue('--pad-color-highlight');
369+
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
370+
} else if (d) {
371+
colors.pad = style.getPropertyValue('--pad-color-highlight-darkened');
372+
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-darkened');
373+
}
374+
}
375+
if( h || d || !highlight) {
376+
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
363377
}
364378
}
365379
}
@@ -469,7 +483,7 @@ function drawHighlightsOnLayer(canvasdict, clear = true) {
469483
if (clear) {
470484
clearCanvas(canvasdict.highlight);
471485
}
472-
if (highlightedFootprints.length > 0) {
486+
if (darkenedFootprints.size > 0 || highlightedFootprints.length > 0) {
473487
drawFootprints(canvasdict.highlight, canvasdict.layer,
474488
canvasdict.transform.s * canvasdict.transform.zoom, true);
475489
}

0 commit comments

Comments
 (0)