From 30ce0c5291362c0dfc58af18acd851fc436dece9 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Sun, 1 Apr 2007 22:37:10 +0000 Subject: [PATCH] 2007-04-01 Don Allingham * src/DataViews/_PedigreeView.py: display matches in statusbar * src/DataViews/_PersonView.py: display matches in statusbar * src/DataViews/_RelationView.py: display matches in statusbar * src/DisplayState.py: display matches in statusbar * src/DisplayModels/_BaseModel.py: display matches in statusbar * src/DisplayModels/_PeopleModel.py: display matches in statusbar * src/GrampsDbUtils/_GedcomParse.py: display matches in statusbar * src/PageView.py: display matches in statusbar * src/Filters/_SearchBar.py: display matches in statusbar * src/DbManager.py: fix default file name svn: r8346 --- ChangeLog | 12 +++++++++ src/DataViews/_PedigreeView.py | 3 +++ src/DataViews/_PersonView.py | 6 +++++ src/DataViews/_RelationView.py | 3 +++ src/DbManager.py | 29 ++++++++++++++++------ src/DisplayModels/_BaseModel.py | 11 +++++++++ src/DisplayModels/_PeopleModel.py | 18 +++++++++++++- src/DisplayState.py | 10 ++++++++ src/Filters/_SearchBar.py | 2 +- src/GrampsDbUtils/_GedcomParse.py | 41 +++++++++++++++++-------------- src/PageView.py | 11 +++++++-- src/Utils.py | 6 ++--- src/ViewManager.py | 1 - 13 files changed, 119 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f45a41f7..564016f82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2007-04-01 Don Allingham + * src/DataViews/_PedigreeView.py: display matches in statusbar + * src/DataViews/_PersonView.py: display matches in statusbar + * src/DataViews/_RelationView.py: display matches in statusbar + * src/DisplayState.py: display matches in statusbar + * src/DisplayModels/_BaseModel.py: display matches in statusbar + * src/DisplayModels/_PeopleModel.py: display matches in statusbar + * src/GrampsDbUtils/_GedcomParse.py: display matches in statusbar + * src/PageView.py: display matches in statusbar + * src/Filters/_SearchBar.py: display matches in statusbar + * src/DbManager.py: fix default file name + 2007-04-01 Zsolt Foldvari * src/GrampsWidgets.py (Statusbar._set_packing): Reverse packing style. diff --git a/src/DataViews/_PedigreeView.py b/src/DataViews/_PedigreeView.py index dfb6c9fea..d89e9179c 100644 --- a/src/DataViews/_PedigreeView.py +++ b/src/DataViews/_PedigreeView.py @@ -468,6 +468,9 @@ class PedigreeView(PageView.PersonNavView): self.show_marriage_data = 0 # Hide marriage data by default self.format_helper = FormattingHelper( self.dbstate) + def change_page(self): + self.uistate.clear_filter_results() + def init_parent_signals_cb(self, widget, event): # required to properly bootstrap the signal handlers. # This handler is connected by build_widget. After the outside ViewManager diff --git a/src/DataViews/_PersonView.py b/src/DataViews/_PersonView.py index 12a57ecb2..d82a9b6a6 100644 --- a/src/DataViews/_PersonView.py +++ b/src/DataViews/_PersonView.py @@ -111,6 +111,9 @@ class PersonView(PageView.PersonNavView): PageView.PersonNavView.change_page(self) self.edit_action.set_visible(True) self.edit_action.set_sensitive(not self.dbstate.db.readonly) + self.uistate.show_filter_results(self.dbstate, + self.model.displayed, + self.model.total) def set_active(self): PageView.PersonNavView.set_active(self) @@ -535,6 +538,9 @@ class PersonView(PageView.PersonNavView): self.dbstate.change_active_person(active) self._goto() self.dirty = False + self.uistate.show_filter_results(self.dbstate, + self.model.displayed, + self.model.total) else: self.dirty = True diff --git a/src/DataViews/_RelationView.py b/src/DataViews/_RelationView.py index 2e7c0c865..d247bded1 100644 --- a/src/DataViews/_RelationView.py +++ b/src/DataViews/_RelationView.py @@ -204,6 +204,9 @@ class RelationshipView(PageView.PersonNavView): pass else: self.change_person(None) + + def change_page(self): + self.uistate.clear_filter_results() def get_stock(self): """ diff --git a/src/DbManager.py b/src/DbManager.py index d87442839..9ae553b42 100644 --- a/src/DbManager.py +++ b/src/DbManager.py @@ -59,7 +59,12 @@ import gtk.glade import QuestionDialog -DEFAULT_DIR = os.path.expanduser("~/grampsdb") +#------------------------------------------------------------------------- +# +# constants +# +#------------------------------------------------------------------------- +DEFAULT_DIR = os.path.expanduser("~/.gramps/grampsdb") DEFAULT_TITLE = _("Family Tree") NAME_FILE = "name.txt" META_NAME = "meta_data.db" @@ -71,9 +76,16 @@ DATE_COL = 3 OPEN_COL = 5 class DbManager: - + """ + Database Manager. Opens a database manager window that allows users to + create, rename, delete and open databases. + """ + def __init__(self, dbstate, parent=None): - + """ + Creates the top level window from the glade description, and extracts + the GTK widgets that are needed. + """ self.glade = gtk.glade.XML(const.gladeFile, "dbmanager", "gramps") self.top = self.glade.get_widget('dbmanager') if parent: @@ -100,6 +112,9 @@ class DbManager: self.populate() def connect_signals(self): + """ + Connects the signals to the buttons on the interface. + """ self.remove.connect('clicked', self.remove_db) self.new.connect('clicked', self.new_db) self.rename.connect('clicked', self.rename_db) @@ -249,10 +264,12 @@ class DbManager: os.mkdir(new_path) path_name = os.path.join(new_path, NAME_FILE) + name_list = [ name[0] for name in self.current_names ] + i = 1 while True: title = "%s %d" % (DEFAULT_TITLE, i) - if title not in self.current_names: + if title not in name_list: break i += 1 @@ -266,7 +283,3 @@ class DbManager: path = self.model.get_path(node) self.dblist.set_cursor(path, focus_column=self.column, start_editing=True) - -if __name__ == "__main__": - a = DbManager() - a.run() diff --git a/src/DisplayModels/_BaseModel.py b/src/DisplayModels/_BaseModel.py index 089b6fd96..594f48cb7 100644 --- a/src/DisplayModels/_BaseModel.py +++ b/src/DisplayModels/_BaseModel.py @@ -153,6 +153,9 @@ class BaseModel(gtk.GenericTreeModel): self.sort_col = scol self.skip = skip + self.total = 0 + self.displayed = 0 + self.node_map = NodeMap() if search: @@ -205,9 +208,11 @@ class BaseModel(gtk.GenericTreeModel): self.sort_data = [] data = cursor.next() + self.total = 0 while data: key = locale.strxfrm(self.sort_func(data[1])) self.sort_data.append((key,data[0])) + self.total += 1 data = cursor.next() cursor.close() @@ -216,6 +221,7 @@ class BaseModel(gtk.GenericTreeModel): return [ x[1] for x in self.sort_data ] def _rebuild_search(self,ignore=None): + self.total = 0 if self.db.is_open(): if self.search and self.search.text: dlist = [h for h in self.sort_keys()\ @@ -224,11 +230,14 @@ class BaseModel(gtk.GenericTreeModel): else: dlist = [h for h in self.sort_keys() \ if h not in self.skip and h != ignore] + self.displayed = len(dlist) self.node_map.set_path_map(dlist) else: + self.displayed = 0 self.node_map.clear_map() def _rebuild_filter(self, ignore=None): + self.total = 0 if self.db.is_open(): if self.search: dlist = self.search.apply(self.db, @@ -238,8 +247,10 @@ class BaseModel(gtk.GenericTreeModel): dlist = [ k for k in self.sort_keys() \ if k != ignore ] + self.displayed = len(dlist) self.node_map.set_path_map(dlist) else: + self.displayed = 0 self.node_map.clear_map() def add_row_by_handle(self,handle): diff --git a/src/DisplayModels/_PeopleModel.py b/src/DisplayModels/_PeopleModel.py index 84555e799..79f2fc2f4 100644 --- a/src/DisplayModels/_PeopleModel.py +++ b/src/DisplayModels/_PeopleModel.py @@ -273,6 +273,9 @@ class PeopleModel(gtk.GenericTreeModel): self.mapper = NodeTreeMap() + self.total = 0 + self.displayed = 0 + if filter_info and filter_info != (1, (0, u'', False)): if filter_info[0] == PeopleModel.GENERIC: data_filter = filter_info[1] @@ -325,15 +328,19 @@ class PeopleModel(gtk.GenericTreeModel): cursor = self.db.get_person_cursor() node = cursor.first() + self.total = 0 + self.displayed = 0 + while node: #for node in self.db.get_person_cursor_iter(): + self.total += 1 handle, d = node if not (handle in skip or (dfilter and not dfilter.match(handle))): name_data = d[PeopleModel._NAME_COL] group_name = ngn(self.db, name_data) sorted_name = nsn(name_data) - + self.displayed += 1 self.mapper.assign_sort_name(handle, sorted_name, group_name) node = cursor.next() cursor.close() @@ -343,11 +350,17 @@ class PeopleModel(gtk.GenericTreeModel): ngn = NameDisplay.displayer.name_grouping_data nsn = NameDisplay.displayer.raw_sorted_name + plist = self.db.get_person_handles() + + self.total = len(plist) + if dfilter: handle_list = dfilter.apply(self.db, self.db.get_person_handles()) else: handle_list = self.db.get_person_handles() + self.displayed = len(handle_list) + self.mapper.clear_sort_names() status = LongOpStatus(msg="Loading People", @@ -378,6 +391,9 @@ class PeopleModel(gtk.GenericTreeModel): self.lru_bdate = LRU(_CACHE_SIZE) self.lru_ddate = LRU(_CACHE_SIZE) + self.total = 0 + self.displayed = 0 + if dfilter: self.dfilter = dfilter diff --git a/src/DisplayState.py b/src/DisplayState.py index db27cf6c1..7fae34ad1 100644 --- a/src/DisplayState.py +++ b/src/DisplayState.py @@ -275,6 +275,7 @@ class DisplayState(GrampsDb.GrampsDBCallback): self.gwm = ManagedWindow.GrampsWindowManager(uimanager) self.widget = None self.warnbtn = warnbtn + self.last_bar = self.status.insert(min_width=150) formatter = logging.Formatter('%(levelname)s %(name)s: %(message)s') self.rh = WarnHandler(capacity=400,button=warnbtn) @@ -337,6 +338,15 @@ class DisplayState(GrampsDb.GrampsDBCallback): self.status_text(text) gobject.timeout_add(5000,self.modify_statusbar,dbstate) + def show_filter_results(self, dbstate, matched, total): + text = _("%d/%d matched") % (matched, total) + self.status.pop(1, self.last_bar) + self.status.push(1, text, self.last_bar) + + def clear_filter_results(self): + self.status.pop(1, self.last_bar) + self.status.push(1, '', self.last_bar) + def modify_statusbar(self,dbstate,active=None): self.status.pop(self.status_id) if dbstate.active == None: diff --git a/src/Filters/_SearchBar.py b/src/Filters/_SearchBar.py index f005e38ca..70ffebdf6 100644 --- a/src/Filters/_SearchBar.py +++ b/src/Filters/_SearchBar.py @@ -136,7 +136,7 @@ class SearchBar: inv = self.filter_model.get_value(node,2) return (index, text, inv) - def apply_filter(self,current_model=None): + def apply_filter(self, current_model=None): self.apply_text = unicode(self.filter_text.get_text()) self.filter_button.set_sensitive(False) self.uistate.status_text(_('Updating display...')) diff --git a/src/GrampsDbUtils/_GedcomParse.py b/src/GrampsDbUtils/_GedcomParse.py index 4a070b6b6..99b67c7d8 100644 --- a/src/GrampsDbUtils/_GedcomParse.py +++ b/src/GrampsDbUtils/_GedcomParse.py @@ -115,6 +115,7 @@ from BasicUtils import NameDisplay, UpdateCallback import Utils import Mime import LdsUtils +import Utils from _GedcomInfo import * from _GedcomTokens import * @@ -2562,7 +2563,7 @@ class GedcomParser(UpdateCallback): self.__parse_level(sub_state, self.event_parse_tbl, self.__undefined) - family_event_name(event, state.family) + family_event_name(event, state.family, self.dbase) self.dbase.commit_event(event, self.trans) event_ref.ref = event.handle state.family.add_event_ref(event_ref) @@ -2606,7 +2607,7 @@ class GedcomParser(UpdateCallback): else: state.family.type.set(RelLib.FamilyRelType.MARRIED) - family_event_name(event, state.family) + family_event_name(event, state.family, self.dbase) self.dbase.commit_event(event, self.trans) event_ref.ref = event.handle @@ -4406,8 +4407,11 @@ class GedcomParser(UpdateCallback): event_ref = RelLib.EventRef() event.set_gramps_id(self.emapper.find_next()) event.set_type(event_type) + if description and description != 'Y': event.set_description(description) + else: + person_event_name(event, state.person) self.dbase.add_event(event, self.trans) sub_state = GedcomUtils.CurrentState() @@ -4430,6 +4434,9 @@ class GedcomParser(UpdateCallback): event.set_type(event_type) if description and description != 'Y': event.set_description(description) + else: + family_event_name(event, state.family, self.dbase) + self.dbase.add_event(event, self.trans) sub_state = GedcomUtils.CurrentState() @@ -4440,7 +4447,7 @@ class GedcomParser(UpdateCallback): self.__parse_level(sub_state, event_map, self.__undefined) - family_event_name(event, state.family) + family_event_name(event, state.family, self.dbase) self.dbase.commit_event(event, self.trans) event_ref.set_reference_handle(event.handle) @@ -4482,22 +4489,20 @@ class GedcomParser(UpdateCallback): # #------------------------------------------------------------------------- def person_event_name(event, person): - if event.get_type().is_custom(): - if not event.get_description(): - text = EVENT_PERSON_STR % { - 'event_name' : str(event.get_type()), - 'person' : NameDisplay.displayer.display(person), - } - event.set_description(text) + if not event.get_description(): + text = EVENT_PERSON_STR % { + 'event_name' : str(event.get_type()), + 'person' : NameDisplay.displayer.display(person), + } + event.set_description(text) -def family_event_name(event, family): - if event.get_type().is_custom(): - if not event.get_description(): - text = EVENT_FAMILY_STR % { - 'event_name' : str(event.get_type()), - 'family' : "", - } - event.set_description(text) +def family_event_name(event, family, dbase): + if not event.get_description(): + text = EVENT_FAMILY_STR % { + 'event_name' : str(event.get_type()), + 'family' : Utils.family_name(family, dbase), + } + event.set_description(text) def encode_filename(name): enc = sys.getfilesystemencoding() diff --git a/src/PageView.py b/src/PageView.py index 9088f00c5..ba3a21d32 100644 --- a/src/PageView.py +++ b/src/PageView.py @@ -161,7 +161,7 @@ class PageView: self.additional_action_groups.append(group) def change_page(self): - pass + self.uistate.clear_filter_results() def edit(self,obj): pass @@ -564,7 +564,8 @@ class ListView(BookMarkView): self.vbox.set_border_width(4) self.vbox.set_spacing(4) - self.search_bar = SearchBar(self.dbstate,self.uistate, self.build_tree) + self.search_bar = SearchBar(self.dbstate,self.uistate, + self.search_build_tree) filter_box = self.search_bar.build() self.list = gtk.TreeView() @@ -604,6 +605,9 @@ class ListView(BookMarkView): else: return self.vbox + def search_build_tree(self): + self.build_tree() + def row_changed(self,obj): """Called with a row is changed. Check the selected objects from the person_tree to get the IDs of the selected objects. Set the @@ -733,6 +737,9 @@ class ListView(BookMarkView): self.dirty = False else: self.dirty = True + self.uistate.show_filter_results(self.dbstate, + self.model.displayed, + self.model.total) def filter_toggle_action(self,obj): if obj.get_active(): diff --git a/src/Utils.py b/src/Utils.py index fd085dc6c..3ed062aab 100644 --- a/src/Utils.py +++ b/src/Utils.py @@ -151,8 +151,9 @@ def wasHistory_broken(): # #------------------------------------------------------------------------- -def family_name(family,db,noname=_("unknown")): +def family_name(family, db, noname=_("unknown")): """Builds a name for the family from the parents names""" + father_handle = family.get_father_handle() mother_handle = family.get_mother_handle() father = db.get_person_from_handle(father_handle) @@ -171,7 +172,7 @@ def family_name(family,db,noname=_("unknown")): name = noname return name -def family_upper_name(family,db): +def family_upper_name(family, db): """Builds a name for the family from the parents names""" father_handle = family.get_father_handle() mother_handle = family.get_mother_handle() @@ -187,7 +188,6 @@ def family_upper_name(family,db): name = mother.get_primary_name().get_upper_name() return name - #------------------------------------------------------------------------- # # diff --git a/src/ViewManager.py b/src/ViewManager.py index 59ead4134..d3504678b 100644 --- a/src/ViewManager.py +++ b/src/ViewManager.py @@ -1070,7 +1070,6 @@ class ViewManager: self.state.db.enable_signals() self.state.signal_change() - print filename Config.set(Config.RECENT_FILE, filename) self.relationship = self.RelClass(self.state.db)