X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Frender_preview.C;h=e6882fb32ff8c2271487a3edcef47cf75e658923;hb=5603df4a5b7e511b31026c9a4f8f55b2b10fde57;hp=f1dd4511c96fa3c52d0cf01c6361d6546a58856f;hpb=11c6ea653ba7c601bedee9c2ea64ad5feff60357;p=lyx.git diff --git a/src/insets/render_preview.C b/src/insets/render_preview.C index f1dd4511c9..e6882fb32f 100644 --- a/src/insets/render_preview.C +++ b/src/insets/render_preview.C @@ -17,6 +17,8 @@ #include "dimension.h" #include "gettext.h" #include "LColor.h" +#include "lyx_main.h" +#include "lyxrc.h" #include "metricsinfo.h" #include "frontends/font_metrics.h" @@ -31,45 +33,53 @@ #include using std::string; +using std::auto_ptr; namespace graphics = lyx::graphics; namespace support = lyx::support; -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 new RenderPreview(*this); + return auto_ptr(new RenderPreview(*this, inset)); } namespace { +graphics::PreviewLoader & getPreviewLoader(Buffer const & buffer) +{ + graphics::Previews const & previews = graphics::Previews::get(); + return previews.loader(buffer); +} + + string const statusMessage(BufferView const * bv, string const & snippet) { BOOST_ASSERT(bv && bv->buffer()); Buffer const & buffer = *bv->buffer(); - graphics::Previews const & previews = graphics::Previews::get(); - graphics::PreviewLoader const & loader = previews.loader(buffer); + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); graphics::PreviewLoader::Status const status = loader.status(snippet); string message; @@ -92,12 +102,25 @@ string const statusMessage(BufferView const * bv, string const & snippet) } // namespace anon +graphics::PreviewImage const * +RenderPreview::getPreviewImage(Buffer const & buffer) const +{ + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); + return loader.preview(snippet_); +} + + void RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const { - if (previewReady()) { - dim.asc = pimage_->ascent(); - dim.des = pimage_->descent(); - dim.wid = pimage_->width(); + 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 = 50; dim.des = 0; @@ -116,44 +139,42 @@ void RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const void RenderPreview::draw(PainterInfo & pi, int x, int y) const { - BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer()); - Buffer const & buffer = *pi.base.bv->buffer(); - startLoading(buffer); + BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer()); - if (previewReady()) { + 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())); - return; - } + *image); - pi.pain.rectangle(x + InsetOld::TEXT_TO_INSET_OFFSET, - y - dim_.asc, - dim_.wid - 2 * InsetOld::TEXT_TO_INSET_OFFSET, - dim_.asc + dim_.des, - LColor::foreground); - - LyXFont font(pi.base.font); - font.setFamily(LyXFont::SANS_FAMILY); - font.setSize(LyXFont::SIZE_FOOTNOTE); - pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6, - y - font_metrics::maxAscent(font) - 4, - statusMessage(pi.base.bv, snippet_), font); -} + } 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); -boost::signals::connection RenderPreview::connect(slot_type const & slot) -{ - return preview_ready_signal_.connect(slot); + LyXFont font(pi.base.font); + font.setFamily(LyXFont::SANS_FAMILY); + font.setSize(LyXFont::SIZE_FOOTNOTE); + + pi.pain.text(x + offset + 6, + y - font_metrics::maxAscent(font) - 4, + statusMessage(pi.base.bv, snippet_), font); + } } void RenderPreview::startLoading(Buffer const & buffer) const { - if (!activated() && !snippet_.empty()) + if (status() == LyXRC::PREVIEW_OFF || snippet_.empty()) return; - graphics::Previews & previews = graphics::Previews::get(); - graphics::PreviewLoader & loader = previews.loader(buffer); + graphics::PreviewLoader const & loader = getPreviewLoader(buffer); loader.startLoading(); } @@ -161,11 +182,10 @@ void RenderPreview::startLoading(Buffer const & buffer) const void RenderPreview::addPreview(string 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); } @@ -173,16 +193,14 @@ void RenderPreview::addPreview(string const & latex_snippet, void RenderPreview::addPreview(string const & latex_snippet, graphics::PreviewLoader & ploader) { - if (!activated()) + if (status() == LyXRC::PREVIEW_OFF) return; snippet_ = support::trim(latex_snippet); - pimage_ = 0; 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 @@ -202,31 +220,26 @@ 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 -{ - return pimage_ ? pimage_->image() : false; } void RenderPreview::imageReady(graphics::PreviewImage const & pimage) { // Check the current snippet is the same as that previewed. - if (snippet_ != pimage.snippet()) - return; - - pimage_ = &pimage; - preview_ready_signal_(); + if (snippet_ == pimage.snippet()) + LyX::cref().updateInset(parent_); } +RenderMonitoredPreview::RenderMonitoredPreview(InsetBase const * inset) + : RenderPreview(inset), + monitor_(std::string(), 2000) +{} + + void RenderMonitoredPreview::setAbsFile(string const & file) { monitor_.reset(file);