126 lines
4.4 KiB
Rust
126 lines
4.4 KiB
Rust
use crate::appearance::Appearance;
|
|
use crate::notebooks::file::MarkdownDisplayMode;
|
|
use galaxyui::elements::{CornerRadius, Fill as UiFill, Radius};
|
|
use galaxyui::presenter::ChildView;
|
|
use galaxyui::ui_components::components::UiComponentStyles;
|
|
use galaxyui::ui_components::segmented_control::{
|
|
LabelConfig, RenderableOptionConfig, SegmentedControl, SegmentedControlEvent,
|
|
};
|
|
use galaxyui::{
|
|
AppContext, Element, Entity, SingletonEntity, TypedActionView, View, ViewContext, ViewHandle,
|
|
};
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum MarkdownToggleEvent {
|
|
ModeSelected(MarkdownDisplayMode),
|
|
}
|
|
|
|
pub struct MarkdownToggleView {
|
|
segmented_control: ViewHandle<SegmentedControl<MarkdownDisplayMode>>,
|
|
}
|
|
|
|
impl MarkdownToggleView {
|
|
pub fn new(default_mode: MarkdownDisplayMode, ctx: &mut ViewContext<Self>) -> Self {
|
|
let segmented_control = ctx.add_typed_action_view(move |ctx| {
|
|
SegmentedControl::new(
|
|
vec![MarkdownDisplayMode::Rendered, MarkdownDisplayMode::Raw],
|
|
|mode, is_selected, app| {
|
|
let appearance = Appearance::as_ref(app);
|
|
let theme = appearance.theme();
|
|
|
|
Some(RenderableOptionConfig {
|
|
icon_path: "",
|
|
icon_color: theme.main_text_color(theme.background()).into(),
|
|
label: Some(LabelConfig {
|
|
label: match mode {
|
|
MarkdownDisplayMode::Rendered => "Rendered".into(),
|
|
MarkdownDisplayMode::Raw => "Raw".into(),
|
|
},
|
|
width_override: Some(55.0),
|
|
color: if is_selected {
|
|
theme.accent().into()
|
|
} else {
|
|
theme.main_text_color(theme.background()).into()
|
|
},
|
|
}),
|
|
tooltip: None,
|
|
background: if is_selected {
|
|
UiFill::Solid(theme.surface_3().into())
|
|
} else {
|
|
UiFill::None
|
|
},
|
|
})
|
|
},
|
|
default_mode,
|
|
markdown_toggle_styles(ctx),
|
|
)
|
|
});
|
|
|
|
ctx.subscribe_to_view(&segmented_control, |_, _, event, ctx| {
|
|
let SegmentedControlEvent::OptionSelected(mode) = event;
|
|
ctx.emit(MarkdownToggleEvent::ModeSelected(*mode));
|
|
});
|
|
|
|
ctx.subscribe_to_model(&Appearance::handle(ctx), |me, _, _, ctx| {
|
|
me.segmented_control.update(ctx, |segmented_control, ctx| {
|
|
segmented_control.set_styles(markdown_toggle_styles(ctx), ctx);
|
|
});
|
|
ctx.notify();
|
|
});
|
|
|
|
Self { segmented_control }
|
|
}
|
|
|
|
pub fn set_selected_mode(&mut self, mode: MarkdownDisplayMode, ctx: &mut ViewContext<Self>) {
|
|
self.segmented_control.update(ctx, |control, ctx| {
|
|
control.set_selected_option(mode, ctx);
|
|
});
|
|
ctx.notify();
|
|
}
|
|
}
|
|
|
|
impl View for MarkdownToggleView {
|
|
fn ui_name() -> &'static str {
|
|
"MarkdownToggleView"
|
|
}
|
|
|
|
fn render(&self, _app: &AppContext) -> Box<dyn Element> {
|
|
ChildView::new(&self.segmented_control).finish()
|
|
}
|
|
}
|
|
|
|
impl TypedActionView for MarkdownToggleView {
|
|
type Action = ();
|
|
|
|
fn handle_action(&mut self, _action: &Self::Action, ctx: &mut ViewContext<Self>) {
|
|
ctx.notify();
|
|
}
|
|
}
|
|
|
|
impl Entity for MarkdownToggleView {
|
|
type Event = MarkdownToggleEvent;
|
|
}
|
|
|
|
fn markdown_toggle_styles(app: &AppContext) -> UiComponentStyles {
|
|
let appearance = Appearance::as_ref(app);
|
|
let theme = appearance.theme();
|
|
|
|
UiComponentStyles {
|
|
font_family_id: Some(appearance.ui_font_family()),
|
|
font_size: Some(appearance.ui_font_size()),
|
|
border_radius: Some(CornerRadius::with_all(Radius::Pixels(4.0))),
|
|
border_width: Some(1.0),
|
|
border_color: Some(UiFill::Solid(theme.surface_3().into())),
|
|
background: Some(UiFill::Solid(theme.background().into())),
|
|
height: Some(20.0),
|
|
padding: Some(galaxyui::ui_components::components::Coords::uniform(0.0)),
|
|
margin: Some(galaxyui::ui_components::components::Coords {
|
|
top: 0.0,
|
|
bottom: 0.0,
|
|
left: 0.0,
|
|
right: 8.0,
|
|
}),
|
|
..Default::default()
|
|
}
|
|
}
|