[fractal] Message Widget: Make ol/ul a list of boxes



commit 9ccb4ecdc141de7516a558f38b6a3ab1b39a1393
Author: Maximiliano Sandoval R <msandova protonmail com>
Date:   Thu Nov 19 15:14:34 2020 +0100

    Message Widget: Make ol/ul a list of boxes
    
    Instead of adding a bullet to each label, create a horizontal box with a
    bullet and the text, this way the text is properly spaced after
    wrapping, i.e.
    
    * some wrapped
    text
    
    * some wrapped
      text
    
    where the second is the implemented and correct behavior. Additionally,
    the bullet cannot be selected as part of the message.

 fractal-gtk/src/widgets/message.rs | 52 +++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 21 deletions(-)
---
diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs
index ea8103ec..fe5b40b5 100644
--- a/fractal-gtk/src/widgets/message.rs
+++ b/fractal-gtk/src/widgets/message.rs
@@ -540,35 +540,44 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm
             set_label_styles(&w);
             w.set_markup(&s);
             w.get_style_context().add_class(&format!("h{}", n));
+            container.connect_right_click_menu(msg, Some(&w.upcast_ref::<gtk::Widget>()));
             w.upcast::<gtk::Widget>()
         }
         HtmlBlock::UList(elements) => {
-            let w = gtk::Label::new(None);
-            set_label_styles(&w);
+            let bx = gtk::Box::new(gtk::Orientation::Vertical, 6);
 
-            let text = elements
-                .iter()
-                .map(|li| format!(" • {}", li))
-                .collect::<Vec<String>>()
-                .join("\n");
-            w.set_markup(&text);
+            for li in elements.iter() {
+                let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6);
+                let bullet = gtk::Label::new(Some("•"));
+                bullet.set_valign(gtk::Align::Start);
+                let w = gtk::Label::new(None);
+                set_label_styles(&w);
+                h_box.add(&bullet);
+                h_box.add(&w);
+                w.set_markup(&li);
+                container.connect_right_click_menu(msg, Some(&w.upcast_ref::<gtk::Widget>()));
+                bx.add(&h_box);
+            }
 
-            w.upcast::<gtk::Widget>()
+            bx.upcast::<gtk::Widget>()
         }
         HtmlBlock::OList(elements) => {
-            let w = gtk::Label::new(None);
-            set_label_styles(&w);
-
-            let text = elements
-                .iter()
-                .enumerate()
-                .map(|(i, li)| format!(" {}. {}", i + 1, li))
-                .collect::<Vec<String>>()
-                .join("\n");
+            let bx = gtk::Box::new(gtk::Orientation::Vertical, 6);
 
-            w.set_markup(&text);
+            for (i, ol) in elements.iter().enumerate() {
+                let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6);
+                let bullet = gtk::Label::new(Some(&format!("{}.", i + 1)));
+                bullet.set_valign(gtk::Align::Start);
+                let w = gtk::Label::new(None);
+                set_label_styles(&w);
+                h_box.add(&bullet);
+                h_box.add(&w);
+                w.set_markup(&ol);
+                bx.add(&h_box);
+                container.connect_right_click_menu(msg, Some(&w.upcast_ref::<gtk::Widget>()));
+            }
 
-            w.upcast::<gtk::Widget>()
+            bx.upcast::<gtk::Widget>()
         }
         HtmlBlock::Code(s) => {
             let buffer = sourceview4::Buffer::new::<gtk::TextTagTable>(None);
@@ -578,6 +587,7 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm
             view.set_editable(false);
             view.set_wrap_mode(gtk::WrapMode::WordChar);
             view.get_style_context().add_class("codeview");
+            container.connect_right_click_menu(msg, Some(&view.upcast_ref::<gtk::Widget>()));
             view.upcast::<gtk::Widget>()
         }
         HtmlBlock::Quote(blocks) => {
@@ -593,10 +603,10 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm
             let w = gtk::Label::new(None);
             set_label_styles(&w);
             w.set_markup(&s);
+            container.connect_right_click_menu(msg, Some(&w.upcast_ref::<gtk::Widget>()));
             w.upcast::<gtk::Widget>()
         }
     };
-    container.connect_right_click_menu(msg, Some(&widget));
     widget
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]