summary refs log tree commit diff
path: root/src/components/smart_summary.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/smart_summary.rs')
-rw-r--r--src/components/smart_summary.rs73
1 files changed, 42 insertions, 31 deletions
diff --git a/src/components/smart_summary.rs b/src/components/smart_summary.rs
index 37bbd74..b360d77 100644
--- a/src/components/smart_summary.rs
+++ b/src/components/smart_summary.rs
@@ -3,7 +3,6 @@ use relm4::{gtk, prelude::{AsyncComponent, AsyncComponentParts}, AsyncComponentS
 
 #[derive(Debug, Default)]
 pub(crate) struct SmartSummaryButton {
-    content_buffer: gtk::TextBuffer,
     busy: bool,
 }
 
@@ -13,6 +12,12 @@ pub(crate) enum Error {
 }
 
 #[derive(Debug)]
+pub(crate) enum Input {
+    ButtonPressed,
+    Text(String)
+}
+
+#[derive(Debug)]
 pub(crate) enum Output {
     Start,
     Chunk(String),
@@ -23,17 +28,17 @@ pub(crate) enum Output {
 
 #[relm4::component(pub(crate) async)]
 impl AsyncComponent for SmartSummaryButton {
-    type Input = ();
+    type Input = Input;
     type Output = Output;
 
-    type Init = gtk::TextBuffer;
+    type Init = ();
     type CommandOutput = ();
 
     view! {
         #[root]
         #[name = "button"]
         gtk::Button {
-            connect_clicked => (),
+            connect_clicked => Input::ButtonPressed,
             #[watch]
             set_sensitive: !model.busy,
             set_tooltip_markup: Some("<b>Smart Summary</b>\nAsk a language model for a single-sentence summary."),
@@ -47,38 +52,44 @@ impl AsyncComponent for SmartSummaryButton {
         }
     }
 
-    async fn init(init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
-        let model = SmartSummaryButton {
-            content_buffer: init,
-            ..Default::default()
-        };
+    async fn init(
+        _init: Self::Init,
+        root: Self::Root,
+        sender: AsyncComponentSender<Self>
+    ) -> AsyncComponentParts<Self> {
+        let model = Self::default();
         let widgets = view_output!();
 
         AsyncComponentParts { model, widgets }
     }
 
-    async fn update_with_view(&mut self, widgets: &mut Self::Widgets, _msg: Self::Input, sender: AsyncComponentSender<Self>, _root: &Self::Root) {
-        log::debug!("Starting Smart Summary generation");
-        self.busy = true;
-        let _ = sender.output(Output::Start);
-        self.update_view(widgets, sender.clone());
-
-        let text = self.content_buffer.text(
-            &self.content_buffer.start_iter(),
-            &self.content_buffer.end_iter(),
-            false
-        );
-        log::debug!("Would generate summary for the following text:\n{}", text);
-        tokio::time::sleep(std::time::Duration::from_millis(450)).await;
-
-        for i in ["I'", "m ", "sorry,", " I", " am ", "unable", " to", " ", "write", " you ", "a summary.", " I", " am", " not ", "really ", "an ", "LLM."] {
-            tokio::time::sleep(std::time::Duration::from_millis(100)).await;
-            let _ = sender.output(Output::Chunk(i.to_string()));
+    async fn update_with_view(
+        &mut self,
+        widgets: &mut Self::Widgets,
+        msg: Self::Input,
+        sender: AsyncComponentSender<Self>,
+        _root: &Self::Root
+    ) {
+        match msg {
+            Input::ButtonPressed => if let Ok(()) = sender.output(Output::Start) {
+                self.busy = true;
+                log::debug!("Requesting text to summarize from parent component...");
+                self.update_view(widgets, sender.clone());
+            },
+            Input::Text(text) => {
+                log::debug!("Would generate summary for the following text:\n{}", text);
+                tokio::time::sleep(std::time::Duration::from_millis(450)).await;
+
+                for i in ["I'", "m ", "sorry,", " I", " am ", "unable", " to", " ", "write", " you ", "a summary.", " I", " am", " not ", "really ", "an ", "LLM."] {
+                    tokio::time::sleep(std::time::Duration::from_millis(100)).await;
+                    let _ = sender.output(Output::Chunk(i.to_string()));
+                }
+
+                log::debug!("Done with the summary.");
+                self.busy = false;
+                let _ = sender.output(Output::Done);
+                self.update_view(widgets, sender.clone());
+            }
         }
-
-        log::debug!("Done with the summary.");
-        self.busy = false;
-        let _ = sender.output(Output::Done);
-        self.update_view(widgets, sender.clone());
     }
 }