Start of gallery improvements
svn: r453
This commit is contained in:
@@ -3584,7 +3584,7 @@
|
|||||||
<object>editPerson</object>
|
<object>editPerson</object>
|
||||||
<last_modification_time>Sat, 09 Dec 2000 22:09:54 GMT</last_modification_time>
|
<last_modification_time>Sat, 09 Dec 2000 22:09:54 GMT</last_modification_time>
|
||||||
</signal>
|
</signal>
|
||||||
<label>Add Image</label>
|
<label>Add Object</label>
|
||||||
<relief>GTK_RELIEF_NORMAL</relief>
|
<relief>GTK_RELIEF_NORMAL</relief>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
@@ -3599,7 +3599,7 @@
|
|||||||
<object>editPerson</object>
|
<object>editPerson</object>
|
||||||
<last_modification_time>Sun, 10 Dec 2000 03:48:08 GMT</last_modification_time>
|
<last_modification_time>Sun, 10 Dec 2000 03:48:08 GMT</last_modification_time>
|
||||||
</signal>
|
</signal>
|
||||||
<label>Delete Image</label>
|
<label>Delete Object</label>
|
||||||
<relief>GTK_RELIEF_NORMAL</relief>
|
<relief>GTK_RELIEF_NORMAL</relief>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,8 @@ class EditPerson:
|
|||||||
|
|
||||||
# widgets
|
# widgets
|
||||||
self.window = self.get_widget("editPerson")
|
self.window = self.get_widget("editPerson")
|
||||||
|
self.gallery = PersonGallery(self, self.path, "i%s" % person.getId(), \
|
||||||
|
self.top.get_widget("photolist"), self.db)
|
||||||
self.notes_field = self.get_widget("personNotes")
|
self.notes_field = self.get_widget("personNotes")
|
||||||
self.event_name_field = self.get_widget("eventName")
|
self.event_name_field = self.get_widget("eventName")
|
||||||
self.event_place_field = self.get_widget("eventPlace")
|
self.event_place_field = self.get_widget("eventPlace")
|
||||||
@@ -107,7 +109,6 @@ class EditPerson:
|
|||||||
self.attr_details_field = self.get_widget("attr_details")
|
self.attr_details_field = self.get_widget("attr_details")
|
||||||
self.name_details_field = self.get_widget("name_details")
|
self.name_details_field = self.get_widget("name_details")
|
||||||
self.addr_details_field = self.get_widget("addr_details")
|
self.addr_details_field = self.get_widget("addr_details")
|
||||||
self.photo_list = self.get_widget("photolist")
|
|
||||||
self.attr_list = self.get_widget("attr_list")
|
self.attr_list = self.get_widget("attr_list")
|
||||||
self.attr_type = self.get_widget("attr_type")
|
self.attr_type = self.get_widget("attr_type")
|
||||||
self.attr_value = self.get_widget("attr_value")
|
self.attr_value = self.get_widget("attr_value")
|
||||||
@@ -161,7 +162,6 @@ class EditPerson:
|
|||||||
self.death = Event(person.getDeath())
|
self.death = Event(person.getDeath())
|
||||||
self.birth = Event(person.getBirth())
|
self.birth = Event(person.getBirth())
|
||||||
self.pname = Name(person.getPrimaryName())
|
self.pname = Name(person.getPrimaryName())
|
||||||
self.selected_icon = -1
|
|
||||||
|
|
||||||
# Typing CR selects OK button
|
# Typing CR selects OK button
|
||||||
self.window.editable_enters(self.notes_field);
|
self.window.editable_enters(self.notes_field);
|
||||||
@@ -182,7 +182,7 @@ class EditPerson:
|
|||||||
"on_add_aka_clicked" : on_add_aka_clicked,
|
"on_add_aka_clicked" : on_add_aka_clicked,
|
||||||
"on_add_attr_clicked" : on_add_attr_clicked,
|
"on_add_attr_clicked" : on_add_attr_clicked,
|
||||||
"on_add_url_clicked" : on_add_url_clicked,
|
"on_add_url_clicked" : on_add_url_clicked,
|
||||||
"on_addphoto_clicked" : on_add_photo_clicked,
|
"on_addphoto_clicked" : self.gallery.on_add_photo_clicked,
|
||||||
"on_address_list_select_row": on_addr_list_select_row,
|
"on_address_list_select_row": on_addr_list_select_row,
|
||||||
"on_aka_delete_clicked" : on_aka_delete_clicked,
|
"on_aka_delete_clicked" : on_aka_delete_clicked,
|
||||||
"on_aka_update_clicked" : on_aka_update_clicked,
|
"on_aka_update_clicked" : on_aka_update_clicked,
|
||||||
@@ -194,18 +194,18 @@ class EditPerson:
|
|||||||
"on_delete_attr_clicked" : on_delete_attr_clicked,
|
"on_delete_attr_clicked" : on_delete_attr_clicked,
|
||||||
"on_delete_event" : on_delete_event,
|
"on_delete_event" : on_delete_event,
|
||||||
"on_delete_url_clicked" : on_delete_url_clicked,
|
"on_delete_url_clicked" : on_delete_url_clicked,
|
||||||
"on_deletephoto_clicked" : on_delete_photo_clicked,
|
"on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked,
|
||||||
"on_editperson_switch_page" : on_switch_page,
|
"on_editperson_switch_page" : on_switch_page,
|
||||||
"on_event_add_clicked" : on_event_add_clicked,
|
"on_event_add_clicked" : on_event_add_clicked,
|
||||||
"on_event_delete_clicked" : on_event_delete_clicked,
|
"on_event_delete_clicked" : on_event_delete_clicked,
|
||||||
"on_event_select_row" : on_event_select_row,
|
"on_event_select_row" : on_event_select_row,
|
||||||
"on_event_update_clicked" : on_event_update_clicked,
|
"on_event_update_clicked" : on_event_update_clicked,
|
||||||
"on_makeprimary_clicked" : on_primary_photo_clicked,
|
"on_makeprimary_clicked" : self.gallery.on_primary_photo_clicked,
|
||||||
"on_name_list_select_row" : on_name_list_select_row,
|
"on_name_list_select_row" : on_name_list_select_row,
|
||||||
"on_name_note_clicked" : on_name_note_clicked,
|
"on_name_note_clicked" : on_name_note_clicked,
|
||||||
"on_name_source_clicked" : on_primary_name_source_clicked,
|
"on_name_source_clicked" : on_primary_name_source_clicked,
|
||||||
"on_photolist_button_press_event" : on_photolist_button_press,
|
"on_photolist_button_press_event" : self.gallery.on_photolist_button_press_event,
|
||||||
"on_photolist_select_icon" : on_photo_select_icon,
|
"on_photolist_select_icon" : self.gallery.on_photo_select_icon,
|
||||||
"on_update_address_clicked" : on_update_addr_clicked,
|
"on_update_address_clicked" : on_update_addr_clicked,
|
||||||
"on_update_attr_clicked" : on_update_attr_clicked,
|
"on_update_attr_clicked" : on_update_attr_clicked,
|
||||||
"on_update_url_clicked" : on_update_url_clicked,
|
"on_update_url_clicked" : on_update_url_clicked,
|
||||||
@@ -259,7 +259,9 @@ class EditPerson:
|
|||||||
# load photos into the photo window
|
# load photos into the photo window
|
||||||
photo_list = person.getPhotoList()
|
photo_list = person.getPhotoList()
|
||||||
if len(photo_list) != 0:
|
if len(photo_list) != 0:
|
||||||
self.load_photo(photo_list[0].getPath())
|
ph = photo_list[0]
|
||||||
|
object = ph.getReference()
|
||||||
|
self.load_photo(object.getPath())
|
||||||
|
|
||||||
# set notes data
|
# set notes data
|
||||||
self.notes_field.set_point(0)
|
self.notes_field.set_point(0)
|
||||||
@@ -340,33 +342,6 @@ class EditPerson:
|
|||||||
self.dplace.set_position(0)
|
self.dplace.set_position(0)
|
||||||
self.dcause.set_position(0)
|
self.dcause.set_position(0)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# add_thumbnail - Scale the image and add it to the IconList.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def add_thumbnail(self,photo):
|
|
||||||
src = os.path.basename(photo.getPath())
|
|
||||||
if photo.getPrivate():
|
|
||||||
thumb = "%s%s.thumb%s%s" % (self.path,os.sep,os.sep,src)
|
|
||||||
else:
|
|
||||||
thumb = "%s%s.thumb%s%s.jpg" % (self.path,os.sep,os.sep,os.path.basename(src))
|
|
||||||
RelImage.check_thumb(photo.getPath(),thumb,const.thumbScale)
|
|
||||||
self.photo_list.append(thumb,photo.getDescription())
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# load_images - add each photo in the person's list of photos to the
|
|
||||||
# photolist window.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def load_images(self):
|
|
||||||
self.photo_list.freeze()
|
|
||||||
self.photo_list.clear()
|
|
||||||
for photo in self.person.getPhotoList():
|
|
||||||
self.add_thumbnail(photo)
|
|
||||||
self.photo_list.thaw()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# load_photo - loads the specfied photo, scales it, and displays it
|
# load_photo - loads the specfied photo, scales it, and displays it
|
||||||
@@ -399,30 +374,41 @@ class EditPerson:
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# PersonImageSelect class
|
# PersonGallery class
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
class PersonImageSelect(ImageSelect.ImageSelect):
|
class PersonGallery(ImageSelect.Gallery):
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# __init__ - Sub-class an ImageSelect window. The only differences
|
# __init__ - Sub-class an ImageSelect.Gallery window. This is
|
||||||
# between the various subclasses are the initializer arguments, and
|
# necessary to add support for the 'Make Primary Image' button.
|
||||||
# the type of object for which an image is being selected.
|
|
||||||
#
|
#
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
def __init__(self, epo):
|
def __init__(self, epo, path, prefix, icon_list, db):
|
||||||
ImageSelect.ImageSelect.__init__(self, epo.path, "i%s" % epo.person.getId())
|
ImageSelect.Gallery.__init__(self, epo.person, path, prefix, icon_list, db)
|
||||||
self.epo = epo;
|
self.epo = epo
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# savephoto - Override the savephoto method to store the selected
|
# on_primary_photo_clicked - Make the currently selected photo the
|
||||||
# photo in a person object
|
# primary (literally the first) photo for this person. This is the
|
||||||
|
# photo that shows up in the General tab of the "Edit Person" window.
|
||||||
#
|
#
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
def savephoto(self, photo):
|
def on_primary_photo_clicked(self, obj):
|
||||||
self.epo.person.addPhoto(photo)
|
if self.selectedIcon == None or self.selectedIcon == 0:
|
||||||
self.epo.add_thumbnail(photo)
|
return
|
||||||
|
|
||||||
|
photolist = self.dataobj.getPhotoList()
|
||||||
|
selected_icon = self.selectedIcon
|
||||||
|
savePhoto = photolist[selected_icon]
|
||||||
|
for i in range(0,selected_icon):
|
||||||
|
photolist[selected_icon-i] = photolist[selected_icon-i-1]
|
||||||
|
photolist[0] = savePhoto
|
||||||
|
|
||||||
|
self.epo.load_photo(savePhoto.getReference().getPath())
|
||||||
|
self.load_images()
|
||||||
|
utils.modified()
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
@@ -839,49 +825,8 @@ def on_switch_page(obj,a,page):
|
|||||||
edit_obj = obj.get_data(EDITPERSON)
|
edit_obj = obj.get_data(EDITPERSON)
|
||||||
if page == 6 and edit_obj.not_loaded:
|
if page == 6 and edit_obj.not_loaded:
|
||||||
edit_obj.not_loaded = 0
|
edit_obj.not_loaded = 0
|
||||||
edit_obj.load_images()
|
edit_obj.gallery.load_images()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photo_select_icon(obj,iconNumber,event):
|
|
||||||
obj.get_data(EDITPERSON).selected_icon = iconNumber
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_delete_photo_clicked(obj):
|
|
||||||
epo = obj.get_data(EDITPERSON)
|
|
||||||
icon = epo.selected_icon
|
|
||||||
|
|
||||||
if icon != -1:
|
|
||||||
epo.photo_list.remove(icon)
|
|
||||||
del epo.person.getPhotoList()[icon]
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_primary_photo_clicked(obj):
|
|
||||||
epo = obj.get_data(EDITPERSON)
|
|
||||||
if epo.selected_icon == None or epo.selected_icon == 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
photolist = epo.person.getPhotoList()
|
|
||||||
selected_icon = epo.selected_icon
|
|
||||||
savePhoto = photolist[selected_icon]
|
|
||||||
for i in range(0,selected_icon):
|
|
||||||
photolist[selected_icon-i] = photolist[selected_icon-i-1]
|
|
||||||
photolist[0] = savePhoto
|
|
||||||
|
|
||||||
epo.load_photo(savePhoto.getPath())
|
|
||||||
epo.load_images()
|
|
||||||
utils.modified()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -1066,14 +1011,6 @@ def update_name(name,first,last,suffix,note,priv):
|
|||||||
|
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_add_photo_clicked(obj):
|
|
||||||
PersonImageSelect(obj.get_data(EDITPERSON))
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -1298,115 +1235,6 @@ def on_birth_source_clicked(obj):
|
|||||||
epo = obj.get_data(EDITPERSON)
|
epo = obj.get_data(EDITPERSON)
|
||||||
Sources.SourceSelector(epo.birth.getSourceRefList(),epo,src_changed)
|
Sources.SourceSelector(epo.birth.getSourceRefList(),epo,src_changed)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photolist_button_press(obj,event):
|
|
||||||
myobj = obj.get_data(EDITPERSON)
|
|
||||||
icon = myobj.selected_icon
|
|
||||||
if icon == -1:
|
|
||||||
return
|
|
||||||
|
|
||||||
if event.button == 3:
|
|
||||||
photo = myobj.person.getPhotoList()[icon]
|
|
||||||
menu = GtkMenu()
|
|
||||||
item = GtkTearoffMenuItem()
|
|
||||||
item.show()
|
|
||||||
menu.append(item)
|
|
||||||
utils.add_menuitem(menu,_("View Image"),myobj,on_view_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Image"),myobj,on_edit_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Description"),myobj,
|
|
||||||
on_change_description)
|
|
||||||
if photo.getPrivate() == 0:
|
|
||||||
utils.add_menuitem(menu,_("Convert to private copy"),
|
|
||||||
myobj, on_convert_to_private)
|
|
||||||
menu.popup(None,None,None,0,0)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_convert_to_private(obj):
|
|
||||||
epo = obj.get_data(OBJECT)
|
|
||||||
photo = epo.person.getPhotoList()[epo.selected_icon]
|
|
||||||
|
|
||||||
prefix = "i%s" % epo.person.getId()
|
|
||||||
name = RelImage.import_photo(photo.getPath(),epo.path,prefix)
|
|
||||||
|
|
||||||
photo.setPath(name)
|
|
||||||
photo.setPrivate(1)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_view_photo(obj):
|
|
||||||
myobj = obj.get_data(OBJECT)
|
|
||||||
photo = myobj.person.getPhotoList()[myobj.selected_icon]
|
|
||||||
utils.view_photo(photo)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_edit_photo(obj):
|
|
||||||
myobj = obj.get_data(OBJECT)
|
|
||||||
photo = myobj.person.getPhotoList()[myobj.selected_icon]
|
|
||||||
if os.fork() == 0:
|
|
||||||
os.execvp(const.editor,[const.editor, photo.getPath()])
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_change_description(obj):
|
|
||||||
myobj = obj.get_data(OBJECT)
|
|
||||||
photo = myobj.person.getPhotoList()[myobj.selected_icon]
|
|
||||||
window = libglade.GladeXML(const.imageselFile,"dialog1")
|
|
||||||
|
|
||||||
text = window.get_widget("text")
|
|
||||||
text.set_text(photo.getDescription())
|
|
||||||
|
|
||||||
image2 = RelImage.scale_image(photo.getPath(),200.0)
|
|
||||||
window.get_widget("photo").load_imlib(image2)
|
|
||||||
window.get_widget("dialog1").set_data(PHOTO,photo)
|
|
||||||
window.get_widget("dialog1").set_data(TEXT,text)
|
|
||||||
window.get_widget("dialog1").set_data(OBJECT,obj.get_data(OBJECT))
|
|
||||||
window.get_widget("dialog1").editable_enters(text)
|
|
||||||
window.signal_autoconnect({
|
|
||||||
"on_cancel_clicked" : utils.destroy_passed_object,
|
|
||||||
"on_ok_clicked" : on_ok_clicked,
|
|
||||||
"on_apply_clicked" : on_apply_clicked
|
|
||||||
})
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_apply_clicked(obj):
|
|
||||||
photo = obj.get_data(PHOTO)
|
|
||||||
text = obj.get_data(TEXT).get_text()
|
|
||||||
if text != photo.getDescription():
|
|
||||||
photo.setDescription(text)
|
|
||||||
obj.get_data(OBJECT).load_images()
|
|
||||||
utils.modified()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_ok_clicked(obj):
|
|
||||||
on_apply_clicked(obj)
|
|
||||||
utils.destroy_passed_object(obj)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# EventEditor class
|
# EventEditor class
|
||||||
|
|||||||
214
src/EditPlace.py
214
src/EditPlace.py
@@ -74,9 +74,10 @@ class EditPlace:
|
|||||||
else:
|
else:
|
||||||
self.srcreflist = []
|
self.srcreflist = []
|
||||||
|
|
||||||
self.selectedIcon = -1
|
|
||||||
self.currentImages = []
|
|
||||||
self.top_window = libglade.GladeXML(const.placesFile,"placeEditor")
|
self.top_window = libglade.GladeXML(const.placesFile,"placeEditor")
|
||||||
|
idval = "p%s" % place.getId()
|
||||||
|
plwidget = self.top_window.get_widget("photolist")
|
||||||
|
self.gallery = ImageSelect.Gallery(place, self.path, idval, plwidget, db)
|
||||||
self.title = self.top_window.get_widget("place_title")
|
self.title = self.top_window.get_widget("place_title")
|
||||||
self.city = self.top_window.get_widget("city")
|
self.city = self.top_window.get_widget("city")
|
||||||
self.county = self.top_window.get_widget("county")
|
self.county = self.top_window.get_widget("county")
|
||||||
@@ -114,16 +115,14 @@ class EditPlace:
|
|||||||
self.note.insert_defaults(place.getNote())
|
self.note.insert_defaults(place.getNote())
|
||||||
self.note.set_word_wrap(1)
|
self.note.set_word_wrap(1)
|
||||||
|
|
||||||
self.photo_list = self.top_window.get_widget("photolist")
|
|
||||||
|
|
||||||
self.top_window.signal_autoconnect({
|
self.top_window.signal_autoconnect({
|
||||||
"destroy_passed_object" : utils.destroy_passed_object,
|
"destroy_passed_object" : utils.destroy_passed_object,
|
||||||
"on_source_clicked" : on_source_clicked,
|
"on_source_clicked" : on_source_clicked,
|
||||||
"on_photolist_select_icon" : on_photo_select_icon,
|
"on_photolist_select_icon" : self.gallery.on_photo_select_icon,
|
||||||
"on_photolist_button_press_event" : on_photolist_button_press_event,
|
"on_photolist_button_press_event" : self.gallery.on_photolist_button_press_event,
|
||||||
"on_switch_page" : on_switch_page,
|
"on_switch_page" : on_switch_page,
|
||||||
"on_addphoto_clicked" : on_add_photo_clicked,
|
"on_addphoto_clicked" : self.gallery.on_add_photo_clicked,
|
||||||
"on_deletephoto_clicked" : on_delete_photo_clicked,
|
"on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked,
|
||||||
"on_add_url_clicked" : on_add_url_clicked,
|
"on_add_url_clicked" : on_add_url_clicked,
|
||||||
"on_delete_url_clicked" : on_delete_url_clicked,
|
"on_delete_url_clicked" : on_delete_url_clicked,
|
||||||
"on_update_url_clicked" : on_update_url_clicked,
|
"on_update_url_clicked" : on_update_url_clicked,
|
||||||
@@ -191,62 +190,6 @@ class EditPlace:
|
|||||||
def redraw_location_list(self):
|
def redraw_location_list(self):
|
||||||
utils.redraw_list(self.llist,self.loc_list,disp_loc)
|
utils.redraw_list(self.llist,self.loc_list,disp_loc)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# add_thumbnail - Scale the image and add it to the IconList.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def add_thumbnail(self,photo):
|
|
||||||
src = os.path.basename(photo.getPath())
|
|
||||||
if photo.getPrivate():
|
|
||||||
thumb = "%s%s.thumb%s%s" % (self.path,os.sep,os.sep,src)
|
|
||||||
else:
|
|
||||||
thumb = "%s%s.thumb%s%s.jpg" % (self.path,os.sep,os.sep,os.path.basename(src))
|
|
||||||
RelImage.check_thumb(photo.getPath(),thumb,const.thumbScale)
|
|
||||||
self.photo_list.append(thumb,photo.getDescription())
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# load_images - clears the currentImages list to free up any cached
|
|
||||||
# Imlibs. Then add each photo in the place's list of photos to the
|
|
||||||
# photolist window.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def load_images(self):
|
|
||||||
self.photo_list.freeze()
|
|
||||||
self.photo_list.clear()
|
|
||||||
for photo in self.place.getPhotoList():
|
|
||||||
self.add_thumbnail(photo)
|
|
||||||
self.photo_list.thaw()
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# PlaceImageSelect class
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
class PlaceImageSelect(ImageSelect.ImageSelect):
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# __init__ - Sub-class an ImageSelect window. The only differences
|
|
||||||
# between the various subclasses are the initializer arguments, and
|
|
||||||
# the type of object for which an image is being selected.
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def __init__(self, epo):
|
|
||||||
ImageSelect.ImageSelect.__init__(self, epo.path, "p%s" % epo.place.getId())
|
|
||||||
self.epo = epo;
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# savephoto - Override the savephoto method to store the selected
|
|
||||||
# photo in a place object
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def savephoto(self, photo):
|
|
||||||
self.epo.place.addPhoto(photo)
|
|
||||||
self.epo.add_thumbnail(photo)
|
|
||||||
|
|
||||||
|
|
||||||
def on_web_go_clicked(obj):
|
def on_web_go_clicked(obj):
|
||||||
import gnome.url
|
import gnome.url
|
||||||
@@ -323,148 +266,7 @@ def on_switch_page(obj,a,page):
|
|||||||
src = obj.get_data(_PLACE)
|
src = obj.get_data(_PLACE)
|
||||||
if page == 3 and src.not_loaded:
|
if page == 3 and src.not_loaded:
|
||||||
src.not_loaded = 0
|
src.not_loaded = 0
|
||||||
src.load_images()
|
src.gallery.load_images()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photo_select_icon(obj,iconNumber,event):
|
|
||||||
obj.get_data(_PLACE).selectedIcon = iconNumber
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_delete_photo_clicked(obj):
|
|
||||||
epo = obj.get_data(_PLACE)
|
|
||||||
icon = epo.selectedIcon
|
|
||||||
|
|
||||||
if icon != -1:
|
|
||||||
epo.photo_list.remove(icon)
|
|
||||||
del epo.place.getPhotoList()[icon]
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_add_photo_clicked(obj):
|
|
||||||
PlaceImageSelect(obj.get_data(_PLACE))
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photolist_button_press_event(obj,event):
|
|
||||||
|
|
||||||
myobj = obj.get_data(_PLACE)
|
|
||||||
icon = myobj.selectedIcon
|
|
||||||
if icon == -1:
|
|
||||||
return
|
|
||||||
|
|
||||||
if event.button == 3:
|
|
||||||
photo = myobj.place.getPhotoList()[icon]
|
|
||||||
menu = GtkMenu()
|
|
||||||
item = GtkTearoffMenuItem()
|
|
||||||
item.show()
|
|
||||||
menu.append(item)
|
|
||||||
utils.add_menuitem(menu,_("View Image"),myobj,on_view_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Image"),myobj,on_edit_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Description"),myobj,
|
|
||||||
on_change_description)
|
|
||||||
if photo.getPrivate() == 0:
|
|
||||||
utils.add_menuitem(menu,_("Convert to private copy"),myobj,
|
|
||||||
on_convert_to_private)
|
|
||||||
menu.popup(None,None,None,0,0)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_convert_to_private(obj):
|
|
||||||
edit_place_obj = obj.get_data("m")
|
|
||||||
photo = edit_place_obj.place.getPhotoList()[edit_place_obj.selectedIcon]
|
|
||||||
|
|
||||||
prefix = "p%s" % edit_place_obj.place.getId()
|
|
||||||
name = RelImage.import_photo(photo.getPath(),edit_place_obj.path,prefix)
|
|
||||||
|
|
||||||
photo.setPath(name)
|
|
||||||
photo.setPrivate(1)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_view_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.place.getPhotoList()[myobj.selectedIcon]
|
|
||||||
|
|
||||||
utils.view_photo(photo)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_edit_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.place.getPhotoList()[myobj.selectedIcon]
|
|
||||||
if os.fork() == 0:
|
|
||||||
os.execvp(const.editor,[const.editor, photo.getPath()])
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_change_description(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.place.getPhotoList()[myobj.selectedIcon]
|
|
||||||
window = libglade.GladeXML(const.imageselFile,"dialog1")
|
|
||||||
|
|
||||||
text = window.get_widget("text")
|
|
||||||
text.set_text(photo.getDescription())
|
|
||||||
|
|
||||||
image2 = RelImage.scale_image(photo.getPath(),200.0)
|
|
||||||
window.get_widget("photo").load_imlib(image2)
|
|
||||||
window.get_widget("dialog1").set_data("p",photo)
|
|
||||||
window.get_widget("dialog1").set_data("t",text)
|
|
||||||
window.get_widget("dialog1").set_data("m",obj.get_data("m"))
|
|
||||||
window.get_widget("dialog1").editable_enters(text)
|
|
||||||
window.signal_autoconnect({
|
|
||||||
"on_cancel_clicked" : utils.destroy_passed_object,
|
|
||||||
"on_ok_clicked" : on_ok_clicked,
|
|
||||||
"on_apply_clicked" : on_apply_clicked
|
|
||||||
})
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_ok_clicked(obj):
|
|
||||||
on_apply_clicked(obj)
|
|
||||||
utils.destroy_passed_object(obj)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_apply_clicked(obj):
|
|
||||||
photo = obj.get_data("p")
|
|
||||||
text = obj.get_data("t").get_text()
|
|
||||||
if text != photo.getDescription():
|
|
||||||
photo.setDescription(text)
|
|
||||||
edit_window = obj.get_data("m")
|
|
||||||
edit_window.load_images()
|
|
||||||
utils.modified()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -65,9 +65,10 @@ class EditSource:
|
|||||||
self.path = db.getSavePath()
|
self.path = db.getSavePath()
|
||||||
self.not_loaded = 1
|
self.not_loaded = 1
|
||||||
|
|
||||||
self.selectedIcon = -1
|
|
||||||
self.currentImages = []
|
|
||||||
self.top_window = libglade.GladeXML(const.gladeFile,"sourceEditor")
|
self.top_window = libglade.GladeXML(const.gladeFile,"sourceEditor")
|
||||||
|
sid = "s%s" % source.getId()
|
||||||
|
plwidget = self.top_window.get_widget("photolist")
|
||||||
|
self.gallery = ImageSelect.Gallery(source, self.path, sid, plwidget, db)
|
||||||
self.title = self.top_window.get_widget("source_title")
|
self.title = self.top_window.get_widget("source_title")
|
||||||
self.author = self.top_window.get_widget("author")
|
self.author = self.top_window.get_widget("author")
|
||||||
self.pubinfo = self.top_window.get_widget("pubinfo")
|
self.pubinfo = self.top_window.get_widget("pubinfo")
|
||||||
@@ -81,15 +82,13 @@ class EditSource:
|
|||||||
self.note.insert_defaults(source.getNote())
|
self.note.insert_defaults(source.getNote())
|
||||||
self.note.set_word_wrap(1)
|
self.note.set_word_wrap(1)
|
||||||
|
|
||||||
self.photo_list = self.top_window.get_widget("photolist")
|
|
||||||
|
|
||||||
self.top_window.signal_autoconnect({
|
self.top_window.signal_autoconnect({
|
||||||
"destroy_passed_object" : utils.destroy_passed_object,
|
"destroy_passed_object" : utils.destroy_passed_object,
|
||||||
"on_photolist_select_icon" : on_photo_select_icon,
|
"on_photolist_select_icon" : self.gallery.on_photo_select_icon,
|
||||||
"on_photolist_button_press_event" : on_photolist_button_press_event,
|
"on_photolist_button_press_event" : self.gallery.on_photolist_button_press_event,
|
||||||
"on_switch_page" : on_switch_page,
|
"on_switch_page" : on_switch_page,
|
||||||
"on_addphoto_clicked" : on_add_photo_clicked,
|
"on_addphoto_clicked" : self.gallery.on_add_photo_clicked,
|
||||||
"on_deletephoto_clicked" : on_delete_photo_clicked,
|
"on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked,
|
||||||
"on_sourceapply_clicked" : on_source_apply_clicked
|
"on_sourceapply_clicked" : on_source_apply_clicked
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -104,62 +103,6 @@ class EditSource:
|
|||||||
self.top.editable_enters(self.author);
|
self.top.editable_enters(self.author);
|
||||||
self.top.editable_enters(self.pubinfo);
|
self.top.editable_enters(self.pubinfo);
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# add_thumbnail - Scale the image and add it to the IconList.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def add_thumbnail(self,photo):
|
|
||||||
src = os.path.basename(photo.getPath())
|
|
||||||
if photo.getPrivate():
|
|
||||||
thumb = "%s%s.thumb%s%s" % (self.path,os.sep,os.sep,src)
|
|
||||||
else:
|
|
||||||
thumb = "%s%s.thumb%s%s.jpg" % (self.path,os.sep,os.sep,os.path.basename(src))
|
|
||||||
RelImage.check_thumb(src,thumb,const.thumbScale)
|
|
||||||
self.photo_list.append(thumb,photo.getDescription())
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# load_images - clears the currentImages list to free up any cached
|
|
||||||
# Imlibs. Then add each photo in the source's list of photos to the
|
|
||||||
# photolist window.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def load_images(self):
|
|
||||||
self.photo_list.freeze()
|
|
||||||
self.photo_list.clear()
|
|
||||||
for photo in self.source.getPhotoList():
|
|
||||||
self.add_thumbnail(photo)
|
|
||||||
self.photo_list.thaw()
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# SourceImageSelect class
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
class SourceImageSelect(ImageSelect.ImageSelect):
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# __init__ - Sub-class an ImageSelect window. The only differences
|
|
||||||
# between the various subclasses are the initializer arguments, and
|
|
||||||
# the type of object for which an image is being selected.
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def __init__(self, eso):
|
|
||||||
ImageSelect.ImageSelect.__init__(self, eso.path, "s%s" % eso.source.getId())
|
|
||||||
self.eso = eso;
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# savephoto - Override the savephoto method to store the selected
|
|
||||||
# photo in a source object
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def savephoto(self, photo):
|
|
||||||
self.eso.source.addPhoto(photo)
|
|
||||||
self.eso.add_thumbnail(photo)
|
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -202,145 +145,5 @@ def on_switch_page(obj,a,page):
|
|||||||
src = obj.get_data(SOURCE)
|
src = obj.get_data(SOURCE)
|
||||||
if page == 2 and src.not_loaded:
|
if page == 2 and src.not_loaded:
|
||||||
src.not_loaded = 0
|
src.not_loaded = 0
|
||||||
src.load_images()
|
src.gallery.load_images()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photo_select_icon(obj,iconNumber,event):
|
|
||||||
obj.get_data(SOURCE).selectedIcon = iconNumber
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_delete_photo_clicked(obj):
|
|
||||||
eso = obj.get_data(SOURCE)
|
|
||||||
icon = eso.selectedIcon
|
|
||||||
|
|
||||||
if icon != -1:
|
|
||||||
eso.photo_list.remove(icon)
|
|
||||||
del eso.source.getPhotoList()[icon]
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_add_photo_clicked(obj):
|
|
||||||
SourceImageSelect(obj.get_data(SOURCE))
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photolist_button_press_event(obj,event):
|
|
||||||
|
|
||||||
myobj = obj.get_data(SOURCE)
|
|
||||||
icon = myobj.selectedIcon
|
|
||||||
if icon == -1:
|
|
||||||
return
|
|
||||||
|
|
||||||
if event.button == 3:
|
|
||||||
photo = myobj.source.getPhotoList()[icon]
|
|
||||||
menu = GtkMenu()
|
|
||||||
item = GtkTearoffMenuItem()
|
|
||||||
item.show()
|
|
||||||
menu.append(item)
|
|
||||||
utils.add_menuitem(menu,_("View Image"),myobj,on_view_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Image"),myobj,on_edit_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Description"),myobj,
|
|
||||||
on_change_description)
|
|
||||||
if photo.getPrivate() == 0:
|
|
||||||
utils.add_menuitem(menu,_("Convert to private copy"),myobj,
|
|
||||||
on_convert_to_private)
|
|
||||||
menu.popup(None,None,None,0,0)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_convert_to_private(obj):
|
|
||||||
eso = obj.get_data("m")
|
|
||||||
photo = eso.source.getPhotoList()[eso.selectedIcon]
|
|
||||||
|
|
||||||
prefix = "s%s" % eso.source.getId()
|
|
||||||
name = RelImage.import_photo(photo.getPath(),eso.path,prefix)
|
|
||||||
|
|
||||||
photo.setPath(name)
|
|
||||||
photo.setPrivate(1)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_view_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.source.getPhotoList()[myobj.selectedIcon]
|
|
||||||
|
|
||||||
utils.view_photo(photo)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_edit_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.source.getPhotoList()[myobj.selectedIcon]
|
|
||||||
if os.fork() == 0:
|
|
||||||
os.execvp(const.editor,[const.editor, photo.getPath()])
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_change_description(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.source.getPhotoList()[myobj.selectedIcon]
|
|
||||||
window = libglade.GladeXML(const.imageselFile,"dialog1")
|
|
||||||
|
|
||||||
text = window.get_widget("text")
|
|
||||||
text.set_text(photo.getDescription())
|
|
||||||
|
|
||||||
image2 = RelImage.scale_image(photo.getPath(),200.0)
|
|
||||||
window.get_widget("photo").load_imlib(image2)
|
|
||||||
window.get_widget("dialog1").set_data("p",photo)
|
|
||||||
window.get_widget("dialog1").set_data("t",text)
|
|
||||||
window.get_widget("dialog1").set_data("m",obj.get_data("m"))
|
|
||||||
window.get_widget("dialog1").editable_enters(text)
|
|
||||||
window.signal_autoconnect({
|
|
||||||
"on_cancel_clicked" : utils.destroy_passed_object,
|
|
||||||
"on_ok_clicked" : on_ok_clicked,
|
|
||||||
"on_apply_clicked" : on_apply_clicked
|
|
||||||
})
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_ok_clicked(obj):
|
|
||||||
on_apply_clicked(obj)
|
|
||||||
utils.destroy_passed_object(obj)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_apply_clicked(obj):
|
|
||||||
photo = obj.get_data("p")
|
|
||||||
text = obj.get_data("t").get_text()
|
|
||||||
if text != photo.getDescription():
|
|
||||||
photo.setDescription(text)
|
|
||||||
edit_window = obj.get_data("m")
|
|
||||||
edit_window.load_images()
|
|
||||||
utils.modified()
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ from RelLib import *
|
|||||||
import string
|
import string
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import gnome.mime
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -79,6 +80,9 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
self.tlist = []
|
self.tlist = []
|
||||||
self.conf = 2
|
self.conf = 2
|
||||||
|
|
||||||
|
self.objref = None
|
||||||
|
self.object = None
|
||||||
|
self.pref = None
|
||||||
self.use_p = 0
|
self.use_p = 0
|
||||||
self.in_note = 0
|
self.in_note = 0
|
||||||
self.in_old_attr = 0
|
self.in_old_attr = 0
|
||||||
@@ -233,6 +237,10 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
self.in_old_attr = 0
|
self.in_old_attr = 0
|
||||||
if self.photo:
|
if self.photo:
|
||||||
self.photo.addAttribute(self.attribute)
|
self.photo.addAttribute(self.attribute)
|
||||||
|
elif self.object:
|
||||||
|
self.object.addAttribute(self.attribute)
|
||||||
|
elif self.objref:
|
||||||
|
self.objref.addAttribute(self.attribute)
|
||||||
elif self.person:
|
elif self.person:
|
||||||
self.person.addAttribute(self.attribute)
|
self.person.addAttribute(self.attribute)
|
||||||
elif self.family:
|
elif self.family:
|
||||||
@@ -418,6 +426,8 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
self.source_ref.setBase(source)
|
self.source_ref.setBase(source)
|
||||||
if self.photo:
|
if self.photo:
|
||||||
self.photo.addSourceRef(self.source_ref)
|
self.photo.addSourceRef(self.source_ref)
|
||||||
|
elif self.object:
|
||||||
|
self.object.addSourceRef(self.source_ref)
|
||||||
elif self.event:
|
elif self.event:
|
||||||
self.event.addSourceRef(self.source_ref)
|
self.event.addSourceRef(self.source_ref)
|
||||||
elif self.address:
|
elif self.address:
|
||||||
@@ -437,6 +447,36 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
def start_source(self,attrs):
|
def start_source(self,attrs):
|
||||||
self.source = self.db.findSourceNoMap(u2l(attrs["id"]))
|
self.source = self.db.findSourceNoMap(u2l(attrs["id"]))
|
||||||
|
|
||||||
|
def start_objref(self,attrs):
|
||||||
|
self.objref = ObjectRef()
|
||||||
|
self.objref.setReference(self.db.findObjectNoMap(u2l(attrs['ref'])))
|
||||||
|
if self.family:
|
||||||
|
self.family.addPhoto(self.objref)
|
||||||
|
elif self.source:
|
||||||
|
self.source.addPhoto(self.objref)
|
||||||
|
elif self.person:
|
||||||
|
self.person.addPhoto(self.objref)
|
||||||
|
elif self.placeobj:
|
||||||
|
self.placeobj.addPhoto(self.objref)
|
||||||
|
|
||||||
|
def start_object(self,attrs):
|
||||||
|
self.object = self.db.findObjectNoMap(u2l(attrs['id']))
|
||||||
|
self.object.setMimeType(u2l(attrs['mime']))
|
||||||
|
self.object.setDescription(u2l(attrs['description']))
|
||||||
|
src = u2l(attrs["src"])
|
||||||
|
if src[0] != os.sep:
|
||||||
|
self.object.setPath("%s%s%s" % (self.base,os.sep,src))
|
||||||
|
self.object.setLocal(1)
|
||||||
|
else:
|
||||||
|
self.object.setPath(src)
|
||||||
|
self.object.setLocal(0)
|
||||||
|
|
||||||
|
def stop_object(self,tag):
|
||||||
|
self.object = None
|
||||||
|
|
||||||
|
def stop_objref(self,tage):
|
||||||
|
self.objref = None
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -444,30 +484,37 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
def start_photo(self,attrs):
|
def start_photo(self,attrs):
|
||||||
self.photo = Photo()
|
self.photo = Photo()
|
||||||
|
self.pref = ObjectRef()
|
||||||
|
self.pref.setReference(self.photo)
|
||||||
|
|
||||||
for key in attrs.keys():
|
for key in attrs.keys():
|
||||||
if key == "descrip" or key == "description":
|
if key == "descrip" or key == "description":
|
||||||
self.photo.setDescription(u2l(attrs[key]))
|
self.photo.setDescription(u2l(attrs[key]))
|
||||||
|
elif key == "priv":
|
||||||
|
self.pref.setPrivacy(int(attrs[key]))
|
||||||
elif key == "src":
|
elif key == "src":
|
||||||
src = u2l(attrs["src"])
|
src = u2l(attrs["src"])
|
||||||
if src[0] != os.sep:
|
if src[0] != os.sep:
|
||||||
self.photo.setPath("%s%s%s" % (self.base,os.sep,src))
|
self.photo.setPath("%s%s%s" % (self.base,os.sep,src))
|
||||||
self.photo.setPrivate(1)
|
self.photo.setLocal(1)
|
||||||
else:
|
else:
|
||||||
self.photo.setPath(src)
|
self.photo.setPath(src)
|
||||||
self.photo.setPrivate(0)
|
self.photo.setLocal(0)
|
||||||
if self.family:
|
|
||||||
self.family.addPhoto(self.photo)
|
|
||||||
elif self.source:
|
|
||||||
self.source.addPhoto(self.photo)
|
|
||||||
elif self.person:
|
|
||||||
self.person.addPhoto(self.photo)
|
|
||||||
elif self.placeobj:
|
|
||||||
self.placeobj.addPhoto(self.photo)
|
|
||||||
else:
|
else:
|
||||||
a = Attribute()
|
a = Attribute()
|
||||||
a.setType(key)
|
a.setType(key)
|
||||||
a.setValue(u2l(attrs[key]))
|
a.setValue(u2l(attrs[key]))
|
||||||
self.photo.addAttribute(a)
|
self.photo.addAttribute(a)
|
||||||
|
self.photo.setMimeType(gnome.mime.type_or_default(self.photo.getPath(),"unknown"))
|
||||||
|
self.db.addObject(self.photo)
|
||||||
|
if self.family:
|
||||||
|
self.family.addPhoto(self.pref)
|
||||||
|
elif self.source:
|
||||||
|
self.source.addPhoto(self.pref)
|
||||||
|
elif self.person:
|
||||||
|
self.person.addPhoto(self.pref)
|
||||||
|
elif self.placeobj:
|
||||||
|
self.placeobj.addPhoto(self.pref)
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -808,6 +855,10 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
|
|
||||||
if self.address:
|
if self.address:
|
||||||
self.address.setNote(note)
|
self.address.setNote(note)
|
||||||
|
elif self.object:
|
||||||
|
self.object.setNote(note)
|
||||||
|
elif self.objref:
|
||||||
|
self.objref.setNote(note)
|
||||||
elif self.photo:
|
elif self.photo:
|
||||||
self.photo.setNote(note)
|
self.photo.setNote(note)
|
||||||
elif self.attribute:
|
elif self.attribute:
|
||||||
@@ -958,6 +1009,8 @@ class GrampsParser(handler.ContentHandler):
|
|||||||
"people" : (start_people, stop_people),
|
"people" : (start_people, stop_people),
|
||||||
"person" : (start_person, None),
|
"person" : (start_person, None),
|
||||||
"img" : (start_photo, stop_photo),
|
"img" : (start_photo, stop_photo),
|
||||||
|
"objref" : (start_objref, stop_objref),
|
||||||
|
"object" : (start_object, stop_object),
|
||||||
"place" : (start_place, stop_place),
|
"place" : (start_place, stop_place),
|
||||||
"places" : (None, stop_places),
|
"places" : (None, stop_places),
|
||||||
"placeobj" : (start_placeobj,stop_placeobj),
|
"placeobj" : (start_placeobj,stop_placeobj),
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import string
|
|||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from gtk import *
|
from gtk import *
|
||||||
from gnome.ui import *
|
from gnome.ui import *
|
||||||
|
import gnome.mime
|
||||||
import libglade
|
import libglade
|
||||||
import GdkImlib
|
import GdkImlib
|
||||||
|
|
||||||
@@ -64,11 +65,20 @@ class ImageSelect:
|
|||||||
# window.
|
# window.
|
||||||
#
|
#
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
def __init__(self, path, prefix):
|
def __init__(self, path, prefix, db):
|
||||||
self.path = path;
|
self.path = path;
|
||||||
|
self.db = db
|
||||||
self.prefix = prefix;
|
self.prefix = prefix;
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# create_add_dialog - Create the gnome dialog for selecting a new
|
||||||
|
# photo and entering its description.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def create_add_dialog(self):
|
||||||
self.glade = libglade.GladeXML(const.imageselFile,"imageSelect")
|
self.glade = libglade.GladeXML(const.imageselFile,"imageSelect")
|
||||||
self.window = self.glade.get_widget("imageSelect")
|
window = self.glade.get_widget("imageSelect")
|
||||||
self.fname = self.glade.get_widget("fname")
|
self.fname = self.glade.get_widget("fname")
|
||||||
self.image = self.glade.get_widget("image")
|
self.image = self.glade.get_widget("image")
|
||||||
self.description = self.glade.get_widget("photoDescription")
|
self.description = self.glade.get_widget("photoDescription")
|
||||||
@@ -80,20 +90,32 @@ class ImageSelect:
|
|||||||
"destroy_passed_object" : utils.destroy_passed_object
|
"destroy_passed_object" : utils.destroy_passed_object
|
||||||
})
|
})
|
||||||
|
|
||||||
self.window.editable_enters(self.description)
|
window.editable_enters(self.description)
|
||||||
self.window.show()
|
window.show()
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# on_name_changed - The filename has changed. Verify it and load
|
||||||
|
# the picture.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
def on_name_changed(self, obj):
|
def on_name_changed(self, obj):
|
||||||
filename = self.fname.get_text()
|
filename = self.fname.get_text()
|
||||||
if os.path.isfile(filename):
|
if os.path.isfile(filename):
|
||||||
image = RelImage.scale_image(filename,const.thumbScale)
|
image = RelImage.scale_image(filename,const.thumbScale)
|
||||||
self.image.load_imlib(image)
|
self.image.load_imlib(image)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# savephoto - Save the photo in the dataobj object. (Required function)
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
def on_savephoto_clicked(self, obj):
|
def on_savephoto_clicked(self, obj):
|
||||||
filename = self.glade.get_widget("photosel").get_full_path(0)
|
filename = self.glade.get_widget("photosel").get_full_path(0)
|
||||||
description = self.glade.get_widget("photoDescription").get_text()
|
description = self.glade.get_widget("photoDescription").get_text()
|
||||||
|
|
||||||
if os.path.exists(filename) == 0:
|
if os.path.exists(filename) == 0:
|
||||||
|
GnomeErrorDialog(_("That is not a valid file name."));
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.external.get_active() == 1:
|
if self.external.get_active() == 1:
|
||||||
@@ -111,12 +133,230 @@ class ImageSelect:
|
|||||||
photo = Photo()
|
photo = Photo()
|
||||||
photo.setPath(name)
|
photo.setPath(name)
|
||||||
photo.setDescription(description)
|
photo.setDescription(description)
|
||||||
|
photo.setMimeType(gnome.mime.type_or_default(name,"unknown"))
|
||||||
|
|
||||||
self.savephoto(photo)
|
self.savephoto(photo)
|
||||||
|
|
||||||
utils.modified()
|
utils.modified()
|
||||||
utils.destroy_passed_object(obj)
|
utils.destroy_passed_object(obj)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# savephoto - Save the photo in the dataobj object. (Placeholder)
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
def savephoto(self, photo):
|
def savephoto(self, photo):
|
||||||
assert 0, "The savephoto function must be subclassed"
|
assert 0, "The savephoto function must be subclassed"
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gallery class - This class handles all the logic underlying a
|
||||||
|
# picture gallery. This class does not load or contain the widget
|
||||||
|
# data structure to actually display the gallery.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class Gallery(ImageSelect):
|
||||||
|
def __init__(self, dataobj, path, prefix, icon_list, db):
|
||||||
|
ImageSelect.__init__(self, path, prefix, db)
|
||||||
|
|
||||||
|
# Be paranoid - development only error messages
|
||||||
|
assert dataobj.addPhoto, "Gallery data object must contain an addPhoto routine."
|
||||||
|
assert dataobj.getPhotoList, "Gallery data object must contain an getPhotoList routine."
|
||||||
|
|
||||||
|
# Remember arguments
|
||||||
|
self.path = path;
|
||||||
|
self.prefix = prefix;
|
||||||
|
self.dataobj = dataobj;
|
||||||
|
self.icon_list = icon_list;
|
||||||
|
|
||||||
|
# Local object variables
|
||||||
|
self.selectedIcon = -1
|
||||||
|
self.currentImages = []
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# savephoto - Save the photo in the dataobj object. (Required function)
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def savephoto(self, photo):
|
||||||
|
|
||||||
|
self.db.addObject(photo)
|
||||||
|
oref = ObjectRef()
|
||||||
|
oref.setReference(photo)
|
||||||
|
self.dataobj.addPhoto(oref)
|
||||||
|
self.add_thumbnail(oref)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# add_thumbnail - Scale the image and add it to the IconList.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def add_thumbnail(self, photo):
|
||||||
|
object = photo.getReference()
|
||||||
|
path = object.getPath()
|
||||||
|
src = os.path.basename(path)
|
||||||
|
if object.getLocal():
|
||||||
|
thumb = "%s%s.thumb%s%s" % (self.path,os.sep,os.sep,src)
|
||||||
|
else:
|
||||||
|
thumb = "%s%s.thumb%s%s.jpg" % (self.path,os.sep,os.sep,os.path.basename(src))
|
||||||
|
RelImage.check_thumb(path,thumb,const.thumbScale)
|
||||||
|
self.icon_list.append(thumb,object.getDescription())
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# load_images - clears the currentImages list to free up any cached
|
||||||
|
# Imlibs. Then add each photo in the place's list of photos to the
|
||||||
|
# photolist window.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def load_images(self):
|
||||||
|
self.icon_list.freeze()
|
||||||
|
self.icon_list.clear()
|
||||||
|
for photo in self.dataobj.getPhotoList():
|
||||||
|
self.add_thumbnail(photo)
|
||||||
|
self.icon_list.thaw()
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# on_photo_select_icon - User clicked on a photo. Remember which one.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def on_photo_select_icon(self, obj,iconNumber,event):
|
||||||
|
self.selectedIcon = iconNumber
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# on_add_photo_clicked - User wants to add a new photo. Create a
|
||||||
|
# dialog to find out which photo they want.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def on_add_photo_clicked(self, obj):
|
||||||
|
self.create_add_dialog()
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# on_delete_photo_clicked - User wants to delete a new photo.
|
||||||
|
# Remove it from the displayed thumbnails, and remove it from the
|
||||||
|
# dataobj photo list.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def on_delete_photo_clicked(self, obj):
|
||||||
|
icon = self.selectedIcon
|
||||||
|
if icon != -1:
|
||||||
|
self.icon_list.remove(icon)
|
||||||
|
del self.dataobj.getPhotoList()[icon]
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# on_photolist_button_press_event - Look for right-clicks on a
|
||||||
|
# picture and create a popup menu of the available actions.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def on_photolist_button_press_event(self, obj, event):
|
||||||
|
icon = self.selectedIcon
|
||||||
|
if icon == -1:
|
||||||
|
return
|
||||||
|
|
||||||
|
if event.button == 3:
|
||||||
|
photo = self.dataobj.getPhotoList()[icon]
|
||||||
|
menu = GtkMenu()
|
||||||
|
item = GtkTearoffMenuItem()
|
||||||
|
item.show()
|
||||||
|
menu.append(item)
|
||||||
|
utils.add_menuitem(menu,_("View Object"),None,self.popup_view_photo)
|
||||||
|
utils.add_menuitem(menu,_("Edit Object"),None,self.popup_edit_photo)
|
||||||
|
utils.add_menuitem(menu,_("Edit Description"),None,
|
||||||
|
self.popup_change_description)
|
||||||
|
object = photo.getReference()
|
||||||
|
if object.getLocal() == 0:
|
||||||
|
utils.add_menuitem(menu,_("Convert to local copy"),None,
|
||||||
|
self.popup_convert_to_private)
|
||||||
|
menu.popup(None,None,None,0,0)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# popup_view_photo - Open this picture in a picture viewer
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def popup_view_photo(self, obj):
|
||||||
|
photo = self.dataobj.getPhotoList()[self.selectedIcon]
|
||||||
|
utils.view_photo(photo.getReference())
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# popup_edit_photo - Open this picture in a picture editor
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def popup_edit_photo(self, obj):
|
||||||
|
photo = self.dataobj.getPhotoList()[self.selectedIcon]
|
||||||
|
if os.fork() == 0:
|
||||||
|
os.execvp(const.editor,[const.editor, photo.getReference().getPath()])
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# popup_convert_to_private - Copy this picture into gramps private
|
||||||
|
# database instead of leaving it as an external data object.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def popup_convert_to_private(self, obj):
|
||||||
|
photo = self.dataobj.getPhotoList()[self.selectedIcon]
|
||||||
|
object = photo.getReference()
|
||||||
|
name = RelImage.import_photo(object.getPath(),self.path,self.prefix)
|
||||||
|
|
||||||
|
object.setPath(name)
|
||||||
|
object.setLocal(1)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# popup_change_description - Bring up a window allowing the user
|
||||||
|
# to edit the description of a picture.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def popup_change_description(self, obj):
|
||||||
|
photo = self.dataobj.getPhotoList()[self.selectedIcon]
|
||||||
|
object = photo.getReference()
|
||||||
|
self.change_dialog = libglade.GladeXML(const.imageselFile,"change_description")
|
||||||
|
|
||||||
|
window = self.change_dialog.get_widget("change_description")
|
||||||
|
text = self.change_dialog.get_widget("text")
|
||||||
|
text.set_text(object.getDescription())
|
||||||
|
|
||||||
|
image2 = RelImage.scale_image(object.getPath(),200.0)
|
||||||
|
self.change_dialog.get_widget("photo").load_imlib(image2)
|
||||||
|
window.set_data("p",photo)
|
||||||
|
window.set_data("t",text)
|
||||||
|
window.editable_enters(text)
|
||||||
|
self.change_dialog.signal_autoconnect({
|
||||||
|
"on_cancel_clicked" : utils.destroy_passed_object,
|
||||||
|
"on_ok_clicked" : self.new_desc_ok_clicked,
|
||||||
|
"on_apply_clicked" : self.new_desc_apply_clicked
|
||||||
|
})
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# new_desc_apply_clicked - Apply the new description.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def new_desc_apply_clicked(self, obj):
|
||||||
|
photo = obj.get_data("p")
|
||||||
|
object = photo.getReference()
|
||||||
|
text = obj.get_data("t").get_text()
|
||||||
|
if text != object.getDescription():
|
||||||
|
object.setDescription(text)
|
||||||
|
self.load_images()
|
||||||
|
utils.modified()
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# new_desc_ok_clicked - Apply the new description and close the dialog.
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def new_desc_ok_clicked(self, obj):
|
||||||
|
self.new_desc_apply_clicked(obj)
|
||||||
|
utils.destroy_passed_object(obj)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
217
src/Marriage.py
217
src/Marriage.py
@@ -70,35 +70,35 @@ class Marriage:
|
|||||||
self.db = db
|
self.db = db
|
||||||
self.path = db.getSavePath()
|
self.path = db.getSavePath()
|
||||||
|
|
||||||
self.selectedIcon = 0
|
|
||||||
|
|
||||||
self.top = libglade.GladeXML(const.marriageFile,"marriageEditor")
|
self.top = libglade.GladeXML(const.marriageFile,"marriageEditor")
|
||||||
|
top_window = self.get_widget("marriageEditor")
|
||||||
|
fid = "f%s" % family.getId()
|
||||||
|
plwidget = self.top.get_widget("photolist")
|
||||||
|
self.gallery = ImageSelect.Gallery(family, self.path, fid, plwidget, db)
|
||||||
self.top.signal_autoconnect({
|
self.top.signal_autoconnect({
|
||||||
"destroy_passed_object" : on_cancel_edit,
|
"destroy_passed_object" : on_cancel_edit,
|
||||||
"on_add_attr_clicked" : on_add_attr_clicked,
|
"on_add_attr_clicked" : on_add_attr_clicked,
|
||||||
"on_addphoto_clicked" : on_add_photo_clicked,
|
"on_addphoto_clicked" : self.gallery.on_add_photo_clicked,
|
||||||
"on_attr_list_select_row" : on_attr_list_select_row,
|
"on_attr_list_select_row" : on_attr_list_select_row,
|
||||||
"on_close_marriage_editor" : on_close_marriage_editor,
|
"on_close_marriage_editor" : on_close_marriage_editor,
|
||||||
"on_delete_attr_clicked" : on_delete_attr_clicked,
|
"on_delete_attr_clicked" : on_delete_attr_clicked,
|
||||||
"on_delete_event" : on_delete_event,
|
"on_delete_event" : on_delete_event,
|
||||||
"on_deletephoto_clicked" : on_delete_photo_clicked,
|
"on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked,
|
||||||
"on_marriageAddBtn_clicked" : on_add_clicked,
|
"on_marriageAddBtn_clicked" : on_add_clicked,
|
||||||
"on_marriageDeleteBtn_clicked" : on_delete_clicked,
|
"on_marriageDeleteBtn_clicked" : on_delete_clicked,
|
||||||
"on_marriageEventList_select_row" : on_select_row,
|
"on_marriageEventList_select_row" : on_select_row,
|
||||||
"on_marriageUpdateBtn_clicked" : on_update_clicked,
|
"on_marriageUpdateBtn_clicked" : on_update_clicked,
|
||||||
"on_photolist_button_press_event" : on_photolist_button_press_event,
|
"on_photolist_button_press_event" : self.gallery.on_photolist_button_press_event,
|
||||||
"on_photolist_select_icon" : on_photo_select_icon,
|
"on_photolist_select_icon" : self.gallery.on_photo_select_icon,
|
||||||
"on_update_attr_clicked" : on_update_attr_clicked,
|
"on_update_attr_clicked" : on_update_attr_clicked,
|
||||||
})
|
})
|
||||||
|
|
||||||
top_window = self.get_widget("marriageEditor")
|
|
||||||
text_win = self.get_widget("marriageTitle")
|
text_win = self.get_widget("marriageTitle")
|
||||||
title = _("%s and %s") % (Config.nameof(family.getFather()),
|
title = _("%s and %s") % (Config.nameof(family.getFather()),
|
||||||
Config.nameof(family.getMother()))
|
Config.nameof(family.getMother()))
|
||||||
text_win.set_text(title)
|
text_win.set_text(title)
|
||||||
|
|
||||||
self.event_list = self.get_widget("marriageEventList")
|
self.event_list = self.get_widget("marriageEventList")
|
||||||
self.photo_list = self.get_widget("photolist")
|
|
||||||
|
|
||||||
# widgets
|
# widgets
|
||||||
self.date_field = self.get_widget("marriageDate")
|
self.date_field = self.get_widget("marriageDate")
|
||||||
@@ -123,7 +123,7 @@ class Marriage:
|
|||||||
self.lists_changed = 0
|
self.lists_changed = 0
|
||||||
|
|
||||||
# set initial data
|
# set initial data
|
||||||
self.load_images()
|
self.gallery.load_images()
|
||||||
|
|
||||||
self.type_field.set_popdown_strings(const.familyRelations)
|
self.type_field.set_popdown_strings(const.familyRelations)
|
||||||
frel = const.display_frel(family.getRelationship())
|
frel = const.display_frel(family.getRelationship())
|
||||||
@@ -166,37 +166,6 @@ class Marriage:
|
|||||||
def redraw_attr_list(self):
|
def redraw_attr_list(self):
|
||||||
utils.redraw_list(self.alist,self.attr_list,disp_attr)
|
utils.redraw_list(self.alist,self.attr_list,disp_attr)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# add_thumbnail - Scale the image and add it to the IconList. Currently,
|
|
||||||
# there seems to be a problem with either GdkImlib. A reference has to be
|
|
||||||
# kept to the image, or it gets lost. This is supposed to be a known
|
|
||||||
# imlib problem
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def add_thumbnail(self,photo):
|
|
||||||
src = os.path.basename(photo.getPath())
|
|
||||||
if photo.getPrivate():
|
|
||||||
thumb = "%s%s.thumb%s%s" % (self.path,os.sep,os.sep,src)
|
|
||||||
else:
|
|
||||||
thumb = "%s%s.thumb%s%s.jpg" % (self.path,os.sep,os.sep,os.path.basename(src))
|
|
||||||
RelImage.check_thumb(photo.getPath(),thumb,const.thumbScale)
|
|
||||||
self.photo_list.append(thumb,photo.getDescription())
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# load_images - clears the currentImages list to free up any cached
|
|
||||||
# Imlibs. Then add each photo in the person's list of photos to the
|
|
||||||
# photolist window.
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def load_images(self):
|
|
||||||
self.photo_list.freeze()
|
|
||||||
self.photo_list.clear()
|
|
||||||
for photo in self.family.getPhotoList():
|
|
||||||
self.add_thumbnail(photo)
|
|
||||||
self.photo_list.thaw()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# redraw_events - redraws the event list by deleting all the entries and
|
# redraw_events - redraws the event list by deleting all the entries and
|
||||||
@@ -215,34 +184,6 @@ class Marriage:
|
|||||||
return self.top.get_widget(name)
|
return self.top.get_widget(name)
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# MarriageImageSelect class
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
class MarriageImageSelect(ImageSelect.ImageSelect):
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# __init__ - Sub-class an ImageSelect window. The only differences
|
|
||||||
# between the various subclasses are the initializer arguments, and
|
|
||||||
# the type of object for which an image is being selected.
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def __init__(self, efo):
|
|
||||||
ImageSelect.ImageSelect.__init__(self, efo.path, "f%s" % efo.family.getId())
|
|
||||||
self.efo = efo;
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# savephoto - Override the savephoto method to store the selected
|
|
||||||
# photo in a family object
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
def savephoto(self, photo):
|
|
||||||
self.efo.family.addPhoto(photo)
|
|
||||||
self.efo.add_thumbnail(photo)
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -482,146 +423,6 @@ def update_event(event,name,date,place,desc,note,priv,cause):
|
|||||||
|
|
||||||
return changed
|
return changed
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photolist_button_press_event(obj,event):
|
|
||||||
myobj = obj.get_data(MARRIAGE)
|
|
||||||
icon = myobj.selectedIcon
|
|
||||||
if icon == -1:
|
|
||||||
return
|
|
||||||
|
|
||||||
if event.button == 3:
|
|
||||||
photo = myobj.family.getPhotoList()[icon]
|
|
||||||
menu = GtkMenu()
|
|
||||||
item = GtkTearoffMenuItem()
|
|
||||||
item.show()
|
|
||||||
menu.append(item)
|
|
||||||
utils.add_menuitem(menu,_("View Image"),myobj,on_view_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Image"),myobj,on_edit_photo)
|
|
||||||
utils.add_menuitem(menu,_("Edit Description"),myobj,
|
|
||||||
on_change_description)
|
|
||||||
if photo.getPrivate() == 0:
|
|
||||||
utils.add_menuitem(menu,_("Convert to private copy"),myobj,
|
|
||||||
on_convert_to_private)
|
|
||||||
menu.popup(None,None,None,0,0)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_convert_to_private(obj):
|
|
||||||
epo = obj.get_data(OBJECT)
|
|
||||||
photo = epo.family.getPhotoList()[epo.selected_icon]
|
|
||||||
|
|
||||||
prefix = "f%s" % epo.person.getId()
|
|
||||||
name = RelImage.import_photo(photo.getPath(),epo.path,prefix)
|
|
||||||
|
|
||||||
photo.setPath(name)
|
|
||||||
photo.setPrivate(1)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_view_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.family.getPhotoList()[myobj.selectedIcon]
|
|
||||||
utils.view_photo(photo)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_edit_photo(obj):
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.family.getPhotoList()[myobj.selectedIcon]
|
|
||||||
if os.fork() == 0:
|
|
||||||
os.execvp(const.editor,[const.editor, photo.getPath()])
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_photo_select_icon(obj,iconNumber,event):
|
|
||||||
obj.get_data(MARRIAGE).selectedIcon = iconNumber
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_delete_photo_clicked(obj):
|
|
||||||
marriage_obj = obj.get_data(MARRIAGE)
|
|
||||||
icon = marriage_obj.selectedIcon
|
|
||||||
|
|
||||||
if icon != -1:
|
|
||||||
marriage_obj.photo_list.remove(icon)
|
|
||||||
del marriage_obj.family.getPhotoList()[icon]
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_add_photo_clicked(obj):
|
|
||||||
MarriageImageSelect(obj.get_data(MARRIAGE))
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_change_description(obj):
|
|
||||||
|
|
||||||
myobj = obj.get_data("m")
|
|
||||||
photo = myobj.family.getPhotoList()[myobj.selectedIcon]
|
|
||||||
window = libglade.GladeXML(const.imageselFile,"dialog1")
|
|
||||||
text = window.get_widget("text")
|
|
||||||
text.set_text(photo.getDescription())
|
|
||||||
|
|
||||||
image2 = RelImage.scale_image(photo.getPath(),200.0)
|
|
||||||
|
|
||||||
window.get_widget("photo").load_imlib(image2)
|
|
||||||
window.get_widget("dialog1").set_data("p",photo)
|
|
||||||
window.get_widget("dialog1").set_data("t",text)
|
|
||||||
window.get_widget("dialog1").set_data("m",obj.get_data("m"))
|
|
||||||
window.get_widget("dialog1").editable_enters(text)
|
|
||||||
window.signal_autoconnect({
|
|
||||||
"on_cancel_clicked" : utils.destroy_passed_object,
|
|
||||||
"on_ok_clicked" : on_ok_clicked,
|
|
||||||
"on_apply_clicked" : on_apply_clicked
|
|
||||||
})
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_apply_clicked(obj):
|
|
||||||
photo = obj.get_data("p")
|
|
||||||
text = obj.get_data("t").get_text()
|
|
||||||
if text != photo.getDescription():
|
|
||||||
photo.setDescription(text)
|
|
||||||
edit_window = obj.get_data("m")
|
|
||||||
edit_window.load_images()
|
|
||||||
utils.modified()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
def on_ok_clicked(obj):
|
|
||||||
on_apply_clicked(obj)
|
|
||||||
utils.destroy_passed_object(obj)
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# on_attr_list_select_row - sets the row object attached to the passed
|
# on_attr_list_select_row - sets the row object attached to the passed
|
||||||
|
|||||||
156
src/RelLib.py
156
src/RelLib.py
@@ -129,7 +129,7 @@ class Place(SourceNote):
|
|||||||
self.urls.append(Url(u))
|
self.urls.append(Url(u))
|
||||||
self.photoList = []
|
self.photoList = []
|
||||||
for photo in source.photoList:
|
for photo in source.photoList:
|
||||||
self.photoList.append(Photo(photo))
|
self.photoList.append(ObjectRef(photo))
|
||||||
else:
|
else:
|
||||||
self.long = ""
|
self.long = ""
|
||||||
self.lat = ""
|
self.lat = ""
|
||||||
@@ -346,14 +346,40 @@ class Photo(SourceNote):
|
|||||||
self.attrlist = []
|
self.attrlist = []
|
||||||
if source:
|
if source:
|
||||||
self.path = source.path
|
self.path = source.path
|
||||||
|
self.mime = source.mime
|
||||||
|
self.local = source.local
|
||||||
self.desc = source.desc
|
self.desc = source.desc
|
||||||
self.private = source.private
|
self.id = source.id
|
||||||
for attr in source.attrlist:
|
for attr in source.attrlist:
|
||||||
self.attrlist.append(Attribute(attr))
|
self.attrlist.append(Attribute(attr))
|
||||||
else:
|
else:
|
||||||
|
self.id = ""
|
||||||
|
self.local = 0
|
||||||
self.path = ""
|
self.path = ""
|
||||||
|
self.mime = ""
|
||||||
self.desc = ""
|
self.desc = ""
|
||||||
self.private = 0
|
|
||||||
|
def setLocal(self,val):
|
||||||
|
"""set or clear the local flag"""
|
||||||
|
self.local = val
|
||||||
|
|
||||||
|
def getLocal(self):
|
||||||
|
"""return the local flag"""
|
||||||
|
return self.local
|
||||||
|
|
||||||
|
def setId(self,id):
|
||||||
|
"""Sets the gramps ID for the place object"""
|
||||||
|
self.id = id
|
||||||
|
|
||||||
|
def getId(self):
|
||||||
|
"""Returns the gramps ID for the place object"""
|
||||||
|
return self.id
|
||||||
|
|
||||||
|
def setMimeType(self,type):
|
||||||
|
self.mime = type
|
||||||
|
|
||||||
|
def getMimeType(self):
|
||||||
|
return self.mime
|
||||||
|
|
||||||
def setPath(self,path):
|
def setPath(self,path):
|
||||||
"""set the file path to the passed path"""
|
"""set the file path to the passed path"""
|
||||||
@@ -363,14 +389,6 @@ class Photo(SourceNote):
|
|||||||
"""return the file path"""
|
"""return the file path"""
|
||||||
return self.path
|
return self.path
|
||||||
|
|
||||||
def setPrivate(self,val):
|
|
||||||
"""set or clear the privacy flag"""
|
|
||||||
self.private = val
|
|
||||||
|
|
||||||
def getPrivate(self):
|
|
||||||
"""return the privacy flag"""
|
|
||||||
return self.private
|
|
||||||
|
|
||||||
def setDescription(self,text):
|
def setDescription(self,text):
|
||||||
"""sets the description of the image"""
|
"""sets the description of the image"""
|
||||||
self.desc = text
|
self.desc = text
|
||||||
@@ -389,6 +407,66 @@ class Photo(SourceNote):
|
|||||||
"""returns the property list associated with the image"""
|
"""returns the property list associated with the image"""
|
||||||
return self.attrlist
|
return self.attrlist
|
||||||
|
|
||||||
|
class ObjectRef:
|
||||||
|
|
||||||
|
def __init__(self,source=None):
|
||||||
|
self.attrlist = []
|
||||||
|
if source:
|
||||||
|
self.private = source.private
|
||||||
|
self.ref = source.ref
|
||||||
|
self.note = Note(source.note)
|
||||||
|
for attr in source.attrlist:
|
||||||
|
self.attrlist.append(Attribute(attr))
|
||||||
|
else:
|
||||||
|
self.private = 0
|
||||||
|
self.ref = None
|
||||||
|
self.note = None
|
||||||
|
|
||||||
|
def setPrivacy(self,val):
|
||||||
|
"""Sets or clears the privacy flag of the data"""
|
||||||
|
self.private = val
|
||||||
|
|
||||||
|
def getPrivacy(self):
|
||||||
|
"""Returns the privacy level of the data"""
|
||||||
|
return self.private
|
||||||
|
|
||||||
|
def setReference(self,obj):
|
||||||
|
self.ref = obj
|
||||||
|
|
||||||
|
def getReference(self):
|
||||||
|
return self.ref
|
||||||
|
|
||||||
|
def setNote(self,text):
|
||||||
|
"""Set the note to the given text"""
|
||||||
|
if self.note == None:
|
||||||
|
self.note = Note()
|
||||||
|
self.note.set(text)
|
||||||
|
|
||||||
|
def getNote(self):
|
||||||
|
"""Return the current note"""
|
||||||
|
if self.note == None:
|
||||||
|
return ""
|
||||||
|
else:
|
||||||
|
return self.note.get()
|
||||||
|
|
||||||
|
def setNoteObj(self,obj):
|
||||||
|
"""Change the note object instance to obj"""
|
||||||
|
self.note = obj
|
||||||
|
|
||||||
|
def getNoteObj(self):
|
||||||
|
"""Return in note instance, not just the text"""
|
||||||
|
return self.note
|
||||||
|
|
||||||
|
def addAttribute(self,attr):
|
||||||
|
"""Adds a propery to the Photo object. This is not used by gramps,
|
||||||
|
but provides a means for XML users to attach other properties to
|
||||||
|
the image"""
|
||||||
|
self.attrlist.append(attr)
|
||||||
|
|
||||||
|
def getAttributeList(self):
|
||||||
|
"""returns the property list associated with the image"""
|
||||||
|
return self.attrlist
|
||||||
|
|
||||||
class Attribute(DataObj):
|
class Attribute(DataObj):
|
||||||
"""Provides a simple key/value pair for describing properties. Used
|
"""Provides a simple key/value pair for describing properties. Used
|
||||||
by the Person and Family objects to store descriptive information."""
|
by the Person and Family objects to store descriptive information."""
|
||||||
@@ -1345,10 +1423,12 @@ class RelDataBase:
|
|||||||
self.familyMap = {}
|
self.familyMap = {}
|
||||||
self.sourceMap = {}
|
self.sourceMap = {}
|
||||||
self.placeMap = {}
|
self.placeMap = {}
|
||||||
|
self.objectMap = {}
|
||||||
self.smapIndex = 0
|
self.smapIndex = 0
|
||||||
self.pmapIndex = 0
|
self.pmapIndex = 0
|
||||||
self.fmapIndex = 0
|
self.fmapIndex = 0
|
||||||
self.lmapIndex = 0
|
self.lmapIndex = 0
|
||||||
|
self.omapIndex = 0
|
||||||
self.default = None
|
self.default = None
|
||||||
self.owner = Researcher()
|
self.owner = Researcher()
|
||||||
self.bookmarks = []
|
self.bookmarks = []
|
||||||
@@ -1413,6 +1493,10 @@ class RelDataBase:
|
|||||||
"""returns a map of gramps's IDs to Source instances"""
|
"""returns a map of gramps's IDs to Source instances"""
|
||||||
return self.sourceMap
|
return self.sourceMap
|
||||||
|
|
||||||
|
def getObjectMap(self):
|
||||||
|
"""returns a map of gramps's IDs to Object instances"""
|
||||||
|
return self.objectMap
|
||||||
|
|
||||||
def getSavePath(self):
|
def getSavePath(self):
|
||||||
"""returns the save path of the file, or "" if one does not exist"""
|
"""returns the save path of the file, or "" if one does not exist"""
|
||||||
return self.path
|
return self.path
|
||||||
@@ -1568,6 +1652,56 @@ class RelDataBase:
|
|||||||
self.addSourceNoMap(source,val)
|
self.addSourceNoMap(source,val)
|
||||||
return source
|
return source
|
||||||
|
|
||||||
|
def addObject(self,object):
|
||||||
|
"""adds an Object instance to the database, assigning it a gramps'
|
||||||
|
ID number"""
|
||||||
|
|
||||||
|
index = "O%d" % self.omapIndex
|
||||||
|
while self.objectMap.has_key(index):
|
||||||
|
self.omapIndex = self.omapIndex + 1
|
||||||
|
index = "O%d" % self.omapIndex
|
||||||
|
object.setId(index)
|
||||||
|
self.objectMap[index] = object
|
||||||
|
self.omapIndex = self.omapIndex + 1
|
||||||
|
return index
|
||||||
|
|
||||||
|
def findObject(self,idVal,map):
|
||||||
|
"""finds an Object in the database using the idVal and map
|
||||||
|
variables to translate between the external ID and gramps'
|
||||||
|
internal ID. If no such Object exists, a new Object instance
|
||||||
|
is created.
|
||||||
|
|
||||||
|
idVal - external ID number
|
||||||
|
map - map build by findObject of external to gramp's IDs"""
|
||||||
|
|
||||||
|
idVal = str(idVal)
|
||||||
|
if map.has_key(idVal):
|
||||||
|
object = self.objectMap[map[idVal]]
|
||||||
|
else:
|
||||||
|
object = Photo()
|
||||||
|
map[idVal] = self.addObject(object)
|
||||||
|
return object
|
||||||
|
|
||||||
|
def addObjectNoMap(self,object,index):
|
||||||
|
"""adds an Object to the database if the gramps' ID is known"""
|
||||||
|
index = str(index)
|
||||||
|
object.setId(index)
|
||||||
|
self.objectMap[index] = object
|
||||||
|
self.omapIndex = self.omapIndex + 1
|
||||||
|
return index
|
||||||
|
|
||||||
|
def findObjectNoMap(self,idVal):
|
||||||
|
"""finds an Object in the database from the passed gramps' ID.
|
||||||
|
If no such Source exists, a new Source is added to the database."""
|
||||||
|
|
||||||
|
val = str(idVal)
|
||||||
|
if self.objectMap.has_key(val):
|
||||||
|
object = self.objectMap[val]
|
||||||
|
else:
|
||||||
|
object = Photo()
|
||||||
|
self.addObjectNoMap(object,val)
|
||||||
|
return object
|
||||||
|
|
||||||
def addPlace(self,place):
|
def addPlace(self,place):
|
||||||
"""adds a Place instance to the database, assigning it a gramps'
|
"""adds a Place instance to the database, assigning it a gramps'
|
||||||
ID number"""
|
ID number"""
|
||||||
|
|||||||
@@ -271,36 +271,22 @@ def dump_location(g,loc):
|
|||||||
def write_attribute_list(g, list, indent=3):
|
def write_attribute_list(g, list, indent=3):
|
||||||
sp = ' ' * indent
|
sp = ' ' * indent
|
||||||
for attr in list:
|
for attr in list:
|
||||||
if len(attr.getSourceRefList()) > 0 or attr.getNote():
|
|
||||||
g.write('%s<attribute%s>\n' % (sp,conf_priv(attr)))
|
g.write('%s<attribute%s>\n' % (sp,conf_priv(attr)))
|
||||||
write_line(g,"attr_type",attr.getType(),4)
|
write_line(g,"attr_type",attr.getType(),4)
|
||||||
write_line(g,"attr_value",attr.getValue(),4)
|
write_line(g,"attr_value",attr.getValue(),4)
|
||||||
for s in attr.getSourceRefList():
|
for s in attr.getSourceRefList():
|
||||||
dump_source_ref(g,s,index+1)
|
dump_source_ref(g,s,indent+1)
|
||||||
write_note(g,"note",attr.getNote(),4)
|
write_note(g,"note",attr.getNote(),4)
|
||||||
g.write('%s</attribute>\n' % sp)
|
g.write('%s</attribute>\n' % sp)
|
||||||
else:
|
|
||||||
g.write('%s<attribute type="%s">' % (sp,attr.getType()))
|
|
||||||
g.write(fix(attr.getValue()))
|
|
||||||
g.write('</attribute>\n')
|
|
||||||
|
|
||||||
|
|
||||||
def write_photo_list(g,list,indent=3):
|
def write_photo_list(g,list,indent=3):
|
||||||
sp = ' '*indent
|
sp = ' '*indent
|
||||||
for photo in list:
|
for photo in list:
|
||||||
path = photo.getPath()
|
g.write('%s<objref ref="%s"' % (sp,photo.getReference().getId()))
|
||||||
if strip_photo:
|
if photo.getPrivacy():
|
||||||
path = os.path.basename(path)
|
g.write(' priv="1"')
|
||||||
else:
|
|
||||||
l = len(fileroot)
|
|
||||||
if len(path) >= l:
|
|
||||||
if fileroot == path[0:l]:
|
|
||||||
path = path[l+1:]
|
|
||||||
g.write('%s<img src="%s"' % (sp,fix(path)) )
|
|
||||||
g.write(' description="%s"' % fix(photo.getDescription()))
|
|
||||||
proplist = photo.getAttributeList()
|
proplist = photo.getAttributeList()
|
||||||
srclist = photo.getSourceRefList()
|
if len(proplist) == 0 and photo.getNote() == "":
|
||||||
if len(proplist) == 0 and photo.getNote() == "" and len(srclist) == 0:
|
|
||||||
g.write("/>\n")
|
g.write("/>\n")
|
||||||
else:
|
else:
|
||||||
g.write(">\n")
|
g.write(">\n")
|
||||||
@@ -308,7 +294,7 @@ def write_photo_list(g,list,indent=3):
|
|||||||
write_note(g,"note",photo.getNote(),indent+1)
|
write_note(g,"note",photo.getNote(),indent+1)
|
||||||
for s in photo.getSourceRefList():
|
for s in photo.getSourceRefList():
|
||||||
dump_source_ref(g,s,indent+1)
|
dump_source_ref(g,s,indent+1)
|
||||||
g.write('%s</img>\n' % sp)
|
g.write('%s</objref>\n' % sp)
|
||||||
|
|
||||||
|
|
||||||
def write_url_list(g, list):
|
def write_url_list(g, list):
|
||||||
@@ -339,9 +325,33 @@ def write_place_obj(g,place):
|
|||||||
if place.getNote() != "":
|
if place.getNote() != "":
|
||||||
write_note(g,"note",place.getNote(),3)
|
write_note(g,"note",place.getNote(),3)
|
||||||
for s in place.getSourceRefList():
|
for s in place.getSourceRefList():
|
||||||
dump_source_ref(g,s,index+1)
|
dump_source_ref(g,s,3)
|
||||||
g.write(" </placeobj>\n")
|
g.write(" </placeobj>\n")
|
||||||
|
|
||||||
|
def write_object(g,object):
|
||||||
|
id = object.getId()
|
||||||
|
type = object.getMimeType()
|
||||||
|
path = object.getPath()
|
||||||
|
l = len(fileroot)
|
||||||
|
if len(path) >= l:
|
||||||
|
if fileroot == path[0:l]:
|
||||||
|
path = path[l+1:]
|
||||||
|
g.write(' <object id="%s" src="%s" mime="%s"' % (id,path,type))
|
||||||
|
g.write(' description="%s"' % fix(object.getDescription()))
|
||||||
|
alist = object.getAttributeList()
|
||||||
|
note = object.getNote()
|
||||||
|
slist = object.getSourceRefList()
|
||||||
|
if len(alist) == 0 and len(slist) == 0 and note == "":
|
||||||
|
g.write('/>\n')
|
||||||
|
else:
|
||||||
|
g.write('>\n')
|
||||||
|
write_attribute_list(g,alist)
|
||||||
|
if note != "":
|
||||||
|
write_note(g,"note",note,3)
|
||||||
|
for s in slist:
|
||||||
|
dump_source_ref(g,s,3)
|
||||||
|
g.write(" </object>\n")
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -381,6 +391,8 @@ def write_xml_data(database, g, callback, sp):
|
|||||||
sourceList = database.getSourceMap().values()
|
sourceList = database.getSourceMap().values()
|
||||||
placeList = database.getPlaceMap().values()
|
placeList = database.getPlaceMap().values()
|
||||||
placeList.sort(sortById)
|
placeList.sort(sortById)
|
||||||
|
objList = database.getObjectMap().values()
|
||||||
|
objList.sort(sortById)
|
||||||
|
|
||||||
total = len(personList) + len(familyList)
|
total = len(personList) + len(familyList)
|
||||||
|
|
||||||
@@ -455,7 +467,7 @@ def write_xml_data(database, g, callback, sp):
|
|||||||
if address.getNote() != "":
|
if address.getNote() != "":
|
||||||
write_note(g,"note",address.getNote(),4)
|
write_note(g,"note",address.getNote(),4)
|
||||||
for s in address.getSourceRefList():
|
for s in address.getSourceRefList():
|
||||||
dump_source_ref(g,s,index+1)
|
dump_source_ref(g,s,4)
|
||||||
g.write(' </address>\n')
|
g.write(' </address>\n')
|
||||||
|
|
||||||
write_attribute_list(g,person.getAttributeList())
|
write_attribute_list(g,person.getAttributeList())
|
||||||
@@ -530,6 +542,12 @@ def write_xml_data(database, g, callback, sp):
|
|||||||
write_place_obj(g,place)
|
write_place_obj(g,place)
|
||||||
g.write(" </places>\n")
|
g.write(" </places>\n")
|
||||||
|
|
||||||
|
if len(objList) > 0:
|
||||||
|
g.write(" <objects>\n")
|
||||||
|
for object in objList:
|
||||||
|
write_object(g,object)
|
||||||
|
g.write(" </objects>\n")
|
||||||
|
|
||||||
if len(database.getBookmarks()) > 0:
|
if len(database.getBookmarks()) > 0:
|
||||||
g.write(" <bookmarks>\n")
|
g.write(" <bookmarks>\n")
|
||||||
for person in database.getBookmarks():
|
for person in database.getBookmarks():
|
||||||
|
|||||||
608
src/gramps.glade
608
src/gramps.glade
@@ -560,6 +560,19 @@
|
|||||||
<icon>earth.xpm</icon>
|
<icon>earth.xpm</icon>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkButton</class>
|
||||||
|
<child_name>Toolbar:button</child_name>
|
||||||
|
<name>button145</name>
|
||||||
|
<signal>
|
||||||
|
<name>clicked</name>
|
||||||
|
<handler>on_media_activate</handler>
|
||||||
|
<last_modification_time>Tue, 09 Oct 2001 17:09:23 GMT</last_modification_time>
|
||||||
|
</signal>
|
||||||
|
<label>Media</label>
|
||||||
|
<stock_pixmap>GNOME_STOCK_PIXMAP_CDROM</stock_pixmap>
|
||||||
|
</widget>
|
||||||
|
|
||||||
<widget>
|
<widget>
|
||||||
<class>GtkButton</class>
|
<class>GtkButton</class>
|
||||||
<child_name>Toolbar:button</child_name>
|
<child_name>Toolbar:button</child_name>
|
||||||
@@ -2396,6 +2409,601 @@
|
|||||||
<xpad>0</xpad>
|
<xpad>0</xpad>
|
||||||
<ypad>0</ypad>
|
<ypad>0</ypad>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkVBox</class>
|
||||||
|
<name>vbox48</name>
|
||||||
|
<homogeneous>False</homogeneous>
|
||||||
|
<spacing>0</spacing>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkHBox</class>
|
||||||
|
<name>hbox34</name>
|
||||||
|
<homogeneous>False</homogeneous>
|
||||||
|
<spacing>0</spacing>
|
||||||
|
<child>
|
||||||
|
<padding>5</padding>
|
||||||
|
<expand>False</expand>
|
||||||
|
<fill>True</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkFrame</class>
|
||||||
|
<name>frame7</name>
|
||||||
|
<label>Preview</label>
|
||||||
|
<label_xalign>0</label_xalign>
|
||||||
|
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
|
||||||
|
<child>
|
||||||
|
<padding>5</padding>
|
||||||
|
<expand>False</expand>
|
||||||
|
<fill>False</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GnomePixmap</class>
|
||||||
|
<name>preview</name>
|
||||||
|
<width>100</width>
|
||||||
|
<height>100</height>
|
||||||
|
<scaled_width>96</scaled_width>
|
||||||
|
<scaled_height>96</scaled_height>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkFrame</class>
|
||||||
|
<name>frame8</name>
|
||||||
|
<label>Information</label>
|
||||||
|
<label_xalign>0</label_xalign>
|
||||||
|
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
|
||||||
|
<child>
|
||||||
|
<padding>5</padding>
|
||||||
|
<expand>True</expand>
|
||||||
|
<fill>True</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkTable</class>
|
||||||
|
<name>table27</name>
|
||||||
|
<rows>4</rows>
|
||||||
|
<columns>6</columns>
|
||||||
|
<homogeneous>False</homogeneous>
|
||||||
|
<row_spacing>0</row_spacing>
|
||||||
|
<column_spacing>0</column_spacing>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label269</name>
|
||||||
|
<label>:</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>3</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>1</left_attach>
|
||||||
|
<right_attach>2</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label271</name>
|
||||||
|
<label>:</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>1</left_attach>
|
||||||
|
<right_attach>2</right_attach>
|
||||||
|
<top_attach>1</top_attach>
|
||||||
|
<bottom_attach>2</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label272</name>
|
||||||
|
<label>:</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>1</left_attach>
|
||||||
|
<right_attach>2</right_attach>
|
||||||
|
<top_attach>2</top_attach>
|
||||||
|
<bottom_attach>3</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label273</name>
|
||||||
|
<label>:</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>1</left_attach>
|
||||||
|
<right_attach>2</right_attach>
|
||||||
|
<top_attach>3</top_attach>
|
||||||
|
<bottom_attach>4</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkEntry</class>
|
||||||
|
<name>mid</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<editable>False</editable>
|
||||||
|
<text_visible>True</text_visible>
|
||||||
|
<text_max_length>0</text_max_length>
|
||||||
|
<text></text>
|
||||||
|
<child>
|
||||||
|
<left_attach>2</left_attach>
|
||||||
|
<right_attach>3</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>True</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label270</name>
|
||||||
|
<label>:</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>3</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>4</left_attach>
|
||||||
|
<right_attach>5</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkEntry</class>
|
||||||
|
<name>mtype</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<editable>False</editable>
|
||||||
|
<text_visible>True</text_visible>
|
||||||
|
<text_max_length>0</text_max_length>
|
||||||
|
<text></text>
|
||||||
|
<child>
|
||||||
|
<left_attach>5</left_attach>
|
||||||
|
<right_attach>6</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>True</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkEntry</class>
|
||||||
|
<name>mdesc</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<editable>False</editable>
|
||||||
|
<text_visible>True</text_visible>
|
||||||
|
<text_max_length>0</text_max_length>
|
||||||
|
<text></text>
|
||||||
|
<child>
|
||||||
|
<left_attach>2</left_attach>
|
||||||
|
<right_attach>6</right_attach>
|
||||||
|
<top_attach>1</top_attach>
|
||||||
|
<bottom_attach>2</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>True</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkEntry</class>
|
||||||
|
<name>mpath</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<editable>False</editable>
|
||||||
|
<text_visible>True</text_visible>
|
||||||
|
<text_max_length>0</text_max_length>
|
||||||
|
<text></text>
|
||||||
|
<child>
|
||||||
|
<left_attach>2</left_attach>
|
||||||
|
<right_attach>6</right_attach>
|
||||||
|
<top_attach>2</top_attach>
|
||||||
|
<bottom_attach>3</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>True</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkEntry</class>
|
||||||
|
<name>mdetails</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<editable>False</editable>
|
||||||
|
<text_visible>True</text_visible>
|
||||||
|
<text_max_length>0</text_max_length>
|
||||||
|
<text></text>
|
||||||
|
<child>
|
||||||
|
<left_attach>2</left_attach>
|
||||||
|
<right_attach>6</right_attach>
|
||||||
|
<top_attach>3</top_attach>
|
||||||
|
<bottom_attach>4</bottom_attach>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>True</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label265</name>
|
||||||
|
<label>Type</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>1</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>5</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>3</left_attach>
|
||||||
|
<right_attach>4</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>5</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label264</name>
|
||||||
|
<label>ID</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>1</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>5</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>0</left_attach>
|
||||||
|
<right_attach>1</right_attach>
|
||||||
|
<top_attach>0</top_attach>
|
||||||
|
<bottom_attach>1</bottom_attach>
|
||||||
|
<xpad>5</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label266</name>
|
||||||
|
<label>Description</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>1</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>5</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>0</left_attach>
|
||||||
|
<right_attach>1</right_attach>
|
||||||
|
<top_attach>1</top_attach>
|
||||||
|
<bottom_attach>2</bottom_attach>
|
||||||
|
<xpad>5</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label267</name>
|
||||||
|
<label>Path</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>1</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>5</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>0</left_attach>
|
||||||
|
<right_attach>1</right_attach>
|
||||||
|
<top_attach>2</top_attach>
|
||||||
|
<bottom_attach>3</bottom_attach>
|
||||||
|
<xpad>5</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<name>label268</name>
|
||||||
|
<label>Details</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>1</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>5</ypad>
|
||||||
|
<child>
|
||||||
|
<left_attach>0</left_attach>
|
||||||
|
<right_attach>1</right_attach>
|
||||||
|
<top_attach>3</top_attach>
|
||||||
|
<bottom_attach>4</bottom_attach>
|
||||||
|
<xpad>5</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
<xexpand>False</xexpand>
|
||||||
|
<yexpand>False</yexpand>
|
||||||
|
<xshrink>False</xshrink>
|
||||||
|
<yshrink>False</yshrink>
|
||||||
|
<xfill>True</xfill>
|
||||||
|
<yfill>False</yfill>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkScrolledWindow</class>
|
||||||
|
<name>scrolledwindow31</name>
|
||||||
|
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
|
||||||
|
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
|
||||||
|
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
|
||||||
|
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
|
||||||
|
<child>
|
||||||
|
<padding>0</padding>
|
||||||
|
<expand>True</expand>
|
||||||
|
<fill>True</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkCList</class>
|
||||||
|
<name>media_list</name>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<signal>
|
||||||
|
<name>select_row</name>
|
||||||
|
<handler>on_media_list_select_row</handler>
|
||||||
|
<last_modification_time>Tue, 09 Oct 2001 17:22:54 GMT</last_modification_time>
|
||||||
|
</signal>
|
||||||
|
<columns>5</columns>
|
||||||
|
<column_widths>33,331,104,168,80</column_widths>
|
||||||
|
<selection_mode>GTK_SELECTION_SINGLE</selection_mode>
|
||||||
|
<show_titles>True</show_titles>
|
||||||
|
<shadow_type>GTK_SHADOW_IN</shadow_type>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>CList:title</child_name>
|
||||||
|
<name>label259</name>
|
||||||
|
<label>ID</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>CList:title</child_name>
|
||||||
|
<name>label260</name>
|
||||||
|
<label>Description</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>CList:title</child_name>
|
||||||
|
<name>label261</name>
|
||||||
|
<label>Type</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>CList:title</child_name>
|
||||||
|
<name>label262</name>
|
||||||
|
<label>Path</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>CList:title</child_name>
|
||||||
|
<name>label263</name>
|
||||||
|
<label>Details</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkHButtonBox</class>
|
||||||
|
<name>hbuttonbox27</name>
|
||||||
|
<layout_style>GTK_BUTTONBOX_SPREAD</layout_style>
|
||||||
|
<spacing>30</spacing>
|
||||||
|
<child_min_width>85</child_min_width>
|
||||||
|
<child_min_height>27</child_min_height>
|
||||||
|
<child_ipad_x>7</child_ipad_x>
|
||||||
|
<child_ipad_y>0</child_ipad_y>
|
||||||
|
<child>
|
||||||
|
<padding>0</padding>
|
||||||
|
<expand>False</expand>
|
||||||
|
<fill>True</fill>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkButton</class>
|
||||||
|
<name>button142</name>
|
||||||
|
<can_default>True</can_default>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<label>Add Media Object</label>
|
||||||
|
<relief>GTK_RELIEF_NORMAL</relief>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkButton</class>
|
||||||
|
<name>button143</name>
|
||||||
|
<can_default>True</can_default>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<label>Edit Media Object</label>
|
||||||
|
<relief>GTK_RELIEF_NORMAL</relief>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkButton</class>
|
||||||
|
<name>button144</name>
|
||||||
|
<can_default>True</can_default>
|
||||||
|
<can_focus>True</can_focus>
|
||||||
|
<label>Delete Media Object</label>
|
||||||
|
<relief>GTK_RELIEF_NORMAL</relief>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
|
||||||
|
<widget>
|
||||||
|
<class>GtkLabel</class>
|
||||||
|
<child_name>Notebook:tab</child_name>
|
||||||
|
<name>label256</name>
|
||||||
|
<label>label256</label>
|
||||||
|
<justify>GTK_JUSTIFY_CENTER</justify>
|
||||||
|
<wrap>False</wrap>
|
||||||
|
<xalign>0.5</xalign>
|
||||||
|
<yalign>0.5</yalign>
|
||||||
|
<xpad>0</xpad>
|
||||||
|
<ypad>0</ypad>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ import EditPlace
|
|||||||
import Marriage
|
import Marriage
|
||||||
import Find
|
import Find
|
||||||
import VersionControl
|
import VersionControl
|
||||||
|
import RelImage
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Global variables.
|
# Global variables.
|
||||||
@@ -106,6 +108,13 @@ notebook = None
|
|||||||
person_list = None
|
person_list = None
|
||||||
source_list = None
|
source_list = None
|
||||||
place_list = None
|
place_list = None
|
||||||
|
media_list = None
|
||||||
|
mid = None
|
||||||
|
mtype = None
|
||||||
|
mdesc = None
|
||||||
|
mpath = None
|
||||||
|
mdetails = None
|
||||||
|
preview = None
|
||||||
database = None
|
database = None
|
||||||
family_window = None
|
family_window = None
|
||||||
nameArrow = None
|
nameArrow = None
|
||||||
@@ -805,6 +814,7 @@ def new_database_response(val):
|
|||||||
load_family()
|
load_family()
|
||||||
load_sources()
|
load_sources()
|
||||||
load_places()
|
load_places()
|
||||||
|
load_media()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -837,6 +847,7 @@ def full_update():
|
|||||||
load_sources()
|
load_sources()
|
||||||
load_places()
|
load_places()
|
||||||
load_canvas()
|
load_canvas()
|
||||||
|
load_media()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -856,8 +867,10 @@ def update_display(changed):
|
|||||||
load_canvas()
|
load_canvas()
|
||||||
elif page == 3:
|
elif page == 3:
|
||||||
load_sources()
|
load_sources()
|
||||||
else:
|
elif page == 4:
|
||||||
load_places()
|
load_places()
|
||||||
|
else:
|
||||||
|
load_media()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -2031,6 +2044,10 @@ def on_places_activate(obj):
|
|||||||
"""Switches to the places view"""
|
"""Switches to the places view"""
|
||||||
notebook.set_page(4)
|
notebook.set_page(4)
|
||||||
|
|
||||||
|
def on_media_activate(obj):
|
||||||
|
"""Switches to the media view"""
|
||||||
|
notebook.set_page(5)
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Load the appropriate page after a notebook switch
|
# Load the appropriate page after a notebook switch
|
||||||
@@ -2049,6 +2066,8 @@ def on_notebook1_switch_page(obj,junk,page):
|
|||||||
load_sources()
|
load_sources()
|
||||||
elif page == 4:
|
elif page == 4:
|
||||||
load_places()
|
load_places()
|
||||||
|
elif page == 5:
|
||||||
|
load_media()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -2091,6 +2110,69 @@ def load_places():
|
|||||||
|
|
||||||
place_list.thaw()
|
place_list.thaw()
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def on_media_list_select_row(obj,row,b,c):
|
||||||
|
mobj = obj.get_row_data(row)
|
||||||
|
type = mobj.getMimeType()
|
||||||
|
path = mobj.getPath()
|
||||||
|
if type[0:5] == "image":
|
||||||
|
dir = os.path.dirname(path)
|
||||||
|
src = os.path.basename(path)
|
||||||
|
thumb = "%s%s.thumb%s%s.jpg" % (dir,os.sep,os.sep,src)
|
||||||
|
RelImage.check_thumb(path,thumb,const.thumbScale)
|
||||||
|
preview.load_file(thumb)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
mid.set_text(mobj.getId())
|
||||||
|
mtype.set_text(type)
|
||||||
|
mdesc.set_text(mobj.getDescription())
|
||||||
|
if path[0] == "/":
|
||||||
|
mpath.set_text(path)
|
||||||
|
else:
|
||||||
|
mpath.set_text("<local>")
|
||||||
|
mdetails.set_text("")
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
def load_media():
|
||||||
|
media_list.freeze()
|
||||||
|
media_list.clear()
|
||||||
|
|
||||||
|
if len(media_list.selection) == 0:
|
||||||
|
current_row = 0
|
||||||
|
else:
|
||||||
|
current_row = media_list.selection[0]
|
||||||
|
|
||||||
|
index = 0
|
||||||
|
objects = database.getObjectMap().values()
|
||||||
|
|
||||||
|
for src in objects:
|
||||||
|
title = src.getDescription()
|
||||||
|
id = src.getId()
|
||||||
|
type = src.getMimeType()
|
||||||
|
if src.getLocal():
|
||||||
|
path = "<local copy>"
|
||||||
|
else:
|
||||||
|
path = src.getPath()
|
||||||
|
media_list.append([id,title,type,path,""])
|
||||||
|
media_list.set_row_data(index,src)
|
||||||
|
index = index + 1
|
||||||
|
|
||||||
|
media_list.sort()
|
||||||
|
|
||||||
|
if index > 0:
|
||||||
|
media_list.select_row(current_row,0)
|
||||||
|
media_list.moveto(current_row)
|
||||||
|
|
||||||
|
media_list.thaw()
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@@ -3187,9 +3269,10 @@ def on_main_key_release_event(obj,event):
|
|||||||
def main(arg):
|
def main(arg):
|
||||||
global database, gtop
|
global database, gtop
|
||||||
global statusbar,notebook
|
global statusbar,notebook
|
||||||
global person_list, source_list, place_list, canvas
|
global person_list, source_list, place_list, canvas, media_list
|
||||||
global topWindow
|
global topWindow, preview
|
||||||
global nameArrow, dateArrow, deathArrow
|
global nameArrow, dateArrow, deathArrow
|
||||||
|
global mid, mtype, mdesc, mpath, mdetails
|
||||||
|
|
||||||
rc_parse(const.gtkrcFile)
|
rc_parse(const.gtkrcFile)
|
||||||
|
|
||||||
@@ -3211,6 +3294,13 @@ def main(arg):
|
|||||||
canvas = gtop.get_widget("canvas1")
|
canvas = gtop.get_widget("canvas1")
|
||||||
source_list = gtop.get_widget("source_list")
|
source_list = gtop.get_widget("source_list")
|
||||||
place_list = gtop.get_widget("place_list")
|
place_list = gtop.get_widget("place_list")
|
||||||
|
media_list = gtop.get_widget("media_list")
|
||||||
|
mid = gtop.get_widget("mid")
|
||||||
|
mtype = gtop.get_widget("mtype")
|
||||||
|
mdesc = gtop.get_widget("mdesc")
|
||||||
|
mpath = gtop.get_widget("mpath")
|
||||||
|
mdetails = gtop.get_widget("mdetails")
|
||||||
|
preview = gtop.get_widget("preview")
|
||||||
filter_list = gtop.get_widget("filter_list")
|
filter_list = gtop.get_widget("filter_list")
|
||||||
notebook = gtop.get_widget(NOTEBOOK)
|
notebook = gtop.get_widget(NOTEBOOK)
|
||||||
nameArrow = gtop.get_widget("nameSort")
|
nameArrow = gtop.get_widget("nameSort")
|
||||||
@@ -3283,6 +3373,8 @@ def main(arg):
|
|||||||
"on_person_list_select_row" : on_person_list_select_row,
|
"on_person_list_select_row" : on_person_list_select_row,
|
||||||
"on_place_list_button_press_event" : on_place_list_button_press_event,
|
"on_place_list_button_press_event" : on_place_list_button_press_event,
|
||||||
"on_main_key_release_event" : on_main_key_release_event,
|
"on_main_key_release_event" : on_main_key_release_event,
|
||||||
|
"on_media_activate" : on_media_activate,
|
||||||
|
"on_media_list_select_row" : on_media_list_select_row,
|
||||||
"on_places_activate" : on_places_activate,
|
"on_places_activate" : on_places_activate,
|
||||||
"on_preferences_activate" : on_preferences_activate,
|
"on_preferences_activate" : on_preferences_activate,
|
||||||
"on_remove_child_clicked" : on_remove_child_clicked,
|
"on_remove_child_clicked" : on_remove_child_clicked,
|
||||||
|
|||||||
@@ -344,7 +344,6 @@
|
|||||||
<text></text>
|
<text></text>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -352,7 +351,7 @@
|
|||||||
|
|
||||||
<widget>
|
<widget>
|
||||||
<class>GnomeDialog</class>
|
<class>GnomeDialog</class>
|
||||||
<name>dialog1</name>
|
<name>change_description</name>
|
||||||
<title>Gramps - Change image description</title>
|
<title>Gramps - Change image description</title>
|
||||||
<type>GTK_WINDOW_TOPLEVEL</type>
|
<type>GTK_WINDOW_TOPLEVEL</type>
|
||||||
<position>GTK_WIN_POS_NONE</position>
|
<position>GTK_WIN_POS_NONE</position>
|
||||||
@@ -401,7 +400,7 @@
|
|||||||
<signal>
|
<signal>
|
||||||
<name>clicked</name>
|
<name>clicked</name>
|
||||||
<handler>on_ok_clicked</handler>
|
<handler>on_ok_clicked</handler>
|
||||||
<object>dialog1</object>
|
<object>change_description</object>
|
||||||
<last_modification_time>Thu, 19 Apr 2001 00:00:19 GMT</last_modification_time>
|
<last_modification_time>Thu, 19 Apr 2001 00:00:19 GMT</last_modification_time>
|
||||||
</signal>
|
</signal>
|
||||||
<stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
|
<stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
|
||||||
@@ -415,7 +414,7 @@
|
|||||||
<signal>
|
<signal>
|
||||||
<name>clicked</name>
|
<name>clicked</name>
|
||||||
<handler>on_apply_clicked</handler>
|
<handler>on_apply_clicked</handler>
|
||||||
<object>dialog1</object>
|
<object>change_description</object>
|
||||||
<last_modification_time>Thu, 19 Apr 2001 00:00:06 GMT</last_modification_time>
|
<last_modification_time>Thu, 19 Apr 2001 00:00:06 GMT</last_modification_time>
|
||||||
</signal>
|
</signal>
|
||||||
<stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
|
<stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button>
|
||||||
@@ -429,7 +428,7 @@
|
|||||||
<signal>
|
<signal>
|
||||||
<name>clicked</name>
|
<name>clicked</name>
|
||||||
<handler>on_cancel_clicked</handler>
|
<handler>on_cancel_clicked</handler>
|
||||||
<object>dialog1</object>
|
<object>change_description</object>
|
||||||
<last_modification_time>Thu, 19 Apr 2001 00:00:43 GMT</last_modification_time>
|
<last_modification_time>Thu, 19 Apr 2001 00:00:43 GMT</last_modification_time>
|
||||||
</signal>
|
</signal>
|
||||||
<stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
|
<stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
|
||||||
|
|||||||
Reference in New Issue
Block a user