mirror of
https://github.com/DioxusLabs/dioxus
synced 2024-11-10 06:34:20 +00:00
fix formatted strings in components
This commit is contained in:
parent
407a82588a
commit
90d0164b9e
8 changed files with 41 additions and 59 deletions
|
@ -44,38 +44,22 @@ fn app() -> Element {
|
|||
style { {STYLE} }
|
||||
div { id: "wrapper",
|
||||
div { class: "app",
|
||||
div { class: "calculator", onkeypress: move |evt| state.write().handle_keydown(evt),
|
||||
div {
|
||||
class: "calculator",
|
||||
onkeypress: move |evt| state.write().handle_keydown(evt),
|
||||
div { class: "calculator-display", {state.read().formatted_display()} }
|
||||
div { class: "calculator-keypad",
|
||||
div { class: "input-keys",
|
||||
div { class: "function-keys",
|
||||
CalculatorKey {
|
||||
name: "key-clear",
|
||||
onclick: move |_| state.write().clear_display(),
|
||||
CalculatorKey { name: "key-clear", onclick: move |_| state.write().clear_display(),
|
||||
if state.read().display_value == "0" { "C" } else { "AC" }
|
||||
}
|
||||
CalculatorKey {
|
||||
name: "key-sign",
|
||||
onclick: move |_| state.write().toggle_sign(),
|
||||
"±"
|
||||
}
|
||||
CalculatorKey {
|
||||
name: "key-percent",
|
||||
onclick: move |_| state.write().toggle_percent(),
|
||||
"%"
|
||||
}
|
||||
CalculatorKey { name: "key-sign", onclick: move |_| state.write().toggle_sign(), "±" }
|
||||
CalculatorKey { name: "key-percent", onclick: move |_| state.write().toggle_percent(), "%" }
|
||||
}
|
||||
div { class: "digit-keys",
|
||||
CalculatorKey {
|
||||
name: "key-0",
|
||||
onclick: move |_| state.write().input_digit(0),
|
||||
"0"
|
||||
}
|
||||
CalculatorKey {
|
||||
name: "key-dot",
|
||||
onclick: move |_| state.write().input_dot(),
|
||||
"●"
|
||||
}
|
||||
CalculatorKey { name: "key-0", onclick: move |_| state.write().input_digit(0), "0" }
|
||||
CalculatorKey { name: "key-dot", onclick: move |_| state.write().input_dot(), "●" }
|
||||
for k in 1..10 {
|
||||
CalculatorKey {
|
||||
key: "{k}",
|
||||
|
@ -102,16 +86,8 @@ fn app() -> Element {
|
|||
onclick: move |_| state.write().set_operator(Operator::Sub),
|
||||
"−"
|
||||
}
|
||||
CalculatorKey {
|
||||
name: "key-add",
|
||||
onclick: move |_| state.write().set_operator(Operator::Add),
|
||||
"+"
|
||||
}
|
||||
CalculatorKey {
|
||||
name: "key-equals",
|
||||
onclick: move |_| state.write().perform_operation(),
|
||||
"="
|
||||
}
|
||||
CalculatorKey { name: "key-add", onclick: move |_| state.write().set_operator(Operator::Add), "+" }
|
||||
CalculatorKey { name: "key-equals", onclick: move |_| state.write().perform_operation(), "=" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -121,17 +97,9 @@ fn app() -> Element {
|
|||
}
|
||||
|
||||
#[component]
|
||||
fn CalculatorKey(
|
||||
#[props(into)] name: String,
|
||||
onclick: EventHandler<MouseEvent>,
|
||||
children: Element,
|
||||
) -> Element {
|
||||
fn CalculatorKey(name: String, onclick: EventHandler<MouseEvent>, children: Element) -> Element {
|
||||
render! {
|
||||
button {
|
||||
class: "calculator-key {name}",
|
||||
onclick: move |e| onclick.call(e),
|
||||
{&children}
|
||||
}
|
||||
button { class: "calculator-key {name}", onclick: move |e| onclick.call(e), {&children} }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,10 +22,7 @@ fn app() -> Element {
|
|||
render! {
|
||||
div {
|
||||
h1 { "Current count: {count}" }
|
||||
button {
|
||||
onclick: move |_| count.set(0),
|
||||
"Reset the count"
|
||||
}
|
||||
button { onclick: move |_| count.set(0), "Reset the count" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ pub fn TodoEntry(mut todos: Signal<HashMap<u32, TodoItem>>, id: u32) -> Element
|
|||
let contents = use_selector(move || todos.read().get(&id).unwrap().contents.clone());
|
||||
|
||||
render! {
|
||||
li { class: if checked() { "completed" }, class: if is_editing() { "editing"},
|
||||
li { class: if checked() { "completed" }, class: if is_editing() { "editing" },
|
||||
div { class: "view",
|
||||
input {
|
||||
class: "toggle",
|
||||
|
|
|
@ -261,11 +261,8 @@ fn get_function(component_body: &ComponentBody) -> ItemFn {
|
|||
let mut pat = pat.clone();
|
||||
|
||||
// rip off mutability, but still write it out eventually
|
||||
match pat.as_mut() {
|
||||
Pat::Ident(ref mut pat_ident) => {
|
||||
pat_ident.mutability = None;
|
||||
}
|
||||
_ => {}
|
||||
if let Pat::Ident(ref mut pat_ident) = pat.as_mut() {
|
||||
pat_ident.mutability = None;
|
||||
}
|
||||
|
||||
Some(quote!(mut #pat))
|
||||
|
|
|
@ -173,7 +173,7 @@ mod field_info {
|
|||
use quote::quote;
|
||||
use syn::spanned::Spanned;
|
||||
use syn::{parse::Error, punctuated::Punctuated};
|
||||
use syn::{Expr, Path};
|
||||
use syn::{parse_quote, Expr, Path};
|
||||
|
||||
use super::util::{
|
||||
expr_to_single_string, ident_to_type, path_to_single_string, strip_raw_ident_prefix,
|
||||
|
@ -204,6 +204,15 @@ mod field_info {
|
|||
);
|
||||
}
|
||||
|
||||
// String fields automatically use impl Display
|
||||
if field.ty == parse_quote!(::std::string::String)
|
||||
|| field.ty == parse_quote!(std::string::String)
|
||||
|| field.ty == parse_quote!(string::String)
|
||||
|| field.ty == parse_quote!(String)
|
||||
{
|
||||
builder_attr.from_displayable = true;
|
||||
}
|
||||
|
||||
// extended field is automatically empty
|
||||
if !builder_attr.extends.is_empty() {
|
||||
builder_attr.default = Some(
|
||||
|
@ -263,6 +272,7 @@ mod field_info {
|
|||
pub doc: Option<syn::Expr>,
|
||||
pub skip: bool,
|
||||
pub auto_into: bool,
|
||||
pub from_displayable: bool,
|
||||
pub strip_option: bool,
|
||||
pub ignore_option: bool,
|
||||
pub extends: Vec<Path>,
|
||||
|
@ -412,6 +422,7 @@ mod field_info {
|
|||
handle_fields!(
|
||||
"skip", skip, "skipped";
|
||||
"into", auto_into, "calling into() on the argument";
|
||||
"displayable", from_displayable, "calling to_string() on the argument";
|
||||
"strip_option", strip_option, "putting the argument in Some(...)";
|
||||
)
|
||||
}
|
||||
|
@ -443,6 +454,10 @@ mod field_info {
|
|||
self.auto_into = false;
|
||||
Ok(())
|
||||
}
|
||||
"displayable" => {
|
||||
self.from_displayable = false;
|
||||
Ok(())
|
||||
}
|
||||
"optional" => {
|
||||
self.strip_option = false;
|
||||
self.ignore_option = true;
|
||||
|
@ -954,6 +969,11 @@ Finally, call `.build()` to create the instance of `{name}`.
|
|||
quote!(impl ::core::convert::Into<#arg_type>),
|
||||
quote!(#field_name.into()),
|
||||
)
|
||||
} else if field.builder_attr.from_displayable {
|
||||
(
|
||||
quote!(impl ::core::fmt::Display),
|
||||
quote!(#field_name.to_string()),
|
||||
)
|
||||
} else {
|
||||
(quote!(#arg_type), quote!(#field_name))
|
||||
};
|
||||
|
|
|
@ -211,7 +211,7 @@ impl ToTokens for ElementAttrValue {
|
|||
fn to_tokens(&self, tokens: &mut TokenStream2) {
|
||||
match self {
|
||||
ElementAttrValue::Shorthand(i) => tokens.append_all(quote! { #i }),
|
||||
ElementAttrValue::AttrLiteral(lit) => tokens.append_all(quote! { #lit }),
|
||||
ElementAttrValue::AttrLiteral(lit) => tokens.append_all(quote! { #lit.to_string() }),
|
||||
ElementAttrValue::AttrOptionalExpr { condition, value } => {
|
||||
tokens.append_all(quote! { if #condition { Some(#value) } else { None } })
|
||||
}
|
||||
|
@ -224,7 +224,7 @@ impl ToTokens for ElementAttrValue {
|
|||
impl ElementAttrValue {
|
||||
fn to_str_expr(&self) -> Option<TokenStream2> {
|
||||
match self {
|
||||
ElementAttrValue::AttrLiteral(lit) => Some(quote!(#lit)),
|
||||
ElementAttrValue::AttrLiteral(lit) => Some(quote!(#lit.to_string())),
|
||||
ElementAttrValue::AttrOptionalExpr { value, .. } => value.to_str_expr(),
|
||||
ElementAttrValue::AttrExpr(expr) => Some(quote!(#expr.to_string())),
|
||||
_ => None,
|
||||
|
|
|
@ -242,7 +242,7 @@ impl ToTokens for IfmtInput {
|
|||
.map(|ident| quote!(#ident = #ident));
|
||||
|
||||
quote! {
|
||||
format!(
|
||||
::std::format_args!(
|
||||
#format_literal
|
||||
#(, #positional_args)*
|
||||
#(, #named_args)*
|
||||
|
|
|
@ -144,7 +144,7 @@ impl ToTokens for BodyNode {
|
|||
}
|
||||
BodyNode::Component(comp) => comp.to_tokens(tokens),
|
||||
BodyNode::Text(txt) => tokens.append_all(quote! {
|
||||
dioxus_core::DynamicNode::Text(dioxus_core::VText::new(#txt))
|
||||
dioxus_core::DynamicNode::Text(dioxus_core::VText::new(#txt.to_string()))
|
||||
}),
|
||||
BodyNode::RawExpr(exp) => tokens.append_all(quote! {
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue