]> uap-core.de Git - note.git/commitdiff
add attachments itemlist to window main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 26 Aug 2026 18:47:45 +0000 (20:47 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 26 Aug 2026 18:47:45 +0000 (20:47 +0200)
application/note/src/note.rs
application/note/src/window.rs
ui-rs/src/ui/container.rs
ui-rs/src/ui/list.rs
ui-rs/src/ui/mod.rs

index 3336fbcdf966365b39d51f65c729c01a6b34e3a7..978ab2805d36fdb27761caa3cb0671adfd4921b6 100644 (file)
@@ -85,7 +85,10 @@ pub struct Note {
     pub text: UiText,
     
     #[bind("note_info")]
-    pub info: UiString
+    pub info: UiString,
+
+    #[bind("note_attachments")]
+    pub attachments: UiList<entity::attachment::Model>
 }
 
 #[ui_actions]
@@ -117,6 +120,7 @@ impl Note {
             title: Default::default(),
             text: Default::default(),
             info: Default::default(),
+            attachments: Default::default()
         }
     }
 
@@ -263,6 +267,32 @@ impl Note {
         });
     }
 
+    pub fn load_attachments(&mut self) {
+        let NoteId::Id(note_id) = self.id else {
+            return;
+        };
+
+        let Some(doc) = self.doc.get_doc() else {
+            return;
+        };
+
+        let proxy = doc.doc_proxy();
+        self.backend.get_note_attachments(note_id, move|result|{
+            proxy.call_mainthread(move |_doc, note|{
+                match result {
+                    Ok(attachments) => {
+                        note.attachments.data_mut().clear();
+                        note.attachments.data_mut().extend(attachments);
+                        note.attachments.update();
+                    },
+                    Err(e) => {
+                        println!("Cannot get note attachments: {}", e);
+                    }
+                }
+            });
+        });
+    }
+
     pub fn update_title(&mut self, s: &str, notify: bool) {
         let title = match generate_title(s) {
             Some(result) => {
@@ -337,6 +367,7 @@ impl Note {
         println!("note changed by {}", _from);
 
         self.load_content();
+        self.load_attachments();
     }
 
     /// Event before the text is changed: detect if the change affects the title
index 5cc9087fb556700402dbf2339fcf10f575f3a45c..82deac64038dbf519c00461e7b53cd09553468ef 100644 (file)
 
 use std::any::Any;
 use backend::backend::{BackendHandle, BroadcastMessage, NoteId};
-use ui_rs::{action, button, grid, hbox, imageviewer, label, sourcelist, tableview, tabview, textarea, textfield, ui_actions, webview, UiModel};
+use ui_rs::{action, button, grid, hbox, imageviewer, label, scrolledwindow, sourcelist, tableview, tabview, textarea, textfield, ui_actions, webview, UiModel};
 use ui_rs::ui::*;
 use crate::{App, AppStates};
 use entity::collection::{CollectionType, Model as Collection, Node};
+use ui_rs::ui::widget::Widget;
 use crate::newnotebook::new_notebook_dialog;
 use crate::notebook::{notelist_getvalue, Notebook, NotebookItem};
 
@@ -286,7 +287,12 @@ pub fn create_window(app: &App, ctx: &AppContext<MainWindow>) -> UiObject<MainWi
                         button!(obj, label = "Close", action = "note_title_close");
                     });
                     hbox!(obj, visibility_states = &[AppStates::NoteHasAttachments], margin = 10, spacing = 4, |obj|{
-                        
+                        let mut w = scrolledwindow!(obj, |obj|{
+                            obj.itemlist::<entity::attachment::Model>()
+                                .varname("note_attachments")
+                                .create();
+                        });
+                        w.set_size(-1, 120);
                     });
                     let textarea = textarea!(obj, fill = true, varname = "note_text", onchange_action = "note_text_change", ontextchanged_action = "note_text_changed");
                     obj.ctx.add_action_untyped("textarea_focus", move|_event|{
index a71d767a6bb5e6233af18ed398069898b8a8c7a7..c0dbb9540653004fb8b596f2a612e90c9ca0c6ac 100644 (file)
@@ -204,6 +204,12 @@ macro_rules! tabview {
     }};
 }
 
+#[macro_export]
+macro_rules! itemlist {
+    ($parent:expr, $($tt:tt)*) => {
+        $crate::widget!($parent, itemlist, $($tt)*)
+    };
+}
 pub struct Container {
     ptr: *mut c_void
 }
@@ -1318,6 +1324,19 @@ impl<'a, T> TabViewBuilder<'a, T> {
     }
 }
 
+impl<T> toolkit::UiObject<T> {
+    pub fn itemlist<'a, E>(&'a mut self) -> ItemListContainerBuilder<'a, T, E> {
+        unsafe {
+            let args = ui_itemlist_container_args_new();
+            ItemListContainerBuilder {
+                args: args,
+                obj: self,
+                _marker: PhantomData
+            }
+        }
+    }
+}
+
 /* -------------------------------- ItemList Container -------------------------------- */
 
 type CreateUiFunc = extern "C" fn(obj: *mut ffi::UiObject, list: *mut ffi::UiList, row: c_int, elm: *mut c_void, userdata: *mut c_void);
@@ -1342,14 +1361,8 @@ pub struct ItemListContainerBuilder<'a, T, C> {
 }
 
 impl<'a, T, C> ItemListContainerBuilder<'a, T, C> {
-    pub fn create<F>(&mut self, create_ui: F) -> Container
-    where F: FnOnce(&mut toolkit::UiObject<T>) {
+    pub fn create(&mut self) -> Container {
         let widget_ptr = unsafe { ui_itemlist_create(self.obj.ptr, self.args) };
-        create_ui(self.obj);
-        unsafe {
-            ui_container_begin_close(self.obj.ptr);
-            ui_container_finish(self.obj.ptr);
-        }
         Container {
             ptr: widget_ptr,
         }
index 8e3555e9f320e4425c5dc867a90816f18c2155d2..112da6584ec809f29f88a7ae7302eb5ca0c8e570 100644 (file)
@@ -29,7 +29,7 @@
 #![allow(dead_code)]
 
 use crate::ui::ffi::{UiObject, UiListArgs, UiCallback, UiList, UiSourceListArgs};
-use crate::ui::{event, ffi, toolkit, ui_list_get, ui_list_get_data, Button, EventWrapper};
+use crate::ui::{event, ffi, toolkit, ui_list_get, ui_list_get_data, Button, EventWrapper, ItemListContainerBuilder};
 use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
 use std::marker::PhantomData;
index 78679e1001243ee7368b85b4949e6d7eca3c40d1..aed82cdd48864f7e6f4aee05dcfbfc550d57ab29 100644 (file)
@@ -32,7 +32,7 @@ mod application;
 mod window;
 mod button;
 mod container;
-mod widget;
+pub mod widget;
 mod text;
 pub mod event;
 pub mod list;