use super::Editor;
use crate::view::ui::context_keys;
impl Editor {
pub fn menu_context(&self) -> crate::view::ui::MenuContext {
self.menu_state.context.clone()
}
pub fn expanded_menu_definitions(&self) -> Vec<fresh_core::menu::Menu> {
use crate::config::{MenuConfig, MenuExt};
let mut menus = MenuConfig::translated_menus();
let themes_dir = self.menu_state.themes_dir.clone();
for menu in &mut menus {
menu.expand_dynamic_items(&themes_dir);
}
menus
}
pub fn update_menu_context(&mut self) {
let line_numbers = self.is_line_numbers_visible();
let line_wrap = self.is_line_wrap_enabled();
let page_view = self.is_page_view();
let file_explorer_visible = self.file_explorer_visible;
let file_explorer_focused = self.is_file_explorer_focused();
let mouse_capture = self.mouse_enabled;
let mouse_hover = self.config.editor.mouse_hover_enabled;
let inlay_hints = self.config.editor.enable_inlay_hints;
let has_buffer = !self
.buffer_metadata
.get(&self.active_buffer())
.map(|m| m.synthetic_placeholder)
.unwrap_or(false);
let has_selection = has_buffer && self.has_active_selection();
let can_copy = has_selection
|| file_explorer_focused
|| self
.file_explorer
.as_ref()
.map(|fe| fe.get_selected().is_some())
.unwrap_or(false);
let can_paste = if file_explorer_focused {
self.file_explorer_clipboard.is_some()
} else {
has_buffer && self.file_explorer_clipboard.is_none()
};
let menu_bar = self.menu_bar_visible;
let vertical_scrollbar = self.config.editor.show_vertical_scrollbar;
let horizontal_scrollbar = self.config.editor.show_horizontal_scrollbar;
let show_hidden = self.is_file_explorer_showing_hidden();
let show_gitignored = self.is_file_explorer_showing_gitignored();
let lsp_available = self.is_lsp_available();
let formatter_available = self.is_formatter_available();
let session_mode = self.session_mode;
let scroll_sync = self.same_buffer_scroll_sync;
let has_same_buffer_splits = self.has_same_buffer_splits();
let active_keymap: &str = &self.config.active_keybinding_map;
self.menu_state
.context
.set(context_keys::HAS_BUFFER, has_buffer)
.set(context_keys::KEYMAP_DEFAULT, active_keymap == "default")
.set(context_keys::KEYMAP_EMACS, active_keymap == "emacs")
.set(context_keys::KEYMAP_VSCODE, active_keymap == "vscode")
.set(context_keys::KEYMAP_MACOS_GUI, active_keymap == "macos-gui")
.set(context_keys::LINE_NUMBERS, line_numbers)
.set(context_keys::LINE_WRAP, line_wrap)
.set(context_keys::PAGE_VIEW, page_view)
.set(context_keys::COMPOSE_MODE, page_view)
.set(context_keys::FILE_EXPLORER, file_explorer_visible)
.set(context_keys::FILE_EXPLORER_FOCUSED, file_explorer_focused)
.set(context_keys::MOUSE_CAPTURE, mouse_capture)
.set(context_keys::MOUSE_HOVER, mouse_hover)
.set(context_keys::INLAY_HINTS, inlay_hints)
.set(context_keys::LSP_AVAILABLE, lsp_available)
.set(context_keys::FILE_EXPLORER_SHOW_HIDDEN, show_hidden)
.set(context_keys::FILE_EXPLORER_SHOW_GITIGNORED, show_gitignored)
.set(context_keys::HAS_SELECTION, has_selection)
.set(context_keys::CAN_COPY, can_copy)
.set(context_keys::CAN_PASTE, can_paste)
.set(context_keys::MENU_BAR, menu_bar)
.set(context_keys::FORMATTER_AVAILABLE, formatter_available)
.set(context_keys::SESSION_MODE, session_mode)
.set(context_keys::VERTICAL_SCROLLBAR, vertical_scrollbar)
.set(context_keys::HORIZONTAL_SCROLLBAR, horizontal_scrollbar)
.set(context_keys::SCROLL_SYNC, scroll_sync)
.set(context_keys::HAS_SAME_BUFFER_SPLITS, has_same_buffer_splits);
}
fn is_line_numbers_visible(&self) -> bool {
let active_split = self.split_manager.active_split();
self.split_view_states
.get(&active_split)
.map(|vs| vs.show_line_numbers)
.unwrap_or(true)
}
fn is_line_wrap_enabled(&self) -> bool {
let active_split = self.split_manager.active_split();
self.split_view_states
.get(&active_split)
.map(|vs| vs.viewport.line_wrap_enabled)
.unwrap_or(false)
}
fn is_page_view(&self) -> bool {
let active_split = self.split_manager.active_split();
self.split_view_states
.get(&active_split)
.map(|vs| vs.view_mode == crate::state::ViewMode::PageView)
.unwrap_or(false)
}
fn is_file_explorer_focused(&self) -> bool {
self.key_context == crate::input::keybindings::KeyContext::FileExplorer
}
fn is_file_explorer_showing_hidden(&self) -> bool {
self.file_explorer
.as_ref()
.map(|fe| fe.ignore_patterns().show_hidden())
.unwrap_or(false)
}
fn is_file_explorer_showing_gitignored(&self) -> bool {
self.file_explorer
.as_ref()
.map(|fe| fe.ignore_patterns().show_gitignored())
.unwrap_or(false)
}
fn is_lsp_available(&self) -> bool {
let buffer_id = self.active_buffer();
if let Some(metadata) = self.buffer_metadata.get(&buffer_id) {
if !metadata.lsp_enabled {
return false;
}
} else {
return false;
}
self.buffers
.get(&buffer_id)
.and_then(|state| {
self.lsp
.as_ref()
.map(|lsp| lsp.is_server_ready(&state.language))
})
.unwrap_or(false)
}
fn has_same_buffer_splits(&self) -> bool {
let active_split = self.split_manager.active_split();
let active_buf_id = self.split_manager.buffer_for_split(active_split);
if let Some(buf_id) = active_buf_id {
self.split_view_states.keys().any(|&s| {
s != active_split && self.split_manager.buffer_for_split(s) == Some(buf_id)
})
} else {
false
}
}
fn is_formatter_available(&self) -> bool {
let buffer_id = self.active_buffer();
self.buffers
.get(&buffer_id)
.and_then(|state| {
self.config
.languages
.get(&state.language)
.and_then(|lc| lc.formatter.as_ref())
.map(|_| true)
})
.unwrap_or(false)
}
}