New gramplet to create a simple interface to edit/add a person's primary notes.
svn: r11558
This commit is contained in:
parent
f018927f5e
commit
cb92251995
253
src/plugins/NoteGramplet.py
Normal file
253
src/plugins/NoteGramplet.py
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2009 Douglas S. Blank
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
import pango
|
||||||
|
|
||||||
|
from DataViews import Gramplet, register
|
||||||
|
from BasicUtils import name_displayer
|
||||||
|
from TransUtils import sgettext as _
|
||||||
|
from const import GLADE_FILE
|
||||||
|
from widgets import StyledTextEditor
|
||||||
|
from gen.lib import StyledText, Note
|
||||||
|
|
||||||
|
class NoteGramplet(Gramplet):
|
||||||
|
"""
|
||||||
|
Gramplet that gives simplified interface to a Person's primary note.
|
||||||
|
"""
|
||||||
|
def init(self):
|
||||||
|
rows = gtk.VBox()
|
||||||
|
self.dirty = False
|
||||||
|
self.dirty_person = None
|
||||||
|
|
||||||
|
# Active person: Name
|
||||||
|
row = gtk.HBox()
|
||||||
|
label = gtk.Label()
|
||||||
|
label.set_text("<b>%s</b>: " % _("Active person"))
|
||||||
|
label.set_use_markup(True)
|
||||||
|
label.set_alignment(0.0, 0.5)
|
||||||
|
row.pack_start(label, False)
|
||||||
|
|
||||||
|
apw = gtk.Label()
|
||||||
|
self.active_person_widget = apw
|
||||||
|
apw.set_alignment(0.0, 0.5)
|
||||||
|
apw.set_use_markup(True)
|
||||||
|
row.pack_start(apw, False)
|
||||||
|
|
||||||
|
# Add edit for person and family
|
||||||
|
icon = gtk.STOCK_EDIT
|
||||||
|
size = gtk.ICON_SIZE_MENU
|
||||||
|
button = gtk.Button()
|
||||||
|
image = gtk.Image()
|
||||||
|
image.set_from_stock(icon, size)
|
||||||
|
button.add(image)
|
||||||
|
button.set_relief(gtk.RELIEF_NONE)
|
||||||
|
button.connect("clicked", self.edit_person)
|
||||||
|
self.active_person_edit = button
|
||||||
|
row.pack_start(button, False)
|
||||||
|
|
||||||
|
label = gtk.Label()
|
||||||
|
label.set_text(" %s: " % _("Family"))
|
||||||
|
self.active_family_label = label
|
||||||
|
row.pack_start(label, False)
|
||||||
|
|
||||||
|
button = gtk.Button()
|
||||||
|
image = gtk.Image()
|
||||||
|
image.set_from_stock(icon, size)
|
||||||
|
button.add(image)
|
||||||
|
button.set_relief(gtk.RELIEF_NONE)
|
||||||
|
button.connect("clicked", self.edit_family)
|
||||||
|
self.active_family_edit = button
|
||||||
|
row.pack_start(button, False)
|
||||||
|
|
||||||
|
rows.pack_start(row, False)
|
||||||
|
|
||||||
|
row = self.build_interface()
|
||||||
|
self.note_buffer = self.texteditor.textbuffer
|
||||||
|
self.note_buffer.connect("changed", self.mark_dirty)
|
||||||
|
rows.pack_start(row, True)
|
||||||
|
|
||||||
|
# Save and Abandon
|
||||||
|
row = gtk.HBox()
|
||||||
|
button = gtk.Button(_("Save"))
|
||||||
|
button.connect("clicked", self.save_data_edit)
|
||||||
|
row.pack_start(button, True)
|
||||||
|
button = gtk.Button(_("Abandon"))
|
||||||
|
button.connect("clicked", self.abandon_data_edit)
|
||||||
|
row.pack_start(button, True)
|
||||||
|
rows.pack_start(row, False)
|
||||||
|
|
||||||
|
self.gui.get_container_widget().remove(self.gui.textview)
|
||||||
|
self.gui.get_container_widget().add_with_viewport(rows)
|
||||||
|
rows.show_all()
|
||||||
|
self.clear_data_entry(None)
|
||||||
|
|
||||||
|
def flow_changed(self, active):
|
||||||
|
"""
|
||||||
|
Changes the wrap/font of text flow.
|
||||||
|
"""
|
||||||
|
if active:
|
||||||
|
# Set the text style to monospace
|
||||||
|
self.texteditor.set_wrap_mode(gtk.WRAP_NONE)
|
||||||
|
self.texteditor.modify_font(pango.FontDescription("monospace"))
|
||||||
|
else:
|
||||||
|
# Set the text style to normal
|
||||||
|
self.texteditor.set_wrap_mode(gtk.WRAP_WORD)
|
||||||
|
self.texteditor.modify_font(pango.FontDescription("normal"))
|
||||||
|
|
||||||
|
def build_interface(self):
|
||||||
|
"""
|
||||||
|
Based on src/Editors/_EditNote.py
|
||||||
|
"""
|
||||||
|
vbox = gtk.VBox()
|
||||||
|
self.texteditor = StyledTextEditor()
|
||||||
|
# create a formatting toolbar
|
||||||
|
vbox.pack_start(self.texteditor.get_toolbar(),
|
||||||
|
expand=False, fill=False)
|
||||||
|
vbox.pack_start(self.texteditor, True)
|
||||||
|
self.flow_changed(False)
|
||||||
|
return vbox
|
||||||
|
|
||||||
|
def main(self): # return false finishes
|
||||||
|
if self.dirty:
|
||||||
|
return
|
||||||
|
self.active_person_edit.hide()
|
||||||
|
self.active_family_edit.hide()
|
||||||
|
self.active_family_label.hide()
|
||||||
|
self.note_buffer.set_text(StyledText())
|
||||||
|
active_person = self.dbstate.get_active_person()
|
||||||
|
self.dirty_person = active_person
|
||||||
|
self.dirty_family = None
|
||||||
|
if active_person:
|
||||||
|
self.active_person_edit.show()
|
||||||
|
self.active_family_edit.hide()
|
||||||
|
self.active_family_label.hide()
|
||||||
|
# Fill in current person edits:
|
||||||
|
name = name_displayer.display(active_person)
|
||||||
|
self.active_person_widget.set_text("<i>%s</i> " % name)
|
||||||
|
self.active_person_widget.set_use_markup(True)
|
||||||
|
# Note:
|
||||||
|
self.note = None
|
||||||
|
note_list = active_person.get_referenced_note_handles()
|
||||||
|
for (classname, note_handle) in note_list:
|
||||||
|
note_obj = self.dbstate.db.get_note_from_handle(note_handle)
|
||||||
|
if note_obj.get_type() == _("Person Note"):
|
||||||
|
self.note = note_obj
|
||||||
|
break
|
||||||
|
if self.note is None:
|
||||||
|
self.note = Note()
|
||||||
|
self.texteditor.set_text(self.note.get_styledtext())
|
||||||
|
self.flow_changed(self.note.get_format())
|
||||||
|
# Family button:
|
||||||
|
family_list = active_person.get_family_handle_list()
|
||||||
|
if len(family_list) > 0:
|
||||||
|
self.dirty_family = self.dbstate.db.get_family_from_handle(family_list[0])
|
||||||
|
self.active_family_edit.show()
|
||||||
|
self.active_family_label.show()
|
||||||
|
else:
|
||||||
|
family_list = active_person.get_parent_family_handle_list()
|
||||||
|
if len(family_list) > 0:
|
||||||
|
self.dirty_family = self.dbstate.db.get_family_from_handle(family_list[0])
|
||||||
|
self.active_family_edit.show()
|
||||||
|
self.active_family_label.show()
|
||||||
|
else:
|
||||||
|
self.clear_data_entry(None)
|
||||||
|
self.active_person_edit.hide()
|
||||||
|
self.active_family_edit.hide()
|
||||||
|
self.active_family_label.hide()
|
||||||
|
self.dirty = False
|
||||||
|
|
||||||
|
def clear_data_entry(self, obj):
|
||||||
|
self.note_buffer.set_text(StyledText())
|
||||||
|
self.flow_changed(False)
|
||||||
|
|
||||||
|
def db_changed(self):
|
||||||
|
"""
|
||||||
|
If person or family changes, the relatives of active person might have
|
||||||
|
changed
|
||||||
|
"""
|
||||||
|
self.dirty = False
|
||||||
|
self.dirty_person = None
|
||||||
|
self.clear_data_entry(None)
|
||||||
|
self.texteditor.set_editable(not self.dbstate.db.readonly)
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def active_changed(self, handle):
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def mark_dirty(self, obj):
|
||||||
|
self.dirty = True
|
||||||
|
|
||||||
|
def abandon_data_edit(self, obj):
|
||||||
|
self.dirty = False
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def edit_callback(self, person):
|
||||||
|
self.dirty = False
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def edit_person(self, obj):
|
||||||
|
from Editors import EditPerson
|
||||||
|
try:
|
||||||
|
EditPerson(self.gui.dbstate,
|
||||||
|
self.gui.uistate, [],
|
||||||
|
self.dirty_person,
|
||||||
|
callback=self.edit_callback)
|
||||||
|
except Errors.WindowActiveError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def edit_family(self, obj):
|
||||||
|
from Editors import EditFamily
|
||||||
|
try:
|
||||||
|
EditFamily(self.gui.dbstate,
|
||||||
|
self.gui.uistate, [],
|
||||||
|
self.dirty_family)
|
||||||
|
except Errors.WindowActiveError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def save_data_edit(self, obj):
|
||||||
|
if self.dirty:
|
||||||
|
person = self.dirty_person
|
||||||
|
text = self.texteditor.get_text()
|
||||||
|
self.note.set_styledtext(text)
|
||||||
|
trans = self.dbstate.db.transaction_begin()
|
||||||
|
if not self.note.get_handle():
|
||||||
|
self.note.set_type(_("Person Note"))
|
||||||
|
self.dbstate.db.add_note(self.note, trans)
|
||||||
|
person.add_note(self.note.get_handle())
|
||||||
|
self.dbstate.db.commit_person(person, trans)
|
||||||
|
msg = _("Add Note")
|
||||||
|
else:
|
||||||
|
if not self.note.get_gramps_id():
|
||||||
|
self.note.set_gramps_id(self.dbstate.db.find_next_note_gramps_id())
|
||||||
|
self.dbstate.db.commit_note(self.note, trans)
|
||||||
|
msg = _("Edit Note")
|
||||||
|
self.dbstate.db.transaction_commit(trans, msg)
|
||||||
|
self.dirty = False
|
||||||
|
|
||||||
|
register(type="gramplet",
|
||||||
|
name="Note Gramplet",
|
||||||
|
tname=_("Note Gramplet"),
|
||||||
|
height=100,
|
||||||
|
expand=True,
|
||||||
|
content = NoteGramplet,
|
||||||
|
title=_("Person Note"),
|
||||||
|
detached_width = 500,
|
||||||
|
detached_height = 400,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user