2 * \file render_preview.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
8 * Full author contact details are available in file CREDITS.
13 #include "render_preview.h"
15 #include "dimension.h"
17 #include "metricsinfo.h"
19 #include "frontends/Painter.h"
21 #include "graphics/PreviewImage.h"
22 #include "graphics/PreviewLoader.h"
23 #include "graphics/Previews.h"
25 #include "support/lstrings.h"
27 #include <boost/bind.hpp>
31 namespace graphics = lyx::graphics;
32 namespace support = lyx::support;
35 bool RenderPreview::activated()
37 return graphics::Previews::activated();
41 RenderPreview::RenderPreview()
46 RenderPreview::RenderPreview(RenderPreview const & other)
48 boost::signals::trackable(),
49 snippet_(other.snippet_),
54 RenderBase * RenderPreview::clone() const
56 return new RenderPreview(*this);
60 void RenderPreview::metrics(MetricsInfo &, Dimension & dim) const
63 dim.asc = pimage()->ascent();
64 dim.des = pimage()->descent();
65 dim.wid = pimage()->width();
76 void RenderPreview::draw(PainterInfo & pi, int x, int y) const
78 BOOST_ASSERT(pi.base.bv);
79 view_ = pi.base.bv->owner()->view();
82 pi.pain.rectangle(x, y - dim_.asc, dim_.wid, dim_.height(),
85 pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
86 *(pimage()->image()));
90 boost::signals::connection RenderPreview::connect(slot_type const & slot)
92 return preview_ready_signal_.connect(slot);
96 void RenderPreview::generatePreview(string const & latex_snippet,
97 Buffer const & buffer)
102 graphics::Previews & previews = graphics::Previews::get();
103 graphics::PreviewLoader & loader = previews.loader(buffer);
104 addPreview(latex_snippet, loader);
105 if (!snippet_.empty())
106 loader.startLoading();
110 void RenderPreview::addPreview(string const & latex_snippet,
111 graphics::PreviewLoader & ploader)
116 snippet_ = support::trim(latex_snippet);
118 if (snippet_.empty())
121 pimage_ = ploader.preview(snippet_);
125 // If this is the first time of calling, connect to the
126 // PreviewLoader signal that'll inform us when the preview image
127 // is ready for loading.
128 if (!ploader_connection_.connected()) {
129 ploader_connection_ = ploader.connect(
130 boost::bind(&RenderPreview::imageReady, this, _1));
133 ploader.add(snippet_);
137 void RenderPreview::removePreview(Buffer const & buffer)
139 if (snippet_.empty())
142 graphics::Previews & previews = graphics::Previews::get();
143 graphics::PreviewLoader & loader = previews.loader(buffer);
144 loader.remove(snippet_);
150 bool RenderPreview::previewReady() const
152 return pimage_ ? pimage_->image() : false;
156 void RenderPreview::imageReady(graphics::PreviewImage const & pimage)
158 // Check the current snippet is the same as that previewed.
159 if (snippet_ != pimage.snippet())
163 preview_ready_signal_();
167 void RenderMonitoredPreview::startMonitoring(string const & file)
169 monitor_.reset(file);
174 boost::signals::connection
175 RenderMonitoredPreview::fileChanged(slot_type const & slot)
177 return monitor_.connect(slot);