]> uap-core.de Git - note.git/commitdiff
renaming a file note's nodename also changes updates the title main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 22 Jul 2026 19:35:48 +0000 (21:35 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 22 Jul 2026 19:35:48 +0000 (21:35 +0200)
application/backend/src/backend.rs
application/note/src/file.rs
application/note/src/window.rs
ui/common/args.c

index 2375dbf10116fb9b06ec2926e92968b49840e060..9179d12e097d491de828534abbe8d71fed6f118e 100644 (file)
@@ -660,7 +660,7 @@ impl BackendHandle {
         let _ = self.tx.send(cmd);
     }
 
-    pub fn rename_note<F>(&self, note_id: i32, nodename: String, callback: F)
+    pub fn rename_note<F>(&self, note_id: i32, nodename: String, title: String, callback: F)
     where F: FnOnce(Result<UpdateResult, DbErr>) + Send + 'static {
         let bhandle = self.clone();
         let cmd = Box::pin(async move {
@@ -675,6 +675,7 @@ impl BackendHandle {
 
             let result = Note::update_many()
                 .col_expr(Column::Nodename, Expr::value(nodename.clone()))
+                .col_expr(Column::Title, Expr::value(title.clone()))
                 .filter(Column::NoteId.eq(note_id))
                 .exec(&bhandle.backend.db).await;
 
index 5f02f53843e223f31412562f6a38e7cfee3dce0c..ef3ec5543ef5556eee7a03d66ff41d68fc7ec73d 100644 (file)
@@ -26,9 +26,9 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 use std::mem;
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
 use std::rc::Rc;
-use backend::backend::{BackendHandle, NoteId, OpenExternResult};
+use backend::backend::{BackendHandle, BroadcastMessage, NoteId, NoteTitleUpdate, OpenExternResult};
 use ui_rs::{action, doc_cast, ui_actions, UiModel};
 use ui_rs::ui::*;
 use crate::AppStates;
@@ -127,6 +127,28 @@ impl FileNote {
         self.save_note();
     }
 
+    #[action]
+    pub fn note_nodename_change(&mut self, event: &ActionEvent) {
+        if event.set {
+            return;
+        }
+        let nodename = self.note_nodename.get();
+        self.update_title(nodename.as_str(), true);
+    }
+
+    pub fn update_title(&mut self, s: &str, notify: bool) {
+        let title = generate_title(s).unwrap_or("file");
+
+        if notify {
+            let update = NoteTitleUpdate {
+                collection_id: self.collection_id,
+                note_id: self.id.clone(),
+                title: title.to_string(),
+            };
+            _ = self.backend.as_ref().send_broadcast(BroadcastMessage::NoteTitleUpdate(update));
+        }
+    }
+
     #[action]
     pub fn notebook_view_changed(&mut self, event: &mut ActionEvent) {
         // TODO: duplicated code in note.rs
@@ -161,10 +183,14 @@ impl NoteViewModel for FileNote {
             // nothing has changed
             return;
         }
+
+        // TODO: "file" is also used in update_title() and needs to be configured somewhere
+        let new_title = generate_title(&nodename).unwrap_or("file").to_string();
+
         mem::swap(&mut self.nodename, &mut nodename);
 
         let proxy = doc.doc_proxy();
-        self.backend.rename_note(note_id, self.nodename.clone(), |result|{
+        self.backend.rename_note(note_id, self.nodename.clone(), new_title, |result|{
             proxy.call_mainthread(move |_doc, note|{
                 match result {
                     Ok(updated) => {
@@ -181,4 +207,16 @@ impl NoteViewModel for FileNote {
         });
 
     }
-}
\ No newline at end of file
+}
+
+fn generate_title(s: &str) -> Option<&str> {
+    if !s.trim().is_empty() {
+        let name = Path::new(s)
+            .file_stem()
+            .and_then(|s| s.to_str())
+            .unwrap_or(s);
+        return Some(name);
+    }
+
+    None
+}
index 6c48d819cfcc409a663e9d67259f70f8317165fb..2b5b01976650f36ce7330f6656344d417b2450c2 100644 (file)
@@ -303,6 +303,7 @@ pub fn create_window(app: &App, ctx: &AppContext<MainWindow>) -> UiObject<MainWi
                                         t.hexpand(true);
                                         t.hfill(true);
                                         t.varname("note_nodename");
+                                        t.onchange_action("note_nodename_change");
                                     });
                                     obj.button(|b|{
                                         b.label("Open");
index 8c1e2b4027c13f9dbee4d61c17a0ae8493c64681..b9bb8f0743495cae399dbf5045bc9219ad327a9e 100644 (file)
@@ -2610,7 +2610,7 @@ void ui_textfield_args_set_onactivate_action(UiTextFieldArgs *args, const char *
 }
 
 void ui_textfield_args_set_onchange_action(UiTextFieldArgs *args, const char *action) {
-    args->onchange_action = action;
+    args->onchange_action = strdup(action);
 }
 
 void ui_textfield_args_set_varname(UiTextFieldArgs *args, const char *varname) {