* src/gen/lib/notetype.py: type report, citation
	* src/plugins/NarrativeWeb.py: new selection of home note & home media
	* src/GrampsWidgets.py: NoteEntry, MediaEntry
	I intend to change the other note selectors likewise next.


svn: r9403
This commit is contained in:
Benny Malengier
2007-11-25 19:07:50 +00:00
parent 5fdffbe292
commit ac82ef8754
4 changed files with 253 additions and 92 deletions

View File

@@ -742,19 +742,20 @@ class ObjEntry:
to select the object.
This is the base class to create a real entry
"""
def __init__(self, dbstate, uistate, track, obj, set_val,
get_val, add_del, share):
def __init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share):
'''Pass the dbstate and uistate and present track.
obj is a gtk.Label that shows the persent value
label is a gtk.Label that shows the persent value
set_val is function that is called when handle changes, use it
to update the calling module
get_val is function that is called to obtain handle from calling
module
add_del is the gtk.Button with add or delete value
share is the gtk.Button to call the object selector
share is the gtk.Button to call the object selector or del connect
add_edt is the gtk.Button with add or edit value. Pass None if
this button should not be present.
'''
self.obj = obj
self.add_del = add_del
self.label = label
self.add_edt = add_edt
self.share = share
self.dbstate = dbstate
self.db = dbstate.db
@@ -769,29 +770,39 @@ class ObjEntry:
#set the object specific code
self._init_object()
if get_val():
#check if valid object:
handle = self.get_val()
if handle:
obj = self.get_from_handle(handle)
if not obj:
#invalid val, set it to None
self.set_val(None)
if self.get_val():
self.set_button(True)
p = self.get_from_handle(self.get_val())
name = self.get_label(p)
obj = self.get_from_handle(self.get_val())
name = self.get_label(obj)
else:
name = u""
self.set_button(False)
if self.db.readonly:
self.add_del.set_sensitive(False)
if self.add_edt is not None:
self.add_edt.set_sensitive(False)
self.share.set_sensitive(False)
else:
self.add_del.set_sensitive(True)
if self.add_edt is not None:
self.add_edt.set_sensitive(True)
self.share.set_sensitive(True)
self.add_del.connect('clicked', self.add_del_clicked)
if self.add_edt is not None:
self.add_edt.connect('clicked', self.add_edt_clicked)
self.share.connect('clicked', self.share_clicked)
if not self.db.readonly and not name:
obj.set_text(self.EMPTY_TEXT)
obj.set_use_markup(True)
self.label.set_text(self.EMPTY_TEXT)
self.label.set_use_markup(True)
else:
obj.set_text(name)
self.label.set_text(name)
def _init_dnd(self):
'''inheriting objects must set this
@@ -817,15 +828,14 @@ class ObjEntry:
def after_edit(self, obj):
name = self.get_label(obj)
self.obj.set_text(name)
self.label.set_text(name)
def add_del_clicked(self, obj):
''' if value, delete, if no value, call editor
def add_edt_clicked(self, obj):
''' if value, edit, if no value, call editor on new object
'''
if self.get_val():
self.set_val(None)
self.obj.set_text(u'')
self.set_button(False)
obj = self.get_from_handle(self.get_val())
self.call_editor(obj)
else:
self.call_editor()
@@ -848,15 +858,16 @@ class ObjEntry:
def obj_added(self, data):
''' callback from adding an object to the entry'''
self.set_val(data.handle)
self.obj.set_text(self.get_label(data))
self.label.set_text(self.get_label(data))
self.set_button(True)
def share_clicked(self, obj):
''' if value, edit object, in no value, select existing object
''' if value, delete connect, in no value, select existing object
'''
if self.get_val():
obj = self.get_from_handle(self.get_val())
self.call_editor(obj)
self.set_val(None)
self.label.set_text(self.EMPTY_TEXT)
self.set_button(False)
else:
select = self.call_selector()
obj = select.run()
@@ -864,10 +875,13 @@ class ObjEntry:
self.obj_added(obj)
def set_button(self, use_add):
''' This sets the correct image to the two buttons
''' This sets the correct image to the two buttons.
If False: select icon and add icon
If True: remove icon and edit icon
'''
for i in self.add_del.get_children():
self.add_del.remove(i)
if self.add_edt is not None:
for i in self.add_edt.get_children():
self.add_edt.remove(i)
for i in self.share.get_children():
self.share.remove(i)
@@ -875,24 +889,26 @@ class ObjEntry:
image = gtk.Image()
image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_BUTTON)
image.show()
self.add_del.add(image)
image = gtk.Image()
image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_BUTTON)
image.show()
self.share.add(image)
self.tooltips.set_tip(self.share, self.EDIT_STR)
self.tooltips.set_tip(self.add_del, self.DEL_STR)
self.tooltips.set_tip(self.share, self.DEL_STR)
if self.add_edt is not None:
image = gtk.Image()
image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_BUTTON)
image.show()
self.add_edt.add(image)
self.tooltips.set_tip(self.add_edt, self.EDIT_STR)
else:
image = gtk.Image()
image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)
image.show()
self.add_del.add(image)
image = gtk.Image()
image.set_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
image.show()
self.share.add(image)
self.tooltips.set_tip(self.share, self.SHARE_STR)
self.tooltips.set_tip(self.add_del, self.ADD_STR)
if self.add_edt is not None:
image = gtk.Image()
image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)
image.show()
self.add_edt.add(image)
self.tooltips.set_tip(self.add_edt, self.ADD_STR)
class PlaceEntry(ObjEntry):
"""
@@ -906,17 +922,17 @@ class PlaceEntry(ObjEntry):
ADD_STR = _('Add a new place')
DEL_STR = _('Remove place')
def __init__(self, dbstate, uistate, track, obj, set_val,
get_val, add_del, share):
ObjEntry.__init__(self, dbstate, uistate, track, obj, set_val,
get_val, add_del, share)
def __init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share):
ObjEntry.__init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share)
def _init_dnd(self):
'''connect drag and drop of places
'''
self.obj.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.PLACE_LINK.target()],
self.label.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.PLACE_LINK.target()],
gtk.gdk.ACTION_COPY)
self.obj.connect('drag_data_received', self.drag_data_received)
self.label.connect('drag_data_received', self.drag_data_received)
def get_from_handle(self, handle):
''' return the object given the hande
@@ -947,6 +963,59 @@ class PlaceEntry(ObjEntry):
cls = selector_factory('Place')
return cls(self.dbstate, self.uistate, self.track)
class MediaEntry(ObjEntry):
"""
Handles the selection of a existing or new media. Supports Drag and Drop
to select a media object.
"""
EMPTY_TEXT = "<i>%s</i>" % _('To select a media object, use drag-and-drop '
'or use the buttons')
EDIT_STR = _('Edit media object')
SHARE_STR = _('Select an existing media object')
ADD_STR = _('Add a new media object')
DEL_STR = _('Remove media object')
def __init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share):
ObjEntry.__init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share)
def _init_dnd(self):
'''connect drag and drop of places
'''
self.label.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.MEDIAOBJ.target()],
gtk.gdk.ACTION_COPY)
self.label.connect('drag_data_received', self.drag_data_received)
def get_from_handle(self, handle):
''' return the object given the hande
'''
return self.db.get_object_from_handle(handle)
def get_label(self, object):
return "%s [%s]" % (object.get_description(), object.gramps_id)
def call_editor(self, obj=None):
from Editors import EditMedia
if obj is None:
from gen.lib import MediaObject
object = MediaObject()
func = self.obj_added
else:
object = obj
func = self.after_edit
try:
EditMedia(self.dbstate, self.uistate, self.track,
object, func)
except WindowActiveError:
pass
def call_selector(self):
from Selectors import selector_factory
cls = selector_factory('MediaObject')
return cls(self.dbstate, self.uistate, self.track)
class NoteEntry(ObjEntry):
"""
Handles the selection of a existing or new Note. Supports Drag and Drop
@@ -959,17 +1028,28 @@ class NoteEntry(ObjEntry):
ADD_STR = _('Add a new note')
DEL_STR = _('Remove note')
def __init__(self, dbstate, uistate, track, obj, set_val,
get_val, add_del, share):
ObjEntry.__init__(self, dbstate, uistate, track, obj, set_val,
get_val, add_del, share)
def __init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share):
ObjEntry.__init__(self, dbstate, uistate, track, label, set_val,
get_val, add_edt, share)
self.notetype = None
def set_notetype(self, type):
''' set a notetype to use in new notes
'''
self.notetype = type
def get_notetype(self):
''' return the set notetype
'''
return self.notetype
def _init_dnd(self):
'''connect drag and drop of places
'''
self.obj.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.NOTE_LINK.target()],
self.label.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.NOTE_LINK.target()],
gtk.gdk.ACTION_COPY)
self.obj.connect('drag_data_received', self.drag_data_received)
self.label.connect('drag_data_received', self.drag_data_received)
def get_from_handle(self, handle):
''' return the object given the hande
@@ -977,27 +1057,27 @@ class NoteEntry(ObjEntry):
return self.db.get_note_from_handle(handle)
def get_label(self, note):
note = " ".join(note.get(markup=False).split())
if len(note) > 35:
txt = note[:35]+"..."
txt = " ".join(note.get(markup=False).split())
if len(txt) > 35:
txt = txt[:35]+"..."
else:
txt = note
return "%s [%s]" % (txt, p.gramps_id)
txt = txt
return "%s [%s]" % (txt, note.gramps_id)
def call_editor(self, obj=None):
from Editors import EditNote
if obj is None:
from gen.lib import Note, Notetype
from gen.lib import Note
note = Note()
note.set_type(NoteType.REPORT)
note.set_type(self.get_notetype())
func = self.obj_added
else:
note = obj
func = self.after_edit
try:
EditNote(self.dbstate, self.uistate, self.track,
note, func)
note, func)
except WindowActiveError:
pass