Search bar completion
svn: r6607
This commit is contained in:
parent
1e3b85f27f
commit
707c4207a9
@ -1,3 +1,12 @@
|
||||
2006-05-10 Don Allingham <don@gramps-project.org>
|
||||
* src/ViewManager.py: remove debug statement
|
||||
* src/PeopleModel.py: use SearchFilter
|
||||
* src/DisplayModels.py: handle search filter
|
||||
* src/PageView.py: search bar support
|
||||
* src/Filters/_SearchBar.py: added
|
||||
* src/Filters/_SearchFilter.py: remove SearchFilter to separate file
|
||||
* src/Filters/__init__.py: added SearchBar
|
||||
|
||||
2006-05-10 Alex Roitman <shura@gramps-project.org>
|
||||
* src/GrampsDb/_DbUtils.py (db_copy): Use batch transaction.
|
||||
* src/GrampsDb/_GrampsBSDDB.py (transaction_begin): Proper indentation.
|
||||
|
@ -49,6 +49,7 @@ import RelLib
|
||||
import ToolTips
|
||||
import GrampsLocale
|
||||
import const
|
||||
from Filters import SearchFilter
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -67,7 +68,8 @@ def sfunc(a,b):
|
||||
#-------------------------------------------------------------------------
|
||||
class BaseModel(gtk.GenericTreeModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING,tooltip_column=None):
|
||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING,
|
||||
tooltip_column=None, search=None):
|
||||
gtk.GenericTreeModel.__init__(self)
|
||||
self.prev_handle = None
|
||||
self.prev_data = None
|
||||
@ -75,6 +77,15 @@ class BaseModel(gtk.GenericTreeModel):
|
||||
self.db = db
|
||||
self.sort_func = self.smap[scol]
|
||||
self.sort_col = scol
|
||||
|
||||
if search:
|
||||
col = search[0]
|
||||
text = search[1]
|
||||
func = lambda x: self.on_get_value(x, col)
|
||||
self.search = SearchFilter(func, text)
|
||||
else:
|
||||
self.search = None
|
||||
|
||||
self.reverse = (order == gtk.SORT_DESCENDING)
|
||||
self.tooltip_column = tooltip_column
|
||||
self.rebuild_data()
|
||||
@ -101,7 +112,11 @@ class BaseModel(gtk.GenericTreeModel):
|
||||
|
||||
def rebuild_data(self):
|
||||
if self.db.is_open():
|
||||
self.datalist = self.sort_keys()
|
||||
if self.search:
|
||||
self.datalist = [h for h in self.sort_keys()\
|
||||
if self.search.match(h)]
|
||||
else:
|
||||
self.datalist = self.sort_keys()
|
||||
i = 0
|
||||
self.indexlist = {}
|
||||
for key in self.datalist:
|
||||
@ -211,7 +226,7 @@ class BaseModel(gtk.GenericTreeModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class SourceModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING,search=None):
|
||||
self.map = db.get_raw_source_data
|
||||
self.gen_cursor = db.get_source_cursor
|
||||
self.fmap = [
|
||||
@ -232,7 +247,7 @@ class SourceModel(BaseModel):
|
||||
self.column_pubinfo,
|
||||
self.sort_change,
|
||||
]
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=7)
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=7,search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
@ -280,7 +295,7 @@ class SourceModel(BaseModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class PlaceModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING,search=None):
|
||||
self.gen_cursor = db.get_place_cursor
|
||||
self.map = db.get_raw_place_data
|
||||
self.fmap = [
|
||||
@ -312,7 +327,8 @@ class PlaceModel(BaseModel):
|
||||
self.column_change,
|
||||
self.column_handle,
|
||||
]
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=12)
|
||||
BaseModel.__init__(self, db, scol, order, tooltip_column=12,
|
||||
search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
@ -393,7 +409,7 @@ class PlaceModel(BaseModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class FamilyModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None):
|
||||
self.gen_cursor = db.get_family_cursor
|
||||
self.map = db.get_raw_family_data
|
||||
self.fmap = [
|
||||
@ -414,7 +430,8 @@ class FamilyModel(BaseModel):
|
||||
self.column_handle,
|
||||
self.column_tooltip
|
||||
]
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=6)
|
||||
BaseModel.__init__(self, db, scol, order, tooltip_column=6,
|
||||
search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
@ -482,7 +499,7 @@ class FamilyModel(BaseModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class MediaModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None):
|
||||
self.gen_cursor = db.get_media_cursor
|
||||
self.map = db.get_raw_object_data
|
||||
|
||||
@ -505,7 +522,8 @@ class MediaModel(BaseModel):
|
||||
self.column_date,
|
||||
self.column_handle,
|
||||
]
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=7)
|
||||
BaseModel.__init__(self, db, scol, order, tooltip_column=7,
|
||||
search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
@ -564,7 +582,7 @@ class MediaModel(BaseModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class EventModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None):
|
||||
self.gen_cursor = db.get_event_cursor
|
||||
self.map = db.get_raw_event_data
|
||||
|
||||
@ -589,7 +607,8 @@ class EventModel(BaseModel):
|
||||
self.sort_change,
|
||||
self.column_handle,
|
||||
]
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=8)
|
||||
BaseModel.__init__(self, db, scol, order, tooltip_column=8,
|
||||
search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
@ -644,7 +663,7 @@ class EventModel(BaseModel):
|
||||
#-------------------------------------------------------------------------
|
||||
class RepositoryModel(BaseModel):
|
||||
|
||||
def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING):
|
||||
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None):
|
||||
self.gen_cursor = db.get_repository_cursor
|
||||
self.get_handles = db.get_repository_handles
|
||||
self.map = db.get_raw_repository_data
|
||||
@ -681,7 +700,8 @@ class RepositoryModel(BaseModel):
|
||||
self.column_handle,
|
||||
]
|
||||
|
||||
BaseModel.__init__(self,db,scol,order,tooltip_column=12)
|
||||
BaseModel.__init__(self, db, scol, order, tooltip_column=12,
|
||||
search=search)
|
||||
|
||||
def on_get_n_columns(self):
|
||||
return len(self.fmap)+1
|
||||
|
@ -18,7 +18,7 @@
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
# $Id: _FilterWidget.py 6521 2006-05-03 01:02:54Z rshura $
|
||||
# $Id:$
|
||||
|
||||
"""
|
||||
Package providing filtering framework for GRAMPS.
|
||||
@ -31,15 +31,11 @@ Package providing filtering framework for GRAMPS.
|
||||
#-------------------------------------------------------------------------
|
||||
import gtk
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
_RETURN = gtk.gdk.keyval_from_name("Return")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# FilterWidget
|
||||
# SearchBar
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class SearchBar:
|
||||
@ -51,10 +47,14 @@ class SearchBar:
|
||||
def build( self):
|
||||
self.filterbar = gtk.HBox()
|
||||
self.filterbar.set_spacing(4)
|
||||
self.filter_text = gtk.Entry()
|
||||
self.filter_list = gtk.ComboBox()
|
||||
|
||||
self.filter_text = gtk.Entry()
|
||||
self.filter_text.connect('key-press-event',self.key_press)
|
||||
|
||||
self.filter_button = gtk.Button(stock=gtk.STOCK_FIND)
|
||||
self.filter_button.connect( 'clicked',self.apply_filter_clicked)
|
||||
|
||||
self.filterbar.pack_start(self.filter_list,False)
|
||||
self.filterbar.pack_start(self.filter_text,True)
|
||||
self.filterbar.pack_end(self.filter_button,False)
|
||||
@ -75,11 +75,13 @@ class SearchBar:
|
||||
|
||||
self.filter_list.set_model(self.filter_model)
|
||||
self.filter_list.set_active(0)
|
||||
self.filter_list.connect('changed',self.on_filter_name_changed)
|
||||
|
||||
def key_press(self, obj, event):
|
||||
if event.keyval == _RETURN and not event.state:
|
||||
self.on_apply_callback()
|
||||
return False
|
||||
|
||||
def apply_filter_clicked(self, obj):
|
||||
print "apply_filter_clicked"
|
||||
print self.on_apply_callback
|
||||
self.on_apply_callback()
|
||||
|
||||
def get_value(self):
|
||||
@ -87,20 +89,13 @@ class SearchBar:
|
||||
index = self.filter_list.get_active()
|
||||
return (index, text)
|
||||
|
||||
def on_filter_name_changed(self,obj):
|
||||
pass
|
||||
|
||||
def apply_filter(self,current_model=None):
|
||||
self.uistate.status_text(_('Updating display...'))
|
||||
self.on_apply_callback()
|
||||
self.uistate.modify_statusbar()
|
||||
|
||||
def get_filter( self):
|
||||
print "get_filter"
|
||||
return None
|
||||
|
||||
def show( self):
|
||||
def show(self):
|
||||
self.filterbar.show()
|
||||
|
||||
def hide( self):
|
||||
def hide(self):
|
||||
self.filterbar.hide()
|
||||
|
34
src/Filters/_SearchFilter.py
Normal file
34
src/Filters/_SearchFilter.py
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2002-2006 Donald N. Allingham
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
# $Id:$
|
||||
|
||||
"""
|
||||
Package providing filtering framework for GRAMPS.
|
||||
"""
|
||||
|
||||
class SearchFilter:
|
||||
def __init__(self, func, text):
|
||||
self.func = func
|
||||
self.text = text.upper()
|
||||
|
||||
def match(self, handle):
|
||||
return self.func(handle).upper().find(self.text) != -1
|
||||
|
@ -56,3 +56,4 @@ from _FilterComboBox import FilterComboBox
|
||||
from _FilterMenu import build_filter_menu
|
||||
from _FilterStore import FilterStore
|
||||
from _SearchBar import SearchBar
|
||||
from _SearchFilter import SearchFilter
|
||||
|
@ -42,9 +42,10 @@ from gtk.gdk import ACTION_COPY, BUTTON1_MASK
|
||||
# GRAMPS
|
||||
#
|
||||
#----------------------------------------------------------------
|
||||
import Config
|
||||
import TreeTips
|
||||
import Bookmarks
|
||||
from Filters import FilterWidget, Rules
|
||||
from Filters import SearchBar
|
||||
import const
|
||||
|
||||
NAVIGATION_NONE = -1
|
||||
@ -471,8 +472,8 @@ class ListView(BookMarkView):
|
||||
self.vbox.set_border_width(0)
|
||||
self.vbox.set_spacing(4)
|
||||
|
||||
self.generic_filter_widget = FilterWidget( self.uistate, self.build_tree)
|
||||
filter_box = self.generic_filter_widget.build()
|
||||
self.search_bar = SearchBar(self.uistate, self.build_tree)
|
||||
filter_box = self.search_bar.build()
|
||||
|
||||
self.list = gtk.TreeView()
|
||||
self.list.set_rules_hint(True)
|
||||
@ -531,13 +532,10 @@ class ListView(BookMarkView):
|
||||
"""
|
||||
Builds the default filters and add them to the filter menu.
|
||||
"""
|
||||
default_filters = [
|
||||
[Rules.Everything, []],
|
||||
[Rules.HasTextMatchingSubstringOf, ['',0,0]],
|
||||
[Rules.HasTextMatchingRegexpOf, ['',0,1]],
|
||||
[Rules.IsPrivate, []],
|
||||
]
|
||||
self.generic_filter_widget.setup_filter( default_filters)
|
||||
cols = []
|
||||
for pair in [pair for pair in self.column_order() if pair[0]]:
|
||||
cols.append(self.colinfo[pair[1]])
|
||||
self.search_bar.setup_filter(cols)
|
||||
|
||||
def goto_handle(self, handle):
|
||||
if not self.dbstate.active or self.inactive:
|
||||
@ -559,7 +557,6 @@ class ListView(BookMarkView):
|
||||
# disable the inactive flag
|
||||
self.inactive = False
|
||||
|
||||
|
||||
def column_clicked(self,obj,data):
|
||||
if self.sort_col != data:
|
||||
order = gtk.SORT_ASCENDING
|
||||
@ -571,7 +568,14 @@ class ListView(BookMarkView):
|
||||
order = gtk.SORT_DESCENDING
|
||||
self.sort_col = data
|
||||
handle = self.first_selected()
|
||||
self.model = self.make_model(self.dbstate.db, self.sort_col,order)
|
||||
|
||||
if Config.get(Config.FILTER):
|
||||
search = (0, '')
|
||||
else:
|
||||
search = self.search_bar.get_value()
|
||||
|
||||
self.model = self.make_model(self.dbstate.db, self.sort_col, order,
|
||||
search=search)
|
||||
self.list.set_model(self.model)
|
||||
colmap = self.column_order()
|
||||
|
||||
@ -604,7 +608,14 @@ class ListView(BookMarkView):
|
||||
|
||||
def build_tree(self):
|
||||
if self.active:
|
||||
self.model = self.make_model(self.dbstate.db,self.sort_col)
|
||||
|
||||
if Config.get(Config.FILTER):
|
||||
search = (0, '')
|
||||
else:
|
||||
search = self.search_bar.get_value()
|
||||
|
||||
self.model = self.make_model(self.dbstate.db,self.sort_col,
|
||||
search=search)
|
||||
self.list.set_model(self.model)
|
||||
self.selection = self.list.get_selection()
|
||||
|
||||
@ -618,7 +629,14 @@ class ListView(BookMarkView):
|
||||
def change_db(self,db):
|
||||
for sig in self.signal_map:
|
||||
db.connect(sig, self.signal_map[sig])
|
||||
self.model = self.make_model(self.dbstate.db,0)
|
||||
|
||||
if Config.get(Config.FILTER):
|
||||
search = (0, '')
|
||||
else:
|
||||
search = self.search_bar.get_value()
|
||||
|
||||
self.model = self.make_model(self.dbstate.db, 0, search=search)
|
||||
|
||||
self.list.set_model(self.model)
|
||||
self.build_columns()
|
||||
self.bookmarks.update_bookmarks(self.get_bookmarks())
|
||||
@ -687,7 +705,7 @@ class ListView(BookMarkView):
|
||||
|
||||
def filter_toggle(self,obj):
|
||||
if obj.get_active():
|
||||
self.generic_filter_widget.show()
|
||||
self.search_bar.show()
|
||||
else:
|
||||
self.generic_filter_widget.hide()
|
||||
self.search_bar.hide()
|
||||
|
||||
|
@ -63,12 +63,13 @@ import gtk
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import const
|
||||
from RelLib import *
|
||||
import NameDisplay
|
||||
import DateHandler
|
||||
import ToolTips
|
||||
import GrampsLocale
|
||||
import const
|
||||
from Filters import SearchFilter
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -119,14 +120,6 @@ else:
|
||||
return mylist
|
||||
|
||||
|
||||
class Search:
|
||||
def __init__(self, func, text):
|
||||
self.func = func
|
||||
self.text = text
|
||||
|
||||
def match(self, handle):
|
||||
return self.func(handle).find(self.text) != -1
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# PeopleModel
|
||||
@ -159,7 +152,7 @@ class PeopleModel(gtk.GenericTreeModel):
|
||||
col = search[0]
|
||||
text = search[1]
|
||||
func = lambda x: self.on_get_value(x, col)
|
||||
data_filter = Search(func, text)
|
||||
data_filter = SearchFilter(func, text)
|
||||
self.rebuild_data(data_filter, skip)
|
||||
|
||||
def rebuild_data(self, data_filter=None, skip=[]):
|
||||
|
@ -605,7 +605,6 @@ class ViewManager:
|
||||
hbox.pack_start(image,False,False)
|
||||
hbox.set_spacing(4)
|
||||
|
||||
print use_text
|
||||
if use_text:
|
||||
label = gtk.Label(page_title)
|
||||
label.show()
|
||||
|
Loading…
Reference in New Issue
Block a user