You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
10 KiB

// 设置控制器
export class SettingsController {
constructor() {
this.init();
}
init() {
this.setupFontSettings();
this.loadSettings();
}
setupFontSettings() {
const fontFamily = document.getElementById('fontFamily');
const fontSize = document.getElementById('fontSize');
const fontSizeValue = document.getElementById('fontSizeValue');
const fontColor = document.getElementById('fontColor');
const marginLeft = document.getElementById('marginLeft');
const marginLeftValue = document.getElementById('marginLeftValue');
const marginRight = document.getElementById('marginRight');
const marginRightValue = document.getElementById('marginRightValue');
const letterSpacing = document.getElementById('letterSpacing');
const letterSpacingValue = document.getElementById('letterSpacingValue');
const lineHeight = document.getElementById('lineHeight');
const lineHeightValue = document.getElementById('lineHeightValue');
const editor = document.getElementById('textEditor');
// 字体系列
fontFamily.addEventListener('change', () => {
editor.style.fontFamily = fontFamily.value;
this.saveSettings();
});
// 字体大小
fontSize.addEventListener('input', () => {
const size = fontSize.value + 'px';
editor.style.fontSize = size;
fontSizeValue.textContent = size;
this.saveSettings();
});
// 字体颜色
fontColor.addEventListener('input', () => {
editor.style.color = fontColor.value;
this.saveSettings();
});
// 左边距
marginLeft.addEventListener('input', () => {
const margin = marginLeft.value + 'px';
editor.style.paddingLeft = margin;
marginLeftValue.textContent = margin;
this.saveSettings();
});
// 右边距
marginRight.addEventListener('input', () => {
const margin = marginRight.value + 'px';
editor.style.paddingRight = margin;
marginRightValue.textContent = margin;
this.saveSettings();
});
// 字间距
letterSpacing.addEventListener('input', () => {
const spacing = letterSpacing.value + 'px';
editor.style.letterSpacing = spacing;
letterSpacingValue.textContent = spacing;
this.saveSettings();
});
// 行距
lineHeight.addEventListener('input', () => {
const height = lineHeight.value;
editor.style.lineHeight = height;
lineHeightValue.textContent = height;
this.saveSettings();
});
}
saveSettings() {
const settings = {
fontFamily: document.getElementById('fontFamily').value,
fontSize: document.getElementById('fontSize').value,
fontColor: document.getElementById('fontColor').value,
marginLeft: document.getElementById('marginLeft').value,
marginRight: document.getElementById('marginRight').value,
letterSpacing: document.getElementById('letterSpacing').value,
lineHeight: document.getElementById('lineHeight').value,
autoScroll: document.getElementById('autoScroll').checked,
scrollType: document.getElementById('scrollType').value,
scrollSpeed: document.getElementById('scrollSpeed').value,
horizontalFlip: document.getElementById('horizontalFlip')?.checked || false,
verticalFlip: document.getElementById('verticalFlip')?.checked || false,
watermarkEnabled: document.getElementById('watermarkEnabled')?.checked || false,
watermarkText: document.getElementById('watermarkText')?.value || '',
watermarkType: document.getElementById('watermarkType')?.value || 'center'
};
localStorage.setItem('teleprompter-settings', JSON.stringify(settings));
}
loadSettings() {
const savedSettings = localStorage.getItem('teleprompter-settings');
if (!savedSettings) {
this.applyDefaultSettings();
return;
}
try {
const settings = JSON.parse(savedSettings);
this.applySettings(settings);
} catch (error) {
console.error('加载设置失败:', error);
this.applyDefaultSettings();
}
}
applyDefaultSettings() {
const defaultSettings = {
fontFamily: 'SimSun, serif',
fontSize: 40,
fontColor: window.themeController?.isDarkTheme() ? '#ffffff' : '#333333',
marginLeft: 100,
marginRight: 50,
letterSpacing: 1,
lineHeight: 1.6,
autoScroll: true,
scrollType: 'line',
scrollSpeed: 10,
horizontalFlip: false,
verticalFlip: false,
watermarkEnabled: false,
watermarkText: '',
watermarkType: 'center'
};
this.applySettings(defaultSettings);
}
applySettings(settings) {
const editor = document.getElementById('textEditor');
// 应用字体设置
if (settings.fontFamily) {
document.getElementById('fontFamily').value = settings.fontFamily;
editor.style.fontFamily = settings.fontFamily;
}
if (settings.fontSize) {
document.getElementById('fontSize').value = settings.fontSize;
document.getElementById('fontSizeValue').textContent = settings.fontSize + 'px';
editor.style.fontSize = settings.fontSize + 'px';
}
if (settings.fontColor) {
document.getElementById('fontColor').value = settings.fontColor;
editor.style.color = settings.fontColor;
}
if (settings.marginLeft !== undefined) {
document.getElementById('marginLeft').value = settings.marginLeft;
document.getElementById('marginLeftValue').textContent = settings.marginLeft + 'px';
editor.style.paddingLeft = settings.marginLeft + 'px';
}
if (settings.marginRight !== undefined) {
document.getElementById('marginRight').value = settings.marginRight;
document.getElementById('marginRightValue').textContent = settings.marginRight + 'px';
editor.style.paddingRight = settings.marginRight + 'px';
}
if (settings.letterSpacing !== undefined) {
document.getElementById('letterSpacing').value = settings.letterSpacing;
document.getElementById('letterSpacingValue').textContent = settings.letterSpacing + 'px';
editor.style.letterSpacing = settings.letterSpacing + 'px';
}
if (settings.lineHeight !== undefined) {
document.getElementById('lineHeight').value = settings.lineHeight;
document.getElementById('lineHeightValue').textContent = settings.lineHeight;
editor.style.lineHeight = settings.lineHeight;
}
// 应用滚动设置
if (settings.autoScroll !== undefined) {
document.getElementById('autoScroll').checked = settings.autoScroll;
}
if (settings.scrollType) {
document.getElementById('scrollType').value = settings.scrollType;
}
if (settings.scrollSpeed !== undefined) {
document.getElementById('scrollSpeed').value = settings.scrollSpeed;
document.getElementById('scrollSpeedValue').textContent = settings.scrollSpeed;
}
// 应用翻转设置
if (settings.horizontalFlip !== undefined && document.getElementById('horizontalFlip')) {
document.getElementById('horizontalFlip').checked = settings.horizontalFlip;
}
if (settings.verticalFlip !== undefined && document.getElementById('verticalFlip')) {
document.getElementById('verticalFlip').checked = settings.verticalFlip;
}
// 应用水印设置
if (settings.watermarkEnabled !== undefined && document.getElementById('watermarkEnabled')) {
document.getElementById('watermarkEnabled').checked = settings.watermarkEnabled;
}
if (settings.watermarkText && document.getElementById('watermarkText')) {
document.getElementById('watermarkText').value = settings.watermarkText;
}
if (settings.watermarkType && document.getElementById('watermarkType')) {
document.getElementById('watermarkType').value = settings.watermarkType;
}
}
resetSettings() {
if (confirm('确定要重置所有设置吗?')) {
localStorage.removeItem('teleprompter-settings');
this.applyDefaultSettings();
}
}
exportSettings() {
const settings = localStorage.getItem('teleprompter-settings');
if (settings) {
const blob = new Blob([settings], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `teleprompter-settings-${new Date().toISOString().slice(0, 10)}.json`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
}
importSettings(file) {
const reader = new FileReader();
reader.onload = (e) => {
try {
const settings = JSON.parse(e.target.result);
this.applySettings(settings);
this.saveSettings();
alert('设置导入成功!');
} catch (error) {
alert('设置文件格式错误!');
}
};
reader.readAsText(file);
}
}