]> git.lyx.org Git - lyx.git/blobdiff - src/insets/RenderGraphic.cpp
* Inset: Prepare for an eventual merge of updateLabels() and addToToc()
[lyx.git] / src / insets / RenderGraphic.cpp
index 74e31819896d852e598eb5adeac67b9afe95733c..3520290a973bff05ae6a1c44fa2e355fbd114187 100644 (file)
@@ -14,7 +14,9 @@
 
 #include "insets/Inset.h"
 
-#include "gettext.h"
+#include "support/FileName.h"
+#include "support/filetools.h"
+#include "support/gettext.h"
 #include "LyX.h"
 #include "LyXRC.h"
 #include "MetricsInfo.h"
@@ -28,6 +30,7 @@
 
 #include <boost/bind.hpp>
 
+using namespace std;
 
 namespace lyx {
 
@@ -35,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));
 }
 
 
@@ -57,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());
+       }
 }
 
 
@@ -132,12 +147,11 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        bool image_ready = displayGraphic(params_) && readyToDisplay(loader_);
 
-       dim.asc = image_ready ? loader_.image()->getHeight() : 50;
+       dim.asc = image_ready ? loader_.image()->height() : 50;
        dim.des = 0;
 
        if (image_ready) {
-               dim.wid = loader_.image()->getWidth() +
-                       2 * Inset::TEXT_TO_INSET_OFFSET;
+               dim.wid = loader_.image()->width() + 2 * Inset::TEXT_TO_INSET_OFFSET;
        } else {
                int font_width = 0;
 
@@ -154,11 +168,11 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
                docstring const msg = statusMessage(params_, loader_.status());
                if (!msg.empty()) {
                        msgFont.setSize(FONT_SIZE_TINY);
-                       font_width = std::max(font_width,
+                       font_width = max(font_width,
                                theFontMetrics(msgFont).width(msg));
                }
 
-               dim.wid = std::max(50, font_width + 15);
+               dim.wid = max(50, font_width + 15);
        }
 
        dim_ = dim;
@@ -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
@@ -194,7 +212,7 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
                // Print the file name.
                FontInfo msgFont = pi.base.font;
                msgFont.setFamily(SANS_FAMILY);
-               std::string const justname = params_.filename.onlyFileName();
+               string const justname = params_.filename.onlyFileName();
 
                if (!justname.empty()) {
                        msgFont.setSize(FONT_SIZE_FOOTNOTE);
@@ -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());
 }