X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Frender_graphic.C;h=513b602d181edb1f71eb93852ac3996e32cf52f8;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=52186bc9f4c78c28bb508d72fb38e89359059ee2;hpb=122e7616d75f7148068f55634d145b942183dc44;p=lyx.git diff --git a/src/insets/render_graphic.C b/src/insets/render_graphic.C index 52186bc9f4..513b602d18 100644 --- a/src/insets/render_graphic.C +++ b/src/insets/render_graphic.C @@ -16,109 +16,133 @@ #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" +#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)); +} -RenderBase * RenderGraphic::clone() const +auto_ptr RenderGraphic::clone(InsetBase const * inset) const { - return new RenderGraphic(*this); + return auto_ptr(new RenderGraphic(*this, inset)); } -void RenderGraphic::update(lyx::graphics::Params const & params) +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; } -string const RenderGraphic::statusMessage() const +docstring const statusMessage(graphics::Params const & params, + graphics::ImageStatus status) { - switch (loader_.status()) { - case lyx::graphics::WaitingToLoad: - return _("Not shown."); - case lyx::graphics::Loading: - return _("Loading..."); - case lyx::graphics::Converting: - return _("Converting to loadable format..."); - case lyx::graphics::Loaded: - return _("Loaded into memory. Must now generate pixmap."); - case lyx::graphics::ScalingEtc: - return _("Scaling etc..."); - case lyx::graphics::Ready: - return _("Ready to display"); - case lyx::graphics::ErrorNoFile: - return _("No file found!"); - case lyx::graphics::ErrorConverting: - return _("Error converting to loadable format"); - case lyx::graphics::ErrorLoading: - return _("Error loading file into memory"); - case lyx::graphics::ErrorGeneratingPixmap: - return _("Error generating the pixmap"); - case lyx::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; } -bool RenderGraphic::readyToDisplay() const +bool readyToDisplay(graphics::Loader const & loader) { - if (!loader_.image() || loader_.status() != lyx::graphics::Ready) + if (!loader.image() || loader.status() != graphics::Ready) return false; - return loader_.image()->isDrawable(); + return loader.image()->isDrawable(); } +} // namespace anon + -void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const +bool RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const { - bool image_ready = readyToDisplay(); + bool image_ready = displayGraphic(params_) && readyToDisplay(loader_); dim.asc = image_ready ? loader_.image()->getHeight() : 50; dim.des = 0; @@ -132,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(); + 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 != lyx::graphics::NoDisplay && - loader_.status() == lyx::graphics::WaitingToLoad) - loader_.startLoading(); - - if (params_.display != lyx::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()) { + 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, @@ -182,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(); + 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, @@ -200,3 +228,6 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const } } } + + +} // namespace lyx