-/*
+/**
* \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 "GraphicsSupport.h"
+#include "LoaderQueue.h"
-#include "frontends/Timeout.h"
+#include "frontends/LyXView.h"
#include <boost/bind.hpp>
#include <boost/signals/trackable.hpp>
void createPixmap();
///
- void startLoading(Inset const &, BufferView const &);
+ void startLoading();
/// The loading status of the image.
ImageStatus status_;
///
Params params_;
- ///
- Timeout timer;
- // Multiple Insets can share the same image
- typedef std::list<Inset const *> InsetList;
- ///
- InsetList insets;
- ///
- BufferView const * view;
};
{
if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_.get())
return;
- pimpl_->cached_item_->startLoading();
+ pimpl_->startLoading();
}
-void Loader::startLoading(Inset const & inset, BufferView const & bv) const
+void Loader::startMonitoring() const
{
- if (pimpl_->status_ != WaitingToLoad || !pimpl_->cached_item_.get())
+ if (!pimpl_->cached_item_.get())
return;
- pimpl_->startLoading(inset, bv);
+
+ 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();
}
Loader::Impl::Impl(Params const & params)
- : status_(WaitingToLoad), params_(params),
- timer(2000, Timeout::ONETIME), view(0)
+ : status_(WaitingToLoad), params_(params)
{
- timer.timeout.connect(boost::bind(&Impl::checkedLoading, this));
}
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);
}
cached_item_ = gc.item(file);
status_ = cached_item_->status();
+ if (continue_monitoring && !cached_item_->monitoring())
+ cached_item_->startMonitoring();
+
cached_item_->connect(boost::bind(&Impl::statusChanged, this));
}
void Loader::Impl::createPixmap()
{
- if (!cached_item_.get() || image_.get() ||
+ if (!cached_item_.get() ||
params_.display == NoDisplay || status_ != Loaded)
return;
}
-void Loader::Impl::startLoading(Inset const & inset, BufferView const & bv)
+void Loader::Impl::startLoading()
{
- if (status_ != WaitingToLoad || timer.running())
+ if (status_ != WaitingToLoad)
return;
- InsetList::const_iterator it = insets.begin();
- InsetList::const_iterator end = insets.end();
- it = std::find(it, end, &inset);
- if (it == end)
- insets.push_back(&inset);
- view = &bv;
-
- timer.start();
-}
-
-
-namespace {
-
-struct FindVisibleInset {
-
- FindVisibleInset(std::list<VisibleParagraph> const & vps) : vps_(vps) {}
-
- bool operator()(Inset const * inset_ptr)
- {
- if (!inset_ptr)
- return false;
- return isInsetVisible(*inset_ptr, vps_);
- }
-
-private:
- std::list<VisibleParagraph> const & vps_;
-};
-
-} // namespace anon
-
-
-void Loader::Impl::checkedLoading()
-{
- if (insets.empty() || !view)
- return;
-
- std::list<VisibleParagraph> const vps = getVisibleParagraphs(*view);
-
- InsetList::const_iterator it = insets.begin();
- InsetList::const_iterator end = insets.end();
-
- it = std::find_if(it, end, FindVisibleInset(vps));
-
- // One of the insets is visible, so start loading the image.
- if (it != end)
- cached_item_->startLoading();
+ LoaderQueue::get().touch(cached_item_);
}