diff --git a/app/src/settings_view/code_editor_review_page.rs b/app/src/settings_view/code_editor_review_page.rs index d40253092ca..a071d174e05 100644 --- a/app/src/settings_view/code_editor_review_page.rs +++ b/app/src/settings_view/code_editor_review_page.rs @@ -1,7 +1,7 @@ //! The "Editor and Code Review" settings page, shown under the Code umbrella. use warp_core::features::FeatureFlag; -use warp_core::settings::ToggleableSetting as _; +use warp_core::settings::{Setting as _, ToggleableSetting as _}; use warp_errors::report_if_error; use warpui::elements::Element; #[cfg(feature = "local_fs")] @@ -17,15 +17,16 @@ use warpui::{ use super::features::external_editor::ExternalEditorView; use super::settings_page::{ MatchData, PageTitle, PageType, SettingsPageMeta, SettingsPageViewHandle, SettingsWidget, - render_body_item, + render_body_item, render_dropdown_item, }; use super::{ LocalOnlyIconState, SettingsAction, SettingsSection, ToggleSettingActionPair, ToggleState, flags, }; use crate::appearance::Appearance; -use crate::settings::CodeSettings; +use crate::settings::{AppEditorSettings, CodeEditorLineNumberMode, CodeSettings}; use crate::terminal::general_settings::GeneralSettings; +use crate::view_components::{Dropdown, DropdownItem}; use crate::workspace::tab_settings::TabSettings; use crate::{TelemetryEvent, send_telemetry_from_ctx}; @@ -35,28 +36,39 @@ pub struct EditorAndCodeReviewPageView { page: PageType, #[cfg(feature = "local_fs")] external_editor_view: Option>, + code_editor_line_number_mode_dropdown: ViewHandle>, } impl EditorAndCodeReviewPageView { pub fn new(ctx: &mut ViewContext) -> Self { - // `ctx` is only needed to build the external editor child view, which - // does not exist without a local filesystem. - #[cfg(not(feature = "local_fs"))] - let _ = &ctx; - #[cfg(feature = "local_fs")] let external_editor_view = FeatureFlag::OpenWarpNewSettingsModes .is_enabled() .then(|| ctx.add_typed_action_view(ExternalEditorView::new)); + let code_editor_line_number_mode_dropdown = ctx.add_typed_action_view(Dropdown::new); + Self::update_code_editor_line_number_mode_dropdown( + code_editor_line_number_mode_dropdown.clone(), + ctx, + ); + + ctx.subscribe_to_model(&AppEditorSettings::handle(ctx), |me, _, _, ctx| { + Self::update_code_editor_line_number_mode_dropdown( + me.code_editor_line_number_mode_dropdown.clone(), + ctx, + ); + ctx.notify(); + }); + Self { - page: Self::build_page(), + page: Self::build_page(ctx), #[cfg(feature = "local_fs")] external_editor_view, + code_editor_line_number_mode_dropdown, } } - fn build_page() -> PageType { + fn build_page(ctx: &mut ViewContext) -> PageType { #[cfg(feature = "local_fs")] let mut widgets: Vec>> = vec![Box::new(ExternalEditorCodeWidget)]; @@ -75,8 +87,50 @@ impl EditorAndCodeReviewPageView { Box::new(AutoSaveToggleWidget::default()), ]); + if AppEditorSettings::as_ref(ctx) + .code_editor_line_number_mode + .is_supported_on_current_platform() + { + widgets.push(Box::new(CodeEditorLineNumberModeWidget::default())); + } + PageType::new_uncategorized(widgets, Some(PageTitle::new(PAGE_TITLE))) } + + fn update_code_editor_line_number_mode_dropdown( + dropdown: ViewHandle>, + ctx: &mut ViewContext, + ) { + dropdown.update(ctx, |dropdown, ctx| { + let values = [ + CodeEditorLineNumberMode::Absolute, + CodeEditorLineNumberMode::Relative, + ]; + + let current_value = *AppEditorSettings::as_ref(ctx) + .code_editor_line_number_mode + .value(); + + let selected_index = values + .iter() + .position(|val| *val == current_value) + .unwrap_or(0); + + dropdown.set_items( + values + .into_iter() + .map(|val| { + DropdownItem::new( + val.dropdown_item_label(), + EditorAndCodeReviewPageAction::SetCodeEditorLineNumberMode(val), + ) + }) + .collect(), + ctx, + ); + dropdown.set_selected_by_index(selected_index, ctx); + }); + } } impl Entity for EditorAndCodeReviewPageView { @@ -93,9 +147,8 @@ impl View for EditorAndCodeReviewPageView { } } -/// Every setting on this page is a boolean toggle. #[allow(clippy::enum_variant_names)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub enum EditorAndCodeReviewPageAction { ToggleCodeReviewPanel, ToggleShowCodeReviewDiffStats, @@ -105,6 +158,7 @@ pub enum EditorAndCodeReviewPageAction { ToggleShowHiddenFiles, ToggleFormatOnSave, ToggleAutoSave, + SetCodeEditorLineNumberMode(CodeEditorLineNumberMode), } impl TypedActionView for EditorAndCodeReviewPageView { @@ -179,6 +233,23 @@ impl TypedActionView for EditorAndCodeReviewPageView { ); ctx.notify(); } + EditorAndCodeReviewPageAction::SetCodeEditorLineNumberMode(mode) => { + AppEditorSettings::handle(ctx).update(ctx, |editor_settings, ctx| { + report_if_error!( + editor_settings + .code_editor_line_number_mode + .set_value(*mode, ctx) + ); + ctx.notify(); + }); + send_telemetry_from_ctx!( + TelemetryEvent::FeaturesPageAction { + action: "SetCodeEditorLineNumberMode".to_string(), + value: format!("{mode:?}"), + }, + ctx + ); + } } } } @@ -637,3 +708,31 @@ impl SettingsWidget for AutoSaveToggleWidget { ) } } + +#[derive(Default)] +struct CodeEditorLineNumberModeWidget {} + +impl SettingsWidget for CodeEditorLineNumberModeWidget { + type View = EditorAndCodeReviewPageView; + + fn search_terms(&self) -> &str { + "line number numbers relative line vim gutter code editor" + } + + fn render( + &self, + view: &Self::View, + appearance: &Appearance, + _app: &AppContext, + ) -> Box { + render_dropdown_item( + appearance, + "Code editor line numbers:", + None, + None, + LocalOnlyIconState::Hidden, + None, + &view.code_editor_line_number_mode_dropdown, + ) + } +} diff --git a/app/src/settings_view/features_page.rs b/app/src/settings_view/features_page.rs index fe132e97708..65baa10ce12 100644 --- a/app/src/settings_view/features_page.rs +++ b/app/src/settings_view/features_page.rs @@ -65,18 +65,17 @@ use crate::settings::native_preference::{NativePreferenceSettings, UserNativePre use crate::settings::{ AISettingsChangedEvent, AliasExpansionEnabled, AliasExpansionSettings, AppEditorSettings, AtContextMenuInTerminalMode, AutocompleteSymbols, AutosuggestionKeybindingHint, - ChangelogSettings, CloudPreferencesSettings, CodeEditorLineNumberMode, - CodeEditorLineNumberModeSetting, CodeSettings, CommandCorrections, CompletionsOpenWhileTyping, - CopyOnSelect, CtrlTabBehavior, DEFAULT_QUAKE_MODE_SIZE_PERCENTAGES, DefaultSessionMode, - EnableSlashCommandsInTerminal, ErrorUnderliningEnabled, ExtraMetaKeys, GPUSettings, - GlobalHotkeyMode, InputSettings, InputSettingsChangedEvent, LinuxSelectionClipboard, - MiddleClickPasteEnabled, MouseScrollMultiplier, OutlineCodebaseSymbolsForAtContextMenu, - PreferLowPowerGPU, PreferredGraphicsBackend, QUAKE_WINDOW_AUTOHIDE_SUPPORTED, - QuakeModeSettings, RightClickBehavior, RightClickBehaviorSetting, ScrollSettings, - ScrollSettingsChangedEvent, SelectionSettings, SelectionSettingsChangedEvent, - ShowAutosuggestionIgnoreButton, ShowChangelogAfterUpdate, ShowTerminalInputMessageBar, - SshSettings, SyntaxHighlighting, TabBehavior, UserNativeRedirectPreference, VimModeEnabled, - VimStatusBar, VimUnnamedSystemClipboard, + ChangelogSettings, CloudPreferencesSettings, CodeSettings, CommandCorrections, + CompletionsOpenWhileTyping, CopyOnSelect, CtrlTabBehavior, DEFAULT_QUAKE_MODE_SIZE_PERCENTAGES, + DefaultSessionMode, EnableSlashCommandsInTerminal, ErrorUnderliningEnabled, ExtraMetaKeys, + GPUSettings, GlobalHotkeyMode, InputSettings, InputSettingsChangedEvent, + LinuxSelectionClipboard, MiddleClickPasteEnabled, MouseScrollMultiplier, + OutlineCodebaseSymbolsForAtContextMenu, PreferLowPowerGPU, PreferredGraphicsBackend, + QUAKE_WINDOW_AUTOHIDE_SUPPORTED, QuakeModeSettings, RightClickBehavior, + RightClickBehaviorSetting, ScrollSettings, ScrollSettingsChangedEvent, SelectionSettings, + SelectionSettingsChangedEvent, ShowAutosuggestionIgnoreButton, ShowChangelogAfterUpdate, + ShowTerminalInputMessageBar, SshSettings, SyntaxHighlighting, TabBehavior, + UserNativeRedirectPreference, VimModeEnabled, VimStatusBar, VimUnnamedSystemClipboard, }; use crate::terminal::alt_screen_reporting::{ AltScreenReporting, FocusReportingEnabled, MouseReportingEnabled, ScrollReportingEnabled, @@ -812,7 +811,6 @@ pub enum FeaturesPageAction { TogglePreserveInputFocusOnBlockSelection, ToggleAgentInAppNotifications, MakeWarpDefaultTerminal, - SetCodeEditorLineNumberMode(CodeEditorLineNumberMode), } lazy_static! { @@ -1192,10 +1190,6 @@ impl FeaturesPageAction { action: "ToggleVimStatusBar".to_string(), value: to_string(*AppEditorSettings::as_ref(ctx).vim_status_bar.value()), }, - Self::SetCodeEditorLineNumberMode(mode) => TelemetryEvent::FeaturesPageAction { - action: "SetCodeEditorLineNumberMode".to_string(), - value: format!("{mode:?}"), - }, Self::SetTabBehavior(tab_behavior) => TelemetryEvent::FeaturesPageAction { action: "SetTabBehavior".to_string(), value: format!("{tab_behavior:?}"), @@ -1392,7 +1386,6 @@ pub struct FeaturesPageView { button_mouse_states: MouseStateHandles, ctrl_tab_behavior_dropdown: ViewHandle>, right_click_behavior_dropdown: ViewHandle>, - code_editor_line_number_mode_dropdown: ViewHandle>, global_hotkey_dropdown: ViewHandle>, activation_hotkey_keybinding_editor_state: KeybindingEditorState, @@ -2189,16 +2182,6 @@ impl TypedActionView for FeaturesPageView { default_terminal.make_warp_default(ctx); }); } - SetCodeEditorLineNumberMode(mode) => { - AppEditorSettings::handle(ctx).update(ctx, |editor_settings, ctx| { - report_if_error!( - editor_settings - .code_editor_line_number_mode - .set_value(*mode, ctx) - ); - ctx.notify(); - }); - } ToggleAsyncFind => { TerminalSettings::handle(ctx).update(ctx, |terminal_settings, ctx| { report_if_error!( @@ -2235,13 +2218,7 @@ impl FeaturesPageView { ); // Listen for model changes on all the settings that are used in this view. - ctx.subscribe_to_model(&AppEditorSettings::handle(ctx), |me, _, _, ctx| { - Self::update_code_editor_line_number_mode_dropdown( - me.code_editor_line_number_mode_dropdown.clone(), - ctx, - ); - ctx.notify(); - }); + ctx.subscribe_to_model(&AppEditorSettings::handle(ctx), |_, _, _, ctx| ctx.notify()); ctx.subscribe_to_model(&SelectionSettings::handle(ctx), |_, _, _, ctx| ctx.notify()); ctx.subscribe_to_model(&AltScreenReporting::handle(ctx), |_, _, _, ctx| { @@ -2486,12 +2463,6 @@ impl FeaturesPageView { let right_click_behavior_dropdown = ctx.add_typed_action_view(Dropdown::new); Self::update_right_click_behavior_dropdown(right_click_behavior_dropdown.clone(), ctx); - let code_editor_line_number_mode_dropdown = ctx.add_typed_action_view(Dropdown::new); - Self::update_code_editor_line_number_mode_dropdown( - code_editor_line_number_mode_dropdown.clone(), - ctx, - ); - ctx.subscribe_to_model(&KeysSettings::handle(ctx), |me, _, event, ctx| { if matches!( event, @@ -2738,7 +2709,6 @@ impl FeaturesPageView { tab_behavior_dropdown, ctrl_tab_behavior_dropdown, right_click_behavior_dropdown, - code_editor_line_number_mode_dropdown, graphics_backend_dropdown, new_tab_placement_dropdown, osc52_clipboard_access_dropdown, @@ -2920,13 +2890,6 @@ impl FeaturesPageView { let mut text_editing_widgets: Vec>> = vec![Box::new(AutocompleteSymbolsWidget::default())]; - if app_editor_settings - .code_editor_line_number_mode - .is_supported_on_current_platform() - { - text_editing_widgets.push(Box::new(CodeEditorLineNumberModeWidget::default())); - } - if app_editor_settings .vim_mode .is_supported_on_current_platform() @@ -3119,41 +3082,6 @@ impl FeaturesPageView { PageType::new_categorized(categories, None) } - fn update_code_editor_line_number_mode_dropdown( - dropdown: ViewHandle>, - ctx: &mut ViewContext, - ) { - dropdown.update(ctx, |dropdown, ctx| { - let values = [ - CodeEditorLineNumberMode::Absolute, - CodeEditorLineNumberMode::Relative, - ]; - - let current_value = *AppEditorSettings::as_ref(ctx) - .code_editor_line_number_mode - .value(); - - let selected_index = values - .iter() - .position(|val| *val == current_value) - .unwrap_or(0); - - dropdown.set_items( - values - .into_iter() - .map(|val| { - DropdownItem::new( - val.dropdown_item_label(), - FeaturesPageAction::SetCodeEditorLineNumberMode(val), - ) - }) - .collect(), - ctx, - ); - dropdown.set_selected_by_index(selected_index, ctx); - }); - } - fn update_ctrl_tab_behavior_dropdown( dropdown: ViewHandle>, ctx: &mut ViewContext, @@ -5928,49 +5856,6 @@ impl SettingsWidget for AutocompleteSymbolsWidget { } } -#[derive(Default)] -struct CodeEditorLineNumberModeWidget {} - -impl SettingsWidget for CodeEditorLineNumberModeWidget { - type View = FeaturesPageView; - - fn search_terms(&self) -> &str { - "line number relative line vim gutter code editor" - } - - fn render( - &self, - view: &Self::View, - appearance: &Appearance, - app: &AppContext, - ) -> Box { - let mut column = Flex::column(); - add_setting( - &mut column, - &AppEditorSettings::as_ref(app).code_editor_line_number_mode, - || { - render_dropdown_item( - appearance, - "Code editor line numbers:", - None, - None, - LocalOnlyIconState::for_setting( - CodeEditorLineNumberModeSetting::storage_key(), - CodeEditorLineNumberModeSetting::sync_to_cloud(), - &mut view - .button_mouse_states - .local_only_icon_tooltip_states - .borrow_mut(), - app, - ), - None, - &view.code_editor_line_number_mode_dropdown, - ) - }, - ); - column.finish() - } -} #[derive(Default)] struct ErrorUnderliningWidget { switch_state: SwitchStateHandle,