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 "PreviewImage.h"
14 #include "PreviewLoader.h"
15 #include "GraphicsImage.h"
16 #include "GraphicsLoader.h"
18 #include "support/lyxlib.h"
20 #include <boost/bind.hpp>
21 #include <boost/signals/trackable.hpp>
23 using namespace lyx::support;
27 struct PreviewImage::Impl : public boost::signals::trackable {
29 Impl(PreviewImage & p, PreviewLoader & l,
30 string const & s, string const & f, double af);
34 Image const * image();
39 PreviewImage const & parent_;
41 PreviewLoader & ploader_;
45 string const snippet_;
47 double const ascent_frac_;
51 PreviewImage::PreviewImage(PreviewLoader & l,
55 : pimpl_(new Impl(*this, l, s, f, af))
59 PreviewImage::~PreviewImage()
63 string const & PreviewImage::snippet() const
65 return pimpl_->snippet_;
69 int PreviewImage::ascent() const
71 Image const * const image = pimpl_->iloader_.image();
75 return int(pimpl_->ascent_frac_ * double(image->getHeight()));
79 int PreviewImage::descent() const
81 Image const * const image = pimpl_->iloader_.image();
85 // Avoids rounding errors.
86 return image->getHeight() - ascent();
90 int PreviewImage::width() const
92 Image const * const image = pimpl_->iloader_.image();
93 return image ? image->getWidth() : 0;
97 Image const * PreviewImage::image() const
99 return pimpl_->image();
103 PreviewImage::Impl::Impl(PreviewImage & p, PreviewLoader & l,
107 : parent_(p), ploader_(l), iloader_(bf),
108 snippet_(s), ascent_frac_(af)
110 iloader_.connect(boost::bind(&Impl::statusChanged, this));
114 PreviewImage::Impl::~Impl()
116 unlink(iloader_.filename());
120 Image const * PreviewImage::Impl::image()
122 if (iloader_.status() == WaitingToLoad)
123 iloader_.startLoading();
125 return iloader_.image();
129 void PreviewImage::Impl::statusChanged()
131 switch (iloader_.status()) {
140 case ErrorConverting:
142 case ErrorGeneratingPixmap:
144 //lyx::unlink(iloader_.filename());
145 ploader_.remove(snippet_);
149 unlink(iloader_.filename());
150 ploader_.emitSignal(parent_);