# Sketch - A Python-based interactive drawing program
# Copyright (C) 2002 by Bernhard Herzog
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library 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
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""User Script that reloads the image data of an external image or
updates the preview of an EPS file.
"""
import Sketch
from Sketch import _
import Sketch.Scripting
from Sketch.Graphics import external,eps
def reload_image(context):
image = context.document.CurrentObject()
if image is not None and isinstance(image, external.ExternalGraphics):
# Don't try this at home :) It pokes around in the internals of
# Sketch!
olddata = image.data
filename = olddata.Filename()
oldrect = image.bounding_rect
# first, remove the old object from the cache.
if olddata.stored_in_cache \
and external.instance_cache.has_key(filename):
del external.instance_cache[filename]
olddata.stored_in_cache = 0
# now we can load the data again the normal way because it's not
# in the cache anymore.
if image.is_Eps:
data = eps.load_eps(filename)
else:
data = Sketch.load_image(filename)
# replace the old data object with the new one. Normally we
# would have to handle the undo info returned. Here we just
# discard it so that the reload won't be in the history.
image.SetData(data)
# some house keeping tasks that are necessary because the sort
# of thing we're doing here, i.e. modifying an object without
# undo information etc., wasn't anticipated:
# to make sure that the bboxes get recomputed etc, call the
# _changed method. SetData should probably do that
# automatically, but currently it doesn't
image._changed()
# make sure the object itself is properly redrawn
context.document.AddClearRect(oldrect)
context.document.AddClearRect(image.bounding_rect)
# make sure the selection's idea of the bounding rect is updated
# too and have the canvas update the handles
context.document.selection.ResetRectangle()
context.main_window.canvas.update_handles()
Sketch.Scripting.AddFunction('reload_image', _("Reload Image"),
reload_image,
script_type = Sketch.Scripting.AdvancedScript)
|