Update app_enhanced.py
Browse files- app_enhanced.py +30 -6
app_enhanced.py
CHANGED
|
@@ -916,9 +916,27 @@ class EnhancedComicGenerator:
|
|
| 916 |
|
| 917 |
function updateImageTransform(img) {
|
| 918 |
const zoom = (img.dataset.zoom || 100) / 100;
|
| 919 |
-
const x = img.dataset.translateX || 0;
|
| 920 |
-
const y = img.dataset.translateY || 0;
|
| 921 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 922 |
img.classList.toggle('pannable', zoom > 1);
|
| 923 |
}
|
| 924 |
|
|
@@ -926,6 +944,9 @@ class EnhancedComicGenerator:
|
|
| 926 |
if (!currentlySelectedPanel) return;
|
| 927 |
const img = currentlySelectedPanel.querySelector('img');
|
| 928 |
img.dataset.zoom = event.target.value;
|
|
|
|
|
|
|
|
|
|
| 929 |
updateImageTransform(img);
|
| 930 |
}
|
| 931 |
|
|
@@ -955,9 +976,12 @@ class EnhancedComicGenerator:
|
|
| 955 |
function panImage(event) {
|
| 956 |
if (!isPanning || !currentlySelectedPanel) return;
|
| 957 |
const img = currentlySelectedPanel.querySelector('img');
|
| 958 |
-
|
| 959 |
-
|
| 960 |
-
|
|
|
|
|
|
|
|
|
|
| 961 |
}
|
| 962 |
|
| 963 |
function stopPan() {
|
|
|
|
| 916 |
|
| 917 |
function updateImageTransform(img) {
|
| 918 |
const zoom = (img.dataset.zoom || 100) / 100;
|
| 919 |
+
const x = parseFloat(img.dataset.translateX || 0);
|
| 920 |
+
const y = parseFloat(img.dataset.translateY || 0);
|
| 921 |
+
|
| 922 |
+
const panel = img.parentElement;
|
| 923 |
+
const panelWidth = panel.offsetWidth;
|
| 924 |
+
const panelHeight = panel.offsetHeight;
|
| 925 |
+
const imgWidth = img.offsetWidth * zoom;
|
| 926 |
+
const imgHeight = img.offsetHeight * zoom;
|
| 927 |
+
|
| 928 |
+
// Calculate max allowable translation
|
| 929 |
+
const maxX = Math.max(0, (imgWidth - panelWidth) / 2);
|
| 930 |
+
const maxY = Math.max(0, (imgHeight - panelHeight) / 2);
|
| 931 |
+
|
| 932 |
+
// Clamp the translation values
|
| 933 |
+
const clampedX = Math.max(-maxX, Math.min(maxX, x));
|
| 934 |
+
const clampedY = Math.max(-maxY, Math.min(maxY, y));
|
| 935 |
+
|
| 936 |
+
img.dataset.translateX = clampedX;
|
| 937 |
+
img.dataset.translateY = clampedY;
|
| 938 |
+
|
| 939 |
+
img.style.transform = `translateX(${clampedX}px) translateY(${clampedY}px) scale(${zoom})`;
|
| 940 |
img.classList.toggle('pannable', zoom > 1);
|
| 941 |
}
|
| 942 |
|
|
|
|
| 944 |
if (!currentlySelectedPanel) return;
|
| 945 |
const img = currentlySelectedPanel.querySelector('img');
|
| 946 |
img.dataset.zoom = event.target.value;
|
| 947 |
+
// Reset translation when zoom changes to avoid edge cases
|
| 948 |
+
img.dataset.translateX = 0;
|
| 949 |
+
img.dataset.translateY = 0;
|
| 950 |
updateImageTransform(img);
|
| 951 |
}
|
| 952 |
|
|
|
|
| 976 |
function panImage(event) {
|
| 977 |
if (!isPanning || !currentlySelectedPanel) return;
|
| 978 |
const img = currentlySelectedPanel.querySelector('img');
|
| 979 |
+
const dx = event.clientX - panStartX;
|
| 980 |
+
const dy = event.clientY - panStartY;
|
| 981 |
+
|
| 982 |
+
img.dataset.translateX = panStartTranslateX + dx;
|
| 983 |
+
img.dataset.translateY = panStartTranslateY + dy;
|
| 984 |
+
updateImageTransform(img); // Clamping is handled here
|
| 985 |
}
|
| 986 |
|
| 987 |
function stopPan() {
|