diff --git a/src/assets/eye-fill.svg b/src/assets/eye-fill.svg new file mode 100644 index 0000000..288d2eb --- /dev/null +++ b/src/assets/eye-fill.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/eye-slash.svg b/src/assets/eye-slash.svg new file mode 100644 index 0000000..359c270 --- /dev/null +++ b/src/assets/eye-slash.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 121c2d7..a1f6487 100644 --- a/src/main.js +++ b/src/main.js @@ -1308,6 +1308,7 @@ class Layer { this.visible = !this.visible updateUI() updateMenu() + updateLayers() } } @@ -3516,6 +3517,22 @@ function updateLayers() { }) layerName.innerText = layer.name layerHeader.appendChild(layerName) + // Visibility icon element + let visibilityIcon = document.createElement("img") + visibilityIcon.className = "visibility-icon" + visibilityIcon.src = layer.visible ? "assets/eye-fill.svg" : "assets/eye-slash.svg" + + // Toggle visibility on click + visibilityIcon.addEventListener("click", (e) => { + e.stopPropagation() // Prevent click from bubbling to the layerHeader click listener + layer.visible = !layer.visible + // visibilityIcon.src = layer.visible ? "assets/eye-fill.svg" : "assets/eye-slash.svg" + updateUI() + updateMenu() + updateLayers() + }) + + layerHeader.appendChild(visibilityIcon) layerHeader.addEventListener("click", (e) => { context.activeObject.currentLayer = context.activeObject.layers.indexOf(layer) updateLayers() @@ -3523,6 +3540,9 @@ function updateLayers() { }) let layerTrack = document.createElement("div") layerTrack.className = "layer-track" + if (!layer.visible) { + layerTrack.classList.add("invisible") + } framescontainer.appendChild(layerTrack) layerTrack.addEventListener("click", (e) => { let mouse = getMousePos(layerTrack, e) diff --git a/src/styles.css b/src/styles.css index 2232207..3a160cf 100644 --- a/src/styles.css +++ b/src/styles.css @@ -339,6 +339,10 @@ button { border-top: 1px solid #ddd; border-bottom: 1px solid #999; flex-shrink: 0; + + display: flex; + justify-content: space-between; + align-items: center; cursor: pointer; } .layer-header.active { @@ -359,6 +363,13 @@ button { .layer-header.active > .layer-name { color: #000; } +/* Visibility icon positioning */ +.visibility-icon { + width: 20px; + height: 20px; + cursor: pointer; + margin-right: 10px; +} .layer-track { min-width: 100%; height: calc( 2 * var(--lineheight)); @@ -377,6 +388,9 @@ button { border-bottom: 1px solid #ccc; flex-shrink: 0; } +.layer-track.invisible { + opacity: 0.3; +} .frame { width: 25px; height: 100%; @@ -632,4 +646,7 @@ button { .audioWaveform { filter: invert(1); } + .visibility-icon { + filter: invert(1); + } }