3 * Copyright 2002 the LyX Team
4 * Read the file COPYING
6 * \author Angus Leeming <a.leeming@ic.ac.uk>
12 #pragma implementation
15 #include "PreviewImage.h"
16 #include "PreviewLoader.h"
17 #include "GraphicsImage.h"
18 #include "GraphicsLoader.h"
22 #include "support/lyxlib.h"
24 #include <boost/bind.hpp>
25 #include <boost/signals/trackable.hpp>
30 struct PreviewImage::Impl : public boost::signals::trackable {
32 Impl(PreviewImage & p, PreviewLoader & l,
33 string const & s, string const & f, double af);
39 Image const * image();
44 PreviewImage const & parent_;
46 PreviewLoader & ploader_;
48 boost::scoped_ptr<Loader> const iloader_;
50 string const snippet_;
52 double const ascent_frac_;
56 PreviewImage::PreviewImage(PreviewLoader & l,
60 : pimpl_(new Impl(*this, l, s, f, af))
64 PreviewImage::~PreviewImage()
68 void PreviewImage::startLoading()
70 return pimpl_->startLoading();
74 string const & PreviewImage::snippet() const
76 return pimpl_->snippet_;
79 int PreviewImage::ascent() const
81 Image const * const image = pimpl_->image();
85 return int(pimpl_->ascent_frac_ * double(image->getHeight()));
89 int PreviewImage::descent() const
91 Image const * const image = pimpl_->image();
95 // Avoids rounding errors.
96 return image->getHeight() - ascent();
100 int PreviewImage::width() const
102 Image const * const image = pimpl_->image();
103 return image ? image->getWidth() : 0;
107 Image const * PreviewImage::image() const
109 return pimpl_->image();
113 PreviewImage::Impl::Impl(PreviewImage & p, PreviewLoader & l,
117 : parent_(p), ploader_(l), iloader_(new Loader(bf)),
118 snippet_(s), ascent_frac_(af)
122 PreviewImage::Impl::~Impl()
124 lyx::unlink(iloader_->filename());
128 void PreviewImage::Impl::startLoading()
130 if (iloader_->status() != WaitingToLoad)
133 iloader_->statusChanged.connect(
134 boost::bind(&Impl::statusChanged, this));
135 iloader_->startLoading();
139 Image const * PreviewImage::Impl::image()
142 return iloader_->image();
145 void PreviewImage::Impl::statusChanged()
147 switch (iloader_->status()) {
156 case ErrorConverting:
158 case ErrorGeneratingPixmap:
160 //lyx::unlink(iloader_->filename());
161 ploader_.remove(snippet_);
165 lyx::unlink(iloader_->filename());
166 ploader_.imageReady(parent_);