[gnome-news/wip/gbsneto/improvements: 1/12] search: implement search
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-news/wip/gbsneto/improvements: 1/12] search: implement search
- Date: Sun, 6 Mar 2016 16:15:29 +0000 (UTC)
commit 24e602995db7acc8dfa9c54428ea4a6d0934e8c5
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sat Mar 5 14:16:23 2016 -0300
search: implement search
This doesn't quite work yet, probably because of an
error in Sparql query. But we finally have something
to work on.
gnomenews/toolbar.py | 19 +++++++++++++++++--
gnomenews/view.py | 31 ++++++++++++++++++++++++++++++-
gnomenews/window.py | 32 +++++++++++++++++++++++++++++++-
3 files changed, 78 insertions(+), 4 deletions(-)
---
diff --git a/gnomenews/toolbar.py b/gnomenews/toolbar.py
index 32eb4c3..287edef 100644
--- a/gnomenews/toolbar.py
+++ b/gnomenews/toolbar.py
@@ -16,6 +16,8 @@
from gi.repository import Gtk, GObject, GLib
+from gettext import gettext as _
+
from gnomenews import log
import logging
logger = logging.getLogger(__name__)
@@ -60,6 +62,11 @@ class Toolbar(GObject.GObject):
self._back_button.connect('clicked', self.window.on_back_button_clicked)
self._search_button = self._ui.get_object('search-button')
+ self._search_button.bind_property('active',
+ self.window.search_bar, 'search-mode-enabled',
+ GObject.BindingFlags.BIDIRECTIONAL)
+
+ self.window.search_entry.connect('search-changed', self._search_changed)
self.set_state(ToolbarState.MAIN)
@@ -70,6 +77,15 @@ class Toolbar(GObject.GObject):
self.header_bar.set_custom_title(self._stack_switcher)
@log
+ def _search_changed(self, entry, data=None):
+ if entry.get_text_length() > 0:
+ self.set_state(ToolbarState.SEARCH_VIEW)
+ self.header_bar.set_title(_("Searching for %s") % entry.get_text())
+ else:
+ self.set_state(ToolbarState.MAIN)
+ self.header_bar.set_title(_("News"))
+
+ @log
def set_stack(self, stack):
self._stack_switcher.set_stack(stack)
@@ -98,7 +114,6 @@ class Toolbar(GObject.GObject):
else:
self.reset_header_title()
- self._search_button.set_visible(self._state != ToolbarState.SEARCH_VIEW)
self._back_button.set_visible(self._state == ToolbarState.CHILD_VIEW)
self.add_toggle_button.set_visible(self._state != ToolbarState.CHILD_VIEW)
@@ -106,7 +121,7 @@ class Toolbar(GObject.GObject):
def _add_new_feed(self, button):
new_url = self.new_url.get_text()
self.window.tracker.add_channel(new_url)
- self.new_url.set_text("")
+ self.new_url.set_text('')
self.add_popover.hide()
@log
diff --git a/gnomenews/view.py b/gnomenews/view.py
index 4efa573..1c1f092 100644
--- a/gnomenews/view.py
+++ b/gnomenews/view.py
@@ -142,7 +142,6 @@ class GenericFeedsView(Gtk.Stack):
if new_feed['url'] not in self.feeds:
logger.info("Adding channel %s" % new_feed['url'])
self._add_new_feed(new_feed)
- self.feeds[new_feed['url']] = new_feed
@log
def setup_layout(self):
@@ -311,5 +310,35 @@ class StarredView(GenericFeedsView):
class SearchView(GenericFeedsView):
+
+ __gproperties__ = {
+ 'search-query': (str, 'Query', 'Search query', "", GObject.ParamFlags.READWRITE)
+ }
+
def __init__(self, tracker):
GenericFeedsView.__init__(self, tracker, 'search')
+
+ self.search_query = ""
+
+ @log
+ def do_get_property(self, prop):
+ if prop.name == 'search-query':
+ return self.search_query
+ else:
+ raise AttributeError('Unknown property %s' % prop.name)
+
+ @log
+ def do_set_property(self, prop, value):
+ if prop.name == 'search-query':
+ self.search_query = value
+ self.update_search()
+ else:
+ raise AttributeError('Unknown property %s' % prop.name)
+
+ @log
+ def update_search(self):
+ [self.flowbox.remove(old_feed) for old_feed in self.flowbox.get_children()]
+
+ posts = self.tracker.get_text_matches(self.search_query, 10)
+ [self._add_a_new_preview(post) for post in posts]
+ self.show_all()
diff --git a/gnomenews/window.py b/gnomenews/window.py
index bbc4f4d..a6f2d57 100644
--- a/gnomenews/window.py
+++ b/gnomenews/window.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from gi.repository import Gtk, Gio, GLib
+from gi.repository import Gtk, Gio, GLib, GObject
from gettext import gettext as _
from gnomenews.toolbar import Toolbar, ToolbarState
@@ -64,6 +64,7 @@ class Window(Gtk.ApplicationWindow):
self.maximize()
# Save changes to window size
+ self.connect("key-press-event", self._on_key_press_event)
self.connect("window-state-event", self._on_window_state_event)
self.configure_event_handler = self.connect("configure-event", self._on_configure_event)
@@ -74,6 +75,9 @@ class Window(Gtk.ApplicationWindow):
with self.handler_block(self.configure_event_handler):
GLib.idle_add(self._store_window_size_and_position, widget, priority=GLib.PRIORITY_LOW)
+ def _on_key_press_event(self, widget, event):
+ return self.search_bar.handle_event(event)
+
def _store_window_size_and_position(self, widget):
size = widget.get_size()
self.settings.set_value('window-size', GLib.Variant('ai', [size[0], size[1]]))
@@ -98,6 +102,12 @@ class Window(Gtk.ApplicationWindow):
# Action bar
self.action_bar = self._ui.get_object('action_bar')
+ # Search bar
+ self.search_bar = self._ui.get_object('search_bar')
+ self.search_entry = self._ui.get_object('search_entry')
+
+ self.search_entry.connect('search-changed', self.on_search_changed)
+
# Header bar
self.toolbar = Toolbar(self)
self.set_titlebar(self.toolbar.header_bar)
@@ -130,6 +140,12 @@ class Window(Gtk.ApplicationWindow):
self.toolbar.set_stack(self._stack)
self._stack.set_visible_child(self.views[0])
+ # Search view
+ self.search_view = view.SearchView(self.tracker)
+
+ self.search_entry.bind_property('text', self.search_view, 'search-query',
+ GObject.BindingFlags.BIDIRECTIONAL)
+
self.tracker.connect('items-updated', self.views[0].update_new_items)
self.tracker.connect('feeds-updated', self.views[1].update_feeds)
@@ -149,3 +165,17 @@ class Window(Gtk.ApplicationWindow):
self.toolbar.set_state(ToolbarState.MAIN)
self.feed_view.disconnect(self.tracker.post_read_signal)
self.feed_view = None
+
+ @log
+ def on_search_changed(self, entry, data=None):
+ if entry.get_text_length() > 0:
+ # Add the view if it's not added yet
+ if self.search_view not in self._stack.get_children():
+ self._stack.previous_view = self._stack.get_visible_child()
+ self._stack.add_named(self.search_view, 'search_view')
+
+ self._stack.set_visible_child(self.search_view)
+ else:
+ self._stack.set_visible_child(self._stack.previous_view)
+ self._stack.previous_view = None
+ self._stack.remove(self.search_view)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]