From 9b60aeea042273bde435eb9b4f5d96d2090766f6 Mon Sep 17 00:00:00 2001 From: Max Usachev Date: Sat, 19 Jun 2010 10:15:55 +0300 Subject: [PATCH] finished work on contacts search --- controller.py | 8 +++++++- database/SQLite.py | 15 +++++++++++++++ ui/hildon_ui.py | 43 +++++++++++++++++++++++++++++-------------- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/controller.py b/controller.py index 63bacfa..b59af1b 100644 --- a/controller.py +++ b/controller.py @@ -62,10 +62,16 @@ class MeabookController: """Gets all peoples.""" # FIXME: read field names from Config - files_dict = self.model.get_files(['cn']) + files_dict = self.model.get_files(['cn'], pattern=pattern) return [(files_dict[internal_name]['cn'], internal_name, 'f') for \ internal_name in files_dict] + def get_all_files_by_pattern(self, pattern): + """Gets all peoples matched pattern.""" + + return [(name, internal_name, 'f') for internal_name, name in \ + self.model.get_files_by_pattern(pattern)] + def get_fields(self): """Returns all exists fields from model.""" diff --git a/database/SQLite.py b/database/SQLite.py index 3b10611..a38a706 100644 --- a/database/SQLite.py +++ b/database/SQLite.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + import os import sqlite3 @@ -169,6 +173,17 @@ class SQLite: items_dict[data_id][field_name] = field_value return items_dict + def get_files_by_pattern(self, pattern): + """Returns list of all files, matched pattern string.""" + + if not pattern: + return [] + execute = self.conn.execute + field_id = execute("SELECT id FROM fields WHERE name=?", \ + ('cn',)).fetchone()[0] + return execute("SELECT id, value FROM data WHERE value LIKE '%%%s%%' \ + AND field_id=? LIMIT 50" % pattern, (field_id,)).fetchall() + def get_entry(self, _id): """Returns full entry by it id.""" diff --git a/ui/hildon_ui.py b/ui/hildon_ui.py index ea7278b..52f88c5 100644 --- a/ui/hildon_ui.py +++ b/ui/hildon_ui.py @@ -9,8 +9,12 @@ from gettext import gettext as _ from meabook.ui.ui import MeabookUI +TYPE_FOLDER = 'd' +TYPE_FILE = 'f' + + def create_button(title, value): - """Create HildonButton.""" + """Creates HildonButton.""" button = hildon.Button(gtk.HILDON_SIZE_AUTO | \ gtk.HILDON_SIZE_FINGER_HEIGHT, \ @@ -21,6 +25,8 @@ def create_button(title, value): def create_menu_button(title): + """Creates Hildon menu button.""" + return hildon.Button(gtk.HILDON_SIZE_AUTO, \ hildon.BUTTON_ARRANGEMENT_HORIZONTAL, title) @@ -53,13 +59,13 @@ class HildonMeabook(MeabookUI): widgets_box = gtk.VBox() self.search_entry = hildon.Entry(gtk.HILDON_SIZE_AUTO) - self.search_entry.set_placeholder(_('Enter search text here')) # connect signals settings_button.connect('clicked', self.show_settings_dialog_cb) about_button.connect('clicked', self.show_about_dialog_cb) import_button.connect('clicked', self.show_import_dialog_cb) self.handler = self.selector.connect('changed', self.select_item_cb) + self.search_entry.connect('key-release-event', self.search_item_cb) # packing widgets widgets_box.pack_start(self.selector, expand=True) @@ -80,10 +86,12 @@ class HildonMeabook(MeabookUI): gtk.main_iteration(False) def _update_title(self, title): + """Set window title text.""" + if title is not None: self.window.set_title(title) - def _set_selector_content(self, selector, handler, items): + def _set_selector_content(self, selector, handler, items=[]): """Updates selector content.""" # temporary block handler @@ -93,8 +101,8 @@ class HildonMeabook(MeabookUI): # model: name, internal_name, type model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT, \ gobject.TYPE_STRING) - for name, internal_name, item_type in items: - model.append((name, internal_name, item_type)) + for item in items: + model.append(item) if selector.get_num_columns(): selector.remove_column(0) selector.append_text_column(model, False) @@ -204,7 +212,6 @@ class HildonMeabook(MeabookUI): "foreground='white' size='small'>Max Usachev | maxusachev@gmail.com" \ "\n" % version) - dialog.vbox.add(info_label) dialog.vbox.show_all() dialog.run() @@ -265,9 +272,10 @@ class HildonMeabook(MeabookUI): self._set_selector_content(self.selector, self.handler, \ self.controller.get_all_subfolders()) else: + self.search_entry.set_text('') + self.search_entry.set_placeholder(_('Enter search text here')) self.search_entry.show() - #self._set_selector_content(self.selector, self.handler, \ - # self.controller.get_all_files()) + self._set_selector_content(self.selector, self.handler) def select_item_cb(self, widget, column): """ @@ -275,13 +283,20 @@ class HildonMeabook(MeabookUI): Opens new StackableWindow with new content. """ - selected_item_index = widget.get_active(0) - _iter = widget.get_model(0)[selected_item_index] - if _iter[2] == 'd': - self._show_items_dialog(_iter[0], self.controller.get_items(\ - _iter[1])) + item_name, internal_name, item_type = \ + widget.get_model(0)[widget.get_active(0)] + if item_type == TYPE_FOLDER: + self._show_items_dialog(item_name, self.controller.get_items( \ + internal_name)) else: - self._show_item_dialog(_iter[0], _iter[1]) + self._show_item_dialog(item_name, internal_name) + + def search_item_cb(self, widget, event): + """Search items from database.""" + + self._set_selector_content(self.selector, self.handler, \ + self.controller.get_all_files_by_pattern(widget.get_text())) + widget.grab_focus() -- 1.7.9.5