-/*
+/**
* \file GraphicsLoader.C
- * Copyright 2002 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * \author Angus Leeming <leeming@lyx.org>
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "GraphicsLoader.h"
-#include "GraphicsCache.h"
+
#include "GraphicsCacheItem.h"
#include "GraphicsImage.h"
#include "GraphicsParams.h"
+#include "LoaderQueue.h"
#include <boost/bind.hpp>
-#include <boost/signals/trackable.hpp>
-namespace grfx {
-struct Loader::Impl : boost::signals::trackable {
+using std::string;
+
+
+namespace lyx {
+
+using support::FileName;
+
+namespace graphics {
+
+class Loader::Impl : public boost::signals::trackable {
+public:
///
- Impl(Loader &, Params const &);
+ Impl();
///
~Impl();
///
- void resetFile(string const &);
+ void resetFile(FileName const &);
///
void resetParams(Params const &);
///
void createPixmap();
+ ///
+ void startLoading();
+ ///
+ Params const & params() const { return params_; }
/// The loading status of the image.
ImageStatus status_;
Cache::ItemPtr cached_item_;
/// We modify a local copy of the image once it is loaded.
Image::ImagePtr image_;
+ /// This signal is emitted when the image loading status changes.
+ boost::signal<void()> signal_;
private:
///
void statusChanged();
-
///
- Params params_;
+ void checkedLoading();
+
///
- Loader & parent_;
+ Params params_;
};
-Loader::Impl::Impl(Loader & parent, Params const & params)
- : status_(WaitingToLoad), params_(params), parent_(parent)
+Loader::Loader()
+ : pimpl_(new Impl)
{}
+Loader::Loader(FileName const & file, DisplayType type)
+ : pimpl_(new Impl)
+{
+ reset(file, type);
+}
+
+
+Loader::Loader(FileName const & file, Params const & params)
+ : pimpl_(new Impl)
+{
+ reset(file, params);
+}
+
+
+Loader::Loader(Loader const & other)
+ : pimpl_(new Impl)
+{
+ Params const & params = other.pimpl_->params();
+ reset(params.filename, params);
+}
+
+
+Loader::~Loader()
+{}
+
+
+Loader & Loader::operator=(Loader const & other)
+{
+ if (this != &other) {
+ Params const & params = other.pimpl_->params();
+ reset(params.filename, params);
+ }
+ return *this;
+}
+
+
+void Loader::reset(FileName const & file, DisplayType type) const
+{
+ Params params;
+ params.display = type;
+ pimpl_->resetParams(params);
+
+ pimpl_->resetFile(file);
+ pimpl_->createPixmap();
+}
+
+
+void Loader::reset(FileName const & file, Params const & params) const
+{
+ pimpl_->resetParams(params);
+ pimpl_->resetFile(file);
+ pimpl_->createPixmap();
+}
+
+
+void Loader::reset(Params const & params) const
+{
+ pimpl_->resetParams(params);
+ pimpl_->createPixmap();
+}
+
+
+void Loader::startLoading() const
+{
+ if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_.get())
+ return;
+ pimpl_->startLoading();
+}
+
+
+void Loader::startMonitoring() const
+{
+ if (!pimpl_->cached_item_.get())
+ return;
+
+ pimpl_->cached_item_->startMonitoring();
+}
+
+
+bool Loader::monitoring() const
+{
+ if (!pimpl_->cached_item_.get())
+ return false;
+
+ return pimpl_->cached_item_->monitoring();
+}
+
+
+unsigned long Loader::checksum() const
+{
+ if (!pimpl_->cached_item_.get())
+ return 0;
+
+ return pimpl_->cached_item_->checksum();
+}
+
+
+FileName const & Loader::filename() const
+{
+ static FileName const empty;
+ return pimpl_->cached_item_.get() ?
+ pimpl_->cached_item_->filename() : empty;
+}
+
+
+ImageStatus Loader::status() const
+{
+ return pimpl_->status_;
+}
+
+
+boost::signals::connection Loader::connect(slot_type const & slot) const
+{
+ return pimpl_->signal_.connect(slot);
+}
+
+
+Image const * Loader::image() const
+{
+ return pimpl_->image_.get();
+}
+
+
+Loader::Impl::Impl()
+ : status_(WaitingToLoad)
+{
+}
+
+
Loader::Impl::~Impl()
{
- resetFile(string());
+ resetFile(FileName());
}
-void Loader::Impl::resetFile(string const & file)
+void Loader::Impl::resetFile(FileName const & file)
{
- string const old_file = cached_item_.get() ?
- cached_item_->filename() : string();
+ FileName const old_file = cached_item_.get() ?
+ cached_item_->filename() : FileName();
if (file == old_file)
return;
+ // If monitoring() the current file, should continue to monitor the
+ // new file.
+ bool continue_monitoring = false;
+
if (!old_file.empty()) {
+ continue_monitoring = cached_item_->monitoring();
cached_item_.reset();
Cache::get().remove(old_file);
}
status_ = cached_item_.get() ? cached_item_->status() : WaitingToLoad;
image_.reset();
-
+
if (cached_item_.get() || file.empty())
return;
cached_item_ = gc.item(file);
status_ = cached_item_->status();
- cached_item_->statusChanged.connect(
- boost::bind(&Impl::statusChanged, this));
+ if (continue_monitoring && !cached_item_->monitoring())
+ cached_item_->startMonitoring();
+
+ cached_item_->connect(boost::bind(&Impl::statusChanged, this));
}
{
status_ = cached_item_.get() ? cached_item_->status() : WaitingToLoad;
createPixmap();
- parent_.statusChanged();
+ signal_();
}
void Loader::Impl::createPixmap()
{
- if (!cached_item_.get() || image_.get() ||
+ if (!cached_item_.get() ||
params_.display == NoDisplay || status_ != Loaded)
return;
}
}
-
-Loader::Loader()
- : pimpl_(new Impl(*this, Params()))
-{}
-
-
-Loader::Loader(string const & file, DisplayType type)
- : pimpl_(new Impl(*this, Params()))
-{
- reset(file, type);
-}
-
-
-Loader::Loader(string const & file, Params const & params)
- : pimpl_(new Impl(*this, params))
-{
- reset(file, params);
-}
-
-
-Loader::~Loader()
-{}
-
-
-void Loader::reset(string const & file, DisplayType type)
-{
- Params params;
- params.display = type;
- pimpl_->resetParams(params);
-
- pimpl_->resetFile(file);
- pimpl_->createPixmap();
-}
-
-
-void Loader::reset(string const & file, Params const & params)
+void Loader::Impl::startLoading()
{
- pimpl_->resetParams(params);
- pimpl_->resetFile(file);
- pimpl_->createPixmap();
-}
-
-
-void Loader::reset(Params const & params)
-{
- pimpl_->resetParams(params);
- pimpl_->createPixmap();
-}
-
-
-void Loader::startLoading()
-{
- if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_.get())
+ if (status_ != WaitingToLoad)
return;
- pimpl_->cached_item_->startLoading();
-}
-
-string const & Loader::filename() const
-{
- static string const empty;
- return pimpl_->cached_item_.get() ?
- pimpl_->cached_item_->filename() : empty;
+ LoaderQueue::get().touch(cached_item_);
}
-ImageStatus Loader::status() const
-{
- return pimpl_->status_;
-}
-
-
-Image const * Loader::image() const
-{
- return pimpl_->image_.get();
-}
-
-} // namespace grfx
+} // namespace graphics
+} // namespace lyx