]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsLoader.C
The std::string mammoth path.
[lyx.git] / src / graphics / GraphicsLoader.C
index 9464960690d1dc5a3e417065bbcd87ba675a3390..5567841954476623ecd5cd2417ba6f07c78e3b59 100644 (file)
@@ -1,31 +1,34 @@
-/*
+/**
  * \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 {
+
+using std::string;
+
+
+namespace lyx {
+namespace graphics {
 
 struct Loader::Impl : boost::signals::trackable {
        ///
-       Impl(Loader &, Params const &);
+       Impl();
        ///
        ~Impl();
        ///
@@ -34,6 +37,10 @@ struct Loader::Impl : boost::signals::trackable {
        void resetParams(Params const &);
        ///
        void createPixmap();
+       ///
+       void startLoading();
+       ///
+       Params const & params() const { return params_; }
 
        /// The loading status of the image.
        ImageStatus status_;
@@ -43,23 +50,154 @@ struct Loader::Impl : boost::signals::trackable {
        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::signal0<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(string const & file, DisplayType type)
+       : pimpl_(new Impl)
+{
+       reset(file, type);
+}
+
+
+Loader::Loader(string 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(string const & file, DisplayType type) const
+{
+       Params params;
+       params.display = type;
+       pimpl_->resetParams(params);
+
+       pimpl_->resetFile(file);
+       pimpl_->createPixmap();
+}
+
+
+void Loader::reset(string 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();
+}
+
+
+string const & Loader::filename() const
+{
+       static string 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());
@@ -74,14 +212,19 @@ void Loader::Impl::resetFile(string const & file)
        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;
 
@@ -93,8 +236,10 @@ void Loader::Impl::resetFile(string const & file)
        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));
 }
 
 
@@ -113,13 +258,13 @@ void Loader::Impl::statusChanged()
 {
        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;
 
@@ -140,81 +285,14 @@ void Loader::Impl::createPixmap()
        }
 }
 
-
-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)
-{
-       pimpl_->resetParams(params);
-       pimpl_->resetFile(file);
-       pimpl_->createPixmap();
-}
-
-
-void Loader::reset(Params const & params)
-{
-       pimpl_->resetParams(params);
-       pimpl_->createPixmap();
-}
-
-
-void Loader::startLoading()
+void Loader::Impl::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;
-}
-
 
-ImageStatus Loader::status() const
-{
-       return pimpl_->status_;
+       LoaderQueue::get().touch(cached_item_);
 }
 
 
-Image const * Loader::image() const
-{
-       return pimpl_->image_.get();
-}
-
-} // namespace grfx
+} // namespace graphics
+} // namespace lyx