diff --git a/development/scons/scons_manifest.py b/development/scons/scons_manifest.py index 5b4743c791..4abc860d7f 100644 --- a/development/scons/scons_manifest.py +++ b/development/scons/scons_manifest.py @@ -1428,6 +1428,7 @@ lib_images_files = Split(''' note-next.png paste.png promote.png + pin.png psnfss1.png psnfss2.png psnfss3.png diff --git a/lib/Makefile.am b/lib/Makefile.am index ac476b2708..262aee34d9 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -335,6 +335,7 @@ dist_images_DATA = \ images/note-insert.png \ images/note-next.png \ images/paste.png \ + images/pin.png \ images/promote.png \ images/psnfss1.png \ images/psnfss2.png \ diff --git a/lib/images/pin.png b/lib/images/pin.png new file mode 100644 index 0000000000..c1f9a75b72 Binary files /dev/null and b/lib/images/pin.png differ diff --git a/src/graphics/GraphicsParams.cpp b/src/graphics/GraphicsParams.cpp index a88d6dc5c0..e5c9b3d24f 100644 --- a/src/graphics/GraphicsParams.cpp +++ b/src/graphics/GraphicsParams.cpp @@ -24,7 +24,8 @@ namespace graphics { Params::Params() : display(ColorDisplay), scale(100), - angle(0) + angle(0), + icon("") {} @@ -34,7 +35,8 @@ bool operator==(Params const & a, Params const & b) a.display == b.display && a.bb == b.bb && a.scale == b.scale && - a.angle == b.angle); + a.angle == b.angle && + a.icon == b.icon); } diff --git a/src/graphics/GraphicsParams.h b/src/graphics/GraphicsParams.h index a7b7c8ffa4..d086a25857 100644 --- a/src/graphics/GraphicsParams.h +++ b/src/graphics/GraphicsParams.h @@ -72,6 +72,12 @@ public: */ /// Rotation angle. double angle; + + /** The icon to be displayed to the top-left corner of an image. + * It is mutable because an icon reflects a temporary state of + * the image, and is variable. + */ + mutable std::string icon; }; bool operator==(Params const &, Params const &); diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp index 36ad1b7f40..687014677b 100644 --- a/src/insets/InsetGraphics.cpp +++ b/src/insets/InsetGraphics.cpp @@ -173,7 +173,7 @@ void InsetGraphics::doDispatch(Cursor & cur, FuncRequest & cmd) InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), buffer, p); if (!p.filename.empty()) { try { - updateEmbeddedFile(buffer, p.filename); + p.filename.enable(buffer.embeddedFiles().enabled(), &buffer); } catch (ExceptionMessage const & message) { Alert::error(message.title_, message.details_); // do not set parameter if an error happens diff --git a/src/insets/InsetGraphicsParams.cpp b/src/insets/InsetGraphicsParams.cpp index 5df541bf7d..a0dba1a5d1 100644 --- a/src/insets/InsetGraphicsParams.cpp +++ b/src/insets/InsetGraphicsParams.cpp @@ -274,6 +274,7 @@ graphics::Params InsetGraphicsParams::as_grfxParams() const { graphics::Params pars; pars.filename = filename.availableFile(); + pars.icon = filename.embedded() ? "pin.png" : ""; pars.scale = lyxscale; pars.angle = convert(rotateAngle); diff --git a/src/insets/RenderGraphic.cpp b/src/insets/RenderGraphic.cpp index 05ce78a938..3520290a97 100644 --- a/src/insets/RenderGraphic.cpp +++ b/src/insets/RenderGraphic.cpp @@ -14,6 +14,8 @@ #include "insets/Inset.h" +#include "support/FileName.h" +#include "support/filetools.h" #include "support/gettext.h" #include "LyX.h" #include "LyXRC.h" @@ -36,13 +38,16 @@ namespace lyx { RenderGraphic::RenderGraphic(Inset const * inset) { loader_.connect(boost::bind(&Inset::updateFrontend, inset)); + icon_.connect(boost::bind(&Inset::updateFrontend, inset)); } RenderGraphic::RenderGraphic(RenderGraphic const & other, Inset const * inset) - : RenderBase(other), loader_(other.loader_), params_(other.params_) + : RenderBase(other), loader_(other.loader_), icon_(other.icon_), + params_(other.params_) { loader_.connect(boost::bind(&Inset::updateFrontend, inset)); + icon_.connect(boost::bind(&Inset::updateFrontend, inset)); } @@ -58,6 +63,15 @@ void RenderGraphic::update(graphics::Params const & params) if (!params_.filename.empty()) loader_.reset(params_.filename, params_); + // If icon is set to empty, icon_ will not be reset to empty + // but will not be displayed. This is to avoid repeated loading + // of the same icon when figure status changes. + if (!params_.icon.empty()) { + support::FileName const icon = support::libFileSearch("images/", + params_.icon, "png"); + if (!icon.empty()) // using an empty bounding box + icon_.reset(icon, graphics::Params()); + } } @@ -172,6 +186,10 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const loader_.startLoading(); if (!loader_.monitoring()) loader_.startMonitoring(); + if (icon_.status() == graphics::WaitingToLoad) + icon_.startLoading(); + if (!icon_.monitoring()) + icon_.startMonitoring(); } // This will draw the graphics. If the graphics has not been @@ -211,6 +229,9 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const y - 4, msg, msgFont); } } + if (!params_.icon.empty() && readyToDisplay(icon_)) + pi.pain.image(x + Inset::TEXT_TO_INSET_OFFSET, y - dim_.asc, + 10, 10, *icon_.image()); } diff --git a/src/insets/RenderGraphic.h b/src/insets/RenderGraphic.h index 5edb7ce940..938322fad0 100644 --- a/src/insets/RenderGraphic.h +++ b/src/insets/RenderGraphic.h @@ -45,6 +45,7 @@ private: /// The stored data. graphics::Loader loader_; + graphics::Loader icon_; graphics::Params params_; };