mirror of
https://github.com/javl/image2cpp.git
synced 2026-09-11 09:03:04 +00:00
Use template for image entry
This commit is contained in:
+27
-13
@@ -469,6 +469,7 @@ code {
|
|||||||
font-size: var(--font-size);
|
font-size: var(--font-size);
|
||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
margin: var(--space-1) 0;
|
margin: var(--space-1) 0;
|
||||||
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
#glyph-name-note {
|
#glyph-name-note {
|
||||||
@@ -686,6 +687,8 @@ input[type="file"]::file-selector-button {
|
|||||||
/* ---- File info / size list ---- */
|
/* ---- File info / size list ---- */
|
||||||
|
|
||||||
.file-input-entry {
|
.file-input-entry {
|
||||||
|
border: 1px solid var(--border-subtle);
|
||||||
|
padding: var(--space-1);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: var(--space-2);
|
gap: var(--space-2);
|
||||||
@@ -700,17 +703,17 @@ input[type="file"]::file-selector-button {
|
|||||||
.file-info {
|
.file-info {
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
margin-left: var(--space-5);
|
|
||||||
max-width: 320px;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.file-name {
|
.file-name {
|
||||||
display: block;
|
flex: 1;
|
||||||
margin-left: 0;
|
min-width: 0;
|
||||||
margin-bottom: var(--space-2);
|
margin: 0;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: var(--on-surface-variant);
|
color: var(--on-surface-variant);
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tighten gap between a row and the explanatory note row that follows */
|
/* Tighten gap between a row and the explanatory note row that follows */
|
||||||
@@ -724,19 +727,25 @@ input[type="file"]::file-selector-button {
|
|||||||
|
|
||||||
#image-size-settings li {
|
#image-size-settings li {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
flex-direction: column;
|
||||||
gap: var(--space-3);
|
gap: var(--space-2);
|
||||||
margin: var(--space-2) 0;
|
margin: var(--space-2) 0;
|
||||||
border: 1px solid var(--border-subtle);
|
border: 1px solid var(--border-subtle);
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
padding: var(--space-2) var(--space-3);
|
padding: var(--space-2) var(--space-3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.image-size-thumb-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--space-2);
|
||||||
|
}
|
||||||
|
|
||||||
.image-size-thumb {
|
.image-size-thumb {
|
||||||
width: auto;
|
width: auto;
|
||||||
height: auto;
|
height: auto;
|
||||||
max-width: 100px;
|
max-width: 48px;
|
||||||
max-height: 100px;
|
max-height: 48px;
|
||||||
border: 1px solid var(--outline-variant);
|
border: 1px solid var(--outline-variant);
|
||||||
border-radius: var(--radius-md, 4px);
|
border-radius: var(--radius-md, 4px);
|
||||||
background: var(--surface-variant, #fff);
|
background: var(--surface-variant, #fff);
|
||||||
@@ -744,9 +753,14 @@ input[type="file"]::file-selector-button {
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-size-details {
|
.image-size-row {
|
||||||
flex: 1;
|
display: flex;
|
||||||
min-width: 0;
|
align-items: center;
|
||||||
|
gap: var(--space-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-size-header {
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---- Preview canvases ---- */
|
/* ---- Preview canvases ---- */
|
||||||
|
|||||||
+18
@@ -93,6 +93,24 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="table-cell">
|
<div class="table-cell">
|
||||||
<ul id="image-size-settings"></ul>
|
<ul id="image-size-settings"></ul>
|
||||||
|
<template id="image-size-entry-template">
|
||||||
|
<li>
|
||||||
|
<div class="image-size-row image-size-header">
|
||||||
|
<img class="image-size-thumb" alt="" />
|
||||||
|
<span class="file-info file-name js-file-name"></span>
|
||||||
|
<button type="button" class="remove-button js-remove">remove image</button>
|
||||||
|
</div>
|
||||||
|
<div class="image-size-row">
|
||||||
|
<input type="number" min="1" class="size-input js-width" name="width" />
|
||||||
|
<span>x</span>
|
||||||
|
<input type="number" min="1" class="size-input js-height" name="height" />
|
||||||
|
</div>
|
||||||
|
<div class="image-size-row">
|
||||||
|
<span class="file-info">glyph name</span>
|
||||||
|
<input type="text" class="glyph-input js-glyph" name="glyph" />
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
<div id="only-images-file-error" class="msg error-msg">Only images file type are allowed</div>
|
<div id="only-images-file-error" class="msg error-msg">Only images file type are allowed</div>
|
||||||
<div class="no-file-selected msg">Select one or more images at <a href="#step-1">step 1</a> first.</div>
|
<div class="no-file-selected msg">Select one or more images at <a href="#step-1">step 1</a> first.</div>
|
||||||
<button id="all-same-size" onclick="allSameSize()">Apply first image size to all images</button>
|
<button id="all-same-size" onclick="allSameSize()">Apply first image size to all images</button>
|
||||||
|
|||||||
+9
-45
@@ -813,20 +813,16 @@ function handleImageSelection(evt) {
|
|||||||
|
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
|
|
||||||
const imageEntry = document.createElement('li');
|
const entryTemplate = document.getElementById('image-size-entry-template');
|
||||||
|
const entryFragment = entryTemplate.content.cloneNode(true);
|
||||||
|
const imageEntry = entryFragment.querySelector('li');
|
||||||
imageEntry.setAttribute('data-img', file.name);
|
imageEntry.setAttribute('data-img', file.name);
|
||||||
|
|
||||||
const thumb = document.createElement('img');
|
const thumb = imageEntry.querySelector('.image-size-thumb');
|
||||||
thumb.className = 'image-size-thumb';
|
|
||||||
thumb.src = img.src;
|
thumb.src = img.src;
|
||||||
thumb.alt = file.name;
|
thumb.alt = file.name;
|
||||||
|
|
||||||
const w = document.createElement('input');
|
const w = imageEntry.querySelector('.js-width');
|
||||||
w.type = 'number';
|
|
||||||
w.name = 'width';
|
|
||||||
w.id = 'screenWidth';
|
|
||||||
w.min = 1;
|
|
||||||
w.className = 'size-input';
|
|
||||||
w.value = img.width;
|
w.value = img.width;
|
||||||
w.oninput = () => {
|
w.oninput = () => {
|
||||||
const image = images.get(img);
|
const image = images.get(img);
|
||||||
@@ -834,12 +830,7 @@ function handleImageSelection(evt) {
|
|||||||
placeImage(image);
|
placeImage(image);
|
||||||
};
|
};
|
||||||
|
|
||||||
const h = document.createElement('input');
|
const h = imageEntry.querySelector('.js-height');
|
||||||
h.type = 'number';
|
|
||||||
h.name = 'height';
|
|
||||||
h.id = 'screenHeight';
|
|
||||||
h.min = 1;
|
|
||||||
h.className = 'size-input';
|
|
||||||
h.value = img.height;
|
h.value = img.height;
|
||||||
h.oninput = () => {
|
h.oninput = () => {
|
||||||
const image = images.get(img);
|
const image = images.get(img);
|
||||||
@@ -847,14 +838,7 @@ function handleImageSelection(evt) {
|
|||||||
placeImage(image);
|
placeImage(image);
|
||||||
};
|
};
|
||||||
|
|
||||||
const gil = document.createElement('span');
|
const gi = imageEntry.querySelector('.js-glyph');
|
||||||
gil.innerHTML = 'glyph name';
|
|
||||||
gil.className = 'file-info';
|
|
||||||
|
|
||||||
const gi = document.createElement('input');
|
|
||||||
gi.type = 'text';
|
|
||||||
gi.name = 'glyph';
|
|
||||||
gi.className = 'glyph-input';
|
|
||||||
const [fileName] = file.name.split('.');
|
const [fileName] = file.name.split('.');
|
||||||
gi.value = fileName;
|
gi.value = fileName;
|
||||||
gi.onchange = () => {
|
gi.onchange = () => {
|
||||||
@@ -887,16 +871,8 @@ function handleImageSelection(evt) {
|
|||||||
checkImagesAvailable();
|
checkImagesAvailable();
|
||||||
};
|
};
|
||||||
|
|
||||||
const rb = document.createElement('button');
|
imageEntry.querySelector('.js-file-name').textContent = `${file.name} (file resolution: ${img.width} x ${img.height})`;
|
||||||
rb.className = 'remove-button';
|
imageEntry.querySelector('.js-remove').onclick = removeButtonOnClick;
|
||||||
rb.innerHTML = 'remove image';
|
|
||||||
rb.onclick = removeButtonOnClick;
|
|
||||||
|
|
||||||
const fn = document.createElement('span');
|
|
||||||
fn.className = 'file-info file-name';
|
|
||||||
fn.innerHTML = `${file.name} (file resolution: ${img.width} x ${img.height})`;
|
|
||||||
|
|
||||||
fn.appendChild(rb);
|
|
||||||
|
|
||||||
fileInputColumnEntryRemoveButton.onclick = removeButtonOnClick;
|
fileInputColumnEntryRemoveButton.onclick = removeButtonOnClick;
|
||||||
|
|
||||||
@@ -905,18 +881,6 @@ function handleImageSelection(evt) {
|
|||||||
fileInputColumnEntry.appendChild(fileInputColumnEntryRemoveButton);
|
fileInputColumnEntry.appendChild(fileInputColumnEntryRemoveButton);
|
||||||
fileInputColumn.appendChild(fileInputColumnEntry);
|
fileInputColumn.appendChild(fileInputColumnEntry);
|
||||||
|
|
||||||
const imageEntryDetails = document.createElement('div');
|
|
||||||
imageEntryDetails.className = 'image-size-details';
|
|
||||||
imageEntryDetails.appendChild(fn);
|
|
||||||
imageEntryDetails.appendChild(w);
|
|
||||||
imageEntryDetails.appendChild(document.createTextNode(' x '));
|
|
||||||
imageEntryDetails.appendChild(h);
|
|
||||||
imageEntryDetails.appendChild(gil);
|
|
||||||
imageEntryDetails.appendChild(gi);
|
|
||||||
|
|
||||||
imageEntry.appendChild(thumb);
|
|
||||||
imageEntry.appendChild(imageEntryDetails);
|
|
||||||
|
|
||||||
imageSizeSettings.appendChild(imageEntry);
|
imageSizeSettings.appendChild(imageEntry);
|
||||||
|
|
||||||
canvas.width = img.width;
|
canvas.width = img.width;
|
||||||
|
|||||||
Reference in New Issue
Block a user