]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsLoader.C
Purely mechanical: move fragile into LatexRunParams.
[lyx.git] / src / graphics / GraphicsLoader.C
index 9464960690d1dc5a3e417065bbcd87ba675a3390..5da53f9b84f787e3dd576c2c1ebc0cb5c89a67a2 100644 (file)
@@ -1,31 +1,35 @@
-/*
+/**
  * \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 "frontends/LyXView.h"
 
 #include <boost/bind.hpp>
 #include <boost/signals/trackable.hpp>
 
+#include <list>
+
 namespace grfx {
 
 struct Loader::Impl : boost::signals::trackable {
        ///
-       Impl(Loader &, Params const &);
+       Impl(Params const &);
        ///
        ~Impl();
        ///
@@ -35,6 +39,9 @@ struct Loader::Impl : boost::signals::trackable {
        ///
        void createPixmap();
 
+       ///
+       void startLoading();
+
        /// The loading status of the image.
        ImageStatus status_;
        /** Must store a copy of the cached item to ensure that it is not
@@ -43,23 +50,137 @@ 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(Params()))
+{}
+
+
+Loader::Loader(string const & file, DisplayType type)
+       : pimpl_(new Impl(Params()))
+{
+       reset(file, type);
+}
+
+
+Loader::Loader(string const & file, Params const & params)
+       : pimpl_(new Impl(params))
+{
+       reset(file, params);
+}
+
+
+Loader::~Loader()
 {}
 
 
+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(Params const & params)
+       : status_(WaitingToLoad), params_(params)
+{
+}
+
+
 Loader::Impl::~Impl()
 {
        resetFile(string());
@@ -74,14 +195,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 +219,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 +241,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;
 
@@ -141,80 +269,13 @@ 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))
+void Loader::Impl::startLoading()
 {
-       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()
-{
-       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