selection and preview of person and family

svn: r5774
This commit is contained in:
Richard Taylor 2006-01-17 13:43:29 +00:00
parent 58ef8176d4
commit 345b35c3b9
11 changed files with 239 additions and 38 deletions

View File

@ -1,3 +1,10 @@
2006-01-17 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/ObjectSelector/_FamilyFrame.py, src/ObjectSelector/_FamilyPreviewFrame.py,
src/ObjectSelector/_ObjectFrameBase.py, src/ObjectSelector/_ObjectSelectorWindow.py,
src/ObjectSelector/_PersonFrame.py, src/ObjectSelector/_PersonPreviewFrame.py,
src/ObjectSelector/_PersonTreeFrame.py src/ObjectSelector/_ObjectSelectorResult.py:
object selection and initial preview works for Family and Person
2006-01-17 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/ObjectSelector/_FamilyFrame.py: basic object selection now working
* src/ObjectSelector/_FamilyTreeFrame.py: basic object selection now working

View File

@ -1,7 +1,6 @@
from _Constants import ObjectTypes
from _PersonFrame import PersonFrame
from _FamilyFrame import FamilyFrame

View File

@ -21,7 +21,7 @@ class FamilyFrame(ObjectFrameBase):
gobject.TYPE_STRING)),
}
__default_border_width = 5
__person_id_field = 0
def __init__(self,
dbstate):
@ -34,7 +34,7 @@ class FamilyFrame(ObjectFrameBase):
def handle_selection(treeselection):
(model, iter) = treeselection.get_selected()
if iter:
if iter and model.get_value(iter,0):
self.emit('selection-changed', "%s / %s (%s)" % (
str(model.get_value(iter,1)),
str(model.get_value(iter,2)),
@ -46,14 +46,8 @@ class FamilyFrame(ObjectFrameBase):
self._tree_frame.get_selection().connect('changed',handle_selection)
def set_preview_frame_sensitivity(treeselection):
(model, iter) = treeselection.get_selected()
if iter:
self._preview_frame.set_sensitive(True)
else:
self._preview_frame.set_sensitive(False)
self._tree_frame.get_selection().connect('changed',self.set_preview,self.__class__.__person_id_field)
self._tree_frame.get_selection().connect('changed',set_preview_frame_sensitivity)

View File

@ -1,5 +1,9 @@
import gtk
import gobject
from logging import getLogger
log = getLogger(".ObjectSelector")
import ImgManip
class FamilyPreviewFrame(gtk.Frame):
@ -13,15 +17,21 @@ class FamilyPreviewFrame(gtk.Frame):
def __init__(self,dbstate,label="Preview"):
gtk.Frame.__init__(self,label)
self._dbstate = dbstate
align = gtk.Alignment()
# Image
image = gtk.Image()
self._image_l = gtk.Image()
self._image_r = gtk.Image()
image_box = gtk.HBox()
image_box.pack_start(self._image_l)
image_box.pack_start(self._image_r)
# test image
image.set_from_file("../flist.svg")
image_frame = gtk.Frame()
image_frame.add(image)
image_frame.add(image_box)
# Text
label = gtk.Label()
@ -52,7 +62,38 @@ class FamilyPreviewFrame(gtk.Frame):
self.add(align)
self.clear_object()
def set_object_from_id(self,id):
try:
family = self._dbstate.db.get_family_from_gramps_id(id)
image = [self._image_l, self._image_r]
image_no = 0
for person_handle in (family.get_father_handle(),family.get_mother_handle()):
person = self._dbstate.db.get_person_from_handle(person_handle)
if not person:
return
image_list = person.get_media_list()
if image_list:
mobj = self._dbstate.db.get_object_from_handle(image_list[0].ref)
if mobj.get_mime_type()[0:5] == "image":
pixbuf = ImgManip.get_thumbnail_image(mobj.get_path())
image[image_no].set_from_pixbuf(pixbuf)
image_no += 1
else:
self._image_l.set_from_file("../person.svg")
self._image_r.set_from_file("../person.svg")
except:
log.warn("Failed to generate preview for family", exc_info=True)
self.clear_object()
def clear_object(self):
self._image_l.set_from_file("../person.svg")
self._image_r.set_from_file("../person.svg")
if gtk.pygtk_version < (2,8,0):
gobject.type_register(FamilyPreviewFrame)

View File

@ -49,10 +49,7 @@ class FamilyTreeFrame(gtk.Frame):
scrollwindow.add(self._list)
self._inactive = False
self._selection = self._list.get_selection()
#self._selection.connect('changed',self._row_changed)
self.add(scrollwindow)

View File

@ -57,6 +57,17 @@ class ObjectFrameBase(gtk.Frame):
self.add(pane_align)
def set_preview(self,treeselection,id_field):
(model, iter) = treeselection.get_selected()
if iter and model.get_value(iter,id_field):
self._preview_frame.set_sensitive(True)
self._preview_frame.set_object_from_id(model.get_value(iter,id_field))
else:
self._preview_frame.set_sensitive(False)
self._preview_frame.clear_object()
def get_selection(self):
return self._tree_frame.get_selection()

View File

@ -0,0 +1,46 @@
from _Constants import ObjectTypes
class ObjectSelectorResult(object):
def __init__(self):
self._gramps_id = None
self._object_type = None
def __str__(self):
return "Object Type = %s\n"\
"Gramps ID = %s" % (str(self._object_type),
str(self._gramps_id))
def set_gramps_id(self,id):
self._gramps_id = id
def get_gramps_id(self):
return self._gramps_id
def set_object_type(self,object_type):
self._object_type = object_type
def get_object_type(self,object_type):
return self._object_type
def is_person(self):
return self._object_type == ObjectTypes.PERSON
def is_family(self):
return self._object_type == ObjectTypes.FAMILY
def is_event(self):
return self._object_type == ObjectTypes.EVENT
def is_source(self):
return self._object_type == ObjectTypes.SOURCE
def is_repository(self):
return self._object_type == ObjectTypes.REPOSITORY
def is_media(self):
return self._object_type == ObjectTypes.MEDIA
def is_place(self):
return self._object_type == ObjectTypes.PLACE

View File

@ -7,12 +7,14 @@ import gobject
import _Factories
from _Constants import ObjectTypes
from _ObjectSelectorResult import ObjectSelectorResult
class _ObjectTypeWidgets(object):
def __init__(self):
self.frame = None
self.sel_label = None
self.selected_id = None
def show(self):
self.frame.show_all()
@ -22,16 +24,22 @@ class _ObjectTypeWidgets(object):
self.frame.hide_all()
self.sel_label.hide_all()
def set_selected_id(self,id):
self.selected_id = id
OBJECT_LIST = [ObjectTypes.PERSON, ObjectTypes.FAMILY,
ObjectTypes.SOURCE, ObjectTypes.EVENT,
ObjectTypes.MEDIA, ObjectTypes.PLACE,
ObjectTypes.REPOSITORY, ObjectTypes.REFERENCE]
ObjectTypes.REPOSITORY]
class ObjectSelectorWindow(gtk.Window):
__gproperties__ = {}
__gsignals__ = {
'add-object' : (gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_PYOBJECT,)),
}
__default_border_width = 5
@ -47,6 +55,7 @@ class ObjectSelectorWindow(gtk.Window):
self._dbstate = dbstate
self._object_list = object_list
self._current_object_type = None
self.set_title("Add Person")
@ -146,15 +155,25 @@ class ObjectSelectorWindow(gtk.Window):
lambda widget,text,handle,label: label.set_text(text),
self._object_frames[object_type].sel_label)
self._object_frames[object_type].frame.connect(
'selection-changed',
lambda widget,text,handle,current_object: current_object.set_selected_id(handle),
self._object_frames[object_type])
self._object_frames[object_type].frame.connect(
'selection-changed',
self.on_selection_changed)
frame_box.pack_start(self._object_frames[object_type].frame,True,True)
self._set_object_type(default_object_type)
# Bottom buttons
add_button = gtk.Button(stock=gtk.STOCK_ADD)
add_button.set_sensitive(False)
add_button.show()
self._add_button = gtk.Button(stock=gtk.STOCK_ADD)
self._add_button.set_sensitive(False)
self._add_button.show()
self._add_button.connect("clicked", self.on_add)
cancel_button = gtk.Button(stock=gtk.STOCK_CANCEL)
cancel_button.show()
@ -166,7 +185,7 @@ class ObjectSelectorWindow(gtk.Window):
bottom_button_bar.set_spacing(self.__class__.__default_border_width/2)
bottom_button_bar.set_border_width(self.__class__.__default_border_width)
bottom_button_bar.add(cancel_button)
bottom_button_bar.add(add_button)
bottom_button_bar.add(self._add_button)
bottom_button_bar.show()
box = gtk.VBox()
@ -186,15 +205,20 @@ class ObjectSelectorWindow(gtk.Window):
self.add(align)
self._set_object_type(default_object_type)
def _set_object_type(self,selected_object_type):
# enable default
# enable selected object type
self._object_frames[selected_object_type].show()
# disable all the others
[ self._object_frames[object_type].hide() for object_type in self._object_list
if object_type != selected_object_type]
# Set the object selector list to the selected object type
# this is required because we may be asked to set the object type
# without the use selecting it explicitly from the list.
store = self._tool_list
it = store.get_iter_first()
while it:
@ -204,7 +228,32 @@ class ObjectSelectorWindow(gtk.Window):
if it != None:
self._tool_combo.set_active_iter(it)
self._current_object_type = selected_object_type
# Set the add button sensitivity
if self._object_frames[selected_object_type].selected_id:
self._add_button.set_sensitive(True)
else:
self._add_button.set_sensitive(False)
def get_result(self):
result = ObjectSelectorResult()
result.set_object_type(self._current_object_type)
result.set_gramps_id(self._object_frames[self._current_object_type].selected_id)
return result
def on_add(self,button):
self.emit('add-object',self.get_result())
def on_selection_changed(self,widget,text,handle):
if handle:
self._add_button.set_sensitive(True)
else:
self._add_button.set_sensitive(False)
if gtk.pygtk_version < (2,8,0):
gobject.type_register(PersonSearchCriteriaWidget)
@ -214,11 +263,24 @@ if __name__ == "__main__":
import GrampsDb
import const
import logging
import sys,os.path
form = logging.Formatter(fmt="%(relativeCreated)d: %(levelname)s: %(filename)s: line %(lineno)d: %(message)s")
stderrh = logging.StreamHandler(sys.stderr)
stderrh.setFormatter(form)
stderrh.setLevel(logging.DEBUG)
# everything.
l = logging.getLogger()
l.setLevel(logging.DEBUG)
l.addHandler(stderrh)
def cb(d):
pass
db = GrampsDb.gramps_db_factory(const.app_gramps)()
db.load("/home/rtaylor/devel/Personal/gramps/test/Untitled_2.grdb",
db.load(os.path.realpath(sys.argv[1]),
cb, # callback
"w")
class D:
@ -226,7 +288,7 @@ if __name__ == "__main__":
dbstate = D()
dbstate.db = db
w = ObjectSelectorWindow(dbstate=dbstate,
default_object_type = ObjectTypes.FAMILY,
@ -235,4 +297,9 @@ if __name__ == "__main__":
w.show()
w.connect("destroy", gtk.main_quit)
def add(w,results):
print str(results)
w.connect('add-object',add)
gtk.main()

View File

@ -21,6 +21,8 @@ class PersonFrame(ObjectFrameBase):
gobject.TYPE_STRING)),
}
__person_id_field = 1
def __init__(self,
dbstate):
@ -32,14 +34,20 @@ class PersonFrame(ObjectFrameBase):
def handle_selection(treeselection):
(model, iter) = treeselection.get_selected()
self.emit('selection-changed', "%s (%s)" % (
str(model.get_value(iter,0)),
str(model.get_value(iter,1))),
model.get_value(iter,0))
if iter and model.get_value(iter,1):
self.emit('selection-changed', "%s (%s)" % (
str(model.get_value(iter,0)),
str(model.get_value(iter,1))),
model.get_value(iter,1))
else:
self.emit('selection-changed',"No Selection","")
self._tree_frame.get_selection().connect('changed',handle_selection)
self._tree_frame.get_selection().connect('changed',self.set_preview,self.__class__.__person_id_field)
if gtk.pygtk_version < (2,8,0):
gobject.type_register(PersonFrame)

View File

@ -1,5 +1,9 @@
import gtk
import gobject
from logging import getLogger
log = getLogger(".ObjectSelector")
import ImgManip
class PersonPreviewFrame(gtk.Frame):
@ -13,15 +17,17 @@ class PersonPreviewFrame(gtk.Frame):
def __init__(self,dbstate,label="Preview"):
gtk.Frame.__init__(self,label)
self._dbstate = dbstate
align = gtk.Alignment()
# Image
image = gtk.Image()
self._image = gtk.Image()
# test image
image.set_from_file("../person.svg")
self._image.set_from_file("../person.svg")
image_frame = gtk.Frame()
image_frame.add(image)
image_frame.add(self._image)
# Text
label = gtk.Label()
@ -52,7 +58,27 @@ class PersonPreviewFrame(gtk.Frame):
self.add(align)
def set_object_from_id(self,id):
try:
person = self._dbstate.db.get_person_from_gramps_id(id)
if not person:
return
image_list = person.get_media_list()
if image_list:
mobj = self._dbstate.db.get_object_from_handle(image_list[0].ref)
if mobj.get_mime_type()[0:5] == "image":
pixbuf = ImgManip.get_thumbnail_image(mobj.get_path())
self._image.set_from_pixbuf(pixbuf)
else:
self._image.set_from_file("../person.svg")
except:
log.warn("Failed to generate preview for person", exc_info=True)
self._clear_object()
def clear_object(self):
self._image.set_from_file("../person.svg")
if gtk.pygtk_version < (2,8,0):
gobject.type_register(PersonPreviewFrame)

View File

@ -58,9 +58,14 @@ class PersonTreeFrame(gtk.Frame):
column.set_min_width(60)
column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY)
self._tree.append_column(column)
self.add(self._tree)
self.set_shadow_type(gtk.SHADOW_IN)
scrollwindow = gtk.ScrolledWindow()
scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrollwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN)
scrollwindow.add(self._tree)
self.add(scrollwindow)
self.set_model(self._dbstate.db)