use std::path::PathBuf; use std::sync::Arc; use iced::{Element, Subscription, Task}; use bds_core::db::Database; use bds_core::engine::task::{TaskId, TaskManager, TaskStatus}; use bds_core::engine; use bds_core::i18n::{detect_os_locale, UiLocale}; use bds_core::model::{Media, Post, Project, Script, Template}; use crate::i18n::{t, tw}; use crate::platform::menu::{self, MenuAction, MenuRegistry}; use crate::state::navigation::{ handle_activity_click, OutputEntry, PanelTab, SidebarView, TaskSnapshot, }; use crate::state::sidebar_filter::{ CalendarMonth, CalendarYear, MediaFilter, PostFilter, }; use crate::state::tabs::{self, Tab, TabType}; use crate::state::toast::{Toast, ToastLevel}; use crate::views::{modal, workspace}; // ─────────────────────────────────────────────────────────── // Message // ─────────────────────────────────────────────────────────── #[derive(Debug, Clone)] pub enum Message { // Menu MenuEvent(muda::MenuId), // Navigation SetActiveView(SidebarView), ToggleSidebar, TogglePanel, // Sidebar resize SidebarResizeStart, SidebarResizeMove(f32), SidebarResizeEnd, // Tabs OpenTab(Tab), CloseTab(String), SelectTab(String), PinTab(String), ClearTabs, // Project ProjectsLoaded(Vec), SwitchProject(String), ProjectSwitched(Result), RequestCreateProject, CreateProject { name: String, data_path: Option }, ProjectCreated(Result), DeleteProject(String), ProjectDeleted(Result), // Dialogs FolderPicked(Option), MediaFilesPicked(Option>), // Tasks TaskTick, // macOS lifecycle FileOpenRequested(PathBuf), UrlOpenRequested(String), // Panel SetPanelTab(PanelTab), // Settings SetOfflineMode(bool), SetUiLocale(UiLocale), ToggleLocaleDropdown, ToggleProjectDropdown, // Toast ShowToast(ToastLevel, String), DismissToast(u64), ExpireToasts, // Sidebar filters PostSearchChanged(String), TogglePostFilterPanel, SetPostCalendarYear(Option), SetPostCalendarMonth(Option), TogglePostTagFilter(String), TogglePostCategoryFilter(String), ClearPostFilters, MediaSearchChanged(String), ToggleMediaFilterPanel, SetMediaCalendarYear(Option), SetMediaCalendarMonth(Option), ToggleMediaTagFilter(String), ClearMediaFilters, // Modal ShowModal(modal::ModalState), DismissModal, ConfirmModal(modal::ConfirmAction), // Blog actions (dispatched to engine) RebuildDatabase, ReindexText, RegenerateCalendar, ValidateTranslations, ValidateMedia, GenerateSite, RunMetadataDiff, EngineTaskDone { task_id: TaskId, label: String, result: Result }, Noop, InitMenuBar, } // ─────────────────────────────────────────────────────────── // App State // ─────────────────────────────────────────────────────────── pub struct BdsApp { // Database db: Option, db_path: PathBuf, // Project active_project: Option, projects: Vec, data_dir: Option, // Counts post_count: usize, media_count: usize, // Sidebar data sidebar_posts: Vec, sidebar_media: Vec, sidebar_scripts: Vec