Fixed spouse selection when family changes

svn: r1643
This commit is contained in:
Don Allingham 2003-06-03 02:54:56 +00:00
parent 21cabaac33
commit 5d2f999431
12 changed files with 401 additions and 62 deletions

View File

@ -218,7 +218,7 @@ class AddSpouse:
sgender = const.male sgender = const.male
else: else:
sgender = const.female sgender = const.female
self.entries = [] self.entries = []
self.slist.clear() self.slist.clear()
self.slist.new_model() self.slist.new_model()
@ -260,9 +260,7 @@ class AddSpouse:
# 100 years from spouse deathdate # 100 years from spouse deathdate
if abs(pdday.getYear() - dday.getYear()) > 100: if abs(pdday.getYear() - dday.getYear()) > 100:
continue continue
self.slist.add([data[0],data[1],data[3],data[5],data[6]],key,person==key) self.slist.add([data[0],data[1],data[3],data[5],data[6]],key,person==key)
self.slist.connect_model() self.slist.connect_model()
def on_show_toggled(self,obj): def on_show_toggled(self,obj):

View File

@ -76,7 +76,11 @@ class AddressEditor:
self.addr = addr self.addr = addr
name = parent.person.getPrimaryName().getName() name = parent.person.getPrimaryName().getName()
text = _("Address Editor for %s") % name print "'%s'" % name
if name == ", ":
text = _("Address Editor")
else:
text = _("Address Editor for %s") % name
title_label = self.top.get_widget("title") title_label = self.top.get_widget("title")

View File

@ -88,7 +88,10 @@ class AttributeEditor:
self.top.get_widget('edit_src'), self.top.get_widget('edit_src'),
self.top.get_widget('del_src')) self.top.get_widget('del_src'))
title = _("Attribute Editor for %s") % title if title == ", ":
title = _("Attribute Editor")
else:
title = _("Attribute Editor for %s") % title
l = self.top.get_widget("title") l = self.top.get_widget("title")
Utils.set_titles(self.window,l,title,_('Attribute Editor')) Utils.set_titles(self.window,l,title,_('Attribute Editor'))

View File

@ -182,6 +182,9 @@ class DrawDoc:
def draw_line(self,style,x1,y1,x2,y2): def draw_line(self,style,x1,y1,x2,y2):
pass pass
def draw_wedge(self, style, centerx, centery, radius, start_angle, end_angle):
pass
def start_path(self,style,x,y): def start_path(self,style,x,y):
pass pass

View File

@ -83,8 +83,12 @@ class EventEditor:
self.window = self.top.get_widget("event_edit") self.window = self.top.get_widget("event_edit")
title_label = self.top.get_widget('title') title_label = self.top.get_widget('title')
Utils.set_titles(self.window,title_label, if name == ", ":
_('Event Editor for %s') % name, etitle = _('Event Editor')
else:
etitle = _('Event Editor for %s') % name
Utils.set_titles(self.window,title_label, etitle,
_('Event Editor')) _('Event Editor'))
self.name_field = self.top.get_widget("eventName") self.name_field = self.top.get_widget("eventName")

View File

@ -266,7 +266,7 @@ class FamilyView:
def spouse_swap(self,obj): def spouse_swap(self,obj):
if self.selected_spouse: if self.selected_spouse:
self.parent.active_person = self.selected_spouse self.parent.active_person = self.selected_spouse
self.load_family() self.load_family(self.family)
def ap_parents_clicked(self,obj): def ap_parents_clicked(self,obj):
self.change_families(self.person) self.change_families(self.person)
@ -331,9 +331,14 @@ class FamilyView:
self.child_model.clear() self.child_model.clear()
self.sp_parents_model.clear() self.sp_parents_model.clear()
splist = self.person.getFamilyList() splist = self.person.getFamilyList()
f = None
first_family = None if len(splist) > 1:
first_spouse = None self.spouse_selection.set_mode(gtk.SELECTION_SINGLE)
else:
self.spouse_selection.set_mode(gtk.SELECTION_NONE)
flist = {}
for f in splist: for f in splist:
if not f: if not f:
continue continue
@ -343,19 +348,8 @@ class FamilyView:
sp = f.getFather() sp = f.getFather()
iter = self.spouse_model.append() iter = self.spouse_model.append()
if f == family: flist[f.getId()] = iter
first_spouse = sp
first_family = f
elif first_spouse == None:
first_spouse = sp
first_family = f
if len(splist) > 1:
self.spouse_selection.set_mode(gtk.SELECTION_SINGLE)
self.spouse_selection.select_path(0)
else:
self.spouse_selection.set_mode(gtk.SELECTION_NONE)
if sp: if sp:
if f.getMarriage(): if f.getMarriage():
mdate = " - %s" % f.getMarriage().getDate() mdate = " - %s" % f.getMarriage().getDate()
@ -367,11 +361,19 @@ class FamilyView:
else: else:
self.spouse_model.set(iter,0,"unknown\n") self.spouse_model.set(iter,0,"unknown\n")
if first_family: if family in splist:
self.display_marriage(first_family) self.display_marriage(family)
iter = flist[family.getId()]
self.spouse_selection.select_iter(iter)
elif len(flist) > 0:
f = splist[0]
iter = flist[f.getId()]
self.spouse_selection.select_iter(iter)
self.display_marriage(f)
else:
self.display_marriage(None)
self.update_list(self.ap_parents_model,self.ap_parents,self.person) self.update_list(self.ap_parents_model,self.ap_parents,self.person)
self.family = first_family
def update_list(self,model,tree,person): def update_list(self,model,tree,person):
model.clear() model.clear()

View File

@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2000-2003 Donald N. Allingham # Copyright (C) 2000 Donald N. Allingham
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -34,10 +34,8 @@ class ListModel:
self.tree.set_rules_hint(gtk.TRUE) self.tree.set_rules_hint(gtk.TRUE)
self.model = None self.model = None
self.new_model()
self.selection = self.tree.get_selection()
self.selection.set_mode(mode)
self.mode = mode self.mode = mode
self.new_model()
self.data_index = l self.data_index = l
self.count = 0 self.count = 0
self.cid = None self.cid = None
@ -84,9 +82,14 @@ class ListModel:
self.cid = self.model.get_sort_column_id() self.cid = self.model.get_sort_column_id()
self.count = 0 self.count = 0
self.model = gtk.ListStore(*self.mylist) self.model = gtk.ListStore(*self.mylist)
self.selection = self.tree.get_selection()
self.selection.set_mode(self.mode)
self.sel_iter = None
def connect_model(self): def connect_model(self):
self.tree.set_model(self.model) self.tree.set_model(self.model)
if self.sel_iter:
self.selection.select_iter(self.sel_iter)
if self.cid: if self.cid:
self.model.set_sort_column_id(self.cid[0],self.cid[1]) self.model.set_sort_column_id(self.cid[0],self.cid[1])
self.sort() self.sort()
@ -165,18 +168,6 @@ class ListModel:
def get_object(self,iter): def get_object(self,iter):
return self.model.get_value(iter,self.data_index) return self.model.get_value(iter,self.data_index)
def add(self,data,info=None,select=0):
self.count = self.count + 1
iter = self.model.append()
col = 0
for object in data:
self.model.set_value(iter,col,object)
col = col + 1
self.model.set_value(iter,col,info)
if select:
self.selection.select_iter(iter)
return iter
def insert(self,position,data,info=None,select=0): def insert(self,position,data,info=None,select=0):
self.count = self.count + 1 self.count = self.count + 1
iter = self.model.insert(position) iter = self.model.insert(position)
@ -192,6 +183,18 @@ class ListModel:
def get_data(self,iter,cols): def get_data(self,iter,cols):
return [ self.model.get_value(iter,c) for c in cols ] return [ self.model.get_value(iter,c) for c in cols ]
def add(self,data,info=None,select=0):
self.count = self.count + 1
iter = self.model.append()
col = 0
for object in data:
self.model.set_value(iter,col,object)
col = col + 1
self.model.set_value(iter,col,info)
if select:
self.sel_iter = iter
return iter
def add_and_select(self,data,info=None): def add_and_select(self,data,info=None):
self.count = self.count + 1 self.count = self.count + 1
iter = self.model.append() iter = self.model.append()
@ -204,8 +207,9 @@ class ListModel:
def center_selected(self): def center_selected(self):
model,iter = self.selection.get_selected() model,iter = self.selection.get_selected()
path = model.get_path(iter) if iter:
self.tree.scroll_to_cell(path,None,gtk.TRUE,0.5,0.5) path = model.get_path(iter)
self.tree.scroll_to_cell(path,None,gtk.TRUE,0.5,0.5)
def button_press(self,obj,event): def button_press(self,obj,event):
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:

View File

@ -75,7 +75,10 @@ class NameEditor:
alt_title = self.top.get_widget("title") alt_title = self.top.get_widget("title")
tmsg = _("Alternate Name Editor for %s") % full_name if full_name == ", ":
tmsg = _("Alternate Name Editor")
else:
tmsg = _("Alternate Name Editor for %s") % full_name
Utils.set_titles(self.window, alt_title, tmsg, _('Alternate Name Editor')) Utils.set_titles(self.window, alt_title, tmsg, _('Alternate Name Editor'))

View File

@ -52,8 +52,13 @@ class UrlEditor:
self.priv = self.top.get_widget("priv") self.priv = self.top.get_widget("priv")
title_label = self.top.get_widget("title") title_label = self.top.get_widget("title")
Utils.set_titles(self.window,title_label, if name == ", ":
_('Internet Address Editor for %s') % name, etitle =_('Internet Address Editor')
else:
etitle =_('Internet Address Editor for %s') % name,
Utils.set_titles(self.window,title_label, etitle,
_('Internet Address Editor')) _('Internet Address Editor'))
if url != None: if url != None:
self.des.set_text(url.get_description()) self.des.set_text(url.get_description())

278
src/docgen/AbiWord2Doc.py Normal file
View File

@ -0,0 +1,278 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Provides a TextDoc based interface to the AbiWord document format.
"""
#-------------------------------------------------------------------------
#
# Imported Modules
#
#-------------------------------------------------------------------------
import os
import base64
import TextDoc
from latin_utf8 import latin_to_utf8
import string
import Plugins
import ImgManip
from intl import gettext as _
#-------------------------------------------------------------------------
#
# Class Definitions
#
#-------------------------------------------------------------------------
class AbiWordDoc(TextDoc.TextDoc):
"""AbiWord document generator. Inherits from the TextDoc generic
document interface class."""
def __init__(self,styles,type,template,orientation):
"""Initializes the AbiWordDoc class, calling the __init__ routine
of the parent TextDoc class"""
TextDoc.TextDoc.__init__(self,styles,type,template,orientation)
self.f = None
self.level = 0
self.new_page = 0
self.in_table = 0
self.icount = 0;
self.imap = {}
def open(self,filename):
"""Opens the document, writing the necessary header information.
AbiWord uses an XML format, so the document format is pretty easy
to understand"""
if filename[-4:] != ".abw":
self.filename = "%s.abw" % filename
else:
self.filename = filename
try:
self.f = open(self.filename,"w")
except IOError,msg:
errmsg = "%s\n%s" % (_("Could not create %s") % self.filename, msg)
raise Errors.ReportError(errmsg)
except:
raise Errors.ReportError(_("Could not create %s") % self.filename)
# doctype
self.f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
self.f.write('<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML 1.0 Strict//EN" ')
self.f.write('"http://www.abisource.com/awml.dtd">\n')
self.f.write('<abiword template="false" styles="unlocked" xmlns:fo="http://www.w3.org/1999/XSL/Format" ')
self.f.write('xmlns:svg="http://www.w3.org/2000/svg" xmlns:dc="http://purl.org/dc/elements/1.1/" ')
self.f.write('fileformat="1.1" xmlns:math="http://www.w3.org/1998/Math/MathML" ')
self.f.write('xmlns:awml="http://www.abisource.com/awml.dtd" xmlns="http://www.abisource.com/awml.dtd" ')
self.f.write('xmlns:xlink="http://www.w3.org/1999/xlink" version="1.9.1" xml:space="preserve" ')
self.f.write('props="lang:en-US; dom-dir:ltr">\n')
# metadata section
self.f.write('<metadata>\n')
self.f.write('<m key="dc.format">application/x-abiword</m>\n')
self.f.write('<m key="abiword.generator">AbiWord</m>\n')
self.f.write('<m key="abiword.date_last_changed">Mon May 19 14:16:24 2003</m>\n')
self.f.write('</metadata>\n')
self.write_styles()
# page size section
self.f.write('<pagesize ')
self.f.write('pagetype="%s" ' % self.paper.get_name())
if self.orientation == TextDoc.PAPER_PORTRAIT:
self.f.write('orientation="portrait" ')
else:
self.f.write('orientation="landscape" ')
self.f.write('width="%.4f" ' % (self.width/2.54))
self.f.write('height="%.4f" ' % (self.height/2.54))
self.f.write('units="inch" page-scale="1.000000"/>\n')
self.f.write('<section ')
rmargin = float(self.rmargin)/2.54
lmargin = float(self.lmargin)/2.54
self.f.write('props="page-margin-right:%.4fin; ' % rmargin)
self.f.write('page-margin-left:%.4fin"' % lmargin)
self.f.write('>\n')
def write_styles(self):
self.f.write('<styles>\n')
for style_name in self.style_list.keys():
style = self.style_list[style_name]
self.current_style = style
self.f.write('<s type="P" name="%s" basedon="" followedby="" props="' % style_name)
self.f.write('margin-top:%.4fin; ' % (float(style.get_padding())/2.54))
self.f.write('margin-bottom:%.4fin; ' % (float(style.get_padding())/2.54))
if style.get_alignment() == TextDoc.PARA_ALIGN_RIGHT:
self.f.write('text-align:right;')
elif style.get_alignment() == TextDoc.PARA_ALIGN_LEFT:
self.f.write('text-align:left;')
elif style.get_alignment() == TextDoc.PARA_ALIGN_CENTER:
self.f.write('text-align:center;')
else:
self.f.write('text-align:justify;')
rmargin = float(style.get_right_margin())/2.54
lmargin = float(style.get_left_margin())/2.54
indent = float(style.get_first_indent())/2.54
self.f.write(' margin-right:%.4fin;' % rmargin)
self.f.write(' margin-left:%.4fin;' % lmargin)
self.f.write(' tabstops:%.4fin/L;' % lmargin)
self.f.write(' text-indent:%.4fin;' % indent)
font = style.get_font()
self.f.write(' font-family:')
if font.get_type_face() == TextDoc.FONT_SANS_SERIF:
self.f.write('Arial; ')
else:
self.f.write('Times New Roman; ')
self.f.write('font-size:%dpt' % font.get_size())
if font.get_bold():
self.f.write('; font-weight:bold')
if font.get_italic():
self.f.write('; font-style:italic')
color = font.get_color()
if color != (0,0,0):
self.f.write('; color:%2x%2x%2x' % color)
if font.get_underline():
self.f.write('; text-decoration:underline')
self.f.write('"/>\n')
self.f.write('</styles>\n')
def close(self):
"""Write the trailing information and closes the file"""
self.f.write('</section>\n')
if len(self.photo_list) > 0:
self.f.write('<data>\n')
for file_tuple in self.photo_list:
tag = self.imap[file_tuple[0]]
img = ImgManip.ImgManip(file_tuple[0])
buf = img.png_data()
self.f.write('<d name="%s" mime-type="image/png" base64="yes">\n' % tag)
self.f.write(base64.encodestring(buf))
self.f.write('</d>\n')
self.f.write('</data>\n')
self.f.write('</abiword>\n')
self.f.close()
def add_photo(self,name,pos,x_cm,y_cm):
image = ImgManip.ImgManip(name)
(x,y) = image.size()
aspect_ratio = float(x)/float(y)
if aspect_ratio > x_cm/y_cm:
act_width = x_cm
act_height = y_cm/aspect_ratio
else:
act_height = y_cm
act_width = x_cm*aspect_ratio
self.photo_list.append((name,act_width,act_height))
tag = "image%d" % self.icount
self.f.write('<image dataid="%s" props="width:%.3fcm; ' % (tag, x_cm))
self.f.write('height:%.3fcm"/>' % y_cm)
self.imap[name] = tag
self.icount += 1
def start_superscript(self):
fsize = self.my_para.get_font().get_size()
self.text = self.text + '<c props="text-position:superscript">'
def end_superscript(self):
self.text = self.text + '</c>'
def start_paragraph(self,style_name,leader=None):
style = self.style_list[style_name]
self.current_style = style
self.f.write('<p style="%s">' % style_name)
if self.new_page == 1:
self.new_page = 0
self.f.write('<pbr/>')
if leader != None:
self.f.write(leader)
self.f.write('\t')
def page_break(self):
self.new_page = 1
def end_paragraph(self):
self.f.write('</p>\n')
def write_text(self,text):
text = text.replace('&','&amp;'); # Must be first
text = text.replace('<','&lt;');
text = text.replace('>','&gt;');
text = text.replace('&lt;super&gt;','<c props="text-position:superscript">')
text = text.replace('&lt;/super&gt;','</c>')
self.f.write(text)
def start_bold(self):
self.f.write('<c props="font-weight:bold">')
def end_bold(self):
self.f.write('</c>')
def start_table(self,name,style_name):
self.in_table = 1
self.tblstyle = self.table_styles[style_name]
self.f.write('<table props="table-column-props:')
width = float(self.get_usable_width())
for col in range(0,self.tblstyle.get_columns()):
self.f.write("%.2fcm/" % ((self.tblstyle.get_column_width(col)/100.0) * width))
self.f.write('">\n')
self.current_row = -1
def end_table(self):
self.in_table = 0
self.f.write('</table>\n')
def start_row(self):
self.ledge = 0.0
self.col = 0
self.current_row += 1
def end_row(self):
pass
def start_cell(self,style_name,span=1):
self.cstyle = self.cell_styles[style_name]
self.f.write('<cell props="')
if not self.cstyle.get_top_border():
self.f.write('top-style:0; top-style:0;')
if not self.cstyle.get_bottom_border():
self.f.write('bot-style:0; bot-style:0;')
if not self.cstyle.get_right_border():
self.f.write('right-style:0; right-style:0;')
if not self.cstyle.get_left_border():
self.f.write('left-style:0; left-style:0;')
self.f.write('bot-attach:%d; ' % (self.current_row+1))
self.f.write('top-attach:%d; ' % self.current_row)
self.f.write('left-attach:%d; ' % self.col)
self.f.write('right-attach:%d"' % (self.col+span))
self.f.write('>\n')
self.col += span
def end_cell(self):
self.f.write('</cell>\n')
Plugins.register_text_doc(_("AbiWord (version 1.9 or greater)"),AbiWordDoc,1,1,1,".abw")

View File

@ -3,7 +3,8 @@
# If not using GNU make, then list all .py files individually # If not using GNU make, then list all .py files individually
pkgpython_PYTHON = \ pkgpython_PYTHON = \
AbiWordDoc.py\ AbiWordDoc.py\
AbiWord2Doc.py\
HtmlDoc.py\ HtmlDoc.py\
KwordDoc.py\ KwordDoc.py\
LaTeXDoc.py\ LaTeXDoc.py\

View File

@ -152,31 +152,65 @@ class PdfDrawDoc(DrawDoc.DrawDoc):
else: else:
self.f.drawPath(p,stroke=1,fill=0) self.f.drawPath(p,stroke=1,fill=0)
def draw_half_circle(self,style,x,y,radius): def draw_wedge(self, style, centerx, centery, radius, start_angle, end_angle, short_radius=0):
centerx += self.lmargin
centery += self.bmargin
from math import sin, cos, pi
def rnd(val):
return val*cm
while end_angle < start_angle:
end_angle += 360
stype = self.draw_styles[style] stype = self.draw_styles[style]
if stype.get_line_style() == DrawDoc.SOLID: if stype.get_line_style() == DrawDoc.SOLID:
self.f.setDash([],0) self.f.setDash([],0)
else: else:
self.f.setDash([2,4],0) self.f.setDash([2,4],0)
self.f.setLineWidth(stype.get_line_width()) degreestoradians = pi/180.0
radiansdelta = degreestoradians
sangle = start_angle*degreestoradians
eangle = end_angle*degreestoradians
while eangle<sangle:
eangle = eangle+2*pi
angle = sangle
color = stype.get_fill_color() color = stype.get_fill_color()
self.f.setFillColor((float(color[0])/255.0,float(color[1])/255.0,float(color[2])/255.0)) self.f.setFillColor((float(color[0])/255.0,float(color[1])/255.0,float(color[2])/255.0))
x0 = (x+self.lmargin)*cm
y0 = (y+self.tmargin)*cm
r = radius*cm
p = self.f.beginPath() p = self.f.beginPath()
p.moveTo(x0-r,y0) if short_radius == 0:
p.arcTo(x0-r,y0-(r/2),x0+r,y0+(r/2)) p.moveTo(rnd(centerx),rnd(centery))
p.lineTo(x0-r,y0) else:
self.f.drawPath(p,fill=1,stroke=1) origx = rnd(centerx + cos(angle)*short_radius)
origy = rnd(centery + sin(angle)*short_radius)
p.moveTo(origx, origy)
while angle<eangle:
x = centerx + cos(angle)*radius
y = centery + sin(angle)*radius
p.lineTo(rnd(x),rnd(y))
angle = angle+radiansdelta
x = centerx + cos(eangle)*radius
y = centery + sin(eangle)*radius
p.lineTo(rnd(x),rnd(y))
# self.f.arc(x0-r,y0-r,x0+r,y0+r,180,180) if short_radius:
# self.f.line(x0-r,y0,x0+r,y0) x = centerx + cos(eangle)*short_radius
fill = stype.get_color() y = centery + sin(eangle)*short_radius
p.lineTo(rnd(x),rnd(y))
angle = eangle
while angle>=sangle:
x = centerx + cos(angle)*short_radius
y = centery + sin(angle)*short_radius
p.lineTo(rnd(x),rnd(y))
angle = angle-radiansdelta
p.close()
self.f.drawPath(p,stroke=1,fill=1)
def draw_box(self,style,text,x,y): def draw_box(self,style,text,x,y):
x = x + self.lmargin x = x + self.lmargin