Added two new functionalities: a Thumbnail Viewing and an Advanced Viewing area.
svn: r17478
This commit is contained in:
parent
b70ea64125
commit
1634625c50
@ -58,6 +58,7 @@ from DateHandler import displayer as _dd
|
|||||||
import gen.lib
|
import gen.lib
|
||||||
import Utils
|
import Utils
|
||||||
from PlaceUtils import conv_lat_lon
|
from PlaceUtils import conv_lat_lon
|
||||||
|
from ListModel import ListModel, NOSORT
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# Check for pyexiv2 library...
|
# Check for pyexiv2 library...
|
||||||
@ -194,6 +195,9 @@ _BUTTONTIPS = {
|
|||||||
"Popup:Select" : _("Allows you to select a date from a pop-up window calendar. \n"
|
"Popup:Select" : _("Allows you to select a date from a pop-up window calendar. \n"
|
||||||
"Warning: You will still need to edit the time..."),
|
"Warning: You will still need to edit the time..."),
|
||||||
|
|
||||||
|
# Thumbnail pop-up Viewing Area button...
|
||||||
|
"Popup:Thumbnail" : _("Will produce a pop-up window showing a Thumbnail Viewing Area"),
|
||||||
|
|
||||||
# Convert to decimal button...
|
# Convert to decimal button...
|
||||||
"GPSFormat:Decimal" : _("Converts Degree, Minutes, Seconds GPS Coordinates to a "
|
"GPSFormat:Decimal" : _("Converts Degree, Minutes, Seconds GPS Coordinates to a "
|
||||||
"Decimal representation."),
|
"Decimal representation."),
|
||||||
@ -206,6 +210,9 @@ _BUTTONTIPS = {
|
|||||||
"Help" : _("Displays the Gramps Wiki Help page for 'Edit Image Exif Metadata' "
|
"Help" : _("Displays the Gramps Wiki Help page for 'Edit Image Exif Metadata' "
|
||||||
"in your web browser."),
|
"in your web browser."),
|
||||||
|
|
||||||
|
# AdvancedView button...
|
||||||
|
"AdvancedView" : _("Will pop open a window with all of the Exif metadata Key/alue pairs."),
|
||||||
|
|
||||||
# Save Exif Metadata button...
|
# Save Exif Metadata button...
|
||||||
"Save" : _("Saves/ writes the Exif metadata to this image.\n"
|
"Save" : _("Saves/ writes the Exif metadata to this image.\n"
|
||||||
"WARNING: Exif metadata will be erased if you save a blank entry field...") }
|
"WARNING: Exif metadata will be erased if you save a blank entry field...") }
|
||||||
@ -310,19 +317,23 @@ class EditExifMetadata(Gramplet):
|
|||||||
hbox.pack_start(self.exif_widgets["Message:Area"], expand =False)
|
hbox.pack_start(self.exif_widgets["Message:Area"], expand =False)
|
||||||
vbox.pack_start(hbox, expand =False)
|
vbox.pack_start(hbox, expand =False)
|
||||||
|
|
||||||
# Edit, Clear, Convert horizontal box
|
# Clear, Thumbnail, Convert horizontal box
|
||||||
ecc_box = gtk.HButtonBox()
|
ctc_box = gtk.HButtonBox()
|
||||||
ecc_box.set_layout(gtk.BUTTONBOX_START)
|
ctc_box.set_layout(gtk.BUTTONBOX_START)
|
||||||
vbox.pack_start(ecc_box, expand =False, fill =False, padding =10)
|
vbox.pack_start(ctc_box, expand =False, fill =False, padding =10)
|
||||||
|
|
||||||
# Clear button...
|
# Clear button...
|
||||||
ecc_box.add( self.__create_button(
|
ctc_box.add( self.__create_button(
|
||||||
"Clear", False, [self.clear_metadata], gtk.STOCK_CLEAR, False) )
|
"Clear", False, [self.clear_metadata], gtk.STOCK_CLEAR, False) )
|
||||||
|
|
||||||
|
# Popup Thumbnail View button...
|
||||||
|
ctc_box.add(self.__create_button(
|
||||||
|
"Popup:Thumbnail", _("Thumbnail View"), [self.thumbnail_view], sensitive =False) )
|
||||||
|
|
||||||
# is ImageMagick installed?
|
# is ImageMagick installed?
|
||||||
if _MAGICK_FOUND:
|
if _MAGICK_FOUND:
|
||||||
# Convert button...
|
# Convert button...
|
||||||
ecc_box.add( self.__create_button(
|
ctc_box.add( self.__create_button(
|
||||||
"Convert", False, [self.__convert_dialog], gtk.STOCK_CONVERT, False) )
|
"Convert", False, [self.__convert_dialog], gtk.STOCK_CONVERT, False) )
|
||||||
|
|
||||||
for items in [
|
for items in [
|
||||||
@ -340,9 +351,10 @@ class EditExifMetadata(Gramplet):
|
|||||||
("Copyright", _("Copyright"), None, False, [], True, 0),
|
("Copyright", _("Copyright"), None, False, [], True, 0),
|
||||||
|
|
||||||
# calendar date clickable entry...
|
# calendar date clickable entry...
|
||||||
|
# Thumbnail button...
|
||||||
("Popup", "", None, True,
|
("Popup", "", None, True,
|
||||||
[("Select", _("Select Date"), "button", self.select_date)],
|
[("Select", _("Select Date"), "button", self.select_date)],
|
||||||
True, 0),
|
True, 0),
|
||||||
|
|
||||||
# Original Date/ Time Entry, 1826-April-12 14:06:00
|
# Original Date/ Time Entry, 1826-April-12 14:06:00
|
||||||
("DateTime", _("Date/ Time"), None, False, [], True, 0),
|
("DateTime", _("Date/ Time"), None, False, [], True, 0),
|
||||||
@ -364,7 +376,7 @@ class EditExifMetadata(Gramplet):
|
|||||||
# Help, Save, Delete horizontal box
|
# Help, Save, Delete horizontal box
|
||||||
hsd_box = gtk.HButtonBox()
|
hsd_box = gtk.HButtonBox()
|
||||||
hsd_box.set_layout(gtk.BUTTONBOX_START)
|
hsd_box.set_layout(gtk.BUTTONBOX_START)
|
||||||
vbox.pack_start(hsd_box, expand =False, fill =False, padding =10)
|
vbox.pack_start(hsd_box, expand =False, fill =False, padding =0)
|
||||||
|
|
||||||
# Help button...
|
# Help button...
|
||||||
hsd_box.add( self.__create_button(
|
hsd_box.add( self.__create_button(
|
||||||
@ -379,6 +391,18 @@ class EditExifMetadata(Gramplet):
|
|||||||
hsd_box.add(self.__create_button(
|
hsd_box.add(self.__create_button(
|
||||||
"Delete", False, [self.__delete_dialog], gtk.STOCK_DELETE, False))
|
"Delete", False, [self.__delete_dialog], gtk.STOCK_DELETE, False))
|
||||||
|
|
||||||
|
# advanced view horizontal button box...
|
||||||
|
adv_box = gtk.HButtonBox()
|
||||||
|
adv_box.set_layout(gtk.BUTTONBOX_START)
|
||||||
|
vbox.pack_start(adv_box, expand =False, fill =False, padding =0)
|
||||||
|
|
||||||
|
# Advanced View Area button...
|
||||||
|
adv_box.add(self.__create_button(
|
||||||
|
"AdvancedView", _("Advanced View"), [self.advanced_view], sensitive =False) )
|
||||||
|
|
||||||
|
# de-activate Thumbnail button...
|
||||||
|
self.exif_widgets["Popup:Thumbnail"].set_sensitive(False)
|
||||||
|
|
||||||
return vbox
|
return vbox
|
||||||
|
|
||||||
def update_has_data(self):
|
def update_has_data(self):
|
||||||
@ -440,11 +464,11 @@ class EditExifMetadata(Gramplet):
|
|||||||
"""
|
"""
|
||||||
db = self.dbstate.db
|
db = self.dbstate.db
|
||||||
|
|
||||||
# clear Display and Edit Areas
|
# clear Edit Areas
|
||||||
self.clear_metadata(self.orig_image)
|
self.clear_metadata(self.orig_image)
|
||||||
|
|
||||||
# De-activate the buttons except for Help...
|
# De-activate the buttons except for Help...
|
||||||
self.deactivate_buttons(["Clear", "Save"])
|
self.deactivate_buttons(["Clear", "Save", "Popup:Thumbnail"])
|
||||||
|
|
||||||
if _MAGICK_FOUND:
|
if _MAGICK_FOUND:
|
||||||
self.deactivate_buttons(["Convert"])
|
self.deactivate_buttons(["Convert"])
|
||||||
@ -722,14 +746,26 @@ class EditExifMetadata(Gramplet):
|
|||||||
reads the image metadata after the pyexiv2.Image has been created
|
reads the image metadata after the pyexiv2.Image has been created
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# separate KeyTags into the ones that we will be using...
|
|
||||||
imageKeyTags = [KeyTag for KeyTag in self.MediaDataTags if KeyTag in _DATAMAP]
|
|
||||||
|
|
||||||
# activate Clear button...
|
# activate Clear button...
|
||||||
self.activate_buttons(["Clear"])
|
self.activate_buttons(["Clear"])
|
||||||
|
|
||||||
|
# Activate Delete button if ImageMagick or jhead is found?...
|
||||||
|
if (_MAGICK_FOUND or _JHEAD_FOUND):
|
||||||
|
self.activate_buttons(["Delete"])
|
||||||
|
|
||||||
|
# separate KeyTags into the ones that we will be using...
|
||||||
|
if LesserVersion:
|
||||||
|
imageKeyTags = [KeyTag for KeyTag in self.plugin_image.exifKeys()
|
||||||
|
if KeyTag in _DATAMAP]
|
||||||
|
else:
|
||||||
|
imageKeyTags = [KeyTag for KeyTag in self.plugin_image.exif_keys
|
||||||
|
if KeyTag in _DATAMAP]
|
||||||
|
|
||||||
if imageKeyTags:
|
if imageKeyTags:
|
||||||
|
|
||||||
|
# activate AdvancedView button...
|
||||||
|
self.activate_buttons(["AdvancedView"])
|
||||||
|
|
||||||
# set Message Area to Copying...
|
# set Message Area to Copying...
|
||||||
self.exif_widgets["Message:Area"].set_text(_("Copying Exif metadata to the Edit Area..."))
|
self.exif_widgets["Message:Area"].set_text(_("Copying Exif metadata to the Edit Area..."))
|
||||||
|
|
||||||
@ -792,6 +828,11 @@ class EditExifMetadata(Gramplet):
|
|||||||
self.exif_widgets["Longitude"].set_text(
|
self.exif_widgets["Longitude"].set_text(
|
||||||
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef) )
|
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef) )
|
||||||
|
|
||||||
|
# Check for Thumbnails...
|
||||||
|
previews = self.plugin_image.previews
|
||||||
|
if (len(previews) > 0):
|
||||||
|
self.activate_buttons(["Popup:Thumbnail"])
|
||||||
|
|
||||||
def convertdelete(self):
|
def convertdelete(self):
|
||||||
"""
|
"""
|
||||||
will convert2Jpeg and delete original non-jpeg image.
|
will convert2Jpeg and delete original non-jpeg image.
|
||||||
@ -1008,9 +1049,62 @@ class EditExifMetadata(Gramplet):
|
|||||||
self.exif_widgets["Longitude"].set_text(
|
self.exif_widgets["Longitude"].set_text(
|
||||||
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef) )
|
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef) )
|
||||||
|
|
||||||
#------------------------------------------------
|
def advanced_view(self, obj):
|
||||||
# Writes/ saves Exif metadata to image
|
"""
|
||||||
#------------------------------------------------
|
Pups up a window with all of the Exif metadata available...
|
||||||
|
"""
|
||||||
|
|
||||||
|
tip = _("Click the close button when you are finished.")
|
||||||
|
|
||||||
|
advarea = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||||
|
advarea.tooltip = tip
|
||||||
|
advarea.set_title(_("Complete Exif, Xmp, and Iptc metadata"))
|
||||||
|
advarea.set_default_size(300, 450)
|
||||||
|
advarea.set_border_width(10)
|
||||||
|
advarea.connect('destroy', lambda advarea: advarea.destroy() )
|
||||||
|
|
||||||
|
vbox = self.build_advanced()
|
||||||
|
vbox.show()
|
||||||
|
advarea.add(vbox)
|
||||||
|
advarea.show()
|
||||||
|
|
||||||
|
if LesserVersion: # prior to pyexiv2-0.2.0
|
||||||
|
for KeyTag in self.MediaDataTags:
|
||||||
|
label = self.plugin_image.tagDetails(KeyTag)[0]
|
||||||
|
if KeyTag in ("Exif.Image.DateTime",
|
||||||
|
"Exif.Photo.DateTimeOriginal",
|
||||||
|
"Exif.Photo.DateTimeDigitized"):
|
||||||
|
human_value = _format_datetime(self.plugin_image[KeyTag])
|
||||||
|
else:
|
||||||
|
human_value = self.plugin_image.interpretedExifValue(KeyTag)
|
||||||
|
self.model.add((label, human_value))
|
||||||
|
|
||||||
|
else: # pyexiv2-0.2.0 and above
|
||||||
|
for KeyTag in self.MediaDataTags:
|
||||||
|
tag = self.plugin_image[KeyTag]
|
||||||
|
if KeyTag in ("Exif.Image.DateTime",
|
||||||
|
"Exif.Photo.DateTimeOriginal",
|
||||||
|
"Exif.Photo.DateTimeDigitized"):
|
||||||
|
label = tag.label
|
||||||
|
human_value = _format_datetime(tag.value)
|
||||||
|
elif ("Xmp" in KeyTag or "Iptc" in KeyTag):
|
||||||
|
label = KeyTag
|
||||||
|
human_value = tag.value
|
||||||
|
else:
|
||||||
|
label = tag.label
|
||||||
|
human_value = tag.human_value
|
||||||
|
self.model.add((label, human_value))
|
||||||
|
|
||||||
|
def build_advanced(self):
|
||||||
|
"""
|
||||||
|
Build the GUI interface.
|
||||||
|
"""
|
||||||
|
top = gtk.TreeView()
|
||||||
|
titles = [(_('Key'), 1, 250),
|
||||||
|
(_('Value'), 2, 350)]
|
||||||
|
self.model = ListModel(top, titles)
|
||||||
|
return top
|
||||||
|
|
||||||
def save_metadata(self):
|
def save_metadata(self):
|
||||||
"""
|
"""
|
||||||
gets the information from the plugin data fields
|
gets the information from the plugin data fields
|
||||||
@ -1053,9 +1147,6 @@ class EditExifMetadata(Gramplet):
|
|||||||
if DateTime is not False:
|
if DateTime is not False:
|
||||||
self._set_value(_DATAMAP["DateTime"], DateTime)
|
self._set_value(_DATAMAP["DateTime"], DateTime)
|
||||||
|
|
||||||
# display formatted date/ time as set in user preferences...
|
|
||||||
self.exif_widgets["DateTime"].set_text(DateTime)
|
|
||||||
|
|
||||||
# Latitude/ Longitude data fields
|
# Latitude/ Longitude data fields
|
||||||
latitude = self.exif_widgets["Latitude"].get_text()
|
latitude = self.exif_widgets["Latitude"].get_text()
|
||||||
longitude = self.exif_widgets["Longitude"].get_text()
|
longitude = self.exif_widgets["Longitude"].get_text()
|
||||||
@ -1117,7 +1208,7 @@ class EditExifMetadata(Gramplet):
|
|||||||
|
|
||||||
if datatags:
|
if datatags:
|
||||||
# set Message Area to Saved...
|
# set Message Area to Saved...
|
||||||
self.exif_widgets["Message:Area"].set_text(_("Saving Exif metadata to the image..."))
|
self.exif_widgets["Message:Area"].set_text(_("Saving Exif metadata to this image..."))
|
||||||
else:
|
else:
|
||||||
# set Message Area to Cleared...
|
# set Message Area to Cleared...
|
||||||
self.exif_widgets["Message:Area"].set_text(_("Image Exif metadata has been cleared "
|
self.exif_widgets["Message:Area"].set_text(_("Image Exif metadata has been cleared "
|
||||||
@ -1126,10 +1217,6 @@ class EditExifMetadata(Gramplet):
|
|||||||
# writes all Exif Metadata to image even if the fields are all empty...
|
# writes all Exif Metadata to image even if the fields are all empty...
|
||||||
self.write_metadata(self.plugin_image)
|
self.write_metadata(self.plugin_image)
|
||||||
|
|
||||||
# Activate Delete button...
|
|
||||||
if _MAGICK_FOUND:
|
|
||||||
self.activate_buttons(["Delete"])
|
|
||||||
|
|
||||||
def strip_metadata(self):
|
def strip_metadata(self):
|
||||||
"""
|
"""
|
||||||
Will completely and irrevocably erase all Exif metadata from this image.
|
Will completely and irrevocably erase all Exif metadata from this image.
|
||||||
@ -1202,6 +1289,46 @@ class EditExifMetadata(Gramplet):
|
|||||||
# close this window
|
# close this window
|
||||||
self.app.destroy()
|
self.app.destroy()
|
||||||
|
|
||||||
|
def thumbnail_view(self, obj):
|
||||||
|
"""
|
||||||
|
will allow a display area for a thumbnail pop-up window.
|
||||||
|
"""
|
||||||
|
|
||||||
|
tip = _("Click Close to close this Thumbnail Viewing Area.")
|
||||||
|
|
||||||
|
tbarea = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||||
|
tbarea.tooltip = tip
|
||||||
|
tbarea.set_title(_("Thumbnail Viewing Area"))
|
||||||
|
tbarea.set_default_size(250, 200)
|
||||||
|
tbarea.set_border_width(10)
|
||||||
|
|
||||||
|
tbarea.connect('destroy', lambda tbarea: tbarea.destroy() )
|
||||||
|
|
||||||
|
# extract the thumbnail data
|
||||||
|
previews = self.plugin_image.previews
|
||||||
|
if not (len(previews) > 0):
|
||||||
|
print(_("This image doesn't contain any Thumbnails."))
|
||||||
|
tbarea.destroy()
|
||||||
|
else:
|
||||||
|
|
||||||
|
# Get the largest preview available...
|
||||||
|
preview = previews[-1]
|
||||||
|
|
||||||
|
# Create a pixbuf loader to read the thumbnail data...
|
||||||
|
pbloader = gtk.gdk.PixbufLoader()
|
||||||
|
pbloader.write(preview.data)
|
||||||
|
|
||||||
|
# Get the resulting pixbuf and build an image to be displayed...
|
||||||
|
pixbuf = pbloader.get_pixbuf()
|
||||||
|
pbloader.close()
|
||||||
|
imgwidget = gtk.Image()
|
||||||
|
imgwidget.set_from_pixbuf(pixbuf)
|
||||||
|
|
||||||
|
# Show the application's main window...
|
||||||
|
tbarea.add(imgwidget)
|
||||||
|
imgwidget.show()
|
||||||
|
tbarea.show()
|
||||||
|
|
||||||
def string_to_rational(coordinate):
|
def string_to_rational(coordinate):
|
||||||
"""
|
"""
|
||||||
convert string to rational variable for GPS
|
convert string to rational variable for GPS
|
||||||
|
Loading…
Reference in New Issue
Block a user