From 7f514dac82881a2b19ebe7234cd2321bf17978b2 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Fri, 10 Jan 2003 05:21:32 +0000 Subject: [PATCH] pychecker fixes, GEDCOM import/export improvements, calendar improvements svn: r1250 --- configure.in | 2 +- example/gramps/data.gramps | Bin 3823 -> 3779 bytes src/AddSpouse.py | 3 - src/AttrEdit.py | 5 +- src/Bookmarks.py | 1 - src/Calendar.py | 13 ++- src/ChooseParents.py | 1 - src/Date.py | 2 +- src/EditPerson.py | 79 ++++++++----------- src/EditPlace.py | 3 - src/EditSource.py | 1 - src/EventEdit.py | 14 ++-- src/FamilyView.py | 122 ++++++++++++++++++++++++++-- src/FrenchRepublic.py | 2 +- src/GenericFilter.py | 7 +- src/GrampsCfg.py | 15 ++-- src/GrampsParser.py | 42 +++++----- src/GrampsXML.py | 6 +- src/Hebrew.py | 2 +- src/ImageSelect.py | 30 +++---- src/ImgManip.py | 5 +- src/ListModel.py | 1 + src/LocEdit.py | 4 +- src/Marriage.py | 33 ++++---- src/MediaView.py | 18 ++--- src/NameEdit.py | 4 +- src/NoteEdit.py | 1 - src/PedView.py | 117 +++------------------------ src/PlaceView.py | 9 +-- src/Plugins.py | 6 +- src/QuestionDialog.py | 1 - src/ReadXML.py | 9 +-- src/RelImage.py | 6 +- src/SelectChild.py | 17 ++-- src/SourceView.py | 10 +-- src/Sources.py | 8 +- src/StartupDialog.py | 15 ++-- src/StyleEditor.py | 30 ++++--- src/UrlEdit.py | 4 +- src/Utils.py | 33 ++++++++ src/WriteXML.py | 3 +- src/ansel_utf8.py | 3 +- src/calendars/Islamic.py | 9 ++- src/calendars/Persian.py | 9 ++- src/gramps_main.py | 64 --------------- src/plugins/GraphViz.py | 157 +++++++++++++++++++++++++------------ src/plugins/ReadGedcom.py | 19 ++--- src/plugins/WriteGedcom.py | 24 +++--- 48 files changed, 489 insertions(+), 480 deletions(-) diff --git a/configure.in b/configure.in index ae159dbb6..fd8f91aae 100644 --- a/configure.in +++ b/configure.in @@ -282,7 +282,7 @@ src/data/templates/Makefile src/po/Makefile doc/Makefile doc/gramps-manual/Makefile -doc/gramps-manual/C/Makefile +doc/gramps-manual/C/Makefile doc/extending-gramps/Makefile doc/extending-gramps/C/Makefile omf-install/Makefile diff --git a/example/gramps/data.gramps b/example/gramps/data.gramps index d9f256923b82d965185dfaaebc421d58f294d021..8a29c2c7140a45af5cf1c54b8029c3f858aeb998 100644 GIT binary patch literal 3779 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 literal 3823 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 diff --git a/src/AddSpouse.py b/src/AddSpouse.py index c2a8550d4..b1b0aecd7 100644 --- a/src/AddSpouse.py +++ b/src/AddSpouse.py @@ -37,7 +37,6 @@ from intl import gettext as _ # GTK/Gnome modules # #------------------------------------------------------------------------- -import gobject import gtk.glade #------------------------------------------------------------------------- @@ -210,8 +209,6 @@ class AddSpouse: else: sgender = const.female - index = 0 - self.entries = [] self.slist.clear() for key in self.db.getPersonKeys(): diff --git a/src/AttrEdit.py b/src/AttrEdit.py index 6c766877e..44c985810 100644 --- a/src/AttrEdit.py +++ b/src/AttrEdit.py @@ -41,8 +41,7 @@ import const import Utils import Sources import AutoComp - -from RelLib import Attribute +import RelLib from intl import gettext as _ @@ -125,7 +124,7 @@ class AttributeEditor: priv = self.priv.get_active() if self.attrib == None: - self.attrib = Attribute() + self.attrib = RelLib.Attribute() self.parent.alist.append(self.attrib) self.attrib.setSourceRefList(self.srcreflist) diff --git a/src/Bookmarks.py b/src/Bookmarks.py index 64da9c652..0656389b9 100644 --- a/src/Bookmarks.py +++ b/src/Bookmarks.py @@ -29,7 +29,6 @@ __version__ = "$Revision$" # #------------------------------------------------------------------------- import gtk -import gnome.ui #------------------------------------------------------------------------- # diff --git a/src/Calendar.py b/src/Calendar.py index e258236ed..bad38c96e 100644 --- a/src/Calendar.py +++ b/src/Calendar.py @@ -28,7 +28,6 @@ web site at http://www.scottlee.com __author__ = "Donald N. Allingham" __version__ = "$Revision$" -import math from intl import gettext as _ import re @@ -158,7 +157,7 @@ class Calendar: return 1 def quote_display(self,year,month,day,mode): - return "%s (%s)" % (text,Calendar.NAME) + return "%04d-%02d-%02d (%s)" % (year,month,day,Calendar.NAME) def display(self,year,month,day,mode): return _FMT_FUNC[Calendar.FORMATCODE](self,year,month,day,mode) @@ -168,8 +167,8 @@ class Calendar: return "" elif day == UNDEF: if month == UNDEF: - retval = str(self.year) - elif self.year == UNDEF: + retval = str(year) + elif year == UNDEF: retval = "????-%02d-??" % (month) else: retval = "%04d-%02d" % (year,month) @@ -270,7 +269,7 @@ class Calendar: retval = str(year) else: month_str = self.month(month).upper()[0:3] - if self.year == UNDEF: + if year == UNDEF: retval = "%d %s ????" % (day,month_str) else: retval = "%d %s %d" % (day,month_str,year) @@ -295,7 +294,7 @@ class Calendar: retval = str(year) else: month_str = self.month(month).upper()[0:3] - if self.year == UNDEF: + if year == UNDEF: retval = "%d. %s ????" % (day,month_str) else: retval = "%d. %s %d" % (day,month_str,year) @@ -356,7 +355,7 @@ class Calendar: pass elif day == UNDEF: if month == UNDEF: - retval = str(self.year) + retval = str(year) elif year == UNDEF: retval = "????%s%02d%s??" % (sep,month+1,sep) else: diff --git a/src/ChooseParents.py b/src/ChooseParents.py index 0d4a8506b..3547e36e6 100644 --- a/src/ChooseParents.py +++ b/src/ChooseParents.py @@ -48,7 +48,6 @@ import gtk.glade #------------------------------------------------------------------------- import RelLib import const -import sort import Utils import GrampsCfg diff --git a/src/Date.py b/src/Date.py index 5ae4e426f..bf01d09ef 100644 --- a/src/Date.py +++ b/src/Date.py @@ -333,7 +333,7 @@ class SingleDate: self.calendar.set_month_string(text) def getMonthStr(self): - return _mname[self.month] + return self.calendar.month(self.month) def getIsoDate(self): if self.year == UNDEF: diff --git a/src/EditPerson.py b/src/EditPerson.py index 5751f7f65..f1fef4a57 100644 --- a/src/EditPerson.py +++ b/src/EditPerson.py @@ -31,9 +31,7 @@ import pickle # GTK/Gnome modules # #------------------------------------------------------------------------- -import gobject import gtk -import gnome.ui import gtk.glade from gtk.gdk import ACTION_COPY, BUTTON1_MASK, INTERP_BILINEAR, pixbuf_new_from_file @@ -47,13 +45,13 @@ import const import Utils import GrampsCfg import Date -from RelLib import * import ImageSelect import sort import AutoComp import ListModel +import RelLib from DateEdit import DateEdit -from QuestionDialog import QuestionDialog +from QuestionDialog import QuestionDialog, WarningDialog, ErrorDialog from intl import gettext as _ @@ -168,9 +166,9 @@ class EditPerson: self.name_source = self.get_widget("name_source") self.gid = self.get_widget("gid") - self.death = Event(person.getDeath()) - self.birth = Event(person.getBirth()) - self.pname = Name(person.getPrimaryName()) + self.death = RelLib.Event(person.getDeath()) + self.birth = RelLib.Event(person.getBirth()) + self.pname = RelLib.Name(person.getPrimaryName()) self.elist = person.getEventList()[:] self.nlist = person.getAlternateNames()[:] @@ -218,9 +216,9 @@ class EditPerson: self.gid.set_text(person.getId()) self.gid.set_editable(GrampsCfg.id_edit) - self.lds_baptism = LdsOrd(self.person.getLdsBaptism()) - self.lds_endowment = LdsOrd(self.person.getLdsEndowment()) - self.lds_sealing = LdsOrd(self.person.getLdsSeal()) + self.lds_baptism = RelLib.LdsOrd(self.person.getLdsBaptism()) + self.lds_endowment = RelLib.LdsOrd(self.person.getLdsEndowment()) + self.lds_sealing = RelLib.LdsOrd(self.person.getLdsSeal()) if GrampsCfg.uselds or self.lds_baptism or self.lds_endowment or self.lds_sealing: self.get_widget("lds_tab").show() @@ -232,9 +230,9 @@ class EditPerson: self.autotype = AutoComp.AutoEntry(self.ntype_field.entry,types) self.write_primary_name() - if person.getGender() == Person.male: + if person.getGender() == RelLib.Person.male: self.is_male.set_active(1) - elif person.getGender() == Person.female: + elif person.getGender() == RelLib.Person.female: self.is_female.set_active(1) else: self.is_unknown.set_active(1) @@ -250,32 +248,24 @@ class EditPerson: self.event_list.drag_source_set(BUTTON1_MASK, pycode_tgts, ACTION_COPY) self.event_list.connect('drag_data_get', self.ev_drag_data_get) self.event_list.connect('drag_begin', self.ev_drag_begin) - self.event_list.connect('drag_data_received', - self.ev_drag_data_received) + self.event_list.connect('drag_data_received',self.ev_drag_data_received) self.web_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,ACTION_COPY) self.web_list.drag_source_set(BUTTON1_MASK, pycode_tgts, ACTION_COPY) self.web_list.connect('drag_data_get', self.url_drag_data_get) self.web_list.connect('drag_begin', self.url_drag_begin) - self.web_list.connect('drag_data_received', - self.url_drag_data_received) + self.web_list.connect('drag_data_received',self.url_drag_data_received) - self.attr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts, - ACTION_COPY) - self.attr_list.drag_source_set(BUTTON1_MASK, pycode_tgts, - ACTION_COPY) + self.attr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,ACTION_COPY) + self.attr_list.drag_source_set(BUTTON1_MASK, pycode_tgts, ACTION_COPY) self.attr_list.connect('drag_data_get', self.at_drag_data_get) - self.attr_list.connect('drag_data_received', - self.at_drag_data_received) + self.attr_list.connect('drag_data_received',self.at_drag_data_received) self.attr_list.connect('drag_begin', self.at_drag_begin) - self.addr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - pycode_tgts,ACTION_COPY) - self.addr_list.drag_source_set(BUTTON1_MASK, pycode_tgts, - ACTION_COPY) + self.addr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,ACTION_COPY) + self.addr_list.drag_source_set(BUTTON1_MASK, pycode_tgts,ACTION_COPY) self.addr_list.connect('drag_data_get', self.ad_drag_data_get) - self.addr_list.connect('drag_data_received', - self.ad_drag_data_received) + self.addr_list.connect('drag_data_received',self.ad_drag_data_received) self.addr_list.connect('drag_begin', self.ev_drag_begin) self.bdate_check = DateEdit(self.bdate,self.get_widget("birth_stat")) @@ -873,7 +863,7 @@ class EditPerson: if self.pname.getNote() != name.getNote(): changed = 1 if self.lds_not_loaded == 0 and self.check_lds(): - changed == 1 + changed = 1 bplace = string.strip(self.bplace.get_text()) dplace = string.strip(self.dplace.get_text()) @@ -898,11 +888,11 @@ class EditPerson: changed = 1 if not self.death.are_equal(self.person.getDeath()): changed = 1 - if male and self.person.getGender() != Person.male: + if male and self.person.getGender() != RelLib.Person.male: changed = 1 - elif female and self.person.getGender() != Person.female: + elif female and self.person.getGender() != RelLib.Person.female: changed = 1 - elif unknown and self.person.getGender() != Person.unknown: + elif unknown and self.person.getGender() != RelLib.Person.unknown: changed = 1 if text != self.person.getNote() or self.lists_changed: changed = 1 @@ -1200,7 +1190,7 @@ class EditPerson: msg2 = _("%(grampsid)s is already used by %(person)s") % { 'grampsid' : idval, 'person' : n } - GnomeWarningDialog("%s\n%s" % (msg1,msg2)) + WarningDialog("%s\n%s" % (msg1,msg2)) if suffix != name.getSuffix(): name.setSuffix(suffix) @@ -1267,8 +1257,8 @@ class EditPerson: female = self.is_female.get_active() unknown = self.is_unknown.get_active() error = 0 - if male and self.person.getGender() != Person.male: - self.person.setGender(Person.male) + if male and self.person.getGender() != RelLib.Person.male: + self.person.setGender(RelLib.Person.male) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getMother(): if temp_family.getFather() != None: @@ -1277,8 +1267,8 @@ class EditPerson: temp_family.setMother(None) temp_family.setFather(self.person) Utils.modified() - elif female and self.person.getGender() != Person.female: - self.person.setGender(Person.female) + elif female and self.person.getGender() != RelLib.Person.female: + self.person.setGender(RelLib.Person.female) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getFather(): if temp_family.getMother() != None: @@ -1287,8 +1277,8 @@ class EditPerson: temp_family.setFather(None) temp_family.setMother(self.person) Utils.modified() - elif unknown and self.person.getGender() != Person.unknown: - self.person.setGender(Person.unknown) + elif unknown and self.person.getGender() != RelLib.Person.unknown: + self.person.setGender(RelLib.Person.unknown) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getFather(): if temp_family.getMother() != None: @@ -1319,17 +1309,17 @@ class EditPerson: if self.lds_not_loaded == 0: self.check_lds() - ord = LdsOrd(self.person.getLdsBaptism()) + ord = RelLib.LdsOrd(self.person.getLdsBaptism()) if not self.lds_baptism.are_equal(ord): self.person.setLdsBaptism(self.lds_baptism) Utils.modified() - ord = LdsOrd(self.person.getLdsEndowment()) + ord = RelLib.LdsOrd(self.person.getLdsEndowment()) if not self.lds_endowment.are_equal(ord): self.person.setLdsEndowment(self.lds_endowment) Utils.modified() - ord = LdsOrd(self.person.getLdsSeal()) + ord = RelLib.LdsOrd(self.person.getLdsSeal()) if not self.lds_sealing.are_equal(ord): self.person.setLdsSeal(self.lds_sealing) Utils.modified() @@ -1346,7 +1336,7 @@ class EditPerson: if self.pmap.has_key(text): return self.db.getPlaceMap()[self.pmap[text]] elif makenew: - place = Place() + place = RelLib.Place() place.set_title(text) self.db.addPlace(place) self.pmap[text] = place.getId() @@ -1396,7 +1386,6 @@ class EditPerson: def on_ldsseal_source_clicked(self,obj): import Sources - ord = self.person.getLdsSeal() Sources.SourceSelector(self.lds_sealing.getSourceRefList(),self,self.lds_seal_list) def lds_seal_list(self,list): @@ -1450,7 +1439,7 @@ class EditPerson: self.nlist.remove(new) self.nlist.append(old) self.redraw_name_list() - self.pname = Name(new) + self.pname = RelLib.Name(new) self.lists_changed = 1 self.write_primary_name() diff --git a/src/EditPlace.py b/src/EditPlace.py index 289240945..b3c4f2fb5 100644 --- a/src/EditPlace.py +++ b/src/EditPlace.py @@ -33,7 +33,6 @@ import pickle import gobject import gtk import gtk.glade -import gnome.ui #------------------------------------------------------------------------- # @@ -43,7 +42,6 @@ import gnome.ui import const import Utils import GrampsCfg -from RelLib import * import Sources import ImageSelect @@ -78,7 +76,6 @@ class EditPlace: self.srcreflist = [] self.top_window = gtk.glade.XML(const.placesFile,"placeEditor") - adj = gtk.Adjustment() self.iconlist = self.top_window.get_widget('iconlist') self.glry = ImageSelect.Gallery(place, self.path, self.iconlist, self.db, self) diff --git a/src/EditSource.py b/src/EditSource.py index 1a98de3e4..f62c741b8 100644 --- a/src/EditSource.py +++ b/src/EditSource.py @@ -34,7 +34,6 @@ import gtk.glade import const import Utils import GrampsCfg -from RelLib import * import ImageSelect from intl import gettext as _ diff --git a/src/EventEdit.py b/src/EventEdit.py index 827749ce9..1bfa59154 100644 --- a/src/EventEdit.py +++ b/src/EventEdit.py @@ -39,10 +39,10 @@ import Utils import GrampsCfg import AutoComp import Calendar +import RelLib +import Date from DateEdit import DateEdit -from Date import compare_dates -from RelLib import * from intl import gettext as _ #------------------------------------------------------------------------- @@ -66,10 +66,10 @@ class EventEditor: if event: self.srcreflist = self.event.getSourceRefList() - self.date = Date(self.event.getDateObj()) + self.date = Date.Date(self.event.getDateObj()) else: self.srcreflist = [] - self.date = Date(None) + self.date = Date.Date(None) self.top = gtk.glade.XML(const.dialogFile, "event_edit") self.window = self.top.get_widget("event_edit") @@ -165,7 +165,7 @@ class EventEditor: if self.pmap.has_key(text): return self.parent.db.getPlaceMap()[self.pmap[text]] elif makenew: - place = Place() + place = RelLib.Place() place.set_title(text) self.parent.db.addPlace(place) self.pmap[text] = place.getId() @@ -190,7 +190,7 @@ class EventEditor: epriv = self.priv.get_active() if self.event == None: - self.event = Event() + self.event = RelLib.Event() self.event.setSourceRefList(self.srcreflist) self.parent.elist.append(self.event) @@ -220,7 +220,7 @@ class EventEditor: self.event.setSourceRefList(self.srcreflist) - if compare_dates(dobj,date) != 0: + if Date.compare_dates(dobj,date) != 0: self.event.setDateObj(date) self.parent.lists_changed = 1 diff --git a/src/FamilyView.py b/src/FamilyView.py index 53468d79a..a4713acba 100644 --- a/src/FamilyView.py +++ b/src/FamilyView.py @@ -18,6 +18,13 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +#------------------------------------------------------------------------- +# +# standard python modules +# +#------------------------------------------------------------------------- +import pickle + #------------------------------------------------------------------------- # # GTK/Gnome modules @@ -26,6 +33,7 @@ import gobject import gtk import gtk.glade +from gtk.gdk import ACTION_COPY, BUTTON1_MASK #------------------------------------------------------------------------- # @@ -34,17 +42,19 @@ import gtk.glade #------------------------------------------------------------------------- import const import sort -from intl import gettext as _ import Utils import GrampsCfg -from RelLib import Person -from QuestionDialog import QuestionDialog - import AddSpouse import SelectChild import DisplayTrace import Marriage import ChooseParents +import RelLib + +from intl import gettext as _ +from QuestionDialog import QuestionDialog,WarningDialog + +pycode_tgts = [('child', 0, 0)] #------------------------------------------------------------------------- # @@ -98,11 +108,18 @@ class FamilyView: self.selected_spouse = None self.child_list = self.top.get_widget('chlist') - self.child_list.set_reorderable(gtk.TRUE) + + self.child_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,ACTION_COPY) + self.child_list.drag_source_set(BUTTON1_MASK, pycode_tgts, ACTION_COPY) + self.child_list.connect('drag_data_get', self.drag_data_get) + self.child_list.connect('drag_begin', self.drag_begin) + self.child_list.connect('drag_data_received',self.drag_data_received) + self.child_model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_STRING,gobject.TYPE_STRING, gobject.TYPE_STRING,gobject.TYPE_STRING, gobject.TYPE_STRING) + self.child_selection = self.child_list.get_selection() self.child_list.connect('button-press-event',self.on_child_list_button_press) @@ -351,7 +368,7 @@ class FamilyView: def delete_family_from(self,person): person.removeFamily(self.family) - self.db.deleteFamily(self.family) + self.parent.db.deleteFamily(self.family) flist = self.person.getFamilyList() if len(flist) > 0: self.family = flist[0][0] @@ -385,9 +402,9 @@ class FamilyView: attr = "" for child in child_list: status = _("Unknown") - if child.getGender() == Person.male: + if child.getGender() == RelLib.Person.male: gender = const.male - elif child.getGender() == Person.female: + elif child.getGender() == RelLib.Person.female: gender = const.female else: gender = const.unknown @@ -507,5 +524,94 @@ class FamilyView: Utils.modified() self.load_family() + def child_list_reordered(self,path,iter): + print path,iter + + def on_child_list_row_move(self,clist,fm,to): + """Validate whether or not this child can be moved within the clist. + This routine is called in the middle of the clist's callbacks, so + the state can be confusing. If the code is being debugged, the + display at this point shows that the list has been reordered when in + actuality it hasn't. All accesses to the clist data structure + reference the state just prior to the move. + This routine must keep/compute its own list indices as the functions + list.remove(), list.insert(), list.reverse() etc. do not affect the + values returned from the list.index() routine.""" + + family = clist.get_data("f") + + # Create a list based upon the current order of the clist + clist_order = [] + for i in range(clist.rows): + clist_order = clist_order + [clist.get_row_data(i)] + child = clist_order[fm] + + # This function deals with ascending order lists. Convert if + # necessary. + if (self.child_sort.sort_direction() == GTK.SORT_DESCENDING): + clist_order.reverse() + max_index = len(clist_order) - 1 + fm = max_index - fm + to = max_index - to + # Create a new list to match the requested order + desired_order = clist_order[:fm] + clist_order[fm+1:] + desired_order = desired_order[:to] + [child] + desired_order[to:] + + # Check birth date order in the new list + if (EditPerson.birth_dates_in_order(desired_order) == 0): + clist.emit_stop_by_name("row_move") + msg = _("Invalid move. Children must be ordered by birth date.") + WarningDialog(msg) + return + + # OK, this birth order works too. Update the family data structures. + family.setChildList(desired_order) + + # Build a mapping of child item to list position. This would not + # be necessary if indices worked properly + i = 0 + new_order = {} + for tmp in desired_order: + new_order[tmp] = i + i = i + 1 + + # Convert the original list back to whatever ordering is being + # used by the clist itself. + if self.child_sort.sort_direction() == GTK.SORT_DESCENDING: + clist_order.reverse() + + # Update the clist indices so any change of sorting works + i = 0 + for tmp in clist_order: + clist.set_text(i,0,"%2d"%(new_order[tmp]+1)) + i = i + 1 + + # Need to save the changed order + Utils.modified() + + + def drag_data_received(self,widget,context,x,y,sel_data,info,time): + row = self.child_list.get_row_at(x,y) + + if sel_data and sel_data.data: + exec 'data = %s' % sel_data.data + exec 'mytype = "%s"' % data[0] + exec 'person = "%s"' % data[1] + if mytype != 'child': + return + elif person == self.person.getId(): + print row + # self.move_element(self.elist,self.etree.get_selected_row(),row) + + def drag_data_get(self,widget, context, sel_data, info, time): + ev = self.child_list.get_selected_objects() + + bits_per = 8; # we're going to pass a string + pickled = pickle.dumps(ev[0]); + data = str(('child',self.person.getId(),pickled)); + sel_data.set(sel_data.target, bits_per, data) + + def drag_begin(self, context, a): + return diff --git a/src/FrenchRepublic.py b/src/FrenchRepublic.py index b64abdb8c..0c7f923c3 100644 --- a/src/FrenchRepublic.py +++ b/src/FrenchRepublic.py @@ -85,7 +85,7 @@ class FrenchRepublic(Calendar.Calendar): try: return FrenchRepublic.M2NUM[val] except KeyError: - return UNDEF + return Calendar.UNDEF def get_sdn(self,y,m,d): """Converts a French Republican Calendar date to an SDN number""" diff --git a/src/GenericFilter.py b/src/GenericFilter.py index f2c63b6ec..28453190c 100644 --- a/src/GenericFilter.py +++ b/src/GenericFilter.py @@ -48,9 +48,10 @@ import gtk # #------------------------------------------------------------------------- import const -from RelLib import * +import RelLib import Date from intl import gettext as _ +from Utils import for_each_ancestor #------------------------------------------------------------------------- # @@ -151,7 +152,7 @@ class IsFemale(Rule): return 'Is a female' def apply(self,db,p): - return p.getGender() == Person.female + return p.getGender() == RelLib.Person.female #------------------------------------------------------------------------- # @@ -296,7 +297,7 @@ class IsMale(Rule): return 'Is a male' def apply(self,db,p): - return p.getGender() == Person.male + return p.getGender() == Person.Person.male #------------------------------------------------------------------------- # diff --git a/src/GrampsCfg.py b/src/GrampsCfg.py index 34c245c79..2f0d51c21 100644 --- a/src/GrampsCfg.py +++ b/src/GrampsCfg.py @@ -24,7 +24,6 @@ # Standard python modules # #------------------------------------------------------------------------- -import string import os import PaperMenu @@ -40,14 +39,15 @@ import gobject import gconf import gtk import gtk.glade +import gnome #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- -from RelLib import * -from Date import * +import RelLib +#from Date import * import const import Utils @@ -285,7 +285,7 @@ def loadConfig(call): autocomp = not ac Calendar.set_format_code(dateFormat) - Calendar.ENTRYCODE = dateEntry + Calendar.Calendar.ENTRYCODE = dateEntry if _name_format == 0: nameof = Utils.normal_name @@ -354,7 +354,7 @@ def get_researcher(): ph = get_string("/apps/gramps/researcher-phone") e = get_string("/apps/gramps/researcher-email") - owner = Researcher() + owner = RelLib.Researcher() owner.set(n,a,c,s,ct,p,ph,e) return owner @@ -555,7 +555,6 @@ class GrampsPreferences: vc = self.top.get_widget("use_vc") vcom = self.top.get_widget("vc_comment") compress = self.top.get_widget("uncompress") - detail = self.top.get_widget("showdetail") auto.set_active(autoload) asave_int.set_value(int(autosave_int)) @@ -671,7 +670,7 @@ class GrampsPreferences: item.connect("activate", self.on_format_toggled) item.show() date_menu.append(item) - date_menu.set_active(Calendar.ENTRYCODE) + date_menu.set_active(Calendar.Calendar.ENTRYCODE) date_entry.set_menu(date_menu) name_option = self.top.get_widget("name_format") @@ -912,7 +911,7 @@ class GrampsPreferences: format_menu = self.top.get_widget("date_entry_format").get_menu() entry_active = format_menu.get_active().get_data(INDEX) - Calendar.ENTRYCODE = entry_active + Calendar.Calendar.ENTRYCODE = entry_active set_int("/apps/gramps/date-entry",entry_active) # get the name format diff --git a/src/GrampsParser.py b/src/GrampsParser.py index 60bc1e10f..cf0d68ece 100644 --- a/src/GrampsParser.py +++ b/src/GrampsParser.py @@ -18,8 +18,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -from RelLib import * -from Date import SingleDate +import RelLib +import Date import string import Calendar @@ -93,7 +93,7 @@ class GrampsParser: self.event = None self.name = None self.tempDefault = None - self.owner = Researcher() + self.owner = RelLib.Researcher() self.func_list = [None]*50 self.func_index = 0 self.func = None @@ -114,7 +114,7 @@ class GrampsParser: def start_lds_ord(self,attrs): type = attrs['type'] - self.ord = LdsOrd() + self.ord = RelLib.LdsOrd() if self.person: if type == "baptism": self.person.setLdsBaptism(self.ord) @@ -158,7 +158,7 @@ class GrampsParser: """Bypass the function calls for this one, since it appears to take up quite a bit of time""" - loc = Location() + loc = RelLib.Location() if attrs.has_key('city'): loc.city = attrs['city'] if attrs.has_key('parish'): @@ -182,7 +182,7 @@ class GrampsParser: self.placeobj.set_longitude(attrs['long']) def start_event(self,attrs): - self.event = Event() + self.event = RelLib.Event() self.event_type = attrs["type"] if attrs.has_key("conf"): self.event.conf = int(attrs["conf"]) @@ -192,7 +192,7 @@ class GrampsParser: self.event.private = int(attrs["priv"]) def start_attribute(self,attrs): - self.attribute = Attribute() + self.attribute = RelLib.Attribute() if attrs.has_key("conf"): self.attribute.conf = int(attrs["conf"]) else: @@ -215,7 +215,7 @@ class GrampsParser: self.family.addAttribute(self.attribute) def start_address(self,attrs): - self.address = Address() + self.address = RelLib.Address() self.person.addAddress(self.address) if attrs.has_key("conf"): self.address.conf = int(attrs["conf"]) @@ -257,7 +257,7 @@ class GrampsParser: desc = "" try: - url = Url() + url = RelLib.Url() url.set_path(attrs["href"]) url.set_description(desc) if attrs.has_key("priv"): @@ -295,7 +295,7 @@ class GrampsParser: self.person.FamilyList.append(self.db.findFamilyNoMap(attrs["ref"])) def start_name(self,attrs): - self.name = Name() + self.name = RelLib.Name() if attrs.has_key("type"): self.name.setType(attrs["type"]) if attrs.has_key("conf"): @@ -313,7 +313,7 @@ class GrampsParser: self.in_note = 1 def start_sourceref(self,attrs): - self.source_ref = SourceRef() + self.source_ref = RelLib.SourceRef() source = self.db.findSourceNoMap(attrs["ref"]) if attrs.has_key("conf"): self.source_ref.confidence = int(attrs["conf"]) @@ -345,7 +345,7 @@ class GrampsParser: self.source = self.db.findSourceNoMap(attrs["id"]) def start_objref(self,attrs): - self.objref = ObjectRef() + self.objref = RelLib.ObjectRef() self.objref.setReference(self.db.findObjectNoMap(attrs['ref'])) if attrs.has_key('priv'): self.objref.setPrivacy(int(attrs['priv'])) @@ -378,8 +378,8 @@ class GrampsParser: self.objref = None def start_photo(self,attrs): - self.photo = Photo() - self.pref = ObjectRef() + self.photo = RelLib.Photo() + self.pref = RelLib.ObjectRef() self.pref.setReference(self.photo) for key in attrs.keys(): @@ -396,7 +396,7 @@ class GrampsParser: self.photo.setPath(src) self.photo.setLocal(0) else: - a = Attribute() + a = RelLib.Attribute() a.setType(key) a.setValue(attrs[key]) self.photo.addAttribute(a) @@ -531,7 +531,7 @@ class GrampsParser: if self.place_map.has_key(tag): self.placeobj = self.place_map[tag] else: - self.placeobj = Place() + self.placeobj = RelLib.Place() self.placeobj.set_title(tag) self.db.addPlace(self.placeobj) self.place_map[tag] = self.placeobj @@ -571,11 +571,11 @@ class GrampsParser: def stop_gender(self,tag): t = tag if t == "M": - self.person.gender = Person.male + self.person.gender = RelLib.Person.male elif t == "F": - self.person.gender = Person.female + self.person.gender = RelLib.Person.female else: - self.person.gender = Person.unknown + self.person.gender = RelLib.Person.unknown def stop_stitle(self,tag): self.source.setTitle(tag) @@ -591,7 +591,7 @@ class GrampsParser: self.source.setAuthor(tag) def stop_sdate(self,tag): - date = Date() + date = Date.Date() date.set(tag) self.source_ref.setDate(date) @@ -874,7 +874,7 @@ class GrampsImportParser(GrampsParser): self.family.setRelationship(attrs["type"]) def start_sourceref(self,attrs): - self.source_ref = SourceRef() + self.source_ref = RelLib.SourceRef() self.source = self.db.findSource(attrs["ref"],self.smap) self.source_ref.setBase(self.source) if self.address: diff --git a/src/GrampsXML.py b/src/GrampsXML.py index 60ff140c6..361216540 100644 --- a/src/GrampsXML.py +++ b/src/GrampsXML.py @@ -18,12 +18,12 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -from RelLib import GrampsDB +import RelLib import WriteXML import ReadXML import const -class GrampsXML(GrampsDB): +class GrampsXML(RelLib.GrampsDB): def get_base(self): return const.xmlFile @@ -32,7 +32,7 @@ class GrampsXML(GrampsDB): return 'GrampsXML' def new(self): - GrampsDB.new(self) + RelLib.GrampsDB.new(self) def save(self,name,callback): WriteXML.exportData(self,name,callback) diff --git a/src/Hebrew.py b/src/Hebrew.py index 8b185d93b..3431a0bfa 100644 --- a/src/Hebrew.py +++ b/src/Hebrew.py @@ -101,7 +101,7 @@ class Hebrew(Calendar.Calendar): try: return Hebrew.M2NUM[unicode(text.lower())] except KeyError: - return UNDEF + return Calendar.UNDEF def Tishri1(self,metonicYear, moladDay, moladHalakim): diff --git a/src/ImageSelect.py b/src/ImageSelect.py index c4db2ae98..885115938 100644 --- a/src/ImageSelect.py +++ b/src/ImageSelect.py @@ -26,13 +26,11 @@ import os import string import urlparse -import gc #------------------------------------------------------------------------- # # GTK/Gnome modules # #------------------------------------------------------------------------- -import gobject import gtk import gnome.ui import gnome.canvas @@ -47,13 +45,8 @@ import const import Utils import GrampsCfg import Plugins -from RelLib import * +import RelLib import RelImage - -import EditPerson -import Marriage -import EditPlace -import EditSource import ListModel import grampslib @@ -157,13 +150,13 @@ class ImageSelect: break if (already_imported): - oref = ObjectRef() + oref = RelLib.ObjectRef() oref.setReference(already_imported) self.dataobj.addPhoto(oref) self.add_thumbnail(oref) else: type = Utils.get_mime_type(filename) - mobj = Photo() + mobj = RelLib.Photo() if description == "": description = os.path.basename(filename) mobj.setDescription(description) @@ -229,7 +222,6 @@ class Gallery(ImageSelect): self.root = self.iconlist.root() # Local object variables - x = 0 self.y = 0 self.remember_x = -1 self.remember_y = -1 @@ -260,9 +252,9 @@ class Gallery(ImageSelect): self.drag_item = widget.get_item_at(self.remember_x, self.remember_y) if self.drag_item: - context = widget.drag_begin(_drag_targets, - gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE, - self.button, event) + widget.drag_begin(_drag_targets, + gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE, + self.button, event) return gtk.TRUE style = self.iconlist.get_style() @@ -321,7 +313,7 @@ class Gallery(ImageSelect): def savephoto(self, photo): """Save the photo in the dataobj object. (Required function)""" self.db.addObject(photo) - oref = ObjectRef() + oref = RelLib.ObjectRef() oref.setReference(photo) self.dataobj.addPhoto(oref) self.add_thumbnail(oref) @@ -408,7 +400,7 @@ class Gallery(ImageSelect): if protocol == "file": name = file mime = Utils.get_mime_type(name) - photo = Photo() + photo = RelLib.Photo() photo.setPath(name) photo.setMimeType(mime) basename = os.path.basename(name) @@ -434,13 +426,13 @@ class Gallery(ImageSelect): ErrorDialog("%s\n%s %d" % (t,msg[0],msg[1])) return mime = Utils.get_mime_type(tfile) - photo = Photo() + photo = RelLib.Photo() photo.setMimeType(mime) photo.setDescription(d) photo.setLocal(1) photo.setPath(tfile) self.db.addObject(photo) - oref = ObjectRef() + oref = RelLib.ObjectRef() oref.setReference(photo) self.dataobj.addPhoto(oref) try: @@ -482,7 +474,7 @@ class Gallery(ImageSelect): self.load_images() return index = index + 1 - oref = ObjectRef() + oref = RelLib.ObjectRef() oref.setReference(self.db.findObjectNoMap(data.data)) self.dataobj.addPhoto(oref) self.add_thumbnail(oref) diff --git a/src/ImgManip.py b/src/ImgManip.py index d7df9b9a6..6167fe4fc 100644 --- a/src/ImgManip.py +++ b/src/ImgManip.py @@ -20,7 +20,6 @@ import os import const -import string #------------------------------------------------------------------------- # @@ -44,8 +43,8 @@ class ImgManip: if no_pil: def size(self): - img = GdkImlib.Image(self.src) - return (img.rgb_width,img.rgb_height) + img = gtk.gdk.pixbuf_new_from_file(self.src) + return (img.get_width(),img.get_height()) def fmt_thumbnail(self,dest,width,height,cnv): w = int(width) diff --git a/src/ListModel.py b/src/ListModel.py index 0830d1efb..0796e4505 100644 --- a/src/ListModel.py +++ b/src/ListModel.py @@ -182,3 +182,4 @@ class ListModel: if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: self.double_click(obj) return 1 + return 0 diff --git a/src/LocEdit.py b/src/LocEdit.py index 05780a204..102dd2a3c 100644 --- a/src/LocEdit.py +++ b/src/LocEdit.py @@ -32,7 +32,7 @@ import gtk.glade #------------------------------------------------------------------------- import const import Utils -from RelLib import * +import RelLib from intl import gettext as _ @@ -84,7 +84,7 @@ class LocationEditor: parish = self.parish.get_text() if self.location == None: - self.location = Location() + self.location = RelLib.Location() self.parent.llist.append(self.location) self.update_location(city,parish,county,state,country) diff --git a/src/Marriage.py b/src/Marriage.py index 7c27d20c4..8c81b3ffb 100644 --- a/src/Marriage.py +++ b/src/Marriage.py @@ -25,10 +25,8 @@ import pickle # GTK/Gnome modules # #------------------------------------------------------------------------- -import gobject import gtk import gtk.glade -import gnome.ui #------------------------------------------------------------------------- # @@ -41,11 +39,18 @@ import GrampsCfg import Utils import AutoComp import ListModel -from QuestionDialog import QuestionDialog -from RelLib import * +import RelLib import ImageSelect +import Date + +from QuestionDialog import QuestionDialog, WarningDialog from intl import gettext as _ +#------------------------------------------------------------------------- +# +# Globals +# +#------------------------------------------------------------------------- _temple_names = const.lds_temple_codes.keys() _temple_names.sort() _temple_names = [""] + _temple_names @@ -210,7 +215,7 @@ class Marriage: import Sources ord = self.family.getLdsSeal() if ord == None: - ord = LdsOrd() + ord = RelLib.LdsOrd() self.family.setLdsSeal(ord) Sources.SourceSelector(ord.getSourceRefList(),self) @@ -218,7 +223,7 @@ class Marriage: import NoteEdit ord = self.family.getLdsSeal() if ord == None: - ord = LdsOrd() + ord = RelLib.LdsOrd() self.family.setLdsSeal(ord) NoteEdit.NoteEditor(ord) @@ -360,9 +365,9 @@ class Marriage: if date or temple or place or self.seal_stat: changed = 1 else: - d = Date() + d = Date.Date() d.set(date) - if compare_dates(d,ord.getDateObj()) != 0 or \ + if Date.compare_dates(d,ord.getDateObj()) != 0 or \ ord.getTemple() != temple or \ ord.getPlace() != place or \ ord.getStatus() != self.seal_stat: @@ -401,7 +406,7 @@ class Marriage: Utils.modified() else: msg1 = _("GRAMPS ID value was not changed.") - GnomeWarningDialog("%s" % msg1) + WarningDialog("%s" % msg1) relation = self.type_field.entry.get_text() father = self.family.getFather() @@ -414,8 +419,8 @@ class Marriage: val = const.save_frel(relation) if val == "Partners": val = "Unknown" - if father.getGender() == Person.female or \ - mother.getGender() == Person.male: + if father.getGender() == RelLib.Person.female or \ + mother.getGender() == RelLib.Person.male: self.family.setFather(mother) self.family.setMother(father) self.family.setRelationship(val) @@ -438,7 +443,7 @@ class Marriage: ord = self.family.getLdsSeal() if not ord: if date or temple or place or self.seal_stat: - ord = LdsOrd() + ord = RelLib.LdsOrd() ord.setDate(date) ord.setTemple(temple) ord.setStatus(self.seal_stat) @@ -446,9 +451,9 @@ class Marriage: self.family.setLdsSeal(ord) Utils.modified() else: - d = Date() + d = Date.Date() d.set(date) - if compare_dates(d,ord.getDateObj()) != 0: + if Date.compare_dates(d,ord.getDateObj()) != 0: ord.setDateObj(d) Utils.modified() if ord.getTemple() != temple: diff --git a/src/MediaView.py b/src/MediaView.py index 901518792..36428e7f5 100644 --- a/src/MediaView.py +++ b/src/MediaView.py @@ -24,6 +24,7 @@ # #------------------------------------------------------------------------- import string +import os #------------------------------------------------------------------------- # @@ -34,21 +35,20 @@ import gobject import gtk import gtk.gdk -import ImageSelect - #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- -from RelLib import * -from QuestionDialog import QuestionDialog, ErrorDialog +import RelLib import Utils -import os import GrampsCfg import const +import ImageSelect import RelImage +from QuestionDialog import QuestionDialog, ErrorDialog + #------------------------------------------------------------------------- # # internationalization @@ -187,7 +187,7 @@ class MediaView: def popup_convert_to_private(self, obj): path = self.db.getSavePath() id = self.obj.getId() - name = RelImage.import_object(self.obj.getPath(),path,id) + name = RelImage.import_media_object(self.obj.getPath(),path,id) if name: self.obj.setPath(name) self.obj.setLocal(1) @@ -302,7 +302,7 @@ class MediaView: if protocol == "file": name = file mime = Utils.get_mime_type(name) - photo = Photo() + photo = RelLib.Photo() photo.setPath(name) photo.setMimeType(mime) description = os.path.basename(name) @@ -332,13 +332,13 @@ class MediaView: ErrorDialog("%s\n%s %d" % (t,msg[0],msg[1])) return mime = Utils.get_mime_type(tfile) - photo = Photo() + photo = RelLib.Photo() photo.setMimeType(mime) photo.setDescription(d) photo.setLocal(1) photo.setPath(tfile) self.db.addObject(photo) - oref = ObjectRef() + oref = RelLib.ObjectRef() oref.setReference(photo) try: id = photo.getId() diff --git a/src/NameEdit.py b/src/NameEdit.py index 7cf73c804..6650063e5 100644 --- a/src/NameEdit.py +++ b/src/NameEdit.py @@ -34,7 +34,7 @@ import const import Utils import AutoComp import Sources -from RelLib import * +import RelLib from intl import gettext as _ @@ -114,7 +114,7 @@ class NameEditor: type = "Also Known As" if self.name == None: - self.name = Name() + self.name = RelLib.Name() self.parent.nlist.append(self.name) self.name.setSourceRefList(self.srcreflist) diff --git a/src/NoteEdit.py b/src/NoteEdit.py index ed380352e..c9809f9fe 100644 --- a/src/NoteEdit.py +++ b/src/NoteEdit.py @@ -24,7 +24,6 @@ # #------------------------------------------------------------------------- import gtk -import gnome.ui #------------------------------------------------------------------------- # diff --git a/src/PedView.py b/src/PedView.py index a5af737b0..1cff11743 100644 --- a/src/PedView.py +++ b/src/PedView.py @@ -347,100 +347,6 @@ class PedigreeView: y*3.0, y*5.0, y*7.0, y*9.0, y*11.0, y*13.0, y*15.0, y*17.0, y*19.0, y*21.0, y*23.0, y*25.0, y*27.0, y*29.0, y*31.0 ] return map(lambda coord, top_pad=top_pad: coord + top_pad, res) - - def add_box(self, x, y, bwidth, bheight, person, style): - """Draw a box of the specified size at the specified location. - The box consists of a shadow box for effect, the real box - that contains the information, and the basic text - information. For convience, the all the subelements are - grouped into a GNOME canvas group.""" - - shadow = _PAD - xpad = _PAD - - name = person.getPrimaryName().getName() - group = self.root.add(gnome.canvas.CanvasGroup,x=x,y=y) - self.canvas_items.append(group) - - # draw the shadow box - item = group.add(gnome.canvas.CanvasRect, x1=shadow, y1=shadow, - x2=bwidth+shadow, y2=bheight+shadow, - outline_color_gdk=style.dark[gtk.STATE_NORMAL], - fill_color_gdk=style.dark[gtk.STATE_NORMAL]) - self.canvas_items.append(item) - - # draw the real box - item = group.add(gnome.canvas.CanvasRect, x1=0, y1=0, x2=bwidth, y2=bheight, - outline_color_gdk=style.bg[gtk.STATE_NORMAL], - fill_color_gdk=style.white) - self.canvas_items.append(item) - - # Write the text - - font = gtk.gdk.font_from_description(style.font_desc) - - item = group.add(gnome.canvas.CanvasText, x=xpad, y=bheight/2.0, text=name, - fill_color_gdk=style.text[gtk.STATE_NORMAL], - font=font, anchor=gtk.ANCHOR_WEST) - self.canvas_items.append(item) - group.connect('event',self.box_event) - group.set_data('p',person) - - def box_event(self,obj,event): - """Handle events over a drawn box. Doubleclick would edit, - shift doubleclick would change the active person, entering - the box expands it to display more information, leaving a - box returns it to the original size and information""" - - if event.type == gtk.gdk._2BUTTON_PRESS: -# if event.button == 1: -# person = obj.get_data(_PERSON) -# if (event.state & gtk.gdk.SHIFT_MASK) or (event.state & gtk.gdk.CONTROL_MASK): -# self.change_active_person(person) -# del self.presel_descendants[:] -# self.load_canvas(person) -# else: -# self.load_person(person) - return 1 - elif event.type == gtk.gdk.ENTER_NOTIFY: - self.expand_box(obj) - return 0 - elif event.type == gtk.gdk.LEAVE_NOTIFY: - self.shrink_box(obj) - return 0 - return 0 - - def shrink_box(self,obj): - """Shrink an exanded box back down to normal size""" - box = self.group_map[obj][1] - x,y,w,h = box.get_bounds() - box.set(x1=x,y1=y,x2=w,y2=h/3) - box2 = self.group_map[obj][2] - x,y,w,h1 = box2.get_bounds() - person = obj.get_data('p') - n = person.getPrimaryName().getName() - box2.set(text=n) - self.update() - self.canvas.update_now() - - def expand_box(self,obj): - """Expand a box to include additional information""" - obj.raise_to_top() - x,y,w,h = box.get_bounds() - box.set(x1=x,y1=y,x2=w,y2=h*3) - box2 = self.group_map[obj][0] - x,y,w,h1 = box2.get_bounds() - box2.set(x1=x,y1=y,x2=w,y2=(3*h)+_PAD) - person = obj.get_data('p') - color = self.canvas.get_style().text[gtk.STATE_NORMAL] - n = "%s\nb. %s.\nd. %s" % (person.getPrimaryName().getName(), - person.getBirth().getDate(), - person.getDeath().getDate()) - box2 = self.group_map[obj][2] - box2.set(text=n) - box2.show() - msg = _("Doubleclick to edit, Shift-Doubleclick to make the active person") - self.sb.set_status(msg) def line_event(self,obj,event): """Catch X events over a line and respond to the ones we care about""" @@ -461,18 +367,6 @@ class PedigreeView: obj.set(fill_color_gdk=style.black, width_pixels=2) self.update() - def on_canvas1_event(self,obj,event): - """Handle resize events over the canvas, redrawing if the size changes""" - - if event.type == gtk.gdk.EXPOSE: - x1,y1,x2,y2 = self.canvas.get_allocation() - if self.x1 != x1 or self.x2 != x2 or \ - self.y1 != y1 or self.y2 != y2: - self.x1 = x1; self.x2 = x2 - self.y1 = y1; self.y2 = y2 - self.load_canvas(self.active_person) - return 0 - def find_tree(self,person,index,depth,list,val=0): """Recursively build a list of ancestors""" @@ -492,3 +386,14 @@ class PedigreeView: if mother != None: self.find_tree(mother,(2*index)+2,depth+1,list,mrel) + def on_canvas1_event(self,obj,event): + """Handle resize events over the canvas, redrawing if the size changes""" + + if event.type == gtk.gdk.EXPOSE: + x1,y1,x2,y2 = self.canvas.get_allocation() + if self.x1 != x1 or self.x2 != x2 or \ + self.y1 != y1 or self.y2 != y2: + self.x1 = x1; self.x2 = x2 + self.y1 = y1; self.y2 = y2 + self.load_canvas(self.active_person) + return 0 diff --git a/src/PlaceView.py b/src/PlaceView.py index 150053405..b3bbcac0e 100644 --- a/src/PlaceView.py +++ b/src/PlaceView.py @@ -36,13 +36,11 @@ import gtk.gdk # Gramps modules # #------------------------------------------------------------------------- -from RelLib import * -from QuestionDialog import QuestionDialog, ErrorDialog - +import RelLib import EditPlace import Utils -import GrampsCfg +from QuestionDialog import QuestionDialog, ErrorDialog from intl import gettext as _ _column_headers = [ @@ -147,6 +145,7 @@ class PlaceView: if mlist: EditPlace.EditPlace(self,mlist[0],self.update_display) return 1 + return 0 def new_place_after_edit(self,place): self.db.addPlace(place) @@ -158,7 +157,7 @@ class PlaceView: self.update(0) def on_add_place_clicked(self,obj): - EditPlace.EditPlace(self,Place(),self.new_place_after_edit) + EditPlace.EditPlace(self,RelLib.Place(),self.new_place_after_edit) def on_delete_clicked(self,obj): mlist = [] diff --git a/src/Plugins.py b/src/Plugins.py index 71d17bbc7..e3a58088e 100644 --- a/src/Plugins.py +++ b/src/Plugins.py @@ -167,12 +167,12 @@ class PluginDialog: xpm = data[3] status = data[4] - st = string.join(xpm,'\n') - # image = gtk.gdk.pixbuf_new_from_inline(len(st),st,0) + #st = string.join(xpm,'\n') + #image = gtk.gdk.pixbuf_new_from_inline(len(st),st,0) self.description.set_text(doc) self.status.set_text(": %s" % status) self.label.show() - # self.img.set_from_pixbuf(image) + #self.img.set_from_pixbuf(image) self.title.set_text(title) self.dialog.get_widget("title").set_text(title) diff --git a/src/QuestionDialog.py b/src/QuestionDialog.py index 163da9e73..97cd61bdd 100644 --- a/src/QuestionDialog.py +++ b/src/QuestionDialog.py @@ -19,7 +19,6 @@ # import gtk -import gnome.ui from intl import gettext as _ class QuestionDialog: diff --git a/src/ReadXML.py b/src/ReadXML.py index 8c1672558..214d5e998 100644 --- a/src/ReadXML.py +++ b/src/ReadXML.py @@ -26,19 +26,12 @@ import string import os -#------------------------------------------------------------------------- -# -# Gnome/GTK -# -#------------------------------------------------------------------------- -import gnome.ui - #------------------------------------------------------------------------- # # Gramps Modules # #------------------------------------------------------------------------- -from RelLib import * +import RelLib from GrampsParser import GrampsParser, GrampsImportParser from QuestionDialog import ErrorDialog, WarningDialog from intl import gettext as _ diff --git a/src/RelImage.py b/src/RelImage.py index 48d8bfc51..db7fa141c 100644 --- a/src/RelImage.py +++ b/src/RelImage.py @@ -32,7 +32,7 @@ import string # #------------------------------------------------------------------------- import gtk -from QuestionDialog import ErrorDialog +from QuestionDialog import ErrorDialog, WarningDialog #------------------------------------------------------------------------- # @@ -105,7 +105,7 @@ def scale_image(path,size): try: image1 = gtk.gdk.pixbuf_new_from_file(path) except: - GnomeWarningDialog(_("Could not load image file %s") % path) + WarningDialog(_("Could not load image file %s") % path) return gtk.gdk.pixbuf_new_from_file(const.icon) width = image1.get_width() @@ -116,7 +116,7 @@ def scale_image(path,size): image1.scale_simple(int(scale*width), int(scale*height), gtk.gdk.INTERP_BILINEAR) return image1 except: - GnomeWarningDialog(_("Could not load image file %s") % path) + WarningDialog(_("Could not load image file %s") % path) return gtk.gdk.pixbuf_new_from_file(const.icon) #------------------------------------------------------------------------- diff --git a/src/SelectChild.py b/src/SelectChild.py index 9c35cd08d..860f672ee 100644 --- a/src/SelectChild.py +++ b/src/SelectChild.py @@ -30,7 +30,6 @@ from intl import gettext as _ # standard python modules # #------------------------------------------------------------------------- -import string #------------------------------------------------------------------------- # @@ -44,13 +43,9 @@ import gtk.glade # gramps modules # #------------------------------------------------------------------------- -from RelLib import * - +import RelLib import const -import sort import Utils -import GrampsCfg -import AutoComp import ListModel #------------------------------------------------------------------------- @@ -96,7 +91,7 @@ class SelectChild: fname = self.person.getPrimaryName().getName() label = _("Relationship to %s") % fname - if self.person.getGender() == Person.male: + if self.person.getGender() == RelLib.Person.male: self.xml.get_widget("flabel").set_text(label) self.xml.get_widget("mrel_combo").set_sensitive(0) else: @@ -118,8 +113,6 @@ class SelectChild: def redraw_child_list(self,filter): self.refmodel.clear() - index = 0 - bday = self.person.getBirth().getDateObj() dday = self.person.getDeath().getDateObj() @@ -187,7 +180,7 @@ class SelectChild: if self.family == None: self.family = self.db.newFamily() self.person.addFamily(self.family) - if self.person.getGender() == Person.male: + if self.person.getGender() == RelLib.Person.male: self.family.setFather(self.person) else: self.family.setMother(self.person) @@ -196,13 +189,13 @@ class SelectChild: mrel = const.childRelations[self.mrel.get_text()] mother = self.family.getMother() - if mother and mother.getGender() != Person.female: + if mother and mother.getGender() != RelLib.Person.female: if mrel == "Birth": mrel = "Unknown" frel = const.childRelations[self.frel.get_text()] father = self.family.getFather() - if father and father.getGender() != Person.male: + if father and father.getGender() !=RelLib. Person.male: if frel == "Birth": frel = "Unknown" diff --git a/src/SourceView.py b/src/SourceView.py index dfa6c695c..0726edcc7 100644 --- a/src/SourceView.py +++ b/src/SourceView.py @@ -38,12 +38,11 @@ import gtk.gdk # gramps modules # #------------------------------------------------------------------------- -from RelLib import * -from QuestionDialog import QuestionDialog - +import RelLib import EditSource import Utils -import GrampsCfg + +from QuestionDialog import QuestionDialog #------------------------------------------------------------------------- # @@ -109,9 +108,10 @@ class SourceView: source = self.db.getSource(id) EditSource.EditSource(source,self.db,self.update_display) return 1 + return 0 def on_add_clicked(self,obj): - EditSource.EditSource(Source(),self.db,self.new_after_edit) + EditSource.EditSource(RelLib.Source(),self.db,self.new_after_edit) def on_delete_clicked(self,obj): diff --git a/src/Sources.py b/src/Sources.py index dc5438e40..6794810f3 100644 --- a/src/Sources.py +++ b/src/Sources.py @@ -34,7 +34,7 @@ import gtk.glade #------------------------------------------------------------------------- import const import Utils -from RelLib import * +import RelLib from intl import gettext as _ #------------------------------------------------------------------------- @@ -50,7 +50,7 @@ class SourceSelector: self.orig = srclist self.list = [] for s in self.orig: - self.list.append(SourceRef(s)) + self.list.append(RelLib.SourceRef(s)) self.update=update self.top = gtk.glade.XML(const.srcselFile,"sourcesel") self.top.signal_autoconnect({ @@ -106,7 +106,7 @@ class SourceSelector: inst.redraw() def add_src_clicked(self,obj): - src = SourceRef() + src = RelLib.SourceRef() SourceEditor(src,self.db,self.add_ref,self) def del_src_clicked(self,obj): @@ -177,7 +177,7 @@ class SourceTab: SourceEditor(src,self.db,self.update_clist,self) def add_src_clicked(self,obj): - src = SourceRef() + src = RelLib.SourceRef() SourceEditor(src,self.db,self.add_ref,self) def add_ref(self,inst,ref): diff --git a/src/StartupDialog.py b/src/StartupDialog.py index 211d33d29..c8386d815 100644 --- a/src/StartupDialog.py +++ b/src/StartupDialog.py @@ -20,7 +20,6 @@ import const import gtk.glade -import gnome import gconf import Utils @@ -75,18 +74,18 @@ class StartupDialog: dateFormat = 1 else: dateFormat = 2 - self.client_set_int("/gramps/config/dateEntry",dateFormat) + self.client.set_int("/gramps/config/dateEntry",dateFormat) showcal = self.druid.get_widget("altcal").get_active() - self.client_set_int("/gramps/config/ShowCalendar",showcal) + self.client.set_int("/gramps/config/ShowCalendar",showcal) lds = self.druid.get_widget("enable_lds").get_active() - self.client_set_int("/gramps/config/UseLDS",lds) - self.client_set_int(_StartupEntry,const.startup) - self.client_sync() + self.client.set_int("/gramps/config/UseLDS",lds) + self.client.set_int(_StartupEntry,const.startup) + self.client.sync() Utils.destroy_passed_object(obj) def on_cancel_clicked(self,obj): - self.client_set_int(_StartupEntry,const.startup) - self.client_sync() + self.client.set_int(_StartupEntry,const.startup) + self.client.sync() Utils.destroy_passed_object(obj) diff --git a/src/StyleEditor.py b/src/StyleEditor.py index 7d23ba734..7f8274307 100644 --- a/src/StyleEditor.py +++ b/src/StyleEditor.py @@ -30,7 +30,6 @@ __version__ = "$Revision$" # GNOME/GTK modules # #------------------------------------------------------------------------ -import gtk.glade import gtk #------------------------------------------------------------------------ @@ -70,7 +69,7 @@ class StyleListDisplay: "on_edit_clicked" : self.on_edit_clicked }) - self.list = ListModel.ListModel(self.top.get_widget("list"),[('Style',10,10)]) + self.list = ListModel.ListModel(self.top.get_widget("list"),[('Style',-1,10)]) self.redraw() def redraw(self): @@ -151,14 +150,15 @@ class StyleEditor: self.top.signal_autoconnect({ "on_save_style_clicked" : self.on_save_style_clicked, - "fg_color_set":self.fg_color_set, - "bg_color_set":self.bg_color_set, "destroy_passed_object" : Utils.destroy_passed_object }) self.window = self.top.get_widget("editor") self.pnames = self.top.get_widget("name") + self.top.get_widget('color').connect('color-set',self.fg_color_set) + self.top.get_widget('bgcolor').connect('color-set',self.bg_color_set) + self.top.get_widget("style_name").set_text(name) myMenu = gtk.Menu() first = 0 @@ -202,16 +202,16 @@ class StyleEditor: self.top.get_widget("lborder").set_active(p.get_left_border()) self.top.get_widget("rborder").set_active(p.get_right_border()) self.top.get_widget("bborder").set_active(p.get_bottom_border()) - c = font.get_color() - self.top.get_widget("color").set_i8(c[0],c[1],c[2],0) - c = p.get_background_color() - self.top.get_widget("bgcolor").set_i8(c[0],c[1],c[2],0) + self.fg_color = font.get_color() + self.top.get_widget("color").set_i8(self.fg_color[0],self.fg_color[1],self.fg_color[2],0) + self.bg_color = p.get_background_color() + self.top.get_widget("bgcolor").set_i8(self.bg_color[0],self.bg_color[1],self.bg_color[2],0) - def bg_color_set(self,obj,r,g,b,a): - print r,g,b,a + def bg_color_set(self,x,r,g,b,a): + self.bg_color = (r >> 8, g >> 8, b >> 8) - def fg_color_set(self,obj,r,g,b,a): - print r,g,b,ax + def fg_color_set(self,x,r,g,b,a): + self.fg_color = (r >> 8, g >> 8, b >> 8) def save_paragraph(self,p): """Saves the current paragraph displayed on the dialog""" @@ -244,10 +244,8 @@ class StyleEditor: p.set_right_border(self.top.get_widget("rborder").get_active()) p.set_bottom_border(self.top.get_widget("bborder").get_active()) - c = fg.get_i8() - font.set_color((c[0],c[1],c[2])) - c = bg.get_i8() - p.set_background_color((c[0],c[1],c[2])) + font.set_color(self.fg_color) + p.set_background_color(self.bg_color) def on_save_style_clicked(self,obj): """ diff --git a/src/UrlEdit.py b/src/UrlEdit.py index 0680e361d..e5250916d 100644 --- a/src/UrlEdit.py +++ b/src/UrlEdit.py @@ -32,7 +32,7 @@ import gtk.glade #------------------------------------------------------------------------- import const import Utils -from RelLib import * +import RelLib #------------------------------------------------------------------------- # @@ -68,7 +68,7 @@ class UrlEditor: priv = self.priv.get_active() if self.url == None: - self.url = Url() + self.url = RelLib.Url() self.parent.ulist.append(self.url) self.update_url(des,addr,priv) diff --git a/src/Utils.py b/src/Utils.py index 3950dff17..0df11ec57 100644 --- a/src/Utils.py +++ b/src/Utils.py @@ -554,3 +554,36 @@ def build_columns(tree,list): column.set_visible(gtk.FALSE) cnum = cnum + 1 tree.append_column(column) + +#------------------------------------------------------------------------- +# +# Iterate over ancestors. +# +#------------------------------------------------------------------------- +def for_each_ancestor(start, func, data): + """ + Recursively iterate (breadth-first) over ancestors of + people listed in start. + Call func(data,pid) for the Id of each person encountered. + Exit and return 1, as soon as func returns true. + Return 0 otherwise. + """ + todo = start + doneIds = {} + while len(todo): + p = todo.pop() + pid = p.getId() + # Don't process the same Id twice. This can happen + # if there is a cycle in the database, or if the + # initial list contains X and some of X's ancestors. + if doneIds.has_key(pid): + continue + doneIds[pid] = 1 + if func(data,pid): + return 1 + for fam, mrel, frel in p.getParentList(): + f = fam.getFather() + m = fam.getMother() + if f: todo.append(f) + if m: todo.append(m) + return 0 diff --git a/src/WriteXML.py b/src/WriteXML.py index f1b6e484d..4e7ea471f 100644 --- a/src/WriteXML.py +++ b/src/WriteXML.py @@ -40,6 +40,7 @@ import os import const import GrampsCfg import Calendar +import Gregorian from RelLib import * from intl import gettext as _ from QuestionDialog import ErrorDialog @@ -455,7 +456,7 @@ class XmlWriter: return name = date.get_calendar().NAME - if name != Calendar.Gregorian.NAME: + if name != Gregorian.Gregorian.NAME: calstr = ' cformat="%s"' % name else: calstr = '' diff --git a/src/ansel_utf8.py b/src/ansel_utf8.py index 985426e51..3f6e5b7b7 100644 --- a/src/ansel_utf8.py +++ b/src/ansel_utf8.py @@ -1,5 +1,6 @@ +import cStringIO -s0 = { +_s0 = { 0xA1 : u'\x01\x41', 0xA2 : u'\xD8', 0xA3 : u'\x01\x10', 0xA4 : u'\xDE', 0xA5 : u'\xC6', 0xA6 : u'\x01\x52', 0xA7 : u'\x02\xB9', 0xA8 : u'\xB7', 0xA9 : u'\x26\x6D', diff --git a/src/calendars/Islamic.py b/src/calendars/Islamic.py index d84a77606..368426dce 100644 --- a/src/calendars/Islamic.py +++ b/src/calendars/Islamic.py @@ -28,6 +28,13 @@ web site at http://www.scottlee.com __author__ = "Donald N. Allingham" __version__ = "$Revision$" +#------------------------------------------------------------------------- +# +# python modules +# +#------------------------------------------------------------------------- +import math + #------------------------------------------------------------------------- # # Gramps Modules @@ -69,7 +76,7 @@ class Islamic(Calendar.Calendar): try: return Islamic.M2NUM[unicode(text.lower())] except KeyError: - return UNDEF + return Calendar.UNDEF def month(self,val): try: diff --git a/src/calendars/Persian.py b/src/calendars/Persian.py index ac8c8c1da..171d1b073 100644 --- a/src/calendars/Persian.py +++ b/src/calendars/Persian.py @@ -28,6 +28,13 @@ web site at http://www.scottlee.com __author__ = "Donald N. Allingham" __version__ = "$Revision$" +#------------------------------------------------------------------------- +# +# python modules +# +#------------------------------------------------------------------------- +import math + #------------------------------------------------------------------------- # # Gramps Modules @@ -67,7 +74,7 @@ class Persian(Calendar.Calendar): try: return Persian.M2NUM[unicode(text.lower())] except KeyError: - return UNDEF + return Calendar.UNDEF def month(self,val): try: diff --git a/src/gramps_main.py b/src/gramps_main.py index c2ab1ba08..52e5d4852 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -922,70 +922,6 @@ class Gramps: self.status_text(name) return 0 - def on_child_list_row_move(self,clist,fm,to): - """Validate whether or not this child can be moved within the clist. - This routine is called in the middle of the clist's callbacks, so - the state can be confusing. If the code is being debugged, the - display at this point shows that the list has been reordered when in - actuality it hasn't. All accesses to the clist data structure - reference the state just prior to the move. - - This routine must keep/compute its own list indices as the functions - list.remove(), list.insert(), list.reverse() etc. do not affect the - values returned from the list.index() routine.""" - - family = clist.get_data("f") - - # Create a list based upon the current order of the clist - clist_order = [] - for i in range(clist.rows): - clist_order = clist_order + [clist.get_row_data(i)] - child = clist_order[fm] - - # This function deals with ascending order lists. Convert if - # necessary. - if (self.child_sort.sort_direction() == GTK.SORT_DESCENDING): - clist_order.reverse() - max_index = len(clist_order) - 1 - fm = max_index - fm - to = max_index - to - - # Create a new list to match the requested order - desired_order = clist_order[:fm] + clist_order[fm+1:] - desired_order = desired_order[:to] + [child] + desired_order[to:] - - # Check birth date order in the new list - if (EditPerson.birth_dates_in_order(desired_order) == 0): - clist.emit_stop_by_name("row_move") - msg = _("Invalid move. Children must be ordered by birth date.") - WarningDialog(msg) - return - - # OK, this birth order works too. Update the family data structures. - family.setChildList(desired_order) - - # Build a mapping of child item to list position. This would not - # be necessary if indices worked properly - i = 0 - new_order = {} - for tmp in desired_order: - new_order[tmp] = i - i = i + 1 - - # Convert the original list back to whatever ordering is being - # used by the clist itself. - if self.child_sort.sort_direction() == GTK.SORT_DESCENDING: - clist_order.reverse() - - # Update the clist indices so any change of sorting works - i = 0 - for tmp in clist_order: - clist.set_text(i,0,"%2d"%(new_order[tmp]+1)) - i = i + 1 - - # Need to save the changed order - Utils.modified() - def on_open_activate(self,obj): wFs = gtk.glade.XML(const.revisionFile, "dbopen") wFs.signal_autoconnect({ diff --git a/src/plugins/GraphViz.py b/src/plugins/GraphViz.py index 11765cce8..068f6c04f 100644 --- a/src/plugins/GraphViz.py +++ b/src/plugins/GraphViz.py @@ -85,22 +85,26 @@ class GraphVizDialog(ReportDialog): des = GenericFilter.GenericFilter() des.set_name(_("Descendants of %s") % name) des.add_rule(GenericFilter.IsDescendantOf([self.person.getId()])) - + ans = GenericFilter.GenericFilter() ans.set_name(_("Ancestors of %s") % name) ans.add_rule(GenericFilter.IsAncestorOf([self.person.getId()])) - return [all,des,ans] + com = GenericFilter.GenericFilter() + com.set_name(_("People with common ancestor with %s") % name) + com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.getId()])) + + return [all,des,ans,com] def add_user_options(self): self.arrowstyle_optionmenu = gtk.OptionMenu() menu = gtk.Menu() - + menuitem = gtk.MenuItem(_("Descendants <- Ancestors")) menuitem.set_data('t', ('none', 'normal')) menuitem.show() menu.append(menuitem) - + menuitem = gtk.MenuItem(_("Descendants -> Ancestors")) menuitem.set_data('t', ('normal', 'none')) menuitem.show() @@ -162,13 +166,21 @@ class GraphVizDialog(ReportDialog): _("Non-birth relationships will show up " "as dashed lines in the graph.")) + self.show_families_cb = gtk.CheckButton(_("Show family nodes")) + self.show_families_cb.set_active(0) + self.add_frame_option(_("GraphViz Options"), + '', + self.show_families_cb, + _("Families will show up as circles, linked " + "to parents and children.")) + tb_margin_adj = gtk.Adjustment(value=0.5, lower=0.25, upper=100.0, step_incr=0.25) lr_margin_adj = gtk.Adjustment(value=0.5, lower=0.25, upper=100.0, step_incr=0.25) - self.tb_margin_sb = gtk.SpinButton(adj=tb_margin_adj, digits=2) - self.lr_margin_sb = gtk.SpinButton(adj=lr_margin_adj, digits=2) + self.tb_margin_sb = gtk.SpinButton(adjustment=tb_margin_adj, digits=2) + self.lr_margin_sb = gtk.SpinButton(adjustment=lr_margin_adj, digits=2) self.add_frame_option(_("GraphViz Options"), _("Top & Bottom Margins"), @@ -180,8 +192,8 @@ class GraphVizDialog(ReportDialog): hpages_adj = gtk.Adjustment(value=1, lower=1, upper=25, step_incr=1) vpages_adj = gtk.Adjustment(value=1, lower=1, upper=25, step_incr=1) - self.hpages_sb = gtk.SpinButton(adj=hpages_adj, digits=0) - self.vpages_sb = gtk.SpinButton(adj=vpages_adj, digits=0) + self.hpages_sb = gtk.SpinButton(adjustment=hpages_adj, digits=0) + self.vpages_sb = gtk.SpinButton(adjustment=vpages_adj, digits=0) self.add_frame_option(_("GraphViz Options"), _("Number of Horizontal Pages"), @@ -239,13 +251,14 @@ class GraphVizDialog(ReportDialog): self.arrowheadstyle, self.arrowtailstyle = menu.get_active().get_data('t') self.includedates = self.includedates_cb.get_active() self.includeurl = self.includeurl_cb.get_active() - self.tb_margin = self.tb_margin_sb.get_value_as_float() - self.lr_margin = self.lr_margin_sb.get_value_as_float() + self.tb_margin = self.tb_margin_sb.get_value() + self.lr_margin = self.lr_margin_sb.get_value() self.colorize = self.colorize_cb.get_active() self.adoptionsdashed = self.adoptionsdashed_cb.get_active() self.hpages = self.hpages_sb.get_value_as_int() self.vpages = self.vpages_sb.get_value_as_int() - + self.show_families = self.show_families_cb.get_active() + #------------------------------------------------------------------------ # # Functions related to creating the actual report document. @@ -258,88 +271,119 @@ class GraphVizDialog(ReportDialog): file = open(self.target_path,"w") - ind_list = self.filter.apply(self.db.getPersonMap().values()) + ind_list = self.filter.apply(self.db, self.db.getPersonMap().values()) write_dot(file, ind_list, self.orien, width, height, self.tb_margin, self.lr_margin, self.hpages, self.vpages, self.includedates, self.includeurl, - self.colorize, self.adoptionsdashed, self.arrowheadstyle, self.arrowtailstyle) - + self.colorize, self.adoptionsdashed, self.arrowheadstyle, + self.arrowtailstyle, self.show_families) + #------------------------------------------------------------------------ # -# +# # #------------------------------------------------------------------------ def report(database,person): GraphVizDialog(database,person) - + #------------------------------------------------------------------------ # -# +# # #------------------------------------------------------------------------ def write_dot(file, ind_list, orien, width, height, tb_margin, lr_margin, hpages, vpages, includedates, includeurl, - colorize, adoptionsdashed, arrowheadstyle, arrowtailstyle): + colorize, adoptionsdashed, arrowheadstyle, arrowtailstyle, + show_families): file.write("digraph g {\n") file.write("bgcolor=white;\n") file.write("rankdir=LR;\n") file.write("center=1;\n") file.write("margin=0.5;\n") file.write("ratio=fill;\n") - file.write("size=\"%3.1fin,%3.1fin\";\n" % ((width*hpages)-(lr_margin*2)-((hpages-1)*1.0), + file.write("size=\"%3.1f,%3.1f\";\n" % ((width*hpages)-(lr_margin*2)-((hpages-1)*1.0), (height*vpages)-(tb_margin*2)-((vpages-1)*1.0))) - file.write("page=\"%3.1fin,%3.1fin\";\n" % (width,height)) + file.write("page=\"%3.1f,%3.1f\";\n" % (width,height)) if orien == PAPER_LANDSCAPE: file.write("rotate=90;\n") if len(ind_list) > 1: - dump_index(ind_list,file,includedates,includeurl,colorize) - dump_person(ind_list,file,adoptionsdashed,arrowheadstyle,arrowtailstyle) + dump_index(ind_list,file,includedates,includeurl,colorize, + arrowheadstyle,arrowtailstyle,show_families) + dump_person(ind_list,file,adoptionsdashed,arrowheadstyle, + arrowtailstyle,show_families) file.write("}\n") file.close() #------------------------------------------------------------------------ # -# +# # #------------------------------------------------------------------------ -def dump_person(person_list,file,adoptionsdashed,arrowheadstyle,arrowtailstyle): +def dump_person(person_list,file,adoptionsdashed,arrowheadstyle, + arrowtailstyle,show_families): + # Hash people in a dictionary for faster inclusion checking. + person_dict = {} + for p in person_list: + person_dict[p] = 1 + for person in person_list: pid = string.replace(person.getId(),'-','_') - family, mrel, frel = person.getMainParentsRel() - if family == None: - continue - father = family.getFather() - if father and father in person_list: - fid = string.replace(father.getId(),'-','_') - file.write('p%s -> p%s [' % (pid, fid)) - file.write('arrowhead=%s, arrowtail=%s, ' % (arrowheadstyle, arrowtailstyle)) - if adoptionsdashed and frel != _("Birth"): - file.write('style=dashed') + for family, mrel, frel in person.getParentList(): + father = family.getFather() + mother = family.getMother() + fadopted = frel != _("Birth") + madopted = mrel != _("Birth") + if show_families and (person_dict.has_key(father) or + person_dict.has_key(mother)): + # Link to the family node. + famid = string.replace(family.getId(),'-','_') + file.write('p%s -> f%s [' % (pid, famid)) + file.write('arrowhead=%s, arrowtail=%s, ' % + (arrowheadstyle, arrowtailstyle)) + if adoptionsdashed and (fadopted or madopted): + file.write('style=dashed') + else: + file.write('style=solid') + file.write('];\n') else: - file.write('style=solid') - file.write('];\n') - mother = family.getMother() - if mother and mother in person_list: - mid = string.replace(mother.getId(),'-','_') - file.write('p%s -> p%s [' % (pid, mid)) - file.write('arrowhead=%s, arrowtail=%s, ' % (arrowheadstyle, arrowtailstyle)) - if adoptionsdashed and mrel != _("Birth"): - file.write('style=dashed') - else: - file.write('style=solid') - file.write('];\n') + # Link to the parents' nodes directly. + if father and person_dict.has_key(father): + fid = string.replace(father.getId(),'-','_') + file.write('p%s -> p%s [' % (pid, fid)) + file.write('arrowhead=%s, arrowtail=%s, ' % + (arrowheadstyle, arrowtailstyle)) + if adoptionsdashed and fadopted: + file.write('style=dashed') + else: + file.write('style=solid') + file.write('];\n') + if mother and person_dict.has_key(mother): + mid = string.replace(mother.getId(),'-','_') + file.write('p%s -> p%s [' % (pid, mid)) + file.write('arrowhead=%s, arrowtail=%s, ' % + (arrowheadstyle, arrowtailstyle)) + if adoptionsdashed and madopted: + file.write('style=dashed') + else: + file.write('style=solid') + file.write('];\n') #------------------------------------------------------------------------ # -# +# # #------------------------------------------------------------------------ -def dump_index(person_list,file,includedates,includeurl,colorize): +def dump_index(person_list,file,includedates,includeurl,colorize, + arrowheadstyle,arrowtailstyle,show_families): + # The list of families for which we have output the node, so we + # don't do it twice. + families_done = [] for person in person_list: + # Output the person's node. label = person.getPrimaryName().getName() id = string.replace(person.getId(),'-','_') if includedates: @@ -364,10 +408,25 @@ def dump_index(person_list,file,includedates,includeurl,colorize): else: file.write('color=black, ') file.write('fontname="Arial", label="%s"];\n' % label) + # Output families's nodes. + if show_families: + family_list = person.getFamilyList() + for fam in family_list: + fid = string.replace(fam.getId(),'-','_') + if fam not in families_done: + file.write('f%s [shape=circle, label="", ' % fid) + file.write('weight=8, height=.3];\n') + # Link this person to all his/her families. + file.write('f%s -> p%s [' % (fid, id)) + file.write('arrowhead=%s, arrowtail=%s, ' % + (arrowheadstyle, arrowtailstyle)) + file.write('style=solid];\n') + + #------------------------------------------------------------------------ # -# +# # #------------------------------------------------------------------------ def get_description(): diff --git a/src/plugins/ReadGedcom.py b/src/plugins/ReadGedcom.py index c63ff7c1a..38bf28753 100644 --- a/src/plugins/ReadGedcom.py +++ b/src/plugins/ReadGedcom.py @@ -38,7 +38,6 @@ import time #------------------------------------------------------------------------- import gtk import gtk.glade -import gnome.ui #------------------------------------------------------------------------- # @@ -46,9 +45,12 @@ import gnome.ui # #------------------------------------------------------------------------- from RelLib import * +import Julian +import FrenchRepublic +import Hebrew + import Date from ansel_utf8 import ansel_to_utf8 - import latin_utf8 import Utils from GedcomInfo import * @@ -1569,11 +1571,11 @@ class GedcomParser: pass if cal1 == "FRENCH R": - dateobj.set_calendar(Date.FRENCH) + dateobj.set_calendar(FrenchRepublic.FrenchRepublic) elif cal1 == "JULIAN": - dateobj.set_calendar(Date.JULIAN) + dateobj.set_calendar(Julian.Julian) elif cal1 == "HEBREW": - dateobj.set_calendar(Date.HEBREW) + dateobj.set_calendar(Hebrew.Hebrew) dateobj.get_start_date().set(data1) dateobj.get_stop_date().set(data2) dateobj.set_range(1) @@ -1583,11 +1585,11 @@ class GedcomParser: if match: (abt,cal,data) = match.groups() if cal == "FRENCH R": - dateobj.set_calendar(Date.FRENCH) + dateobj.set_calendar(FrenchRepublic.FrenchRepublic) elif cal == "JULIAN": - dateobj.set_calendar(Date.JULIAN) + dateobj.set_calendar(Julian.Julian) elif cal == "HEBREW": - dateobj.set_calendar(Date.HEBREW) + dateobj.set_calendar(Hebrew.Hebrew) dateobj.set(data) if abt: dateobj.get_start_date().setMode(abt) @@ -1615,7 +1617,6 @@ class GedcomParser: def resolve_refns(self): prefix = self.db.iprefix - renamed = [] index = 0 new_pmax = self.db.pmapIndex pmap = self.db.getPersonMap() diff --git a/src/plugins/WriteGedcom.py b/src/plugins/WriteGedcom.py index 8d7eb1f43..cbe34e15b 100644 --- a/src/plugins/WriteGedcom.py +++ b/src/plugins/WriteGedcom.py @@ -50,6 +50,10 @@ import const import Utils import Date import Calendar +import Julian +import Hebrew +import FrenchRepublic + from intl import gettext as _ from latin_utf8 import latin_to_utf8 from GedcomInfo import * @@ -66,7 +70,7 @@ except: #------------------------------------------------------------------------- _hmonth = [ - "", "ELUL", "TSH", "CSH", "KSL", "TVT", "SHV", "ADR", + "ADS", "NSN", "IYR", "SVN", "TMZ", "AAV", "ELL" ] _fmonth = [ @@ -78,9 +82,9 @@ _month = [ "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" ] _calmap = { - Calendar.Hebrew : (_hmonth, '@#HEBREW@'), - Calendar.FrenchRepublic : (_fmonth, '@#FRENCH R@'), - Calendar.Julian : (_month, '@#JULIAN@'), + Hebrew.Hebrew.NAME : (_hmonth, '@#HEBREW@'), + FrenchRepublic.FrenchRepublic.NAME : (_fmonth, '@#FRENCH R@'), + Julian.Julian.NAME : (_month, '@#JULIAN@'), } _caldef = { @@ -201,14 +205,8 @@ def make_date(subdate): mon_valid = subdate.getMonthValid() year_valid = subdate.getYearValid() - # Adjust `mon' so it can be used as index in our _Xmonth arrays. - if mon_valid: - mon += 1 - else: - mon = 0 - - if _calmap.has_key(subdate.calendar): - (mmap,prefix) = _calmap[subdate.calendar] + if _calmap.has_key(subdate.calendar.NAME): + (mmap,prefix) = _calmap[subdate.calendar.NAME] else: mmap = _month prefix = "" @@ -780,7 +778,7 @@ class GedcomWriter: text = addr_append(text,addr.getPostal()) text = addr_append(text,addr.getCountry()) if text: - self.g.write("2 PLAC %s\n" % string.replace(self.cnvtxt(text)),'\r',' ') + self.g.write("2 PLAC %s\n" % string.replace(self.cnvtxt(text),'\r',' ')) if addr.getNote(): self.write_long_text("NOTE",3,self.cnvtxt(addr.getNote())) for srcref in addr.getSourceRefList():