Basically, a total new re-write of my addon.
svn: r17599
This commit is contained in:
parent
bd89ee1889
commit
42b6bcdb87
@ -26,7 +26,7 @@
|
||||
# *****************************************************************************
|
||||
import os, sys
|
||||
from datetime import datetime, date
|
||||
from calendar import monthrange as _mr
|
||||
import calendar
|
||||
import time
|
||||
|
||||
# abilty to escape certain characters from output...
|
||||
@ -164,14 +164,15 @@ _DATAMAP = {
|
||||
"Exif.GPSInfo.GPSLatitude" : "Latitude",
|
||||
"Exif.GPSInfo.GPSLongitudeRef" : "LongitudeRef",
|
||||
"Exif.GPSInfo.GPSLongitude" : "Longitude",
|
||||
"Exif.GPSInfo.GPSAltitudeRef" : "AltitudeRef",
|
||||
"Exif.GPSInfo.GPSAltitude" : "Altitude"}
|
||||
"Exif.GPSInfo.GPSTimeStamp" : "GPSTimeStamp"}
|
||||
_DATAMAP = dict( (key, val) for key, val in _DATAMAP.items() )
|
||||
_DATAMAP.update( (val, key) for key, val in _DATAMAP.items() )
|
||||
|
||||
# define tooltips for all data entry fields...
|
||||
_TOOLTIPS = {
|
||||
|
||||
"ExifLabel" : _("This is equivalent to the Title field in the media object editor."),
|
||||
|
||||
"Description" : _("Provide a short descripion for this image."),
|
||||
|
||||
"Artist" : _("Enter the Artist/ Author of this image. The person's name or "
|
||||
@ -179,30 +180,18 @@ _TOOLTIPS = {
|
||||
|
||||
"Copyright" : _("Enter the copyright information for this image. \n"),
|
||||
|
||||
"Year" : _("Enter the year for the date of this image.\n"
|
||||
"Example: 1826 - 2100, You can either spin the up and down arrows by clicking on them or enter it manually."),
|
||||
"Original" : _("The original date/ time when the image was first created/ taken as in a photograph.\n"
|
||||
"Example: 1830-01-1 09:30:59"),
|
||||
|
||||
"Month" : _("Enter the month for the date of this image.\n"
|
||||
"Example: 0 - 12, You can either spin the up and down arrows by clicking on them or enter it manually."),
|
||||
|
||||
"Day" : _("Enter the day for the date of this image.\n"
|
||||
"Example: 1 - 31, You can either spin the up and down arrows by clicking on them or enter it manually."),
|
||||
|
||||
"Hour" : _("Enter the hour for the time of this image.\n"
|
||||
"Example: 0 - 23, You can either spin the up and down arrows by clicking on them or enter it manually.\n\n"
|
||||
"The hour is represented in 24-hour format."),
|
||||
|
||||
"Minutes" : _("Enter the minutes for the time of this image.\n"
|
||||
"Example: 0 - 59, You can either spin the up and down arrows by clicking on them or enter it manually."),
|
||||
|
||||
"Seconds" : _("Enter the seconds for the time of this image.\n"
|
||||
"Example: 0 - 59, You can either spin the up and down arrows by clicking on them or enter it manually."),
|
||||
"Modified" : _("This is the date/ time that the image was last changed/ modified.\n"
|
||||
"Example: 2011-05-24 14:30:00"),
|
||||
|
||||
"Latitude" : _("Enter the Latitude GPS Coordinates for this image,\n"
|
||||
"Example: 43.722965, 43 43 22 N, 38° 38′ 03″ N, 38 38 3"),
|
||||
|
||||
"Longitude" : _("Enter the Longitude GPS Coordinates for this image,\n"
|
||||
"Example: 10.396378, 10 23 46 E, 105° 6′ 6″ W, -105 6 6") }
|
||||
|
||||
_TOOLTIPS = dict( (key, tip) for key, tip in _TOOLTIPS.items() )
|
||||
|
||||
# define tooltips for all buttons...
|
||||
@ -264,7 +253,7 @@ class EditExifMetadata(Gramplet):
|
||||
label.set_line_wrap(True)
|
||||
medialabel.pack_start(label, expand =False)
|
||||
self.exif_widgets["MediaLabel"] = label
|
||||
main_vbox.pack_start(medialabel, expand =False, fill =False, padding =5)
|
||||
main_vbox.pack_start(medialabel, expand =False, fill =False, padding =2)
|
||||
label.show()
|
||||
|
||||
# Displays mime type information...
|
||||
@ -274,7 +263,7 @@ class EditExifMetadata(Gramplet):
|
||||
label.set_line_wrap(True)
|
||||
mimetype.pack_start(label, expand =False)
|
||||
self.exif_widgets["MimeType"] = label
|
||||
main_vbox.pack_start(mimetype, expand =False, fill =False, padding =5)
|
||||
main_vbox.pack_start(mimetype, expand =False, fill =False, padding =2)
|
||||
label.show()
|
||||
|
||||
# Displays all plugin messages...
|
||||
@ -284,9 +273,12 @@ class EditExifMetadata(Gramplet):
|
||||
label.set_line_wrap(True)
|
||||
messagearea.pack_start(label, expand =False)
|
||||
self.exif_widgets["MessageArea"] = label
|
||||
main_vbox.pack_start(messagearea, expand =False, fill =False, padding =5)
|
||||
main_vbox.pack_start(messagearea, expand =False, fill =False, padding =2)
|
||||
label.show()
|
||||
|
||||
# Separator line before the buttons...
|
||||
main_vbox.pack_start(gtk.HSeparator(), expand =False, fill =False, padding =2)
|
||||
|
||||
# Clear, Thumbnail View, Convert horizontal box
|
||||
ctc_box = gtk.HButtonBox()
|
||||
ctc_box.set_layout(gtk.BUTTONBOX_START)
|
||||
@ -314,7 +306,7 @@ class EditExifMetadata(Gramplet):
|
||||
|
||||
# Help button...
|
||||
hed_box.add( self.__create_button(
|
||||
"Help", False, [self.__help_page], gtk.STOCK_HELP) )
|
||||
"Help", False, [self.__help_page], gtk.STOCK_HELP, True) )
|
||||
|
||||
# Edit button...
|
||||
hed_box.add( self.__create_button(
|
||||
@ -341,9 +333,6 @@ class EditExifMetadata(Gramplet):
|
||||
"""
|
||||
db = self.dbstate.db
|
||||
|
||||
# disable all buttons...
|
||||
self.deactivate_buttons(["All"])
|
||||
|
||||
# clears all labels and display area...
|
||||
for widget in ["MediaLabel", "MimeType", "MessageArea"]:
|
||||
self.exif_widgets[widget].set_text("")
|
||||
@ -524,39 +513,42 @@ class EditExifMetadata(Gramplet):
|
||||
# set Message Area to Display...
|
||||
self.exif_widgets["MessageArea"].set_text(_("Displaying all Exif metadata keypairs..."))
|
||||
|
||||
for KeyTag in metadatatags:
|
||||
if LesserVersion: # prior to pyexiv2-0.2.0...
|
||||
# Activate Delete button if ImageMagick or jhead is found?...
|
||||
if (_MAGICK_FOUND or _JHEAD_FOUND):
|
||||
self.activate_buttons(["Delete"])
|
||||
|
||||
label = self.plugin_image.tagDetails(KeyTag)[0]
|
||||
for KeyTag in metadatatags:
|
||||
if LesserVersion: # prior to v0.2.0
|
||||
label = metadata.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)
|
||||
else: # pyexiv2-0.2.0 and above...
|
||||
self.model.add((label, human_value))
|
||||
|
||||
else: # v0.2.0 and above
|
||||
try:
|
||||
tag = self.plugin_image[KeyTag]
|
||||
|
||||
# display the date as the user has set in preferences...
|
||||
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
|
||||
|
||||
# display anything else...
|
||||
else:
|
||||
label = tag.label
|
||||
human_value = tag.human_value
|
||||
self.model.add((label, human_value))
|
||||
self.model.add((tag.label, human_value))
|
||||
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
self.set_has_data(self.model.count > 0)
|
||||
|
||||
def __create_button(self, pos, text, callback =[], icon =False):
|
||||
def __create_button(self, pos, text, callback =[], icon =False, sensitive =False):
|
||||
"""
|
||||
creates and returns a button for display
|
||||
"""
|
||||
@ -573,6 +565,9 @@ class EditExifMetadata(Gramplet):
|
||||
# attach a addon widget to the button for manipulation...
|
||||
self.exif_widgets[pos] = button
|
||||
|
||||
if not sensitive:
|
||||
button.set_sensitive(False)
|
||||
|
||||
return button
|
||||
|
||||
def build_shaded_display(self):
|
||||
@ -587,6 +582,27 @@ class EditExifMetadata(Gramplet):
|
||||
|
||||
return top
|
||||
|
||||
def __description_exif(self, object):
|
||||
|
||||
pass
|
||||
|
||||
def __origin_exif(self, object):
|
||||
|
||||
pass
|
||||
|
||||
def __image_exif(self, object):
|
||||
|
||||
pass
|
||||
|
||||
def __camera_exif(self, object):
|
||||
|
||||
pass
|
||||
|
||||
def __advanced_exif(self, object):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def clear_display(self, obj):
|
||||
"""
|
||||
clears all data fields to nothing
|
||||
@ -614,19 +630,19 @@ class EditExifMetadata(Gramplet):
|
||||
|
||||
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)
|
||||
self.tbarea = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||
self.tbarea.tooltip = tip
|
||||
self.tbarea.set_title(_("Thumbnail Viewing Area"))
|
||||
self.tbarea.set_default_size(250, 200)
|
||||
self.tbarea.set_border_width(10)
|
||||
|
||||
tbarea.connect('destroy', lambda tbarea: tbarea.destroy() )
|
||||
self.tbarea.connect('destroy', lambda w: self.tbarea.destroy() )
|
||||
|
||||
# extract the thumbnail data
|
||||
previews = self.plugin_image.previews
|
||||
if not previews:
|
||||
print(_("This image doesn't contain any Thumbnails..."))
|
||||
tbarea.destroy()
|
||||
self.tbarea.destroy()
|
||||
else:
|
||||
|
||||
# Get the largest preview available...
|
||||
@ -643,9 +659,9 @@ class EditExifMetadata(Gramplet):
|
||||
imgwidget.set_from_pixbuf(pixbuf)
|
||||
|
||||
# Show the application's main window...
|
||||
tbarea.add(imgwidget)
|
||||
self.tbarea.add(imgwidget)
|
||||
imgwidget.show()
|
||||
tbarea.show()
|
||||
self.tbarea.show()
|
||||
|
||||
def __convert_dialog(self, obj):
|
||||
"""
|
||||
@ -811,16 +827,11 @@ class EditExifMetadata(Gramplet):
|
||||
main_vbox.set_border_width(10)
|
||||
main_vbox.set_size_request(480, 518)
|
||||
|
||||
# Displays Last Change/ Modified DateStamp...
|
||||
datestamp = gtk.HBox(False)
|
||||
label = gtk.Label()
|
||||
label.set_alignment(0.0, 0.0)
|
||||
label.set_line_wrap(True)
|
||||
datestamp.pack_start(label, expand =False, fill =False, padding =0)
|
||||
self.exif_widgets["DateStamp"] = label
|
||||
main_vbox.pack_start(label, expand =False, fill =False, padding =5)
|
||||
label.show()
|
||||
main_vbox.pack_start(datestamp, expand =False, fill =False, padding =10)
|
||||
datestamp.show()
|
||||
self.exif_widgets["Edit:Message"] = label
|
||||
|
||||
# create the data fields...
|
||||
# ***Label/ Title, Description, Artist, and Copyright
|
||||
@ -868,8 +879,8 @@ class EditExifMetadata(Gramplet):
|
||||
now = time.localtime()
|
||||
|
||||
# iso format: Year, Month, Day spinners...
|
||||
datetime_frame = gtk.Frame(_("Original Date/ Time"))
|
||||
datetime_frame.set_size_request(460, 110)
|
||||
datetime_frame = gtk.Frame(_("Date/ Time"))
|
||||
datetime_frame.set_size_request(460, 120)
|
||||
main_vbox.pack_start(datetime_frame, expand =False, fill =False, padding =0)
|
||||
datetime_frame.show()
|
||||
|
||||
@ -882,57 +893,34 @@ class EditExifMetadata(Gramplet):
|
||||
new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =5)
|
||||
new_hbox.show()
|
||||
|
||||
# create the adjustment for each of the SpinButtons for Date/ Time
|
||||
datetime_adj = [ [value, lower, upper, step, page] for (value, lower, upper, step, page) in [
|
||||
(now[0], 1826, 2100, 1, 100), # Year
|
||||
(now[1], 1, 12, 1, 1), # Month
|
||||
(now[2], 1, 31, 1, 1), # Day
|
||||
(now[3], 0, 23, 1, 1), # Hour
|
||||
(now[4], 0, 59, 1, 1), # Minutes
|
||||
(now[5], 0, 59, 1, 1) ] ] # Seconds
|
||||
textNames = [_("Year :"), _("Month :"), _("Day :"), _("Hour :"), _("Minutes :"), _("Seconds :")]
|
||||
widgetNames = ["Year", "Month", "Day", "Hour", "Minutes", "Seconds"]
|
||||
|
||||
index = 0
|
||||
for (value, lower, upper, step, page) in datetime_adj:
|
||||
text, widget = textNames[index], widgetNames[index]
|
||||
for widget, text in [
|
||||
("Original", _("Original Date/ Time :") ),
|
||||
("Modified", _("Last Changed :") ) ]:
|
||||
|
||||
vbox2 = gtk.VBox(False, 0)
|
||||
vbox2.set_size_request(224, 60)
|
||||
new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5)
|
||||
vbox2.show()
|
||||
|
||||
label = gtk.Label(text)
|
||||
label.set_alignment(0.0, 0.0)
|
||||
label.set_size_request(70, 25)
|
||||
label.set_size_request(222, 25)
|
||||
vbox2.pack_start(label, expand =False, fill =False, padding =0)
|
||||
label.show()
|
||||
|
||||
|
||||
event_box = gtk.EventBox()
|
||||
event_box.set_border_width(2)
|
||||
event_box.set_size_request(70, 40)
|
||||
event_box.set_size_request(222, 40)
|
||||
vbox2.pack_start(event_box, expand =False, fill =False, padding =0)
|
||||
self.exif_widgets[widget + "Box"] = event_box
|
||||
event_box.show()
|
||||
self.exif_widgets[widget + "Box"] = event_box
|
||||
|
||||
adj = gtk.Adjustment(value, lower, upper, step, page)
|
||||
spinner = self.__create_spinner("Year", adj, False, False)
|
||||
event_box.add(spinner)
|
||||
spinner.show()
|
||||
self.exif_widgets[widget] = spinner
|
||||
|
||||
index += 1
|
||||
|
||||
new_hbox = gtk.HBox(False, 0)
|
||||
datetime_frame.add(new_hbox)
|
||||
new_vbox.show()
|
||||
|
||||
label = gtk.Label()
|
||||
new_hbox.pack_start(label, expand =False, fill =False, padding =10)
|
||||
label.show()
|
||||
self.exif_widgets["DateOriginal"] = label
|
||||
entry = gtk.Entry(max =40)
|
||||
event_box.add(entry)
|
||||
self.exif_widgets[widget] = entry
|
||||
entry.show()
|
||||
|
||||
# GPS Coordinates...
|
||||
latlong_frame = gtk.Frame(_("Latitude/ Longitude/ Altitude GPS Coordinates"))
|
||||
latlong_frame = gtk.Frame(_("Latitude/ Longitude GPS Coordinates"))
|
||||
latlong_frame.set_size_request(460, 100)
|
||||
main_vbox.pack_start(latlong_frame, expand =False, fill =False, padding =0)
|
||||
latlong_frame.show()
|
||||
@ -945,11 +933,11 @@ class EditExifMetadata(Gramplet):
|
||||
new_vbox.pack_start(new_hbox, expand =False, fill =False, padding =0)
|
||||
new_hbox.show()
|
||||
|
||||
# Latitude/ Longitude/ Altitude GPS Coordinates...
|
||||
widget_text = [ (text) for text in [_("Latitude"), _("Longitude"), _("Altitude") ] ]
|
||||
while widget_text:
|
||||
text = widget_text[0] + " :"
|
||||
widget = widget_text[0]
|
||||
# Latitude/ Longitude GPS Coordinates...
|
||||
for widget, text in [
|
||||
("Latitude", _("Latitude :") ),
|
||||
("Longitude", _("Longitude :") ),
|
||||
("GPSTimeStamp", _("GPS TimeStamp :") ) ]:
|
||||
|
||||
vbox2 = gtk.VBox(False, 0)
|
||||
new_hbox.pack_start(vbox2, expand =False, fill =False, padding =5)
|
||||
@ -977,9 +965,6 @@ class EditExifMetadata(Gramplet):
|
||||
entry.show()
|
||||
self.exif_widgets[widget] = entry
|
||||
|
||||
# remove the entries one by one after displaying...
|
||||
widget_text.remove(widget)
|
||||
|
||||
# Help, Save, Clear, and Close horizontal box
|
||||
hscc_box = gtk.HButtonBox()
|
||||
hscc_box.set_layout(gtk.BUTTONBOX_START)
|
||||
@ -988,23 +973,25 @@ class EditExifMetadata(Gramplet):
|
||||
|
||||
# Help button...
|
||||
button = self.__create_button(
|
||||
"Help", False, [self.__help_page], gtk.STOCK_HELP)
|
||||
"Help", False, [self.__help_page], gtk.STOCK_HELP, True)
|
||||
hscc_box.add(button)
|
||||
button.show()
|
||||
|
||||
# Save button...
|
||||
button = self.__create_button("Save", False, [self.save_metadata, self.update,
|
||||
self.display_metadata], gtk.STOCK_SAVE)
|
||||
self.display_metadata], gtk.STOCK_SAVE, True)
|
||||
hscc_box.add(button)
|
||||
button.show()
|
||||
|
||||
# Clear button...
|
||||
button = self.__create_button("Clear", False, [self.clear_edit_area], gtk.STOCK_CLEAR)
|
||||
button = self.__create_button(
|
||||
"Clear", False, [self.clear_edit_area], gtk.STOCK_CLEAR, True)
|
||||
hscc_box.add(button)
|
||||
button.show()
|
||||
|
||||
# Close button...
|
||||
button = self.__create_button("Close", False, [lambda w: self.edtarea.destroy()], gtk.STOCK_CLOSE)
|
||||
button = self.__create_button(
|
||||
"Close", False, [lambda w: self.edtarea.destroy()], gtk.STOCK_CLOSE, True)
|
||||
hscc_box.add(button)
|
||||
button.show()
|
||||
|
||||
@ -1044,26 +1031,16 @@ class EditExifMetadata(Gramplet):
|
||||
will clear the Edit Area display...
|
||||
"""
|
||||
|
||||
for widget in ["DateStamp", "ExifLabel", "Description", "Artist", "Copyright", "Latitude", "Longitude"]:
|
||||
self.exif_widgets[widget].set_text()
|
||||
for widget in ["ExifLabel", "Description", "Artist", "Copyright", "Modified", "Original",
|
||||
"Latitude", "Longitude", "GPSTimeStamp", "Edit:Message"]:
|
||||
self.exif_widgets[widget].set_text("")
|
||||
|
||||
index = 0
|
||||
now = time.localtime()
|
||||
for widget in ["Year", "Month", "Day", "Hour", "Minutes", "Seconds"]:
|
||||
self.exif_widgets[widget].set_value(now[index])
|
||||
|
||||
index += 1
|
||||
|
||||
def clear_display(self, object):
|
||||
"""
|
||||
clears all data fields to nothing
|
||||
"""
|
||||
|
||||
for widgetsName in ["DateStamp"]:
|
||||
self.exif_widgets[widgetsName].set_text("")
|
||||
|
||||
for widget, tooltip in _TOOLTIPS.items():
|
||||
self.exif_widgets[widget].set_text("")
|
||||
self.model.clear()
|
||||
|
||||
# De-activate the buttons except for Help...
|
||||
self.deactivate_buttons(["Thumbnail"])
|
||||
@ -1074,23 +1051,6 @@ class EditExifMetadata(Gramplet):
|
||||
if (_MAGICK_FOUND or _HEAD_FOUND):
|
||||
self.deactivate_buttons(["Delete"])
|
||||
|
||||
def __create_spinner(self, pos, adjustment, climb =True, wrap =True, numdigits =0):
|
||||
"""
|
||||
Creates and returns the Date/ Time spinners...
|
||||
"""
|
||||
|
||||
if climb:
|
||||
spin_button = gtk.SpinButton(adjustment, climb_rate =0.0, digits =numdigits)
|
||||
else:
|
||||
spin_button = gtk.SpinButton(adjustment, climb_rate =1.0, digits =numdigits)
|
||||
|
||||
spin_button.set_wrap(wrap)
|
||||
spin_button.set_numeric(True)
|
||||
spin_button.update()
|
||||
self.exif_widgets[pos] = spin_button
|
||||
|
||||
return spin_button
|
||||
|
||||
def EditArea(self, MediaDataTags):
|
||||
"""
|
||||
displays the image Exif metadata in the Edit Area...
|
||||
@ -1102,13 +1062,6 @@ class EditExifMetadata(Gramplet):
|
||||
# if no Exif metadata, disable the has_data() functionality?
|
||||
if MediaDataTags:
|
||||
|
||||
# activate Save button...
|
||||
self.activate_buttons(["Save"])
|
||||
|
||||
# Activate Delete button if ImageMagick or jhead is found?...
|
||||
if (_MAGICK_FOUND or _JHEAD_FOUND):
|
||||
self.activate_buttons(["Delete"])
|
||||
|
||||
for KeyTag in MediaDataTags:
|
||||
|
||||
# name for matching to exif_widgets
|
||||
@ -1117,7 +1070,7 @@ class EditExifMetadata(Gramplet):
|
||||
tagValue = self._get_value(KeyTag)
|
||||
if tagValue:
|
||||
|
||||
if widgetsName in ["ExifLabel", "Description", "Artist", "Copyright"]:
|
||||
if widgetsName in ["ExifLabel", "Description", "Artist", "Copyright", "GPSTimeStamp"]:
|
||||
self.exif_widgets[widgetsName].set_text(tagValue)
|
||||
|
||||
# Last Changed/ Modified...
|
||||
@ -1125,8 +1078,7 @@ class EditExifMetadata(Gramplet):
|
||||
use_date = self._get_value(_DATAMAP["Modified"])
|
||||
use_date = _process_datetime(use_date) if use_date else False
|
||||
if use_date:
|
||||
self.exif_widgets["DateStamp"].set_text(
|
||||
_("Last Changed: %s") % use_date)
|
||||
self.exif_widgets["Modified"].set_text(use_date)
|
||||
|
||||
# Original Creation Date/ Time...
|
||||
elif widgetsName == "Original":
|
||||
@ -1148,11 +1100,8 @@ class EditExifMetadata(Gramplet):
|
||||
year = False
|
||||
if year:
|
||||
|
||||
# update Date/ Time spin buttons...
|
||||
self.update_spinners(year, month, day, hour, minutes, seconds)
|
||||
|
||||
use_date = _create_datetime(year, month, day, hour, minutes, seconds)
|
||||
self.exif_widgets["DateOriginal"].set_text( _format_datetime(use_date) )
|
||||
self.exif_widgets["Original"].set_text( _format_datetime(use_date) )
|
||||
|
||||
# LatitudeRef, Latitude, LongitudeRef, Longitude...
|
||||
elif widgetsName == "Latitude":
|
||||
@ -1188,28 +1137,13 @@ class EditExifMetadata(Gramplet):
|
||||
self.exif_widgets["Longitude"].set_text(
|
||||
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongRef) )
|
||||
|
||||
elif widgetsName == "Altitude":
|
||||
altitude = self._get_value(_DATAMAP["Altitude"] )
|
||||
AltRef = self._get_value(_DATAMAP["AltitudeRef"] )
|
||||
|
||||
if (altitude and AltRef):
|
||||
altdeg, altmin, altsec = rational_to_dms(altitude)
|
||||
|
||||
altfail = any(coords == False for coords in [altdeg, altmin, altsec])
|
||||
if not altfail:
|
||||
|
||||
# set display for Altitude GPS Coordinates
|
||||
self.exif_widgets["Altitude"].set_text(
|
||||
"""%s° %s′ %s″ %s""" % (altdeg, altmin, altsec, AltRef) )
|
||||
|
||||
else:
|
||||
|
||||
# set Message Area to None...
|
||||
self.exif_widgets["MessageArea"].set_text(_("There is NO Exif "
|
||||
"metadata for this image yet..."))
|
||||
|
||||
for widgetsName in ["Description", "Artist", "Copyright", "Latitude",
|
||||
"Longitude", "Altitude"]:
|
||||
for widgetsName in ["ExifLabel", "Description", "Artist", "Copyright", "Latitude", "Longitude"]:
|
||||
|
||||
# once the user types in that field,
|
||||
# the Edit, Clear, and Delete buttons will become active...
|
||||
@ -1289,12 +1223,7 @@ class EditExifMetadata(Gramplet):
|
||||
if (latitude and longitude):
|
||||
|
||||
if (latitude.count(".") == 1 and longitude.count(".") == 1):
|
||||
self.convert2dms(self.plugin_image)
|
||||
|
||||
# get Latitude/ Longitude from data fields
|
||||
# after the conversion
|
||||
latitude = self.exif_widgets["Latitude"].get_text()
|
||||
longitude = self.exif_widgets["Longitude"].get_text()
|
||||
latitude, longitude = self.convert2dms(latitude, longitude)
|
||||
|
||||
# add DMS symbols if necessary?
|
||||
# the conversion to decimal format, require the DMS symbols
|
||||
@ -1360,16 +1289,12 @@ class EditExifMetadata(Gramplet):
|
||||
self.exif_widgets["Latitude"].set_text(latitude)
|
||||
self.exif_widgets["Longitude"].set_text(longitude)
|
||||
|
||||
def convert2dms(self, obj):
|
||||
def convert2dms(self, latitude, longitude):
|
||||
"""
|
||||
will convert a decimal GPS Coordinates into degrees, minutes, seconds
|
||||
for display only
|
||||
"""
|
||||
|
||||
# get Latitude/ Longitude from the data fields
|
||||
latitude = self.exif_widgets["Latitude"].get_text()
|
||||
longitude = self.exif_widgets["Longitude"].get_text()
|
||||
|
||||
# if Latitude/ Longitude exists?
|
||||
if (latitude and longitude):
|
||||
|
||||
@ -1393,14 +1318,13 @@ class EditExifMetadata(Gramplet):
|
||||
LongitudeRef = "W"
|
||||
longdeg, longmin, longsec = longitude.split(":", 2)
|
||||
|
||||
self.exif_widgets["Latitude"].set_text(
|
||||
"""%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatitudeRef) )
|
||||
latitude = """%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatitudeRef)
|
||||
self.exif_widgets["Latitude"].set_text(latitude)
|
||||
|
||||
self.exif_widgets["Longitude"].set_text(
|
||||
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef) )
|
||||
longitude = """%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef)
|
||||
self.exif_widgets["Longitude"].set_text(longitude)
|
||||
|
||||
def destroy(self, widget):
|
||||
self.window.destroy()
|
||||
return latitude, longitude
|
||||
|
||||
def save_metadata(self, object):
|
||||
"""
|
||||
@ -1409,13 +1333,8 @@ class EditExifMetadata(Gramplet):
|
||||
"""
|
||||
|
||||
# determine if there has been something entered in the data fields?
|
||||
datatags = (
|
||||
len(self.exif_widgets["ExifLabel"].get_text() ) +
|
||||
len(self.exif_widgets["Description"].get_text() ) +
|
||||
len(self.exif_widgets["Artist"].get_text() ) +
|
||||
len(self.exif_widgets["Copyright"].get_text() ) +
|
||||
len(self.exif_widgets["Latitude"].get_text() ) +
|
||||
len(self.exif_widgets["Longitude"].get_text() ) )
|
||||
datatags = [ (self.exif_widgets[widget].get_text() ) for widget in _TOOLTIPS.keys()
|
||||
if widget not in ["Close", "Save"] ]
|
||||
|
||||
# Exif Label/ Title
|
||||
exiflabel = self.exif_widgets["ExifLabel"].get_text()
|
||||
@ -1428,9 +1347,7 @@ class EditExifMetadata(Gramplet):
|
||||
# Modify Date/ Time... not a data field, but saved anyway...
|
||||
modified = datetime.now()
|
||||
self._set_value(_DATAMAP["Modified"], modified)
|
||||
|
||||
# display modified Date/ Time...
|
||||
self.exif_widgets["MessageArea"].set_text(_("Last Changed: %s") % _format_datetime(modified) )
|
||||
self.exif_widgets["Modified"].set_text(_format_datetime(modified) )
|
||||
|
||||
# Artist/ Author data field...
|
||||
artist = self.exif_widgets["Artist"].get_text()
|
||||
@ -1440,23 +1357,11 @@ class EditExifMetadata(Gramplet):
|
||||
copyright = self.exif_widgets["Copyright"].get_text()
|
||||
self._set_value(_DATAMAP["Copyright"], copyright)
|
||||
|
||||
# Original Date/ Time
|
||||
year = self._get_spin_value("Year"),
|
||||
month = self._get_spin_value("Month"),
|
||||
day = self._get_spin_value("Day"),
|
||||
hour = self._get_spin_value("Hour"),
|
||||
minutes = self._get_spin_value("Minutes"),
|
||||
seconds = self._get_spin_value("Seconds")
|
||||
print(year, month, day, hour, minutes, seconds)
|
||||
|
||||
use_date = False
|
||||
if year < 1900:
|
||||
use_date = "%04d-%s-%02d %02d:%02d:%02d" % (year, _dd.long_months[month], day,
|
||||
hour, minutes, seconds)
|
||||
else:
|
||||
use_date = datetime(year, month, day, hour, minutes, seconds)
|
||||
if use_date:
|
||||
self._set_value(_DATAMAP["Original"], use_date)
|
||||
# Original Date/ Time...
|
||||
original = self.exif_widgets["Original"].get_text()
|
||||
original = _process_datetime(original) if original else False
|
||||
if original is not False:
|
||||
self._set_value(_DATAMAP["Original"], original)
|
||||
|
||||
# Latitude/ Longitude data fields
|
||||
latitude = self.exif_widgets["Latitude"].get_text()
|
||||
@ -1480,11 +1385,7 @@ class EditExifMetadata(Gramplet):
|
||||
|
||||
# if it is in decimal format, convert it to DMS?
|
||||
# if not, then do nothing?
|
||||
self.convert2dms(self.plugin_image)
|
||||
|
||||
# get Latitude/ Longitude from the data fields
|
||||
latitude = self.exif_widgets["Latitude"].get_text()
|
||||
longitude = self.exif_widgets["Longitude"].get_text()
|
||||
latitude, longitude = self.convert2dms(latitude, longitude)
|
||||
|
||||
# will add (degrees, minutes, seconds) symbols if needed?
|
||||
# if not, do nothing...
|
||||
@ -1517,13 +1418,9 @@ class EditExifMetadata(Gramplet):
|
||||
self._set_value(_DATAMAP["LongitudeRef"], LongitudeRef)
|
||||
self._set_value(_DATAMAP["Longitude"], coords_to_rational(longitude))
|
||||
|
||||
if datatags:
|
||||
if (len(datatags) > 0):
|
||||
# set Message Area to Saved...
|
||||
self.exif_widgets["MessageArea"].set_text(_("Saving Exif metadata to this image..."))
|
||||
else:
|
||||
# set Message Area to Cleared...
|
||||
self.exif_widgets["MessageArea"].set_text(_("Image Exif metadata has been cleared "
|
||||
"from this image..."))
|
||||
self.exif_widgets["Edit:Message"].set_text(_("Saving Exif metadata to this image..."))
|
||||
|
||||
# writes all Exif Metadata to image even if the fields are all empty...
|
||||
self.write_metadata(self.plugin_image)
|
||||
@ -1573,47 +1470,23 @@ class EditExifMetadata(Gramplet):
|
||||
update Date/ Time spinners.
|
||||
"""
|
||||
|
||||
# split the date/ time into its six pieces...
|
||||
datetimevalues = {
|
||||
for widget, value in {
|
||||
"Year" : syear,
|
||||
"Month" : smonth,
|
||||
"Day" : day,
|
||||
"Hour" : hour,
|
||||
"Minutes" : minutes,
|
||||
"Seconds" : seconds}.items()
|
||||
|
||||
for widget, value in datetimevalues:
|
||||
|
||||
"Seconds" : seconds}.items():
|
||||
|
||||
# make sure that the amount of days for that year and month is not > than the number of days selected...
|
||||
if widget == "Day":
|
||||
numdays = [0] + [_mr(year, month)[1] for year in [syear] for month in range(1, 13) ]
|
||||
|
||||
numdays = [0] + [calendar.monthrange(year, month)[1] for year in [syear] for month in range(1, 13) ]
|
||||
if value > numdays[smonth]:
|
||||
value = numdays[smonth]
|
||||
|
||||
# set the date/ time spin buttons...
|
||||
# set the date/ time SpinButttons
|
||||
self.exif_widgets[widget].set_value(value)
|
||||
|
||||
def _get_spin_value(self, pos):
|
||||
"""
|
||||
will retrieve the spinner's value and format it as two digit integer...
|
||||
"""
|
||||
|
||||
value = self.exif_widgets[pos].get_value_as_int()
|
||||
|
||||
if pos == "Day":
|
||||
syear = self._get_spin_value("Year")
|
||||
smonth = self._get_spin_value("Month")
|
||||
|
||||
numdays = [0] + [_mr(year, month)[1] for year in [syear] for month in range(1, 13) ]
|
||||
|
||||
if value > numdays[smonth]:
|
||||
value = numdays[smonth]
|
||||
elif value <= 0:
|
||||
value = 1
|
||||
|
||||
return value
|
||||
|
||||
def _get_exif_keypairs(plugin_image):
|
||||
"""
|
||||
Will be used to retrieve and update the Exif metadata from the image.
|
||||
@ -1710,18 +1583,23 @@ def _format_datetime(exif_dt):
|
||||
standard Gramps date format.
|
||||
"""
|
||||
|
||||
if type(exif_dt) is not datetime:
|
||||
return exif_dt
|
||||
|
||||
date_part = gen.lib.Date()
|
||||
date_part.set_yr_mon_day(exif_dt.year, exif_dt.month, exif_dt.day)
|
||||
date_str = _dd.display(date_part)
|
||||
if type(exif_dt) == datetime:
|
||||
date_part.set_yr_mon_day(exif_dt.year, exif_dt.month, exif_dt.day)
|
||||
time_str = "%02d:%02d:%02d" % (exif_dt.hour, exif_dt.minute, exif_dt.second)
|
||||
|
||||
if exif_dt.year < 1900:
|
||||
split_time = "%02d:%02d:%02d" % (exif_dt.hour, exif_dt.minute, exif_dt.second)
|
||||
time_str = split_time.strftime('%H:%M:%S')
|
||||
else:
|
||||
time_str = exif_dt.strftime('%H:%M:%S')
|
||||
date_str = _dd.display(date_part)
|
||||
|
||||
elif type(exif_dt) == str:
|
||||
|
||||
exif_dt = _get_date_format(exif_dt)
|
||||
if exif_dt == False:
|
||||
return False
|
||||
|
||||
date_part.set_yr_mon_day(exif_dt[0], exif_dt[1], exif_dt[2])
|
||||
time_str = "%02d:%02d:%02d" % exif_dt[3:6]
|
||||
|
||||
date_str = _dd.display(date_part)
|
||||
|
||||
return _('%(date)s %(time)s') % {'date': date_str, 'time': time_str}
|
||||
|
||||
@ -1730,7 +1608,7 @@ def _get_date_format(datestr):
|
||||
attempt to retrieve date format from date string
|
||||
"""
|
||||
|
||||
# attempt to determine the dateformat of the variable passed to it...
|
||||
# attempt to determine the dateformat of the date string...
|
||||
tmpDate = False
|
||||
for dateformat in ["%Y-%m-%d %H:%M:%S", "%Y %m %d %H:%M:%S",
|
||||
"%Y-%b-%d %H:%M:%S", "%Y %b %d %H:%M:%S",
|
||||
@ -1747,7 +1625,7 @@ def _get_date_format(datestr):
|
||||
tmpDate = time.strptime(datestr, dateformat)
|
||||
break
|
||||
|
||||
# datestring format not found...
|
||||
# date string format not found...
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
@ -1783,18 +1661,14 @@ def _create_datetime(pyear, pmonth, day, hour, minutes, seconds):
|
||||
seconds = 0
|
||||
|
||||
# get the number of days in year for all months
|
||||
numdays = [0] + [_mr(year, month)[1] for year in [pyear] for month in range(1, 13) ]
|
||||
numdays = [0] + [calendar.monthrange(year, month)[1] for year in [pyear] for month in range(1, 13) ]
|
||||
if day > numdays[pmonth]:
|
||||
day = numdays[pmonth]
|
||||
elif day <= 0:
|
||||
day = 1
|
||||
|
||||
if pyear < 1900:
|
||||
try:
|
||||
tmpDate = "%04d-%02d-%02d %02d:%02d:%02d" % (pyear, pmonth, day, hour, minutes, seconds)
|
||||
except ValueError:
|
||||
tmpDate = False
|
||||
|
||||
tmpDate = "%04d-%02d-%02d %02d:%02d:%02d" % (pyear, pmonth, day, hour, minutes, seconds)
|
||||
else:
|
||||
try:
|
||||
tmpDate = datetime(pyear, pmonth, day, hour, minutes, seconds)
|
||||
@ -1802,9 +1676,6 @@ def _create_datetime(pyear, pmonth, day, hour, minutes, seconds):
|
||||
except ValueError:
|
||||
tmpDate = False
|
||||
|
||||
if tmpDate is False:
|
||||
tmpDate = ""
|
||||
|
||||
return tmpDate
|
||||
|
||||
def _process_datetime(tmpDate, exif_type =True):
|
||||
|
Loading…
x
Reference in New Issue
Block a user