[gnote] Move search entry to main window



commit c3939a25d1e39592f24ecd2bdc4690f53bf4f425
Author: Aurimas Äernius <aurisc4 gmail com>
Date:   Sun Feb 17 22:55:22 2013 +0200

    Move search entry to main window
    
    Make search entry part of toolbar in main window, rather then part of
    search widget.

 src/recentchanges.cpp     |   77 ++++++++++++++++++++++++++++++++---
 src/recentchanges.hpp     |    7 +++
 src/searchnoteswidget.cpp |   98 ++-------------------------------------------
 src/searchnoteswidget.hpp |   11 +----
 4 files changed, 84 insertions(+), 109 deletions(-)
---
diff --git a/src/recentchanges.cpp b/src/recentchanges.cpp
index a5ab46b..8bbb37f 100644
--- a/src/recentchanges.cpp
+++ b/src/recentchanges.cpp
@@ -25,6 +25,7 @@
 
 #include <boost/bind.hpp>
 #include <glibmm/i18n.h>
+#include <gtkmm/alignment.h>
 #include <gtkmm/image.h>
 #include <gtkmm/stock.h>
 
@@ -35,6 +36,7 @@
 #include "notemanager.hpp"
 #include "notewindow.hpp"
 #include "recentchanges.hpp"
+#include "sharp/string.hpp"
 
 
 namespace gnote {
@@ -45,6 +47,7 @@ namespace gnote {
     , m_search_notes_widget(m)
     , m_content_vbox(false, 0)
     , m_mapped(false)
+    , m_entry_changed_timeout(NULL)
   {
     set_default_size(450,400);
     set_resizable(true);
@@ -62,7 +65,7 @@ namespace gnote {
       .connect(sigc::mem_fun(*this, &NoteRecentChanges::on_open_note_new_window));
 
     Gtk::Box *toolbar = make_toolbar();
-    m_content_vbox.pack_start(*toolbar, false, false, 0);
+    m_content_vbox.pack_start(*toolbar, false, false, 5);
     m_content_vbox.pack_start(m_embed_box, true, true, 0);
     m_embed_box.show();
     m_content_vbox.show ();
@@ -83,6 +86,9 @@ namespace gnote {
     while(m_embedded_widgets.size()) {
       unembed_widget(**m_embedded_widgets.begin());
     }
+    if(m_entry_changed_timeout) {
+      delete m_entry_changed_timeout;
+    }
   }
 
   Gtk::Box *NoteRecentChanges::make_toolbar()
@@ -104,6 +110,17 @@ namespace gnote {
     button->show_all();
     toolbar->pack_start(*button, false, false);
 
+    m_search_entry.set_activates_default(false);
+    m_search_entry.set_size_request(300);
+    m_search_entry.signal_changed()
+      .connect(sigc::mem_fun(*this, &NoteRecentChanges::on_entry_changed));
+    m_search_entry.signal_activate()
+      .connect(sigc::mem_fun(*this, &NoteRecentChanges::on_entry_activated));
+    Gtk::Alignment *alignment = manage(new Gtk::Alignment(Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 0));
+    alignment->add(m_search_entry);
+    alignment->show_all();
+    toolbar->pack_start(*alignment, true, true);
+
     toolbar->show();
     return toolbar;
   }
@@ -215,15 +232,14 @@ namespace gnote {
     }
     std::vector<Gtk::Widget*> embedded = m_embed_box.get_children();
     if(embedded.size() == 1 && embedded.front() == &m_search_notes_widget) {
-      m_search_notes_widget.focus_search_entry();
+      m_search_entry.grab_focus();
     }
     MainWindow::on_show();
   }
 
   void NoteRecentChanges::set_search_text(const std::string & value)
   {
-    //TODO: handle non-search embedded widgets
-    m_search_notes_widget.set_search_text(value);
+    m_search_entry.set_text(value);
   }
 
   void NoteRecentChanges::embed_widget(utils::EmbeddableWidget & widget)
@@ -272,8 +288,7 @@ namespace gnote {
       m_embed_box.pack_start(wid, true, true, 0);
       widget.foreground();
       wid.show();
-      m_all_notes_button->set_sensitive(
-        dynamic_cast<SearchNotesWidget*>(&widget) != &m_search_notes_widget);
+      update_toolbar(widget);
       on_embedded_name_changed(widget.get_name());
       m_current_embedded_name_slot = widget.signal_name_changed
         .connect(sigc::mem_fun(*this, &NoteRecentChanges::on_embedded_name_changed));
@@ -333,5 +348,55 @@ namespace gnote {
     set_title(title);
   }
 
+  void NoteRecentChanges::on_entry_changed()
+  {
+    if(m_entry_changed_timeout == NULL) {
+      m_entry_changed_timeout = new utils::InterruptableTimeout();
+      m_entry_changed_timeout->signal_timeout
+        .connect(sigc::mem_fun(*this, &NoteRecentChanges::entry_changed_timeout));
+    }
+
+    std::string search_text = get_search_text();
+    if(search_text.empty()) {
+      m_search_notes_widget.perform_search(search_text);
+    }
+    else {
+      m_entry_changed_timeout->reset(500);
+    }
+  }
+
+  void NoteRecentChanges::on_entry_activated()
+  {
+    if(m_entry_changed_timeout) {
+      m_entry_changed_timeout->cancel();
+    }
+
+    entry_changed_timeout();
+  }
+
+  void NoteRecentChanges::entry_changed_timeout()
+  {
+    std::string search_text = get_search_text();
+    if(search_text.empty()) {
+      return;
+    }
+
+    m_search_notes_widget.perform_search(search_text);
+  }
+
+  std::string NoteRecentChanges::get_search_text()
+  {
+    std::string text = m_search_entry.get_text();
+    text = sharp::string_trim(text);
+    return text;
+  }
+
+  void NoteRecentChanges::update_toolbar(utils::EmbeddableWidget & widget)
+  {
+    bool search = dynamic_cast<SearchNotesWidget*>(&widget) == &m_search_notes_widget;
+    m_all_notes_button->set_sensitive(!search);
+    m_search_entry.set_visible(search);
+  }
+
 }
 
diff --git a/src/recentchanges.hpp b/src/recentchanges.hpp
index 82d62d5..0082ae8 100644
--- a/src/recentchanges.hpp
+++ b/src/recentchanges.hpp
@@ -69,15 +69,22 @@ private:
   utils::EmbeddableWidget *currently_embedded();
   Gtk::Box *make_toolbar();
   void on_embedded_name_changed(const std::string & name);
+  void on_entry_changed();
+  void on_entry_activated();
+  void entry_changed_timeout();
+  std::string get_search_text();
+  void update_toolbar(utils::EmbeddableWidget & widget);
 
   NoteManager        &m_note_manager;
   SearchNotesWidget   m_search_notes_widget;
   Gtk::VBox           m_content_vbox;
   Gtk::VBox           m_embed_box;
   Gtk::Button        *m_all_notes_button;
+  Gtk::SearchEntry    m_search_entry;
   std::list<utils::EmbeddableWidget*> m_embedded_widgets;
   bool                m_mapped;
   sigc::connection    m_current_embedded_name_slot;
+  utils::InterruptableTimeout *m_entry_changed_timeout;
 };
 
 
diff --git a/src/searchnoteswidget.cpp b/src/searchnoteswidget.cpp
index 9702283..1ddb616 100644
--- a/src/searchnoteswidget.cpp
+++ b/src/searchnoteswidget.cpp
@@ -53,7 +53,6 @@ Glib::RefPtr<Gdk::Pixbuf> SearchNotesWidget::get_note_icon()
 SearchNotesWidget::SearchNotesWidget(NoteManager & m)
   : Gtk::VBox(false, 0)
   , m_accel_group(Gtk::AccelGroup::create())
-  , m_entry_changed_timeout(NULL)
   , m_no_matches_box(NULL)
   , m_manager(m)
   , m_clickX(0), m_clickY(0)
@@ -64,18 +63,6 @@ SearchNotesWidget::SearchNotesWidget(NoteManager & m)
 {
   make_actions();
 
-  m_search_entry.signal_changed()
-    .connect(sigc::mem_fun(*this, &SearchNotesWidget::on_entry_changed));
-  m_search_entry.set_activates_default(false);
-  m_search_entry.signal_activate()
-    .connect(sigc::mem_fun(*this, &SearchNotesWidget::on_entry_activated));
-
-  m_search_entry.set_size_request(300);
-  Gtk::Alignment *search_box = manage(new Gtk::Alignment(Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 0));
-  search_box->set_border_width(6);
-  search_box->add(m_search_entry);
-  search_box->show_all();
-
   // Notebooks Pane
   Gtk::Widget *notebooksPane = Gtk::manage(make_notebooks_pane());
   notebooksPane->show();
@@ -100,7 +87,6 @@ SearchNotesWidget::SearchNotesWidget(NoteManager & m)
 
   restore_position();
 
-  pack_start(*search_box, false, false, 0);
   pack_start(m_hpaned, true, true, 0);
 
   // Update on changes to notes
@@ -118,36 +104,10 @@ SearchNotesWidget::SearchNotesWidget(NoteManager & m)
     .connect(sigc::mem_fun(*this, &SearchNotesWidget::on_note_removed_from_notebook));
   notebooks::NotebookManager::obj().signal_note_pin_status_changed
     .connect(sigc::mem_fun(*this, &SearchNotesWidget::on_note_pin_status_changed));
-
-  // Set the focus chain for the top-most containers
-  std::vector<Gtk::Widget*> focus_chain;
-  focus_chain.push_back(search_box);
-  focus_chain.push_back(&m_hpaned);
-  set_focus_chain(focus_chain);
-
-  // Set focus chain for sub widgets of first top-most container
-  focus_chain.clear();
-  focus_chain.push_back(&m_search_entry);
-  focus_chain.push_back(&m_matches_window);
-  search_box->set_focus_chain(focus_chain);
-
-  // set focus chain for sub widgets of second top-most container
-  focus_chain.clear();
-  focus_chain.push_back(&m_matches_window);
-  focus_chain.push_back(notebooksPane);
-  m_hpaned.set_focus_chain(focus_chain);
-
-  // get back to the beginning of the focus chain
-  focus_chain.clear();
-  focus_chain.push_back(m_tree);
-  m_matches_window.set_focus_chain(focus_chain);
 }
 
 SearchNotesWidget::~SearchNotesWidget()
 {
-  if(m_entry_changed_timeout) {
-    delete m_entry_changed_timeout;
-  }
   if(m_note_list_context_menu) {
     delete m_note_list_context_menu;
   }
@@ -182,56 +142,13 @@ void SearchNotesWidget::make_actions()
   m_delete_notebook_action->signal_activate().connect(sigc::mem_fun(*this, 
&SearchNotesWidget::on_delete_notebook));
 }
 
-void SearchNotesWidget::focus_search_entry()
+void SearchNotesWidget::perform_search(const std::string & search_text)
 {
-  m_search_entry.grab_focus();
-}
-
-void SearchNotesWidget::on_entry_changed()
-{
-  if(m_entry_changed_timeout == NULL) {
-    m_entry_changed_timeout = new utils::InterruptableTimeout();
-    m_entry_changed_timeout->signal_timeout
-      .connect(sigc::mem_fun(*this, &SearchNotesWidget::entry_changed_timeout));
-  }
-
-  if(get_search_text().empty()) {
-    m_search_entry.set_sensitive(false);
-    perform_search();
-  }
-  else {
-    m_entry_changed_timeout->reset(500);
-    m_search_entry.set_sensitive(true);
-  }
-
   restore_matches_window();
-}
-
-void SearchNotesWidget::on_entry_activated()
-{
-  if(m_entry_changed_timeout) {
-    m_entry_changed_timeout->cancel();
-  }
-
-  entry_changed_timeout();
-}
-
-void SearchNotesWidget::entry_changed_timeout()
-{
-  if(get_search_text().empty()) {
-    return;
-  }
-
+  m_search_text = search_text;
   perform_search();
 }
 
-std::string SearchNotesWidget::get_search_text()
-{
-  std::string text = m_search_entry.get_text();
-  text = sharp::string_trim(text);
-  return text;
-}
-
 void SearchNotesWidget::perform_search()
 {
   // For some reason, the matches column must be rebuilt
@@ -239,7 +156,7 @@ void SearchNotesWidget::perform_search()
   remove_matches_column();
   Search search(m_manager);
 
-  std::string text = get_search_text();
+  std::string text = m_search_text;
   if(text.empty()) {
     m_current_matches.clear();
     m_store_filter->refilter();
@@ -866,7 +783,7 @@ Note::Ptr SearchNotesWidget::get_note(const Gtk::TreePath & p)
 
 bool SearchNotesWidget::filter_by_search(const Note::Ptr & note)
 {
-  if(get_search_text().empty()) {
+  if(m_search_text.empty()) {
     return true;
   }
 
@@ -1365,13 +1282,6 @@ Gtk::Window *SearchNotesWidget::get_owning_window()
   return dynamic_cast<Gtk::Window*>(widget);
 }
 
-void SearchNotesWidget::set_search_text(const std::string & value)
-{
-  if(!value.empty()) {
-    m_search_entry.set_text(value);
-  }
-}
-
 void SearchNotesWidget::on_note_added_to_notebook(const Note &,
                                                   const notebooks::Notebook::Ptr &)
 {
diff --git a/src/searchnoteswidget.hpp b/src/searchnoteswidget.hpp
index bf96a89..5653952 100644
--- a/src/searchnoteswidget.hpp
+++ b/src/searchnoteswidget.hpp
@@ -29,7 +29,6 @@
 #include <gtkmm/liststore.h>
 #include <gtkmm/paned.h>
 #include <gtkmm/scrolledwindow.h>
-#include <gtkmm/searchentry.h>
 #include <sigc++/sigc++.h>
 
 #include "utils.hpp"
@@ -50,20 +49,15 @@ public:
   virtual void foreground();
   virtual void background();
 
-  void focus_search_entry();
+  void perform_search(const std::string & search_text);
   void select_all_notes_notebook();
   void new_note();
   void delete_selected_notes();
-  void set_search_text(const std::string & value);
 
   sigc::signal<void, const Note::Ptr &> signal_open_note;
   sigc::signal<void, const Note::Ptr &> signal_open_note_new_window;
 private:
   void make_actions();
-  void on_entry_changed();
-  void on_entry_activated();
-  void entry_changed_timeout();
-  std::string get_search_text();
   void perform_search();
   void restore_matches_window();
   Gtk::Widget *make_notebooks_pane();
@@ -153,9 +147,7 @@ private:
   Glib::RefPtr<Gtk::Action> m_delete_note_action;
   Glib::RefPtr<Gtk::Action> m_delete_notebook_action;
   RecentSearchColumnTypes m_find_combo_columns;
-  Gtk::SearchEntry m_search_entry;
   Gtk::HPaned m_hpaned;
-  utils::InterruptableTimeout *m_entry_changed_timeout;
   Gtk::ScrolledWindow m_matches_window;
   Gtk::HBox *m_no_matches_box;
   notebooks::NotebooksTreeView *m_notebooksTree;
@@ -174,6 +166,7 @@ private:
   Gtk::Menu *m_note_list_context_menu;
   Gtk::Menu *m_notebook_list_context_menu;
   bool m_initial_position_restored;
+  std::string m_search_text;
 
   static Glib::RefPtr<Gdk::Pixbuf> get_note_icon();
 };


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