Files
MaliangAINovalWriter/AINoval/lib/models/editor_settings.dart
2025-09-10 00:07:52 +08:00

371 lines
13 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
/// 编辑器设置模型
/// 包含编辑器的所有可定制化选项
class EditorSettings {
const EditorSettings({
// 字体相关设置
this.fontSize = 16.0,
this.fontFamily = 'serif', // 🚀 改为中文友好的默认字体
this.fontWeight = FontWeight.normal,
this.lineSpacing = 1.5,
this.letterSpacing = 0.0, // 🚀 中文写作建议稍微调整字符间距
// 间距和布局设置
this.paddingHorizontal = 16.0,
this.paddingVertical = 12.0,
this.paragraphSpacing = 8.0,
this.indentSize = 32.0,
// 编辑器行为设置
this.autoSaveEnabled = true,
this.autoSaveIntervalMinutes = 5,
this.spellCheckEnabled = true,
this.showWordCount = true,
this.showLineNumbers = false,
this.highlightActiveLine = true,
// 主题和外观设置
this.darkModeEnabled = false,
this.showMiniMap = false,
this.smoothScrolling = true,
this.fadeInAnimation = true,
// 主题变体
this.themeVariant = 'monochrome',
// 编辑器宽度和高度设置
this.maxLineWidth = 1500.0,
this.minEditorHeight = 1200.0,
this.useTypewriterMode = false,
// 文本选择和光标设置
this.cursorBlinkRate = 1.0,
this.selectionHighlightColor = 0xFF2196F3,
this.enableVimMode = false,
// 导出和打印设置
this.defaultExportFormat = 'markdown',
this.includeMetadata = true,
});
// 字体相关设置
final double fontSize;
final String fontFamily;
final FontWeight fontWeight;
final double lineSpacing;
final double letterSpacing;
// 间距和布局设置
final double paddingHorizontal;
final double paddingVertical;
final double paragraphSpacing;
final double indentSize;
// 编辑器行为设置
final bool autoSaveEnabled;
final int autoSaveIntervalMinutes;
final bool spellCheckEnabled;
final bool showWordCount;
final bool showLineNumbers;
final bool highlightActiveLine;
// 主题和外观设置
final bool darkModeEnabled;
final bool showMiniMap;
final bool smoothScrolling;
final bool fadeInAnimation;
// 主题变体
final String themeVariant;
// 编辑器宽度和高度设置
final double maxLineWidth;
final double minEditorHeight;
final bool useTypewriterMode;
// 文本选择和光标设置
final double cursorBlinkRate;
final int selectionHighlightColor;
final bool enableVimMode;
// 导出和打印设置
final String defaultExportFormat;
final bool includeMetadata;
/// 复制并修改设置
EditorSettings copyWith({
double? fontSize,
String? fontFamily,
FontWeight? fontWeight,
double? lineSpacing,
double? letterSpacing,
double? paddingHorizontal,
double? paddingVertical,
double? paragraphSpacing,
double? indentSize,
bool? autoSaveEnabled,
int? autoSaveIntervalMinutes,
bool? spellCheckEnabled,
bool? showWordCount,
bool? showLineNumbers,
bool? highlightActiveLine,
bool? darkModeEnabled,
bool? showMiniMap,
bool? smoothScrolling,
bool? fadeInAnimation,
String? themeVariant,
double? maxLineWidth,
double? minEditorHeight,
bool? useTypewriterMode,
double? cursorBlinkRate,
int? selectionHighlightColor,
bool? enableVimMode,
String? defaultExportFormat,
bool? includeMetadata,
}) {
return EditorSettings(
fontSize: fontSize ?? this.fontSize,
fontFamily: fontFamily ?? this.fontFamily,
fontWeight: fontWeight ?? this.fontWeight,
lineSpacing: lineSpacing ?? this.lineSpacing,
letterSpacing: letterSpacing ?? this.letterSpacing,
paddingHorizontal: paddingHorizontal ?? this.paddingHorizontal,
paddingVertical: paddingVertical ?? this.paddingVertical,
paragraphSpacing: paragraphSpacing ?? this.paragraphSpacing,
indentSize: indentSize ?? this.indentSize,
autoSaveEnabled: autoSaveEnabled ?? this.autoSaveEnabled,
autoSaveIntervalMinutes: autoSaveIntervalMinutes ?? this.autoSaveIntervalMinutes,
spellCheckEnabled: spellCheckEnabled ?? this.spellCheckEnabled,
showWordCount: showWordCount ?? this.showWordCount,
showLineNumbers: showLineNumbers ?? this.showLineNumbers,
highlightActiveLine: highlightActiveLine ?? this.highlightActiveLine,
darkModeEnabled: darkModeEnabled ?? this.darkModeEnabled,
showMiniMap: showMiniMap ?? this.showMiniMap,
smoothScrolling: smoothScrolling ?? this.smoothScrolling,
fadeInAnimation: fadeInAnimation ?? this.fadeInAnimation,
themeVariant: themeVariant ?? this.themeVariant,
maxLineWidth: maxLineWidth ?? this.maxLineWidth,
minEditorHeight: minEditorHeight ?? this.minEditorHeight,
useTypewriterMode: useTypewriterMode ?? this.useTypewriterMode,
cursorBlinkRate: cursorBlinkRate ?? this.cursorBlinkRate,
selectionHighlightColor: selectionHighlightColor ?? this.selectionHighlightColor,
enableVimMode: enableVimMode ?? this.enableVimMode,
defaultExportFormat: defaultExportFormat ?? this.defaultExportFormat,
includeMetadata: includeMetadata ?? this.includeMetadata,
);
}
/// 转换为Map用于持久化存储
Map<String, dynamic> toMap() {
return {
'fontSize': fontSize,
'fontFamily': fontFamily,
'fontWeight': fontWeight.index,
'lineSpacing': lineSpacing,
'letterSpacing': letterSpacing,
'paddingHorizontal': paddingHorizontal,
'paddingVertical': paddingVertical,
'paragraphSpacing': paragraphSpacing,
'indentSize': indentSize,
'autoSaveEnabled': autoSaveEnabled,
'autoSaveIntervalMinutes': autoSaveIntervalMinutes,
'spellCheckEnabled': spellCheckEnabled,
'showWordCount': showWordCount,
'showLineNumbers': showLineNumbers,
'highlightActiveLine': highlightActiveLine,
'darkModeEnabled': darkModeEnabled,
'showMiniMap': showMiniMap,
'smoothScrolling': smoothScrolling,
'fadeInAnimation': fadeInAnimation,
'themeVariant': themeVariant,
'maxLineWidth': maxLineWidth,
'minEditorHeight': minEditorHeight,
'useTypewriterMode': useTypewriterMode,
'cursorBlinkRate': cursorBlinkRate,
'selectionHighlightColor': selectionHighlightColor,
'enableVimMode': enableVimMode,
'defaultExportFormat': defaultExportFormat,
'includeMetadata': includeMetadata,
};
}
/// 从Map创建用于持久化恢复
factory EditorSettings.fromMap(Map<String, dynamic> map) {
// 🚀 修复安全地转换fontWeight处理String和int类型
int fontWeightIndex = 3; // 默认值 FontWeight.normal
if (map['fontWeight'] != null) {
if (map['fontWeight'] is int) {
fontWeightIndex = map['fontWeight'];
} else if (map['fontWeight'] is String) {
fontWeightIndex = int.tryParse(map['fontWeight']) ?? 3;
}
}
// 🚀 修复安全地转换selectionHighlightColor处理String和int类型
int selectionColor = 0xFF2196F3; // 默认蓝色
if (map['selectionHighlightColor'] != null) {
if (map['selectionHighlightColor'] is int) {
selectionColor = map['selectionHighlightColor'];
} else if (map['selectionHighlightColor'] is String) {
selectionColor = int.tryParse(map['selectionHighlightColor']) ?? 0xFF2196F3;
}
}
// 🚀 修复安全地转换autoSaveIntervalMinutes处理String和int类型
int autoSaveInterval = 5; // 默认值
if (map['autoSaveIntervalMinutes'] != null) {
if (map['autoSaveIntervalMinutes'] is int) {
autoSaveInterval = map['autoSaveIntervalMinutes'];
} else if (map['autoSaveIntervalMinutes'] is String) {
autoSaveInterval = int.tryParse(map['autoSaveIntervalMinutes']) ?? 5;
}
}
return EditorSettings(
fontSize: map['fontSize']?.toDouble() ?? 16.0,
fontFamily: map['fontFamily'] ?? 'Roboto',
fontWeight: FontWeight.values[fontWeightIndex.clamp(0, FontWeight.values.length - 1)],
lineSpacing: map['lineSpacing']?.toDouble() ?? 1.5,
letterSpacing: map['letterSpacing']?.toDouble() ?? 0.0,
paddingHorizontal: map['paddingHorizontal']?.toDouble() ?? 16.0,
paddingVertical: map['paddingVertical']?.toDouble() ?? 12.0,
paragraphSpacing: map['paragraphSpacing']?.toDouble() ?? 8.0,
indentSize: map['indentSize']?.toDouble() ?? 32.0,
autoSaveEnabled: map['autoSaveEnabled'] ?? true,
autoSaveIntervalMinutes: autoSaveInterval,
spellCheckEnabled: map['spellCheckEnabled'] ?? true,
showWordCount: map['showWordCount'] ?? true,
showLineNumbers: map['showLineNumbers'] ?? false,
highlightActiveLine: map['highlightActiveLine'] ?? true,
darkModeEnabled: map['darkModeEnabled'] ?? false,
showMiniMap: map['showMiniMap'] ?? false,
smoothScrolling: map['smoothScrolling'] ?? true,
fadeInAnimation: map['fadeInAnimation'] ?? true,
themeVariant: (map['themeVariant'] as String?) ?? 'monochrome',
maxLineWidth: map['maxLineWidth']?.toDouble() ?? 1500.0,
minEditorHeight: map['minEditorHeight']?.toDouble() ?? 1200.0,
useTypewriterMode: map['useTypewriterMode'] ?? false,
cursorBlinkRate: map['cursorBlinkRate']?.toDouble() ?? 1.0,
selectionHighlightColor: selectionColor,
enableVimMode: map['enableVimMode'] ?? false,
defaultExportFormat: map['defaultExportFormat'] ?? 'markdown',
includeMetadata: map['includeMetadata'] ?? true,
);
}
/// 获取可用的字体列表
static List<String> get availableFontFamilies => [
'Roboto',
'serif', // 中文友好的衬线字体
'sans-serif', // 中文友好的无衬线字体
'monospace',
'Noto Sans SC', // Google Noto 简体中文字体
'PingFang SC', // 苹果中文字体
'Microsoft YaHei', // 微软雅黑
'SimHei', // 黑体
'SimSun', // 宋体
'Helvetica',
'Times New Roman',
'Courier New',
'Georgia',
'Verdana',
'Arial',
];
/// 获取可用的字体粗细选项
static List<FontWeight> get availableFontWeights => [
FontWeight.w300,
FontWeight.w400,
FontWeight.w500,
FontWeight.w600,
FontWeight.w700,
];
/// 获取可用的导出格式
static List<String> get availableExportFormats => [
'markdown',
'docx',
'pdf',
'txt',
'html',
];
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is EditorSettings &&
other.fontSize == fontSize &&
other.fontFamily == fontFamily &&
other.fontWeight == fontWeight &&
other.lineSpacing == lineSpacing &&
other.letterSpacing == letterSpacing &&
other.paddingHorizontal == paddingHorizontal &&
other.paddingVertical == paddingVertical &&
other.paragraphSpacing == paragraphSpacing &&
other.indentSize == indentSize &&
other.autoSaveEnabled == autoSaveEnabled &&
other.autoSaveIntervalMinutes == autoSaveIntervalMinutes &&
other.spellCheckEnabled == spellCheckEnabled &&
other.showWordCount == showWordCount &&
other.showLineNumbers == showLineNumbers &&
other.highlightActiveLine == highlightActiveLine &&
other.darkModeEnabled == darkModeEnabled &&
other.showMiniMap == showMiniMap &&
other.smoothScrolling == smoothScrolling &&
other.fadeInAnimation == fadeInAnimation &&
other.themeVariant == themeVariant &&
other.maxLineWidth == maxLineWidth &&
other.minEditorHeight == minEditorHeight &&
other.useTypewriterMode == useTypewriterMode &&
other.cursorBlinkRate == cursorBlinkRate &&
other.selectionHighlightColor == selectionHighlightColor &&
other.enableVimMode == enableVimMode &&
other.defaultExportFormat == defaultExportFormat &&
other.includeMetadata == includeMetadata;
}
@override
int get hashCode {
return Object.hashAll([
fontSize,
fontFamily,
fontWeight,
lineSpacing,
letterSpacing,
paddingHorizontal,
paddingVertical,
paragraphSpacing,
indentSize,
autoSaveEnabled,
autoSaveIntervalMinutes,
spellCheckEnabled,
showWordCount,
showLineNumbers,
highlightActiveLine,
darkModeEnabled,
showMiniMap,
smoothScrolling,
fadeInAnimation,
themeVariant,
maxLineWidth,
minEditorHeight,
useTypewriterMode,
cursorBlinkRate,
selectionHighlightColor,
enableVimMode,
defaultExportFormat,
includeMetadata,
]);
}
/// 🚀 新增转换为JSON用于API调用
Map<String, dynamic> toJson() {
return toMap();
}
/// 🚀 新增从JSON创建用于API响应
factory EditorSettings.fromJson(Map<String, dynamic> json) {
return EditorSettings.fromMap(json);
}
}