X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Frender_graphic.C;h=513b602d181edb1f71eb93852ac3996e32cf52f8;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=05f939cf6871da0039204533c8db9a5d63e71094;hpb=c38370d1c3dc594b17c53c28582f8092a15901d9;p=lyx.git diff --git a/src/insets/render_graphic.C b/src/insets/render_graphic.C index 05f939cf68..513b602d18 100644 --- a/src/insets/render_graphic.C +++ b/src/insets/render_graphic.C @@ -16,40 +16,49 @@ #include "gettext.h" #include "LColor.h" +#include "lyx_main.h" +#include "lyxrc.h" #include "metricsinfo.h" -#include "frontends/font_metrics.h" +#include "frontends/FontMetrics.h" #include "frontends/Painter.h" #include "graphics/GraphicsImage.h" #include "support/filetools.h" -namespace graphics = lyx::graphics; +#include -using lyx::support::AbsolutePath; -using lyx::support::OnlyFilename; + +namespace lyx { + +using support::onlyFilename; using std::string; using std::auto_ptr; -RenderGraphic::RenderGraphic() - : checksum_(0) -{} +RenderGraphic::RenderGraphic(InsetBase const * inset) +{ + loader_.connect(boost::bind(&LyX::updateInset, + boost::cref(LyX::cref()), inset)); +} -RenderGraphic::RenderGraphic(RenderGraphic const & other) +RenderGraphic::RenderGraphic(RenderGraphic const & other, + InsetBase const * inset) : RenderBase(other), loader_(other.loader_), - params_(other.params_), - checksum_(0) -{} + params_(other.params_) +{ + loader_.connect(boost::bind(&LyX::updateInset, + boost::cref(LyX::cref()), inset)); +} -auto_ptr RenderGraphic::clone() const +auto_ptr RenderGraphic::clone(InsetBase const * inset) const { - return auto_ptr(new RenderGraphic(*this)); + return auto_ptr(new RenderGraphic(*this, inset)); } @@ -58,57 +67,66 @@ void RenderGraphic::update(graphics::Params const & params) params_ = params; if (!params_.filename.empty()) { - BOOST_ASSERT(AbsolutePath(params_.filename)); loader_.reset(params_.filename, params_); } } -bool RenderGraphic::hasFileChanged() const -{ - unsigned long const new_checksum = loader_.checksum(); - bool const file_has_changed = checksum_ != new_checksum; - if (file_has_changed) - checksum_ = new_checksum; - return file_has_changed; -} - +namespace { -boost::signals::connection RenderGraphic::connect(slot_type const & slot) const +bool displayGraphic(graphics::Params const & params) { - return loader_.connect(slot); + return params.display != graphics::NoDisplay && + lyxrc.display_graphics != graphics::NoDisplay; } -namespace { - -string const statusMessage(graphics::ImageStatus status) +docstring const statusMessage(graphics::Params const & params, + graphics::ImageStatus status) { - switch (status) { - case graphics::WaitingToLoad: - return _("Not shown."); - case graphics::Loading: - return _("Loading..."); - case graphics::Converting: - return _("Converting to loadable format..."); - case graphics::Loaded: - return _("Loaded into memory. Must now generate pixmap."); - case graphics::ScalingEtc: - return _("Scaling etc..."); - case graphics::Ready: - return _("Ready to display"); - case graphics::ErrorNoFile: - return _("No file found!"); - case graphics::ErrorConverting: - return _("Error converting to loadable format"); - case graphics::ErrorLoading: - return _("Error loading file into memory"); - case graphics::ErrorGeneratingPixmap: - return _("Error generating the pixmap"); - case graphics::ErrorUnknown: - return _("No image"); + docstring ret; + + if (!displayGraphic(params)) + ret = _("Not shown."); + else { + switch (status) { + case graphics::WaitingToLoad: + ret = _("Not shown."); + break; + case graphics::Loading: + ret = _("Loading..."); + break; + case graphics::Converting: + ret = _("Converting to loadable format..."); + break; + case graphics::Loaded: + ret = _("Loaded into memory. Generating pixmap..."); + break; + case graphics::ScalingEtc: + ret = _("Scaling etc..."); + break; + case graphics::Ready: + ret = _("Ready to display"); + break; + case graphics::ErrorNoFile: + ret = _("No file found!"); + break; + case graphics::ErrorConverting: + ret = _("Error converting to loadable format"); + break; + case graphics::ErrorLoading: + ret = _("Error loading file into memory"); + break; + case graphics::ErrorGeneratingPixmap: + ret = _("Error generating the pixmap"); + break; + case graphics::ErrorUnknown: + ret = _("No image"); + break; + } } - return string(); + + return ret; } @@ -122,9 +140,9 @@ bool readyToDisplay(graphics::Loader const & loader) } // namespace anon -void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const +bool RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const { - bool image_ready = readyToDisplay(loader_); + bool image_ready = displayGraphic(params_) && readyToDisplay(loader_); dim.asc = image_ready ? loader_.image()->getHeight() : 50; dim.des = 0; @@ -138,40 +156,44 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const LyXFont msgFont(mi.base.font); msgFont.setFamily(LyXFont::SANS_FAMILY); - string const justname = OnlyFilename(params_.filename); + // FIXME UNICODE + docstring const justname = + from_utf8(onlyFilename(params_.filename.absFilename())); if (!justname.empty()) { msgFont.setSize(LyXFont::SIZE_FOOTNOTE); - font_width = font_metrics::width(justname, msgFont); + font_width = theFontMetrics(msgFont) + .width(justname); } - string const msg = statusMessage(loader_.status()); + docstring const msg = statusMessage(params_, loader_.status()); if (!msg.empty()) { msgFont.setSize(LyXFont::SIZE_TINY); font_width = std::max(font_width, - font_metrics::width(msg, msgFont)); + theFontMetrics(msgFont).width(msg)); } dim.wid = std::max(50, font_width + 15); } + bool const changed = dim_ != dim; dim_ = dim; + return changed; } void RenderGraphic::draw(PainterInfo & pi, int x, int y) const { - if (params_.display != graphics::NoDisplay && - loader_.status() == graphics::WaitingToLoad) - loader_.startLoading(); - - if (params_.display != graphics::NoDisplay && - !loader_.monitoring()) - loader_.startMonitoring(); + if (displayGraphic(params_)) { + if (loader_.status() == graphics::WaitingToLoad) + loader_.startLoading(); + if (!loader_.monitoring()) + loader_.startMonitoring(); + } - // This will draw the graphics. If the graphics has not been loaded yet, - // we draw just a rectangle. + // This will draw the graphics. If the graphics has not been + // loaded yet, we draw just a rectangle. - if (readyToDisplay(loader_)) { + if (displayGraphic(params_) && readyToDisplay(loader_)) { pi.pain.image(x + InsetOld::TEXT_TO_INSET_OFFSET, y - dim_.asc, dim_.wid - 2 * InsetOld::TEXT_TO_INSET_OFFSET, @@ -188,17 +210,17 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const // Print the file name. LyXFont msgFont = pi.base.font; msgFont.setFamily(LyXFont::SANS_FAMILY); - string const justname = OnlyFilename(params_.filename); + string const justname = onlyFilename(params_.filename.absFilename()); if (!justname.empty()) { msgFont.setSize(LyXFont::SIZE_FOOTNOTE); pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6, - y - font_metrics::maxAscent(msgFont) - 4, - justname, msgFont); + y - theFontMetrics(msgFont).maxAscent() - 4, + from_utf8(justname), msgFont); } // Print the message. - string const msg = statusMessage(loader_.status()); + docstring const msg = statusMessage(params_, loader_.status()); if (!msg.empty()) { msgFont.setSize(LyXFont::SIZE_TINY); pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6, @@ -206,3 +228,6 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const } } } + + +} // namespace lyx