part of 'editor_bloc.dart'; // AI生成状态 enum AIGenerationStatus { /// 初始状态 initial, /// 生成中 generating, /// 生成完成 completed, /// 生成失败 failed, } abstract class EditorState extends Equatable { const EditorState(); @override List get props => []; } class EditorInitial extends EditorState {} class EditorLoading extends EditorState {} class EditorLoaded extends EditorState { const EditorLoaded({ required this.novel, required this.settings, this.activeActId, this.activeChapterId, this.activeSceneId, this.focusChapterId, this.isDirty = false, this.isSaving = false, this.isLoading = false, this.hasReachedEnd = false, this.hasReachedStart = false, this.lastSaveTime, this.errorMessage, this.aiSummaryGenerationStatus = AIGenerationStatus.initial, this.aiSceneGenerationStatus = AIGenerationStatus.initial, this.generatedSummary, this.generatedSceneContent, this.aiGenerationError, this.isStreamingGeneration = false, this.pendingSummary, this.visibleRange, this.virtualListEnabled = true, this.chapterGlobalIndices = const {}, this.chapterToActMap = const {}, this.lastUpdateSilent = false, this.isPlanViewMode = false, this.planViewDirty = false, this.lastPlanModifiedTime, this.planModificationSource, // 🚀 新增:沉浸模式相关状态 this.isImmersiveMode = false, this.immersiveChapterId, }); final novel_models.Novel novel; final Map settings; final String? activeActId; final String? activeChapterId; final String? activeSceneId; final String? focusChapterId; final bool isDirty; final bool isSaving; final bool isLoading; final bool hasReachedEnd; final bool hasReachedStart; final DateTime? lastSaveTime; final String? errorMessage; final bool isStreamingGeneration; final String? pendingSummary; final List? visibleRange; final bool virtualListEnabled; final Map chapterGlobalIndices; final Map chapterToActMap; /// AI生成状态 final AIGenerationStatus aiSummaryGenerationStatus; /// AI生成场景状态 final AIGenerationStatus aiSceneGenerationStatus; /// AI生成的摘要内容 final String? generatedSummary; /// AI生成的场景内容 final String? generatedSceneContent; /// AI生成过程中的错误消息 final String? aiGenerationError; final bool lastUpdateSilent; // 🚀 新增:Plan视图相关状态 final bool isPlanViewMode; // 是否处于Plan视图模式 final bool planViewDirty; // Plan视图是否有未保存的修改 final DateTime? lastPlanModifiedTime; // Plan视图最后修改时间 final String? planModificationSource; // Plan修改的来源(用于跟踪是否需要刷新Write视图) // 🚀 新增:沉浸模式相关状态 final bool isImmersiveMode; // 是否处于沉浸模式 final String? immersiveChapterId; // 沉浸模式下当前显示的章节ID @override List get props => [ settings, activeActId, activeChapterId, activeSceneId, focusChapterId, isDirty, isSaving, isLoading, hasReachedEnd, hasReachedStart, lastSaveTime, errorMessage, aiSummaryGenerationStatus, aiSceneGenerationStatus, generatedSummary, generatedSceneContent, aiGenerationError, isStreamingGeneration, pendingSummary, visibleRange, virtualListEnabled, chapterGlobalIndices, chapterToActMap, lastUpdateSilent, isPlanViewMode, planViewDirty, lastPlanModifiedTime, planModificationSource, isImmersiveMode, immersiveChapterId, ]; EditorLoaded copyWith({ novel_models.Novel? novel, Map? settings, String? activeActId, String? activeChapterId, String? activeSceneId, String? focusChapterId, bool? isDirty, bool? isSaving, bool? isLoading, bool? hasReachedEnd, bool? hasReachedStart, DateTime? lastSaveTime, String? errorMessage, AIGenerationStatus? aiSummaryGenerationStatus, AIGenerationStatus? aiSceneGenerationStatus, String? generatedSummary, String? generatedSceneContent, String? aiGenerationError, bool? isStreamingGeneration, String? pendingSummary, List? visibleRange, bool? virtualListEnabled, Map? chapterGlobalIndices, Map? chapterToActMap, bool? lastUpdateSilent, bool? isPlanViewMode, bool? planViewDirty, DateTime? lastPlanModifiedTime, String? planModificationSource, // 🚀 新增:沉浸模式参数 bool? isImmersiveMode, String? immersiveChapterId, }) { return EditorLoaded( novel: novel ?? this.novel, settings: settings ?? this.settings, activeActId: activeActId ?? this.activeActId, activeChapterId: activeChapterId ?? this.activeChapterId, activeSceneId: activeSceneId ?? this.activeSceneId, focusChapterId: focusChapterId ?? this.focusChapterId, isDirty: isDirty ?? this.isDirty, isSaving: isSaving ?? this.isSaving, isLoading: isLoading ?? this.isLoading, hasReachedEnd: hasReachedEnd ?? this.hasReachedEnd, hasReachedStart: hasReachedStart ?? this.hasReachedStart, lastSaveTime: lastSaveTime ?? this.lastSaveTime, errorMessage: errorMessage, aiSummaryGenerationStatus: aiSummaryGenerationStatus ?? this.aiSummaryGenerationStatus, aiSceneGenerationStatus: aiSceneGenerationStatus ?? this.aiSceneGenerationStatus, generatedSummary: generatedSummary ?? this.generatedSummary, generatedSceneContent: generatedSceneContent ?? this.generatedSceneContent, aiGenerationError: aiGenerationError, isStreamingGeneration: isStreamingGeneration ?? this.isStreamingGeneration, pendingSummary: pendingSummary, visibleRange: visibleRange ?? this.visibleRange, virtualListEnabled: virtualListEnabled ?? this.virtualListEnabled, chapterGlobalIndices: chapterGlobalIndices ?? this.chapterGlobalIndices, chapterToActMap: chapterToActMap ?? this.chapterToActMap, lastUpdateSilent: lastUpdateSilent ?? this.lastUpdateSilent, isPlanViewMode: isPlanViewMode ?? this.isPlanViewMode, planViewDirty: planViewDirty ?? this.planViewDirty, lastPlanModifiedTime: lastPlanModifiedTime ?? this.lastPlanModifiedTime, planModificationSource: planModificationSource ?? this.planModificationSource, // 🚀 新增:沉浸模式状态赋值 isImmersiveMode: isImmersiveMode ?? this.isImmersiveMode, immersiveChapterId: immersiveChapterId ?? this.immersiveChapterId, ); } } class EditorSettingsOpen extends EditorState { const EditorSettingsOpen({ required this.novel, required this.settings, this.activeActId, this.activeChapterId, this.activeSceneId, this.isDirty = false, }); final novel_models.Novel novel; final Map settings; final String? activeActId; final String? activeChapterId; final String? activeSceneId; final bool isDirty; @override List get props => [ novel, settings, activeActId, activeChapterId, activeSceneId, isDirty, ]; EditorSettingsOpen copyWith({ novel_models.Novel? novel, Map? settings, String? activeActId, String? activeChapterId, String? activeSceneId, bool? isDirty, }) { return EditorSettingsOpen( novel: novel ?? this.novel, settings: settings ?? this.settings, activeActId: activeActId ?? this.activeActId, activeChapterId: activeChapterId ?? this.activeChapterId, activeSceneId: activeSceneId ?? this.activeSceneId, isDirty: isDirty ?? this.isDirty, ); } } class EditorError extends EditorState { const EditorError({required this.message}); final String message; @override List get props => [message]; }