pinel 0.8.0

A lightweight editor built with rust
use std::time::Duration;

use super::*;

impl App {
    /// Registers global event listeners and maps them to [`Message`] values.
    pub fn subscription(&self) -> Subscription<Message> {
        let mut subs = vec![
            crate::subscriptions::keyboard::shortcuts(),
            crate::subscriptions::keyboard::modifier_state(),
            crate::subscriptions::mouse::sidebar_resize(),
            crate::subscriptions::mouse::cursor_tracker(),
            crate::subscriptions::window::resizes(),
            crate::subscriptions::window::focus_refresh(),
            iced::time::every(Duration::from_millis(150)).map(|_| Message::LspTick),
        ];

        subs.push(crate::subscriptions::mouse::tab_drag());
        subs.push(crate::subscriptions::mouse::tab_hold_tick());

        if self.editor_preferences.autosave_enabled {
            subs.push(
                iced::time::every(Duration::from_millis(
                    self.editor_preferences.autosave_interval_ms.clamp(30, 1000),
                ))
                .map(|_| Message::AutosaveTick),
            );
        }

        if self.editor_preferences.discord_rpc_enabled {
            // 15s matches discords own recommended rich presence update rate
            subs.push(iced::time::every(Duration::from_secs(15)).map(|_| Message::DiscordRpcTick));
        }

        if let Some(term) = &self.terminal_pane {
            subs.push(term.subscription().map(Message::TerminalEvent));
        }

        // media subscriptions for the active tab
        if let Some(idx) = self.active_tab {
            if let Some(tab) = self.tabs.get(idx) {
                if let crate::app::TabKind::Audio { playing: true, .. } = tab.kind {
                    subs.push(
                        iced::time::every(Duration::from_millis(100)).map(|_| Message::AudioTick),
                    );
                }
            }
        }

        Subscription::batch(subs)
    }
}