Ely Office: six offline-first desktop apps in Rust and GPUI
ElyDoc, ElyTable, ElyShow (LibreOfficeKit), ElyPDF (MuPDF), ElyTree (Git), ElyMark (Milkdown and CodeMirror in CEF). ElyMail and ElyAgent follow.
This commit is contained in:
817 files changed
+143101
No files matched your search
@@ -0,0 +1,96 @@
|
||||
//! The panel's text group and its kernel hookup.
|
||||
|
||||
use ely_gpui_component::{data_display::PropertyGroup, primitives::IconName};
|
||||
use ely_office::panel::{Panel, color_state, font_box, palette, row, size_menu, toggle};
|
||||
use gpui::{App, Context, SharedString, Window};
|
||||
|
||||
use super::Props;
|
||||
use crate::docs::Docs;
|
||||
|
||||
/// The swatch's label without a color.
|
||||
const AUTOMATIC: &str = "office.props.automatic";
|
||||
|
||||
impl Panel for Props {
|
||||
fn state(&self, uno: &str, cx: &App) -> Option<SharedString> {
|
||||
let view = self.shown.as_ref()?.view.read(cx);
|
||||
view.state(uno)
|
||||
.map(|state| SharedString::from(state.to_string()))
|
||||
}
|
||||
|
||||
fn run(&mut self, id: &str, values: &[&str], cx: &mut Context<Self>) {
|
||||
Props::run(self, id, values, cx);
|
||||
}
|
||||
}
|
||||
|
||||
impl Props {
|
||||
pub(super) fn text_group(&self, window: &mut Window, cx: &mut Context<Self>) -> PropertyGroup {
|
||||
let why = "doc.why.selection";
|
||||
let effects = row([
|
||||
toggle(
|
||||
self,
|
||||
"format.bold",
|
||||
(Some(IconName::Bold), ""),
|
||||
("doc.props.bold", why),
|
||||
cx,
|
||||
),
|
||||
toggle(
|
||||
self,
|
||||
"format.italic",
|
||||
(Some(IconName::Italic), ""),
|
||||
("doc.props.italic", why),
|
||||
cx,
|
||||
),
|
||||
toggle(
|
||||
self,
|
||||
"format.underline",
|
||||
(Some(IconName::Underline), ""),
|
||||
("doc.props.underline", why),
|
||||
cx,
|
||||
),
|
||||
toggle(
|
||||
self,
|
||||
"format.strikeout",
|
||||
(Some(IconName::Strikethrough), ""),
|
||||
("doc.props.strikeout", why),
|
||||
cx,
|
||||
),
|
||||
toggle(
|
||||
self,
|
||||
"format.superscript",
|
||||
(None, "x²"),
|
||||
("doc.props.superscript", why),
|
||||
cx,
|
||||
),
|
||||
toggle(
|
||||
self,
|
||||
"format.subscript",
|
||||
(None, "x₂"),
|
||||
("doc.props.subscript", why),
|
||||
cx,
|
||||
),
|
||||
]);
|
||||
let this = cx.entity();
|
||||
let color = color_state(self, ".uno:FontColor", cx);
|
||||
let highlight = color_state(self, ".uno:CharBackColor", cx);
|
||||
let font = font_box(self, "doc-props-font", &self.fonts, window, cx);
|
||||
let tip = |key: &str| Docs::text(cx, key, &[]);
|
||||
PropertyGroup::new(tip("doc.props.text"))
|
||||
.row(tip("doc.props.font"), font)
|
||||
.row(tip("doc.props.size"), size_menu(self, "doc-props-size", cx))
|
||||
.row(tip("doc.props.effects"), effects)
|
||||
.row(
|
||||
tip("doc.props.color"),
|
||||
palette(&this, "format.color", (color, AUTOMATIC), None, cx),
|
||||
)
|
||||
.row(
|
||||
tip("doc.props.highlight"),
|
||||
palette(
|
||||
&this,
|
||||
"format.highlight",
|
||||
(highlight, AUTOMATIC),
|
||||
Some(("doc.props.no_highlight", "format.highlight", "-1")),
|
||||
cx,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user