]> 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 b5c44ff265013fb4865102b91be1d394b0d4cb13..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"
 
 #include <boost/bind.hpp>
 
+using namespace std;
 
 namespace lyx {
 
-using support::onlyFilename;
-
-using std::string;
-
 
 RenderGraphic::RenderGraphic(Inset const * inset)
 {
-       loader_.connect(boost::bind(&LyX::updateInset,
-                                   boost::cref(LyX::cref()), 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_)
+RenderGraphic::RenderGraphic(RenderGraphic const & other, Inset const * inset)
+       : RenderBase(other), loader_(other.loader_), icon_(other.icon_),
+               params_(other.params_)
 {
-       loader_.connect(boost::bind(&LyX::updateInset,
-                                   boost::cref(LyX::cref()), inset));
+       loader_.connect(boost::bind(&Inset::updateFrontend, inset));
+       icon_.connect(boost::bind(&Inset::updateFrontend, inset));
 }
 
 
@@ -64,8 +61,16 @@ void RenderGraphic::update(graphics::Params const & params)
 {
        params_ = params;
 
-       if (!params_.filename.empty()) {
+       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());
        }
 }
 
@@ -142,35 +147,32 @@ 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;
 
-               Font msgFont(mi.base.font);
-               msgFont.setFamily(Font::SANS_FAMILY);
+               FontInfo msgFont(mi.base.font);
+               msgFont.setFamily(SANS_FAMILY);
 
                // FIXME UNICODE
-               docstring const justname =
-                       from_utf8(onlyFilename(params_.filename.absFilename()));
+               docstring const justname = from_utf8(params_.filename.onlyFileName());
                if (!justname.empty()) {
-                       msgFont.setSize(Font::SIZE_FOOTNOTE);
-                       font_width = theFontMetrics(msgFont)
-                               .width(justname);
+                       msgFont.setSize(FONT_SIZE_FOOTNOTE);
+                       font_width = theFontMetrics(msgFont).width(justname);
                }
 
                docstring const msg = statusMessage(params_, loader_.status());
                if (!msg.empty()) {
-                       msgFont.setSize(Font::SIZE_TINY);
-                       font_width = std::max(font_width,
+                       msgFont.setSize(FONT_SIZE_TINY);
+                       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;
@@ -184,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
@@ -204,12 +210,12 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
                                  Color_foreground);
 
                // Print the file name.
-               Font msgFont = pi.base.font;
-               msgFont.setFamily(Font::SANS_FAMILY);
-               string const justname = onlyFilename(params_.filename.absFilename());
+               FontInfo msgFont = pi.base.font;
+               msgFont.setFamily(SANS_FAMILY);
+               string const justname = params_.filename.onlyFileName();
 
                if (!justname.empty()) {
-                       msgFont.setSize(Font::SIZE_FOOTNOTE);
+                       msgFont.setSize(FONT_SIZE_FOOTNOTE);
                        pi.pain.text(x + Inset::TEXT_TO_INSET_OFFSET + 6,
                                   y - theFontMetrics(msgFont).maxAscent() - 4,
                                   from_utf8(justname), msgFont);
@@ -218,11 +224,14 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
                // Print the message.
                docstring const msg = statusMessage(params_, loader_.status());
                if (!msg.empty()) {
-                       msgFont.setSize(Font::SIZE_TINY);
+                       msgFont.setSize(FONT_SIZE_TINY);
                        pi.pain.text(x + Inset::TEXT_TO_INSET_OFFSET + 6,
                                     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());
 }