Add ability to toggle user settings

This commit is contained in:
Marshall Bowers 2023-10-19 13:38:19 -04:00
parent 4aac733238
commit a869de3b1f
2 changed files with 59 additions and 15 deletions

View file

@ -1,10 +1,10 @@
use std::sync::Arc; use std::sync::Arc;
use chrono::DateTime; use chrono::DateTime;
use gpui3::{px, relative, view, Context, Size, View}; use gpui3::{px, relative, rems, view, Context, Size, View};
use crate::settings::Settings; use crate::settings::FakeSettings;
use crate::{prelude::*, Button}; use crate::{prelude::*, user_settings_mut, Button, SettingValue};
use crate::{ use crate::{
theme, v_stack, AssistantPanel, ChatMessage, ChatPanel, CollabPanel, EditorPane, Label, theme, v_stack, AssistantPanel, ChatMessage, ChatPanel, CollabPanel, EditorPane, Label,
LanguageSelector, Pane, PaneGroup, Panel, PanelAllowedSides, PanelSide, ProjectPanel, LanguageSelector, Pane, PaneGroup, Panel, PanelAllowedSides, PanelSide, ProjectPanel,
@ -12,13 +12,13 @@ use crate::{
}; };
#[derive(Clone)] #[derive(Clone)]
pub struct GPUI2UIDebug { pub struct Gpui2UiDebug {
pub in_livestream: bool, pub in_livestream: bool,
pub enable_user_settings: bool, pub enable_user_settings: bool,
pub show_toast: bool, pub show_toast: bool,
} }
impl Default for GPUI2UIDebug { impl Default for Gpui2UiDebug {
fn default() -> Self { fn default() -> Self {
Self { Self {
in_livestream: false, in_livestream: false,
@ -44,8 +44,7 @@ pub struct Workspace {
right_panel_scroll_state: ScrollState, right_panel_scroll_state: ScrollState,
tab_bar_scroll_state: ScrollState, tab_bar_scroll_state: ScrollState,
bottom_panel_scroll_state: ScrollState, bottom_panel_scroll_state: ScrollState,
debug: GPUI2UIDebug, debug: Gpui2UiDebug,
settings: Settings,
} }
impl Workspace { impl Workspace {
@ -65,8 +64,7 @@ impl Workspace {
right_panel_scroll_state: ScrollState::default(), right_panel_scroll_state: ScrollState::default(),
tab_bar_scroll_state: ScrollState::default(), tab_bar_scroll_state: ScrollState::default(),
bottom_panel_scroll_state: ScrollState::default(), bottom_panel_scroll_state: ScrollState::default(),
debug: GPUI2UIDebug::default(), debug: Gpui2UiDebug::default(),
settings: Settings::default(),
} }
} }
@ -155,11 +153,8 @@ impl Workspace {
} }
pub fn debug_toggle_user_settings(&mut self, cx: &mut ViewContext<Self>) { pub fn debug_toggle_user_settings(&mut self, cx: &mut ViewContext<Self>) {
if self.debug.enable_user_settings { self.debug.enable_user_settings = !self.debug.enable_user_settings;
self.debug.enable_user_settings = false;
} else {
self.debug.enable_user_settings = true;
}
cx.notify(); cx.notify();
} }
@ -188,6 +183,20 @@ impl Workspace {
pub fn render(&mut self, cx: &mut ViewContext<Self>) -> impl Element<ViewState = Self> { pub fn render(&mut self, cx: &mut ViewContext<Self>) -> impl Element<ViewState = Self> {
let theme = theme(cx).clone(); let theme = theme(cx).clone();
// HACK: This should happen inside of `debug_toggle_user_settings`, but
// we don't have `cx.global::<FakeSettings>()` in event handlers at the moment.
// Need to talk with Nathan/Antonio about this.
{
let settings = user_settings_mut(cx);
if self.debug.enable_user_settings {
settings.list_indent_depth = SettingValue::UserDefined(rems(0.5).into());
settings.ui_scale = SettingValue::UserDefined(1.25);
} else {
*settings = FakeSettings::default();
}
}
let root_group = PaneGroup::new_panes( let root_group = PaneGroup::new_panes(
vec![Pane::new( vec![Pane::new(
ScrollState::default(), ScrollState::default(),

View file

@ -1,7 +1,9 @@
use std::ops::Deref; use std::ops::Deref;
use std::sync::Arc;
use gpui3::{ use gpui3::{
rems, AbsoluteLength, AnyElement, BorrowAppContext, Bounds, LayoutId, Pixels, WindowContext, rems, AbsoluteLength, AnyElement, BorrowAppContext, Bounds, Interactive, LayoutId, Pixels,
WindowContext,
}; };
use crate::prelude::*; use crate::prelude::*;
@ -11,6 +13,10 @@ pub fn user_settings(cx: &WindowContext) -> FakeSettings {
cx.global::<FakeSettings>().clone() cx.global::<FakeSettings>().clone()
} }
pub fn user_settings_mut<'cx>(cx: &'cx mut WindowContext) -> &'cx mut FakeSettings {
cx.global_mut::<FakeSettings>()
}
#[derive(Clone)] #[derive(Clone)]
pub enum SettingValue<T> { pub enum SettingValue<T> {
UserDefined(T), UserDefined(T),
@ -143,3 +149,32 @@ impl<E: Element> Element for WithSettings<E> {
}); });
} }
} }
impl<E: Element + Interactive> Interactive for WithSettings<E> {
fn listeners(&mut self) -> &mut gpui3::EventListeners<Self::ViewState> {
self.child.listeners()
}
fn on_mouse_down(
mut self,
button: gpui3::MouseButton,
handler: impl Fn(&mut Self::ViewState, &gpui3::MouseDownEvent, &mut ViewContext<Self::ViewState>)
+ Send
+ Sync
+ 'static,
) -> Self
where
Self: Sized,
{
println!("WithSettings on_mouse_down");
let settings = self.settings.clone();
self.listeners()
.mouse_down
.push(Arc::new(move |view, event, bounds, phase, cx| {
cx.with_global(settings.clone(), |cx| handler(view, event, cx))
}));
self
}
}