[gnote] Optimize note creation, renaming and deletion



commit a2c2594be8eeeef92afb21cd872f186fb9ddb201
Author: Debarshi Ray <debarshir src gnome org>
Date:   Sun Oct 2 02:36:37 2011 +0300

    Optimize note creation, renaming and deletion
    
    With a large number of notes, Gnote becomes very slow at creating,
    renaming and deleting notes.
    
    First, there is no need to throw away the whole trie and re-create it
    from scratch when a new note is being created. The title of the new
    note can be added to the existing trie.
    
    Secondly there is no need to throw away and re-create the
    Gtk::ListStore within the recent changes window from scratch when a
    note has been created, renamed or deleted. Instead, the existing model
    can be edited.
    
    Fixes: https://bugzilla.gnome.org/660663

 src/notemanager.cpp   |   11 +++++++-
 src/recentchanges.cpp |   59 ++++++++++++++++++++++++++++++++++++++++++++-----
 src/recentchanges.hpp |    7 +++++-
 3 files changed, 68 insertions(+), 9 deletions(-)
---
diff --git a/src/notemanager.cpp b/src/notemanager.cpp
index a354ccd..a92991c 100644
--- a/src/notemanager.cpp
+++ b/src/notemanager.cpp
@@ -58,6 +58,7 @@ namespace gnote {
     TrieController(NoteManager &);
     ~TrieController();
 
+    void add_note(const Note::Ptr & note);
     void update();
     TrieTree<Note::WeakPtr> *title_trie() const
       {
@@ -747,9 +748,9 @@ namespace gnote {
     delete m_title_trie;
   }
 
-  void TrieController::on_note_added (const Note::Ptr & )
+  void TrieController::on_note_added (const Note::Ptr & note)
   {
-    update ();
+    add_note (note);
   }
 
   void TrieController::on_note_deleted (const Note::Ptr & )
@@ -762,6 +763,12 @@ namespace gnote {
     update ();
   }
 
+  void TrieController::add_note(const Note::Ptr & note)
+  {
+    m_title_trie->add_keyword (note->get_title(), note);
+    m_title_trie->compute_failure_graph();
+  }
+
   void TrieController::update ()
   {
     if(m_title_trie) {
diff --git a/src/recentchanges.cpp b/src/recentchanges.cpp
index 6eeb948..83c0ffa 100644
--- a/src/recentchanges.cpp
+++ b/src/recentchanges.cpp
@@ -158,8 +158,8 @@ namespace gnote {
     m_status_bar.show();
 
     // Update on changes to notes
-    m.signal_note_deleted.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_notes_changed));
-    m.signal_note_added.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_notes_changed));
+    m.signal_note_deleted.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_note_deleted));
+    m.signal_note_added.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_note_added));
     m.signal_note_renamed.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_note_renamed));
     m.signal_note_saved.connect(sigc::mem_fun(*this, &NoteRecentChanges::on_note_saved));
 
@@ -398,6 +398,42 @@ namespace gnote {
     m_tree->append_column (*change);
   }
 
+  void NoteRecentChanges::add_note(const Note::Ptr & note)
+  {
+    std::string nice_date =
+      utils::get_pretty_print_date(note->change_date(), true);
+    Gtk::TreeIter iter = m_store->append();
+    iter->set_value(m_column_types.icon, s_note_icon);
+    iter->set_value(m_column_types.title, note->get_title());
+    iter->set_value(m_column_types.change_date, nice_date);
+    iter->set_value(m_column_types.note, note);
+  }
+
+  void NoteRecentChanges::delete_note(const Note::Ptr & note)
+  {
+    Gtk::TreeModel::Children rows = m_store->children();
+
+    for (Gtk::TreeModel::iterator iter = rows.begin();
+         rows.end() != iter; iter++) {
+      if (note == iter->get_value(m_column_types.note)) {
+        m_store->erase(iter);
+        break;
+      }
+    }
+  }
+
+  void NoteRecentChanges::rename_note(const Note::Ptr & note)
+  {
+    Gtk::TreeModel::Children rows = m_store->children();
+
+    for (Gtk::TreeModel::iterator iter = rows.begin();
+         rows.end() != iter; iter++) {
+      if (note == iter->get_value(m_column_types.note)) {
+        iter->set_value(m_column_types.title, note->get_title());
+        break;
+      }
+    }
+  }
 
   void NoteRecentChanges::update_results()
   {
@@ -712,14 +748,25 @@ namespace gnote {
   }
 
 
-  void NoteRecentChanges::on_notes_changed(const Note::Ptr &)
+  void NoteRecentChanges::on_case_sensitive_toggled()
   {
-    update_results ();
+    perform_search ();
   }
 
-  void NoteRecentChanges::on_note_renamed(const Note::Ptr&, const std::string&)
+  void NoteRecentChanges::on_note_added(const Note::Ptr & note)
   {
-    update_results ();
+    add_note(note);
+  }
+
+  void NoteRecentChanges::on_note_deleted(const Note::Ptr & note)
+  {
+    delete_note(note);
+  }
+
+  void NoteRecentChanges::on_note_renamed(const Note::Ptr & note,
+                                          const std::string &)
+  {
+    rename_note(note);
   }
 
   void NoteRecentChanges::on_note_saved(const Note::Ptr&)
diff --git a/src/recentchanges.hpp b/src/recentchanges.hpp
index f906d19..70a6bf0 100644
--- a/src/recentchanges.hpp
+++ b/src/recentchanges.hpp
@@ -78,6 +78,9 @@ private:
   Gtk::MenuBar *create_menu_bar ();
   Gtk::Widget  *make_notebooks_pane();
   void make_recent_tree ();
+  void add_note(const Note::Ptr & note);
+  void delete_note(const Note::Ptr & note);
+  void rename_note(const Note::Ptr & note);
   void update_results();
   void select_notes(const Note::List &);
   static void scroll_to_iter (Gtk::TreeView & tree, const Gtk::TreeIter & iter);
@@ -91,7 +94,9 @@ private:
   bool filter_tags(const Gtk::TreeIter & );
   bool filter_by_tag (const Note::Ptr &);
   bool filter_by_search(const Note::Ptr &);
-  void on_notes_changed(const Note::Ptr &);
+  void on_case_sensitive_toggled();
+  void on_note_added(const Note::Ptr & note);
+  void on_note_deleted(const Note::Ptr & note);
   void on_note_renamed(const Note::Ptr&, const std::string&);
   void on_note_saved(const Note::Ptr&);
   void on_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext> &,



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