Part2 of MediaMetadata.py for MediaView in the bottom bar. Please remove all of *.ini in /home/USER/.gramps/gramps33 after updating... Display is now exactly as I would like to see it be.

svn: r16756
This commit is contained in:
Rob G. Healey 2011-03-04 22:22:47 +00:00
parent 0bf7dbc351
commit 11850ad64a

View File

@ -19,7 +19,7 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
# $Id: AttributesGramplet.py 16035 2010-10-24 14:43:47Z bmcage $ # $Id: $
# #
# ***************************************************************************** # *****************************************************************************
@ -35,12 +35,9 @@ from xml.sax.saxutils import escape as _html_escape
#------------------------------------------------ #------------------------------------------------
# Gtk/ Gramps modules # Gtk/ Gramps modules
#------------------------------------------------ #------------------------------------------------
import gtk
from gen.plug import Gramplet
from gen.ggettext import gettext as _ from gen.ggettext import gettext as _
import gen.mime
# import the pyexiv2 library classes for this addon # import the pyexiv2 library classes for this addon
_DOWNLOAD_LINK = "http://tilloy.net/dev/pyexiv2/" _DOWNLOAD_LINK = "http://tilloy.net/dev/pyexiv2/"
pyexiv2_required = True pyexiv2_required = True
@ -50,14 +47,14 @@ try:
if pyexiv2.version_info < REQ_pyexiv2_VERSION: if pyexiv2.version_info < REQ_pyexiv2_VERSION:
pyexiv2_required = False pyexiv2_required = False
except AttributeError:
pyexiv2_required = False
except ImportError: except ImportError:
raise Exception(_("The, pyexiv2, python binding library, to exiv2 is not " raise Exception(_("The, pyexiv2, python binding library, to exiv2 is not "
"installed on this computer.\n It can be downloaded from here: %s\n" "installed on this computer.\n It can be downloaded from here: %s\n"
"You will need to download at least pyexiv2-%d.%d.%d .") % ( "You will need to download at least pyexiv2-%d.%d.%d .") % (
REQ_pyexiv2_VERSION, _DOWNLOAD_LINK)) REQ_pyexiv2_VERSION, _DOWNLOAD_LINK))
except AttributeError:
pyexiv2_required = False
if not pyexiv2_required: if not pyexiv2_required:
raise Exception(_("The minimum required version for pyexiv2 must be pyexiv2-%d.%d.%d\n" raise Exception(_("The minimum required version for pyexiv2 must be pyexiv2-%d.%d.%d\n"
@ -65,52 +62,14 @@ if not pyexiv2_required:
REQ_pyexiv2_VERSION, _DOWNLOAD_LINK)) REQ_pyexiv2_VERSION, _DOWNLOAD_LINK))
# import the required classes for use in this gramplet # import the required classes for use in this gramplet
from pyexiv2 import ExifTag, ImageMetadata, IptcTag, Rational from pyexiv2 import ImageMetadata
from gen.plug import Gramplet from gen.plug import Gramplet
from DateHandler import displayer as _dd from DateHandler import displayer as _dd
import gen.lib import gen.lib
import Utils import Utils
import gen.mime
#------------------------------------------------
# Support functions
#------------------------------------------------
def _return_month(month):
"""
returns either an integer of the month number or the abbreviated month name
@param: rmonth -- can be one of:
10, "10", or ( "Oct" or "October" )
"""
if isinstance(month, str):
for s, l, i in _allmonths:
found = any(month == value for value in [s, l])
if found:
month = int(i)
break
else:
for s, l, i in _allmonths:
if str(month) == i:
month = l
break
return month
def _split_values(text):
"""
splits a variable into its pieces
"""
if "-" in text:
separator = "-"
elif "." in text:
separator = "."
elif ":" in text:
separator = ":"
else:
separator = " "
return [value for value in text.split(separator)]
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Constants # Constants
@ -143,14 +102,57 @@ class MediaMetadata(Gramplet):
""" """
def init(self): def init(self):
# set all dirty variables to False to begin this gramplet self.exif_column_width = 15
_dirty_image = False self.exif_widgets = {}
plugin_image = False # set all dirty variables to False to begin this gramplet
self._dirty_image = False
self.plugin_image = False
mtype = False mtype = False
self.set_text(_("No Family Tree loaded.")) rows = gtk.VBox()
self.set_use_markup(True) for items in [
("ActiveImage", _("Active Image"), None, True, [], False, 0, None),
("Artist", _("Artist"), None, False, [], False, 0, None),
("Copyright", _("Copyright"), None, False, [], False, 0, None),
# Manual Date
("NewDate", _("Date"), None, False, [], False, 0, None),
# Manual Time
("NewTime", _("Time"), None, False, [], False, 0, None),
# Latitude and Longitude for this image
("Latitude", _("Latitude"), None, False, [], False, 0, None),
("Longitude", _("Longitude"), None, False, [], False, 0, None),
# keywords describing your image
("Keywords", _("Keywords"), None, False, [], False, 0, None) ]:
pos, text, choices, readonly, callback, dirty, default, source = items
row = self.make_row(pos, text, choices, readonly, callback, dirty, default, source)
rows.pack_start(row, False)
# separator before description textbox
rows.pack_start( gtk.HSeparator(), True )
# description textbox label
label = gtk.Label()
label.set_text("<b><u>%s</u></b>" % _("Description"))
label.set_use_markup(True)
rows.pack_start(label, False)
# description textbox field
description_box = gtk.TextView()
description_box.set_wrap_mode(gtk.WRAP_WORD)
description_box.set_editable(True)
self.exif_widgets["Description"] = description_box.get_buffer()
rows.pack_start(description_box, True, True, 0)
self.gui.get_container_widget().remove(self.gui.textview)
self.gui.get_container_widget().add_with_viewport(rows)
rows.show_all()
def post_init(self): def post_init(self):
self.connect_signal("Media", self.update) self.connect_signal("Media", self.update)
@ -164,19 +166,21 @@ class MediaMetadata(Gramplet):
def main(self): # return false finishes def main(self): # return false finishes
self.set_text("") # clear all data entry fields
self.clear_metadata(None)
active_handle = self.get_active('Media') active_handle = self.get_active('Media')
active_media = self.dbstate.db.get_object_from_handle(active_handle) active_media = self.dbstate.db.get_object_from_handle(active_handle)
if not active_media: if not active_media:
return return
# get mime type and make sure it is an image # get mime type and make sure it is an image?
mime_type = active_media.get_mime_type() mime_type = active_media.get_mime_type()
mtype = gen.mime.get_description(mime_type) mtype = gen.mime.get_description(mime_type)
if mime_type and mime_type.startswith("image"): if mime_type and mime_type.startswith("image"):
value, filetype = mime_type.split("/") value, filetype = mime_type.split("/")
# make sure it is within the allowable media types? # make sure it is a media type that can be used by exiv2?
found = any(_type == filetype for _type in _valid_types) found = any(_type == filetype for _type in _valid_types)
if not found: if not found:
return return
@ -192,58 +196,50 @@ class MediaMetadata(Gramplet):
return return
# define plugin media # define plugin media
plugin_image = ImageMetadata(image_path) self.plugin_image = ImageMetadata(image_path)
# read media metadata # read media metadata
plugin_image.read() self.plugin_image.read()
# display media description # display media description
title = active_media.get_description() title = active_media.get_description()
self.render_text(_("Active media") + ": <b>%s</b>" % title) self.exif_widgets["ActiveImage"].set_text(title)
self.append_text("\n")
# display Media mime type
self.append_text(_("Mime type") + ": " + mtype)
self.append_text("\n\n")
# set up image metadata keys for use in this gramplet # set up image metadata keys for use in this gramplet
dataKeyTags = [KeyTag for KeyTag in plugin_image.exif_keys if KeyTag in _DATAMAP ] dataKeyTags = [KeyTag for KeyTag in self.plugin_image.exif_keys if KeyTag in _DATAMAP ]
for KeyTag in dataKeyTags: for KeyTag in dataKeyTags:
# Media image Artist # Media image Artist
if KeyTag == ImageArtist: if KeyTag == ImageArtist:
self.append_text(_("Artist") + ": " + _get_value(KeyTag, plugin_image)) self.exif_widgets["Artist"].set_text(_get_value(KeyTag, self.plugin_image)
self.append_text("\n") )
# media image Copyright # media image Copyright
elif KeyTag == ImageCopyright: elif KeyTag == ImageCopyright:
self.append_text(_("Copyright") + ": " + _get_value(KeyTag, plugin_image)) self.exif_widgets["Copyright"].set_text(_get_value(KeyTag, self.plugin_image)
self.append_text("\n\n") )
# media image DateTime # media image DateTime
elif KeyTag == ImageDateTime: elif KeyTag == ImageDateTime:
# date1 may come from the image metadata # date1 may come from the image metadata
# date2 may come from the Gramps database # date2 may come from the Gramps database
date1 = _get_value( KeyTag, plugin_image ) date1 = _get_value( KeyTag, self.plugin_image )
date2 = active_media.get_date_object() date2 = active_media.get_date_object()
use_date = date1 or date2 use_date = date1 or date2
if use_date: if use_date:
rdate, rtime = self.process_date(use_date) rdate, rtime = self.process_date(use_date)
self.append_text(_("Date") + ": " + rdate) self.exif_widgets["NewDate"].set_text(rdate)
self.append_text("\n") self.exif_widgets["NewTime"].set_text(rtime)
self.append_text(_("Time") + ": " + rtime)
self.append_text("\n\n")
# Latitude and Latitude Reference # Latitude and Latitude Reference
elif KeyTag == ImageLatitude: elif KeyTag == ImageLatitude:
latitude = _get_value(ImageLatitude, plugin_image) latitude = _get_value(ImageLatitude, self.plugin_image)
longitude = _get_value(ImageLongitude, plugin_image) longitude = _get_value(ImageLongitude, self.plugin_image)
# if latitude and longitude exist, display them... # if latitude and longitude exist, display them...
if (latitude and longitude): if (latitude and longitude):
@ -252,32 +248,31 @@ class MediaMetadata(Gramplet):
deg, min, sec = rational_to_dms(latitude) deg, min, sec = rational_to_dms(latitude)
# Latitude Direction Reference # Latitude Direction Reference
LatitudeRef = _get_value(ImageLatitudeRef, plugin_image) LatitudeRef = _get_value(ImageLatitudeRef, self.plugin_image)
self.append_text(_("Latitude") + ": " + """%s° %s %s%s""" % ( self.exif_widgets["Latitude"].set_text(
deg, min, sec, LatitudeRef) """%s° %s %s%s""" % (deg, min, sec, LatitudeRef)
) )
self.append_text("\n")
# split longitude metadata into degrees, minutes, and seconds # split longitude metadata into degrees, minutes, and seconds
deg, min, sec = rational_to_dms(longitude) deg, min, sec = rational_to_dms(longitude)
# Longitude Direction Reference # Longitude Direction Reference
LongitudeRef = _get_value(ImageLongitudeRef, plugin_image) LongitudeRef = _get_value(ImageLongitudeRef, self.plugin_image)
self.append_text(_("Longitude") + ": " + """%s° %s %s%s""" % ( self.exif_widgets["Longitude"].set_text(
deg, min, sec, LongitudeRef) """%s° %s %s%s""" % (deg, min, sec, LongitudeRef)
) )
self.append_text("\n\n")
# Image Description Field # Image Description Field
elif KeyTag == ImageDescription: elif KeyTag == ImageDescription:
self.append_text(_("Description") + ": " + _get_value(ImageDescription, plugin_image)) self.exif_widgets["Description"].set_text(
self.append_text("\n") _get_value(ImageDescription, self.plugin_image)
)
# image Keywords # image Keywords
words = "" words = ""
keyWords = _get_value(IptcKeywords, plugin_image) keyWords = _get_value(IptcKeywords, self.plugin_image)
if keyWords: if keyWords:
index = 1 index = 1
for word in keyWords: for word in keyWords:
@ -285,10 +280,91 @@ class MediaMetadata(Gramplet):
if index is not len(keyWords): if index is not len(keyWords):
words += "," words += ","
index += 1 index += 1
self.append_text(_("Keywords") + ": " + words) self.exif_widgets["Keywords"].set_text(words)
self.append_text("\n")
self.append_text("\n", scroll_to="begin") def make_row(self, pos, text, choices=None, readonly=False, callback_list=[],
mark_dirty=False, default=0, source=None):
import gtk
# Data Entry: Active Person
row = gtk.HBox()
label = gtk.Label()
if readonly:
label.set_text("<b>%s</b>" % text)
label.set_width_chars(self.exif_column_width)
label.set_use_markup(True)
self.exif_widgets[pos] = gtk.Label()
self.exif_widgets[pos].set_alignment(0.0, 0.5)
self.exif_widgets[pos].set_use_markup(True)
label.set_alignment(0.0, 0.5)
row.pack_start(label, False)
row.pack_start(self.exif_widgets[pos], False)
else:
label.set_text("%s: " % text)
label.set_width_chars(self.exif_column_width)
label.set_alignment(1.0, 0.5)
if choices == None:
self.exif_widgets[pos] = gtk.Entry()
if mark_dirty:
self.exif_widgets[pos].connect("changed", self._mark_dirty_image)
row.pack_start(label, False)
row.pack_start(self.exif_widgets[pos], True)
else:
eventBox = gtk.EventBox()
self.exif_widgets[pos] = gtk.combo_box_new_text()
eventBox.add(self.exif_widgets[pos])
for add_type in choices:
self.exif_widgets[pos].append_text(add_type)
self.exif_widgets[pos].set_active(default)
if mark_dirty:
self.exif_widgets[pos].connect("changed", self._mark_dirty_image)
row.pack_start(label, False)
row.pack_start(eventBox, True)
if source:
label = gtk.Label()
label.set_text("%s: " % source[0])
label.set_width_chars(self.de_source_width)
label.set_alignment(1.0, 0.5)
self.exif_widgets[source[1] + ":Label"] = label
self.exif_widgets[source[1]] = gtk.Entry()
if mark_dirty:
self.exif_widgets[source[1]].connect("changed", self._mark_dirty_image)
row.pack_start(label, False)
row.pack_start(self.exif_widgets[source[1]], True)
if not self.show_source:
self.exif_widgets[source[1]].hide()
for name, text, cbtype, callback in callback_list:
if cbtype == "button":
label = gtk.Label()
label.set_text(text)
self.exif_widgets[pos + ":" + name + ":Label"] = label
row.pack_start(label, False)
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", callback)
self.exif_widgets[pos + ":" + name] = button
row.pack_start(button, False)
elif cbtype == "checkbox":
button = gtk.CheckButton(text)
button.set_active(True)
button.connect("clicked", callback)
self.exif_widgets[pos + ":" + name] = button
row.pack_start(button, False)
row.show_all()
return row
def clear_metadata(self, obj):
"""
clears all data fields to nothing
"""
for key in [ "ActiveImage", "Artist", "Copyright", "NewDate", "NewTime",
"Latitude", "Longitude", "Keywords", "Description" ]:
self.exif_widgets[key].set_text( "" )
def process_date(self, tmpDate): def process_date(self, tmpDate):
""" """
@ -395,3 +471,42 @@ def rational_to_dms(rational_coords):
rs, rest = rs.split("/") rs, rest = rs.split("/")
return rd, rm, rs return rd, rm, rs
#------------------------------------------------
# Support functions
#------------------------------------------------
def _return_month(month):
"""
returns either an integer of the month number or the abbreviated month name
@param: rmonth -- can be one of:
10, "10", or ( "Oct" or "October" )
"""
if isinstance(month, str):
for s, l, i in _allmonths:
found = any(month == value for value in [s, l])
if found:
month = int(i)
break
else:
for s, l, i in _allmonths:
if str(month) == i:
month = l
break
return month
def _split_values(text):
"""
splits a variable into its pieces
"""
if "-" in text:
separator = "-"
elif "." in text:
separator = "."
elif ":" in text:
separator = ":"
else:
separator = " "
return [value for value in text.split(separator)]