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
79 pi.pain.rectangle(x, y - dim_.asc, dim_.wid, dim_.height(),
82 pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
87 boost::signals::connection RenderPreview::connect(slot_type const & slot)
89 return preview_ready_signal_.connect(slot);
93 void RenderPreview::generatePreview(string const & latex_snippet,
94 Buffer const & buffer)
99 graphics::Previews & previews = graphics::Previews::get();
100 graphics::PreviewLoader & loader = previews.loader(buffer);
101 addPreview(latex_snippet, loader);
102 if (!snippet_.empty())
103 loader.startLoading();
107 void RenderPreview::addPreview(string const & latex_snippet,
108 graphics::PreviewLoader & ploader)
113 snippet_ = support::trim(latex_snippet);
115 if (snippet_.empty())
118 pimage_ = ploader.preview(snippet_);
122 // If this is the first time of calling, connect to the
123 // PreviewLoader signal that'll inform us when the preview image
124 // is ready for loading.
125 if (!ploader_connection_.connected()) {
126 ploader_connection_ = ploader.connect(
127 boost::bind(&RenderPreview::imageReady, this, _1));
130 ploader.add(snippet_);
134 void RenderPreview::removePreview(Buffer const & buffer)
136 if (snippet_.empty())
139 graphics::Previews & previews = graphics::Previews::get();
140 graphics::PreviewLoader & loader = previews.loader(buffer);
141 loader.remove(snippet_);
147 bool RenderPreview::previewReady() const
149 return pimage_ ? pimage_->image() : false;
153 void RenderPreview::imageReady(graphics::PreviewImage const & pimage)
155 // Check the current snippet is the same as that previewed.
156 if (snippet_ != pimage.snippet())
160 preview_ready_signal_();
164 void RenderMonitoredPreview::startMonitoring(string const & file)
166 monitor_.reset(file);
171 boost::signals::connection
172 RenderMonitoredPreview::fileChanged(slot_type const & slot)
174 return monitor_.connect(slot);