X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Frender_preview.C;h=5badea260db3690bd1119f9f68fb81e19a8ced4d;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=60b611bb58a0c05b1418d6278ba48c44a69a9054;hpb=dff822442ad64ea35cfa7ed7265f24624093a476;p=lyx.git diff --git a/src/insets/render_preview.C b/src/insets/render_preview.C index 60b611bb58..5badea260d 100644 --- a/src/insets/render_preview.C +++ b/src/insets/render_preview.C @@ -10,116 +10,204 @@ #include -#include "render_preview.h" +#include "insets/render_preview.h" +#include "insets/inset.h" +#include "BufferView.h" #include "dimension.h" +#include "gettext.h" #include "LColor.h" +#include "lyx_main.h" +#include "lyxrc.h" #include "metricsinfo.h" +#include "frontends/FontMetrics.h" #include "frontends/Painter.h" #include "graphics/PreviewImage.h" #include "graphics/PreviewLoader.h" #include "graphics/Previews.h" +#include "support/filename.h" #include "support/lstrings.h" #include -using std::string; -namespace graphics = lyx::graphics; -namespace support = lyx::support; +namespace lyx { + +using support::FileName; + +using std::string; +using std::auto_ptr; -bool RenderPreview::activated() +LyXRC_PreviewStatus RenderPreview::status() { - return graphics::Previews::activated(); + return graphics::Previews::status(); } -RenderPreview::RenderPreview() - : pimage_(0) +RenderPreview::RenderPreview(InsetBase const * inset) + : parent_(inset) {} -RenderPreview::RenderPreview(RenderPreview const & other) +RenderPreview::RenderPreview(RenderPreview const & other, + InsetBase const * inset) : RenderBase(other), boost::signals::trackable(), snippet_(other.snippet_), - pimage_(0) + parent_(inset) {} -RenderBase * RenderPreview::clone() const +auto_ptr RenderPreview::clone(InsetBase const * inset) const +{ + return auto_ptr(new RenderPreview(*this, inset)); +} + + +namespace { + +graphics::PreviewLoader & getPreviewLoader(Buffer const & buffer) { - return new RenderPreview(*this); + graphics::Previews const & previews = graphics::Previews::get(); + return previews.loader(buffer); } -void RenderPreview::metrics(MetricsInfo &, Dimension & dim) const +docstring const statusMessage(BufferView const * bv, string const & snippet) { - if (previewReady()) { - dim.asc = pimage()->ascent(); - dim.des = pimage()->descent(); - dim.wid = pimage()->width(); + BOOST_ASSERT(bv && bv->buffer()); + + Buffer const & buffer = *bv->buffer(); + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); + graphics::PreviewLoader::Status const status = loader.status(snippet); + + docstring message; + switch (status) { + case graphics::PreviewLoader::InQueue: + case graphics::PreviewLoader::Processing: + message = _("Preview loading"); + break; + case graphics::PreviewLoader::Ready: + message = _("Preview ready"); + break; + case graphics::PreviewLoader::NotFound: + message = _("Preview failed"); + break; + } + + return message; +} + +} // namespace anon + + +graphics::PreviewImage const * +RenderPreview::getPreviewImage(Buffer const & buffer) const +{ + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); + return loader.preview(snippet_); +} + + +bool RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const +{ + BOOST_ASSERT(mi.base.bv && mi.base.bv->buffer()); + + graphics::PreviewImage const * const pimage = + getPreviewImage(*mi.base.bv->buffer()); + + if (pimage) { + dim.asc = pimage->ascent(); + dim.des = pimage->descent(); + dim.wid = pimage->width(); } else { - dim.asc = 20; - dim.des = 20; - dim.wid = 20; + dim.asc = 50; + dim.des = 0; + + LyXFont font(mi.base.font); + font.setFamily(LyXFont::SANS_FAMILY); + font.setSize(LyXFont::SIZE_FOOTNOTE); + docstring const stat = statusMessage(mi.base.bv, snippet_); + dim.wid = 15 + theFontMetrics(font).width(stat); } + bool const changed = dim_ != dim; dim_ = dim; + return changed; } void RenderPreview::draw(PainterInfo & pi, int x, int y) const { - BOOST_ASSERT(pi.base.bv); - view_ = pi.base.bv->owner()->view(); + BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer()); - if (!previewReady()) - pi.pain.rectangle(x, y - dim_.asc, dim_.wid, dim_.height(), - LColor::foreground); - else + graphics::PreviewImage const * const pimage = + getPreviewImage(*pi.base.bv->buffer()); + graphics::Image const * const image = pimage ? pimage->image() : 0; + + if (image) { pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(), - *(pimage()->image())); + *image); + + } else { + int const offset = InsetOld::TEXT_TO_INSET_OFFSET; + + pi.pain.rectangle(x + offset, + y - dim_.asc, + dim_.wid - 2 * offset, + dim_.asc + dim_.des, + LColor::foreground); + + LyXFont font(pi.base.font); + font.setFamily(LyXFont::SANS_FAMILY); + font.setSize(LyXFont::SIZE_FOOTNOTE); + + docstring const stat = statusMessage(pi.base.bv, snippet_); + pi.pain.text(x + offset + 6, + y - theFontMetrics(font).maxAscent() - 4, + stat, font); + } } -boost::signals::connection RenderPreview::connect(slot_type const & slot) +void RenderPreview::startLoading(Buffer const & buffer) const { - return preview_ready_signal_.connect(slot); + if (status() == LyXRC::PREVIEW_OFF || snippet_.empty()) + return; + + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); + loader.startLoading(); } -void RenderPreview::generatePreview(string const & latex_snippet, - Buffer const & buffer) +void RenderPreview::addPreview(docstring const & latex_snippet, + Buffer const & buffer) { - if (!activated()) + if (status() == LyXRC::PREVIEW_OFF) return; - graphics::Previews & previews = graphics::Previews::get(); - graphics::PreviewLoader & loader = previews.loader(buffer); + graphics::PreviewLoader & loader = getPreviewLoader(buffer); addPreview(latex_snippet, loader); - if (!snippet_.empty()) - loader.startLoading(); } -void RenderPreview::addPreview(string const & latex_snippet, - graphics::PreviewLoader & ploader) +void RenderPreview::addPreview(docstring const & latex_snippet, + graphics::PreviewLoader & ploader) { - if (!activated()) + if (status() == LyXRC::PREVIEW_OFF) return; - snippet_ = support::trim(latex_snippet); - pimage_ = 0; + // FIXME UNICODE + // We have to make sure that we call latex with the right encoding + snippet_ = support::trim(to_utf8(latex_snippet)); if (snippet_.empty()) return; - pimage_ = ploader.preview(snippet_); - if (pimage_) + if (ploader.preview(snippet_)) return; // If this is the first time of calling, connect to the @@ -139,35 +227,37 @@ void RenderPreview::removePreview(Buffer const & buffer) if (snippet_.empty()) return; - graphics::Previews & previews = graphics::Previews::get(); - graphics::PreviewLoader & loader = previews.loader(buffer); + graphics::PreviewLoader & loader = getPreviewLoader(buffer); loader.remove(snippet_); snippet_.erase(); - pimage_ = 0; } -bool RenderPreview::previewReady() const +void RenderPreview::imageReady(graphics::PreviewImage const & pimage) { - return pimage_ ? pimage_->image() : false; + // Check the current snippet is the same as that previewed. + if (snippet_ == pimage.snippet()) + LyX::cref().updateInset(parent_); } -void RenderPreview::imageReady(graphics::PreviewImage const & pimage) -{ - // Check the current snippet is the same as that previewed. - if (snippet_ != pimage.snippet()) - return; +RenderMonitoredPreview::RenderMonitoredPreview(InsetBase const * inset) + : RenderPreview(inset), + monitor_(FileName(), 2000) +{} - pimage_ = &pimage; - preview_ready_signal_(); + +void RenderMonitoredPreview::setAbsFile(FileName const & file) +{ + monitor_.reset(file); } -void RenderMonitoredPreview::startMonitoring(string const & file) +void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y) const { - monitor_.reset(file); - monitor_.start(); + RenderPreview::draw(pi, x, y); + if (!monitoring()) + startMonitoring(); } @@ -176,3 +266,5 @@ RenderMonitoredPreview::fileChanged(slot_type const & slot) { return monitor_.connect(slot); } + +} // namespace lyx