object sharing support
svn: r6178
This commit is contained in:
		@@ -1,3 +1,11 @@
 | 
			
		||||
2006-03-18  Don Allingham  <don@gramps-project.org>
 | 
			
		||||
	* src/Editors/_EditFamily.py: add add_person functionality
 | 
			
		||||
	* src/DisplayTabs.py: add share option to sources
 | 
			
		||||
	* src/glade/gramps.glade: change dialog size
 | 
			
		||||
	* src/ListModel.py: fixed column widths, ellipses
 | 
			
		||||
	* src/SelectEvent.py: grab correct field
 | 
			
		||||
	* src/SelectSource.py: added
 | 
			
		||||
 | 
			
		||||
2006-03-18  Alex Roitman  <shura@gramps-project.org>
 | 
			
		||||
	* configure.in: Remove scrollkeeper checks and other unused
 | 
			
		||||
	statements.
 | 
			
		||||
 
 | 
			
		||||
@@ -622,16 +622,17 @@ class EventEmbedList(EmbeddedList):
 | 
			
		||||
 | 
			
		||||
        sel = SelectEvent.SelectEvent(self.dbstate.db,"Event Select")
 | 
			
		||||
        event = sel.run()
 | 
			
		||||
        try:
 | 
			
		||||
            ref = RelLib.EventRef()
 | 
			
		||||
            if self.obj.__class__.__name__ == 'Person':
 | 
			
		||||
                ref.set_role((RelLib.EventRef.PRIMARY,''))
 | 
			
		||||
            else:
 | 
			
		||||
                ref.set_role((RelLib.EventRef.FAMILY,''))
 | 
			
		||||
            EditEventRef(self.dbstate,self.uistate,self.track,
 | 
			
		||||
                         event, ref, self.obj, self.event_added)
 | 
			
		||||
        except Errors.WindowActiveError:
 | 
			
		||||
            pass
 | 
			
		||||
        if event:
 | 
			
		||||
            try:
 | 
			
		||||
                ref = RelLib.EventRef()
 | 
			
		||||
                if self.obj.__class__.__name__ == 'Person':
 | 
			
		||||
                    ref.set_role((RelLib.EventRef.PRIMARY,''))
 | 
			
		||||
                else:
 | 
			
		||||
                    ref.set_role((RelLib.EventRef.FAMILY,''))
 | 
			
		||||
                EditEventRef(self.dbstate,self.uistate,self.track,
 | 
			
		||||
                             event, ref, self.obj, self.event_added)
 | 
			
		||||
            except Errors.WindowActiveError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
    def edit_button_clicked(self,obj):
 | 
			
		||||
        ref = self.get_selected()
 | 
			
		||||
@@ -1371,7 +1372,7 @@ class SourceEmbedList(EmbeddedList):
 | 
			
		||||
    def __init__(self,dbstate,uistate,track,obj):
 | 
			
		||||
        self.obj = obj
 | 
			
		||||
        EmbeddedList.__init__(self, dbstate, uistate, track,
 | 
			
		||||
                              _('Sources'), SourceRefModel)
 | 
			
		||||
                              _('Sources'), SourceRefModel, True)
 | 
			
		||||
 | 
			
		||||
    def get_icon_name(self):
 | 
			
		||||
        return 'gramps-event'
 | 
			
		||||
@@ -1393,6 +1394,21 @@ class SourceEmbedList(EmbeddedList):
 | 
			
		||||
        except Errors.WindowActiveError:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
    def share_button_clicked(self,obj):
 | 
			
		||||
        from Editors import EditSourceRef
 | 
			
		||||
        import SelectSource
 | 
			
		||||
 | 
			
		||||
        sel = SelectSource.SelectSource(self.dbstate.db,"Source Select")
 | 
			
		||||
        src = sel.run()
 | 
			
		||||
        sref = RelLib.SourceRef()
 | 
			
		||||
        if src:
 | 
			
		||||
            try:
 | 
			
		||||
                ref = RelLib.SourceRef()
 | 
			
		||||
                EditSourceRef(self.dbstate,self.uistate,self.track,
 | 
			
		||||
                              src, sref, self.add_callback)
 | 
			
		||||
            except Errors.WindowActiveError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
    def add_callback(self,reference, primary):
 | 
			
		||||
        self.get_data().append(reference)
 | 
			
		||||
        self.changed = True
 | 
			
		||||
 
 | 
			
		||||
@@ -105,7 +105,7 @@ class ChildEmbedList(EmbeddedList):
 | 
			
		||||
        """
 | 
			
		||||
        self.family = family
 | 
			
		||||
        EmbeddedList.__init__(self, dbstate, uistate, track,
 | 
			
		||||
                              _('Children'), ChildModel)
 | 
			
		||||
                              _('Children'), ChildModel, True)
 | 
			
		||||
 | 
			
		||||
    def find_index(self,obj):
 | 
			
		||||
        """
 | 
			
		||||
@@ -184,41 +184,67 @@ class ChildEmbedList(EmbeddedList):
 | 
			
		||||
        return [(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(0,8),(0,9)]
 | 
			
		||||
 | 
			
		||||
    def add_button_clicked(self,obj):
 | 
			
		||||
        # we could workout the death years of the parents here and
 | 
			
		||||
        # set a suitable filter_spec on the PersonSelector
 | 
			
		||||
        # we might also be able to set a filter that only includes
 | 
			
		||||
        # people that are not already listed as children in another
 | 
			
		||||
        # family.
 | 
			
		||||
        selector = PersonSelector(self.dbstate,self.uistate,self.track)
 | 
			
		||||
        from Editors import EditPerson
 | 
			
		||||
 | 
			
		||||
        # this need the window handle of the main EditFamily window
 | 
			
		||||
        # to make the PersonSelector transient to it. I am not sure
 | 
			
		||||
        # want the best way is to get that handle from here.
 | 
			
		||||
        #selector.set_transient_for(self.window)
 | 
			
		||||
        person = RelLib.Person()
 | 
			
		||||
        EditPerson(self.dbstate,self.uistate,[],person, self.new_child_added)
 | 
			
		||||
 | 
			
		||||
        # Connect this to the method used to add a new child.
 | 
			
		||||
        #selector.connect('add-object',self.on_add_child)
 | 
			
		||||
    def new_child_added(self, person):
 | 
			
		||||
        self.family.add_child_handle(person.get_handle())
 | 
			
		||||
        self.rebuild()
 | 
			
		||||
 | 
			
		||||
    def share_button_clicked(self,obj):
 | 
			
		||||
        from SelectPerson import SelectPerson
 | 
			
		||||
 | 
			
		||||
        # it only makes sense to skip those who are already in the family
 | 
			
		||||
        
 | 
			
		||||
        selector.connect('add-object',self.on_change_child)
 | 
			
		||||
        skip = [self.family.get_father_handle(),
 | 
			
		||||
                self.family.get_mother_handle()] + self.family.get_child_handle_list()
 | 
			
		||||
 | 
			
		||||
    def on_change_child(self, selector_window, obj):
 | 
			
		||||
        if obj.__class__ == RelLib.Person:
 | 
			
		||||
            try:
 | 
			
		||||
                person = obj
 | 
			
		||||
                self.family.add_child_handle(person.get_handle())
 | 
			
		||||
                self.rebuild()
 | 
			
		||||
            except:
 | 
			
		||||
                log.warn(
 | 
			
		||||
                    "Failed to update child: \n"
 | 
			
		||||
                    "obj returned from selector was: %s\n"
 | 
			
		||||
                    % (repr(obj),))
 | 
			
		||||
                raise
 | 
			
		||||
        else:
 | 
			
		||||
            log.warn(
 | 
			
		||||
                "Object selector returned obj.__class__ = %s, it should "
 | 
			
		||||
                "have been of type %s." % (obj.__class__.__name__,
 | 
			
		||||
                                           RelLib.Person.__name__))
 | 
			
		||||
        selector_window.close()
 | 
			
		||||
        sel = SelectPerson(self.dbstate.db, "Select Child",
 | 
			
		||||
                           skip=[ x for x in skip if x])
 | 
			
		||||
        person = sel.run()
 | 
			
		||||
 | 
			
		||||
        if person:
 | 
			
		||||
            self.family.add_child_handle(person.get_handle())
 | 
			
		||||
            self.rebuild()
 | 
			
		||||
 | 
			
		||||
#     def add_button_clicked(self,obj):
 | 
			
		||||
#         # we could workout the death years of the parents here and
 | 
			
		||||
#         # set a suitable filter_spec on the PersonSelector
 | 
			
		||||
#         # we might also be able to set a filter that only includes
 | 
			
		||||
#         # people that are not already listed as children in another
 | 
			
		||||
#         # family.
 | 
			
		||||
#         selector = PersonSelector(self.dbstate,self.uistate,self.track)
 | 
			
		||||
 | 
			
		||||
#         # this need the window handle of the main EditFamily window
 | 
			
		||||
#         # to make the PersonSelector transient to it. I am not sure
 | 
			
		||||
#         # want the best way is to get that handle from here.
 | 
			
		||||
#         #selector.set_transient_for(self.window)
 | 
			
		||||
 | 
			
		||||
#         # Connect this to the method used to add a new child.
 | 
			
		||||
#         #selector.connect('add-object',self.on_add_child)
 | 
			
		||||
        
 | 
			
		||||
#         selector.connect('add-object',self.on_change_child)
 | 
			
		||||
 | 
			
		||||
#     def on_change_child(self, selector_window, obj):
 | 
			
		||||
#         if obj.__class__ == RelLib.Person:
 | 
			
		||||
#             try:
 | 
			
		||||
#                 person = obj
 | 
			
		||||
#                 self.family.add_child_handle(person.get_handle())
 | 
			
		||||
#                 self.rebuild()
 | 
			
		||||
#             except:
 | 
			
		||||
#                 log.warn(
 | 
			
		||||
#                     "Failed to update child: \n"
 | 
			
		||||
#                     "obj returned from selector was: %s\n"
 | 
			
		||||
#                     % (repr(obj),))
 | 
			
		||||
#                 raise
 | 
			
		||||
#         else:
 | 
			
		||||
#             log.warn(
 | 
			
		||||
#                 "Object selector returned obj.__class__ = %s, it should "
 | 
			
		||||
#                 "have been of type %s." % (obj.__class__.__name__,
 | 
			
		||||
#                                            RelLib.Person.__name__))
 | 
			
		||||
#         selector_window.close()
 | 
			
		||||
 | 
			
		||||
    def del_button_clicked(self,obj):
 | 
			
		||||
        handle = self.get_selected()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,8 +18,8 @@
 | 
			
		||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
from gobject import TYPE_STRING, TYPE_PYOBJECT, TYPE_OBJECT, TYPE_BOOLEAN
 | 
			
		||||
import gtk
 | 
			
		||||
import pango
 | 
			
		||||
import const
 | 
			
		||||
 | 
			
		||||
gtk26 = gtk.pygtk_version >= (2,6,0)
 | 
			
		||||
@@ -39,15 +39,16 @@ class ListModel:
 | 
			
		||||
    def __init__(self,tree,dlist,select_func=None,
 | 
			
		||||
                 event_func=None,mode=gtk.SELECTION_SINGLE):
 | 
			
		||||
        self.tree = tree
 | 
			
		||||
        self.tree.set_fixed_height_mode(True)
 | 
			
		||||
        self.mylist = []
 | 
			
		||||
        self.data_index = 0
 | 
			
		||||
        for l in dlist:
 | 
			
		||||
            if len(l)>3 and l[3] == TOGGLE:
 | 
			
		||||
                self.mylist.append(TYPE_BOOLEAN)
 | 
			
		||||
                self.mylist.append(bool)
 | 
			
		||||
            else:
 | 
			
		||||
                self.mylist.append(TYPE_STRING)
 | 
			
		||||
                self.mylist.append(str)
 | 
			
		||||
            self.data_index += 1
 | 
			
		||||
        self.mylist.append(TYPE_PYOBJECT)
 | 
			
		||||
        self.mylist.append(object)
 | 
			
		||||
 | 
			
		||||
        self.function = {}
 | 
			
		||||
        self.tree.set_rules_hint(True)
 | 
			
		||||
@@ -62,6 +63,9 @@ class ListModel:
 | 
			
		||||
 | 
			
		||||
        cnum = 0
 | 
			
		||||
        for name in dlist:
 | 
			
		||||
            if not name[2]:
 | 
			
		||||
                continue
 | 
			
		||||
            
 | 
			
		||||
            if len(name) == 3:
 | 
			
		||||
                name = (name[0],name[1],name[2],TEXT,False, None)
 | 
			
		||||
            elif len(name) == 4:
 | 
			
		||||
@@ -73,7 +77,7 @@ class ListModel:
 | 
			
		||||
                column.add_attribute(renderer,'active',cnum)
 | 
			
		||||
            elif gtk26 and name[3] == COMBO:
 | 
			
		||||
                store = gtk.ListStore(str)
 | 
			
		||||
                model = gtk.ListStore(str,TYPE_OBJECT)
 | 
			
		||||
                model = gtk.ListStore(str, object)
 | 
			
		||||
                for val in name[4]:
 | 
			
		||||
                    model.append((val,store))
 | 
			
		||||
                self.function[cnum] = name[5]
 | 
			
		||||
@@ -88,6 +92,7 @@ class ListModel:
 | 
			
		||||
            else:
 | 
			
		||||
                renderer = gtk.CellRendererText()
 | 
			
		||||
                renderer.set_fixed_height_from_font(True)
 | 
			
		||||
                renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
 | 
			
		||||
                if name[5]:
 | 
			
		||||
                    renderer.set_property('editable',True)
 | 
			
		||||
                    renderer.connect('edited',self.edited_cb, cnum)
 | 
			
		||||
@@ -108,6 +113,9 @@ class ListModel:
 | 
			
		||||
                column.set_clickable(True)
 | 
			
		||||
                column.set_sort_column_id(name[1])
 | 
			
		||||
 | 
			
		||||
            column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
 | 
			
		||||
            column.set_fixed_width(name[2])
 | 
			
		||||
 | 
			
		||||
            cnum += 1
 | 
			
		||||
            self.cids.append(name[1])
 | 
			
		||||
            if name[0] != '':
 | 
			
		||||
 
 | 
			
		||||
@@ -64,9 +64,8 @@ class SelectEvent:
 | 
			
		||||
 | 
			
		||||
        Utils.set_titles(self.top,title_label,title)
 | 
			
		||||
 | 
			
		||||
        titles = [(_('Description'),4,150), (_('ID'),1,50),
 | 
			
		||||
                  (_('Type'),2,70), (_('Date'),3,50), (_('Place'),3,150),
 | 
			
		||||
                  (_('Cause'),3,50), ('',4,0) ] 
 | 
			
		||||
        titles = [(_('Description'),4,250), (_('ID'),1,75),
 | 
			
		||||
                  (_('Type'),2,75), (_('Date'),3,150), ('',4,0) ] 
 | 
			
		||||
        self.ncols = len(titles)      
 | 
			
		||||
 | 
			
		||||
        self.model = ListModel.ListModel(self.elist,titles)
 | 
			
		||||
@@ -98,7 +97,7 @@ class SelectEvent:
 | 
			
		||||
                pname = u''
 | 
			
		||||
            date = DateHandler.get_date(event)
 | 
			
		||||
            cause = event.get_cause()
 | 
			
		||||
            self.model.add([desc,the_id,name,date,pname,cause],handle)
 | 
			
		||||
            self.model.add([desc,the_id,name,date],handle)
 | 
			
		||||
 | 
			
		||||
        self.model.connect_model()
 | 
			
		||||
 | 
			
		||||
@@ -109,7 +108,7 @@ class SelectEvent:
 | 
			
		||||
            store,node = self.model.get_selected()
 | 
			
		||||
            if node:
 | 
			
		||||
                data = self.model.get_data(node,range(self.ncols))
 | 
			
		||||
                handle = data[6]
 | 
			
		||||
                handle = data[4]
 | 
			
		||||
                return_value = self.db.get_event_from_handle(handle)
 | 
			
		||||
            else:
 | 
			
		||||
                return_value = None
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								gramps2/src/SelectSource.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								gramps2/src/SelectSource.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
#
 | 
			
		||||
# Gramps - a GTK+/GNOME based genealogy program
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2003-2005  Donald N. Allingham
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
# the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
# (at your option) any later version.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope that it will be useful,
 | 
			
		||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program; if not, write to the Free Software
 | 
			
		||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# $Id: SelectEvent.py 6155 2006-03-16 20:24:27Z rshura $
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# internationalization
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
from TransUtils import sgettext as _
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# GTK/Gnome modules
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gtk.glade
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# gramps modules
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
import const
 | 
			
		||||
import Utils
 | 
			
		||||
import ListModel
 | 
			
		||||
import RelLib
 | 
			
		||||
import DateHandler
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# SelectEvent
 | 
			
		||||
#
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
class SelectSource:
 | 
			
		||||
 | 
			
		||||
    def __init__(self,db,title,parent_window=None):
 | 
			
		||||
 | 
			
		||||
        self.db = db
 | 
			
		||||
        self.glade = gtk.glade.XML(const.gladeFile,"select_person","gramps")
 | 
			
		||||
        self.top = self.glade.get_widget('select_person')
 | 
			
		||||
        title_label = self.glade.get_widget('title')
 | 
			
		||||
        self.elist =  self.glade.get_widget('plist')
 | 
			
		||||
 | 
			
		||||
        Utils.set_titles(self.top,title_label,title)
 | 
			
		||||
 | 
			
		||||
        titles = [(_('Title'),4,350), (_('ID'),1,50), ('',0,0)]
 | 
			
		||||
        self.ncols = len(titles)      
 | 
			
		||||
 | 
			
		||||
        self.model = ListModel.ListModel(self.elist,titles)
 | 
			
		||||
 | 
			
		||||
        self.redraw()
 | 
			
		||||
        self.top.show()
 | 
			
		||||
 | 
			
		||||
        if parent_window:
 | 
			
		||||
            self.top.set_transient_for(parent_window)
 | 
			
		||||
 | 
			
		||||
    def redraw(self):
 | 
			
		||||
        self.model.clear()
 | 
			
		||||
        self.model.new_model()
 | 
			
		||||
 | 
			
		||||
        for handle in self.db.get_source_handles():
 | 
			
		||||
            source = self.db.get_source_from_handle(handle)
 | 
			
		||||
            desc = source.get_title()
 | 
			
		||||
            the_id = source.get_gramps_id()
 | 
			
		||||
            self.model.add([desc,the_id,handle])
 | 
			
		||||
        self.model.connect_model()
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        val = self.top.run()
 | 
			
		||||
 | 
			
		||||
        if val == gtk.RESPONSE_OK:
 | 
			
		||||
            store,node = self.model.get_selected()
 | 
			
		||||
            if node:
 | 
			
		||||
                data = self.model.get_data(node,range(self.ncols))
 | 
			
		||||
                handle = data[2]
 | 
			
		||||
                return_value = self.db.get_source_from_handle(handle)
 | 
			
		||||
            else:
 | 
			
		||||
                return_value = None
 | 
			
		||||
            self.top.destroy()
 | 
			
		||||
	    return return_value
 | 
			
		||||
        else:
 | 
			
		||||
            self.top.destroy()
 | 
			
		||||
            return None
 | 
			
		||||
@@ -4023,7 +4023,7 @@ Text Beside Icons</property>
 | 
			
		||||
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
 | 
			
		||||
  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
 | 
			
		||||
  <property name="modal">True</property>
 | 
			
		||||
  <property name="default_width">500</property>
 | 
			
		||||
  <property name="default_width">600</property>
 | 
			
		||||
  <property name="default_height">450</property>
 | 
			
		||||
  <property name="resizable">True</property>
 | 
			
		||||
  <property name="destroy_with_parent">False</property>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user