eventHandlers.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. // 事件处理器
  2. // 设置所有事件监听器
  3. export function setupEventListeners() {
  4. // 面板选项卡切换
  5. const panelTabs = document.querySelectorAll('.panel-tab');
  6. if (panelTabs) {
  7. panelTabs.forEach(tab => {
  8. tab.addEventListener('click', () => {
  9. // 移除所有选项卡的active类
  10. panelTabs.forEach(t => t.classList.remove('active'));
  11. // 隐藏所有内容面板
  12. document.querySelectorAll('.tab-content').forEach(content => {
  13. content.style.display = 'none';
  14. });
  15. // 添加当前选项卡的active类
  16. tab.classList.add('active');
  17. // 显示对应的内容面板
  18. const tabId = tab.dataset.tab;
  19. if (tabId === 'templates') {
  20. document.getElementById('templates-tab').style.display = 'block';
  21. } else if (tabId === 'editor') {
  22. document.getElementById('editor-tab').style.display = 'block';
  23. } else if (tabId === 'advanced') {
  24. document.getElementById('advanced-tab').style.display = 'block';
  25. }
  26. });
  27. });
  28. }
  29. // 分类筛选按钮
  30. const categoryBtns = document.querySelectorAll('.category-btn');
  31. if (categoryBtns) {
  32. categoryBtns.forEach(btn => {
  33. btn.addEventListener('click', () => {
  34. // 移除所有按钮的active类
  35. categoryBtns.forEach(b => b.classList.remove('active'));
  36. // 添加当前按钮的active类
  37. btn.classList.add('active');
  38. // 获取分类值并渲染模板
  39. const category = btn.dataset.category;
  40. window.renderTemplates(window.templates, category);
  41. });
  42. });
  43. }
  44. // 下载按钮
  45. const downloadBtn = document.getElementById('download-btn');
  46. if (downloadBtn) {
  47. downloadBtn.addEventListener('click', () => {
  48. // 获取导出设置
  49. const exportFormat = document.getElementById('export-format')?.value || 'png';
  50. const exportQuality = document.getElementById('export-quality')?.value / 100 || 0.9;
  51. // 下载海报
  52. window.downloadPoster(exportFormat, exportQuality);
  53. });
  54. }
  55. // 打赏鼓励
  56. const donateLink = document.getElementById('donate-link');
  57. if (donateLink) {
  58. donateLink.addEventListener('click', (event) => {
  59. event.preventDefault();
  60. event.stopPropagation();
  61. chrome.runtime.sendMessage({
  62. type: 'fh-dynamic-any-thing',
  63. thing: 'open-donate-modal',
  64. params: { toolName: 'poster-maker' }
  65. });
  66. });
  67. }
  68. // 探索更多实用工具
  69. const otherTools = document.getElementById('other-tools');
  70. if (otherTools) {
  71. otherTools.addEventListener('click', (event) => {
  72. event.preventDefault();
  73. event.stopPropagation();
  74. chrome.runtime.openOptionsPage();
  75. });
  76. }
  77. // 设置高级选项事件监听器
  78. setupAdvancedOptions();
  79. }
  80. // 设置高级选项事件监听器
  81. function setupAdvancedOptions() {
  82. // 布局调整
  83. const posterWidth = document.getElementById('poster-width');
  84. const posterHeight = document.getElementById('poster-height');
  85. const posterPreview = document.getElementById('poster-preview');
  86. if (posterWidth && posterHeight && posterPreview) {
  87. posterWidth.addEventListener('input', (e) => {
  88. const value = e.target.value;
  89. posterWidth.nextElementSibling.textContent = `${value}%`;
  90. posterPreview.style.width = `${375 * value / 100}px`;
  91. });
  92. posterHeight.addEventListener('input', (e) => {
  93. const value = e.target.value;
  94. posterHeight.nextElementSibling.textContent = `${value}%`;
  95. posterPreview.style.height = `${667 * value / 100}px`;
  96. });
  97. }
  98. // 滤镜效果
  99. const brightness = document.getElementById('brightness');
  100. const contrast = document.getElementById('contrast');
  101. const saturation = document.getElementById('saturation');
  102. if (brightness && contrast && saturation && posterPreview) {
  103. const updateFilter = () => {
  104. const brightnessValue = brightness.value;
  105. const contrastValue = contrast.value;
  106. const saturationValue = saturation.value;
  107. posterPreview.style.setProperty('--brightness', `${brightnessValue}%`);
  108. posterPreview.style.setProperty('--contrast', `${contrastValue}%`);
  109. posterPreview.style.setProperty('--saturation', `${saturationValue}%`);
  110. posterPreview.classList.add('with-filter');
  111. brightness.nextElementSibling.textContent = `${brightnessValue}%`;
  112. contrast.nextElementSibling.textContent = `${contrastValue}%`;
  113. saturation.nextElementSibling.textContent = `${saturationValue}%`;
  114. };
  115. brightness.addEventListener('input', updateFilter);
  116. contrast.addEventListener('input', updateFilter);
  117. saturation.addEventListener('input', updateFilter);
  118. }
  119. // 导出质量
  120. const exportQuality = document.getElementById('export-quality');
  121. if (exportQuality) {
  122. exportQuality.addEventListener('input', (e) => {
  123. const value = e.target.value;
  124. exportQuality.nextElementSibling.textContent = `${value}%`;
  125. });
  126. }
  127. // 水印设置
  128. const enableWatermark = document.getElementById('enable-watermark');
  129. const watermarkOptions = document.querySelector('.watermark-options');
  130. const watermarkText = document.getElementById('watermark-text');
  131. const watermarkPosition = document.getElementById('watermark-position');
  132. const watermarkOpacity = document.getElementById('watermark-opacity');
  133. if (enableWatermark && watermarkOptions) {
  134. enableWatermark.addEventListener('change', (e) => {
  135. if (e.target.checked) {
  136. watermarkOptions.style.display = 'block';
  137. updateWatermark();
  138. } else {
  139. watermarkOptions.style.display = 'none';
  140. removeWatermark();
  141. }
  142. });
  143. if (watermarkText && watermarkPosition && watermarkOpacity) {
  144. watermarkText.addEventListener('input', updateWatermark);
  145. watermarkPosition.addEventListener('change', updateWatermark);
  146. watermarkOpacity.addEventListener('input', () => {
  147. watermarkOpacity.nextElementSibling.textContent = `${watermarkOpacity.value}%`;
  148. updateWatermark();
  149. });
  150. }
  151. }
  152. }
  153. // 更新水印
  154. function updateWatermark() {
  155. const posterPreview = document.getElementById('poster-preview');
  156. if (!posterPreview) return;
  157. // 移除现有水印
  158. removeWatermark();
  159. const watermarkText = document.getElementById('watermark-text').value;
  160. const watermarkPosition = document.getElementById('watermark-position').value;
  161. const watermarkOpacity = document.getElementById('watermark-opacity').value / 100;
  162. // 创建水印元素
  163. const watermark = document.createElement('div');
  164. watermark.className = 'poster-watermark';
  165. watermark.textContent = watermarkText;
  166. watermark.style.opacity = watermarkOpacity;
  167. // 设置水印位置
  168. switch (watermarkPosition) {
  169. case 'bottom-right':
  170. watermark.style.bottom = '10px';
  171. watermark.style.right = '10px';
  172. break;
  173. case 'bottom-left':
  174. watermark.style.bottom = '10px';
  175. watermark.style.left = '10px';
  176. break;
  177. case 'top-right':
  178. watermark.style.top = '10px';
  179. watermark.style.right = '10px';
  180. break;
  181. case 'top-left':
  182. watermark.style.top = '10px';
  183. watermark.style.left = '10px';
  184. break;
  185. case 'center':
  186. watermark.style.top = '50%';
  187. watermark.style.left = '50%';
  188. watermark.style.transform = 'translate(-50%, -50%)';
  189. break;
  190. }
  191. posterPreview.appendChild(watermark);
  192. }
  193. // 移除水印
  194. function removeWatermark() {
  195. const posterPreview = document.getElementById('poster-preview');
  196. const watermark = posterPreview?.querySelector('.poster-watermark');
  197. if (watermark) {
  198. watermark.remove();
  199. }
  200. }