From 56c4714da77aa710bc8187ef0f06eb38e238ecb5 Mon Sep 17 00:00:00 2001 From: Vika Date: Tue, 20 Aug 2024 22:08:38 +0300 Subject: Visibility selector --- src/lib.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 84 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index e97a9fa..ce90fec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,8 @@ pub mod micropub; pub mod util; pub const APPLICATION_ID: &str = "xyz.vikanezrimaya.kittybox.Bowl"; +pub const VISIBILITY: [&str; 2] = ["public", "private"]; + #[tracker::track] #[derive(Debug)] pub struct PostComposerModel { @@ -72,6 +74,8 @@ impl AsyncComponent for PostComposerModel { #[root] adw::ApplicationWindow { set_title: Some("Create post"), + set_width_request: 360, + set_height_request: 480, adw::ToolbarView { add_top_bar: &{ @@ -92,7 +96,7 @@ impl AsyncComponent for PostComposerModel { }, #[name = "content_wrapper"] adw::BreakpointBin { - set_width_request: 320, + set_width_request: 360, set_height_request: 480, #[name = "content"] @@ -130,7 +134,6 @@ impl AsyncComponent for PostComposerModel { set_orientation: gtk::Orientation::Horizontal, set_css_classes: &["linked"], - gtk::Entry { set_hexpand: true, set_buffer: &model.summary_buffer, @@ -210,13 +213,49 @@ impl AsyncComponent for PostComposerModel { #[track = "model.changed(Self::submit_busy_guard())"] set_sensitive: model.submit_busy_guard.is_none(), } - } + }, + + #[name = "misc_prop_wrapper"] + gtk::Box { + set_hexpand: true, + + gtk::FlowBox { + set_hexpand: false, + set_orientation: gtk::Orientation::Horizontal, + set_homogeneous: false, + set_column_spacing: 0, + set_min_children_per_line: 2, + set_max_children_per_line: 6, + set_selection_mode: gtk::SelectionMode::None, + + append = >k::Box { + set_spacing: 5, + + #[name = "visibility_label"] + gtk::Label { + set_markup: "Visibility", + set_halign: gtk::Align::Start, + set_valign: gtk::Align::Start, + set_margin_vertical: 10, + set_margin_horizontal: 10, + }, + #[name = "visibility_selector"] + gtk::DropDown { + set_model: Some(>k::StringList::new(&VISIBILITY)), + set_hexpand: false, + + #[track = "model.changed(Self::submit_busy_guard())"] + set_sensitive: model.submit_busy_guard.is_none(), + }, + }, + }, + }, }, add_breakpoint = adw::Breakpoint::new( adw::BreakpointCondition::new_length( adw::BreakpointConditionLengthType::MinWidth, - 480.0, + 512.0, adw::LengthUnit::Px ) ) { @@ -260,23 +299,40 @@ impl AsyncComponent for PostComposerModel { layout.set_column_homogeneous(false); layout.set_row_spacing(10); - for (row, (label, field)) in [ - (&widgets.name_label, widgets.name_field.upcast_ref::()), - (&widgets.summary_label, widgets.summary_field.upcast_ref::()), - (&widgets.tag_label, widgets.tag_holder.upcast_ref::()), - (&widgets.content_label, widgets.content_textarea.upcast_ref::()) + enum Row<'a> { + TwoColumn(&'a gtk::Label, &'a gtk::Widget), + Span(&'a gtk::Widget) + } + + for (row, content) in [ + Row::TwoColumn(&widgets.name_label, widgets.name_field.upcast_ref::()), + Row::TwoColumn(&widgets.summary_label, widgets.summary_field.upcast_ref::()), + Row::TwoColumn(&widgets.tag_label, widgets.tag_holder.upcast_ref::()), + Row::TwoColumn(&widgets.content_label, widgets.content_textarea.upcast_ref::()), + Row::Span(widgets.misc_prop_wrapper.upcast_ref::()), ].into_iter().enumerate() { - let label_layout = layout.layout_child(label) - .downcast::() - .unwrap(); - label_layout.set_row(row as i32); - label_layout.set_column(0); - - let field_layout = layout.layout_child(field) - .downcast::() - .unwrap(); - field_layout.set_row(row as i32); - field_layout.set_column(1); + match content { + Row::TwoColumn(label, field) => { + let label_layout = layout.layout_child(label) + .downcast::() + .unwrap(); + label_layout.set_row(row as i32); + label_layout.set_column(0); + + let field_layout = layout.layout_child(field) + .downcast::() + .unwrap(); + field_layout.set_row(row as i32); + field_layout.set_column(1); + }, + Row::Span(widget) => { + let widget_layout = layout.layout_child(widget) + .downcast::() + .unwrap(); + widget_layout.set_row(row as i32); + widget_layout.set_column_span(2); + } + } } widgets.content.set_layout_manager(Some(model.narrow_layout.clone())); @@ -344,7 +400,14 @@ impl AsyncComponent for PostComposerModel { ).into())); } - log::warn!("sending post: {:?}", &mf2); + { + let proplist = mf2.properties.entry("visibility".to_owned()).or_default(); + let selected = VISIBILITY[widgets.visibility_selector.selected() as usize]; + proplist.push(PropertyValue::Plain(selected.to_owned())); + } + + log::warn!("sending post: {:#}", serde_json::to_value(&mf2).unwrap()); + match self.micropub.send_post(mf2).await { Ok(location) => { self.name_buffer.set_text(""); -- cgit 1.4.1