]> git.lyx.org Git - lyx.git/blobdiff - src/insets/RenderPreview.cpp
Use docstring for preview snippet all the way down
[lyx.git] / src / insets / RenderPreview.cpp
index 92363d435d2a6e111e341d09b5b715d38072533c..48d471c3c5f58c4e09635ba0bbc87b177bc183ea 100644 (file)
 #include "support/lassert.h"
 #include "support/lstrings.h"
 
-#include "support/bind.h"
-
 using namespace std;
 using namespace lyx::support;
 
 namespace lyx {
 
 
-LyXRC_PreviewStatus RenderPreview::status()
+bool RenderPreview::previewText()
 {
-       return lyxrc.preview;
+       // Use a switch to trigger a warning if the enum is changed.
+       switch(lyxrc.preview) {
+       case LyXRC::PREVIEW_ON:
+       case LyXRC::PREVIEW_NO_MATH:
+               return true;
+       case LyXRC::PREVIEW_OFF:
+               break;
+       }
+
+       return false;
+}
+
+
+bool RenderPreview::previewMath()
+{
+       // Use a switch to trigger a warning if the enum is changed.
+       switch(lyxrc.preview) {
+       case LyXRC::PREVIEW_ON:
+               return true;
+       case LyXRC::PREVIEW_NO_MATH:
+       case LyXRC::PREVIEW_OFF:
+               break;
+       }
+
+       return false;
 }
 
 
@@ -53,19 +75,11 @@ RenderPreview::RenderPreview(Inset const * inset)
 RenderPreview::RenderPreview(RenderPreview const & other,
                             Inset const * inset)
        : RenderBase(other),
-         boost::signals::trackable(),
          snippet_(other.snippet_),
          parent_(inset)
 {}
 
 
-RenderPreview::~RenderPreview()
-{
-       if (ploader_connection_.connected())
-               ploader_connection_.disconnect();
-}
-
-
 RenderBase * RenderPreview::clone(Inset const * inset) const
 {
        return new RenderPreview(*this, inset);
@@ -74,12 +88,15 @@ RenderBase * RenderPreview::clone(Inset const * inset) const
 
 namespace {
 
-docstring const statusMessage(BufferView const * bv, string const & snippet)
+docstring const statusMessage(BufferView const * bv, docstring const & snippet)
 {
        LASSERT(bv, return docstring());
 
        Buffer const & buffer = bv->buffer();
        graphics::PreviewLoader const * loader = buffer.loader();
+       // please coverity (probably worth the check anyway)
+       if (!loader)
+               return docstring();
        graphics::PreviewLoader::Status const status = loader->status(snippet);
 
        docstring message;
@@ -99,14 +116,14 @@ docstring const statusMessage(BufferView const * bv, string const & snippet)
        return message;
 }
 
-} // namespace anon
+} // namespace
 
 
 graphics::PreviewImage const *
 RenderPreview::getPreviewImage(Buffer const & buffer) const
 {
        graphics::PreviewLoader const * loader = buffer.loader();
-       LASSERT(loader, return 0);
+       LASSERT(loader, return nullptr);
        return loader->preview(snippet_);
 }
 
@@ -123,21 +140,23 @@ void RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const
                pimage->image();
                dim = pimage->dim();
        } else {
-               dim.asc = 50;
-               dim.des = 0;
-
                FontInfo font(mi.base.font);
                font.setFamily(SANS_FAMILY);
-               font.setSize(FONT_SIZE_FOOTNOTE);
+               font.setSize(FOOTNOTE_SIZE);
+
+               frontend::FontMetrics const & fm = theFontMetrics(font);
+               dim.asc = 2 * (Inset::textOffset(mi.base.bv) + 6) + fm.maxHeight();
+               dim.des = 0;
+
                docstring const stat = statusMessage(mi.base.bv, snippet_);
-               dim.wid = 15 + theFontMetrics(font).width(stat);
+               dim.wid = 2 * (Inset::textOffset(mi.base.bv) + 6) + fm.width(stat);
        }
 
        dim_ = dim;
 }
 
 
-void RenderPreview::draw(PainterInfo & pi, int x, int y) const
+void RenderPreview::draw(PainterInfo & pi, int x, int y, bool const) const
 {
        LBUFERR(pi.base.bv);
 
@@ -148,31 +167,30 @@ void RenderPreview::draw(PainterInfo & pi, int x, int y) const
        if (image) {
                pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
                              *image);
-
        } else {
-               int const offset = Inset::TEXT_TO_INSET_OFFSET;
+               int const offset = Inset::textOffset(pi.base.bv);
 
-               pi.pain.rectangle(x + offset,
-                                 y - dim_.asc,
-                                 dim_.wid - 2 * offset,
-                                 dim_.asc + dim_.des,
-                                 Color_foreground);
+               pi.pain.rectangle(x + offset, y - dim_.asc,
+                                 dim_.wid - 2 * offset, dim_.asc + dim_.des,
+                                 Color_foreground);
 
                FontInfo font(pi.base.font);
                font.setFamily(SANS_FAMILY);
-               font.setSize(FONT_SIZE_FOOTNOTE);
+               font.setSize(FOOTNOTE_SIZE);
 
                docstring const stat = statusMessage(pi.base.bv, snippet_);
                pi.pain.text(x + offset + 6,
-                            y - theFontMetrics(font).maxAscent() - 4,
-                            stat, font);
+                            y - offset - 6 - theFontMetrics(pi.base.font).maxDescent(),
+                            stat, font);
        }
+       pi.change.paintCue(pi, x, y - dim_.asc,
+                          x + dim_.width(), y - dim_.asc + dim_.height());
 }
 
 
 void RenderPreview::startLoading(Buffer const & buffer, bool forexport) const
 {
-       if (!forexport && (status() == LyXRC::PREVIEW_OFF || snippet_.empty()))
+       if (!forexport && (lyxrc.preview == LyXRC::PREVIEW_OFF || snippet_.empty()))
                return;
 
        graphics::PreviewLoader * loader = buffer.loader();
@@ -182,10 +200,10 @@ void RenderPreview::startLoading(Buffer const & buffer, bool forexport) const
 
 
 void RenderPreview::addPreview(docstring const & latex_snippet,
-                               Buffer const & buffer, 
+                               Buffer const & buffer,
                                bool ignore_lyxrc)
 {
-       if (status() == LyXRC::PREVIEW_OFF && !ignore_lyxrc)
+       if (lyxrc.preview == LyXRC::PREVIEW_OFF && !ignore_lyxrc)
                return;
 
        graphics::PreviewLoader * loader = buffer.loader();
@@ -195,15 +213,15 @@ void RenderPreview::addPreview(docstring const & latex_snippet,
 
 
 void RenderPreview::addPreview(docstring const & latex_snippet,
-                               graphics::PreviewLoader & ploader, 
+                               graphics::PreviewLoader & ploader,
                                bool ignore_lyxrc)
 {
-       if (status() == LyXRC::PREVIEW_OFF && !ignore_lyxrc)
+       if (lyxrc.preview == LyXRC::PREVIEW_OFF && !ignore_lyxrc)
                return;
 
        // FIXME UNICODE
        // We have to make sure that we call latex with the right encoding
-       snippet_ = support::trim(to_utf8(latex_snippet));
+       snippet_ = support::trim(latex_snippet);
        if (snippet_.empty())
                return;
 
@@ -213,10 +231,12 @@ void RenderPreview::addPreview(docstring const & latex_snippet,
        // If this is the first time of calling, connect to the
        // PreviewLoader signal that'll inform us when the preview image
        // is ready for loading.
-       if (!ploader_connection_.connected()) {
-               ploader_connection_ = ploader.connect(
-                       bind(&RenderPreview::imageReady, this, _1));
-       }
+       if (!ploader_connection_.connected())
+               // This is a scoped connection.
+               ploader_connection_ =
+                       ploader.connect([this](graphics::PreviewImage const & pi){
+                               imageReady(pi);
+                       });
 
        ploader.add(snippet_);
 }
@@ -243,28 +263,59 @@ void RenderPreview::imageReady(graphics::PreviewImage const & pimage)
 
 
 RenderMonitoredPreview::RenderMonitoredPreview(Inset const * inset)
-       : RenderPreview(inset), monitor_(FileName(), 2000)
-{}
+       : RenderPreview(inset)
+{
+       setAbsFile(FileName());
+}
 
 
 void RenderMonitoredPreview::setAbsFile(FileName const & file)
 {
-       monitor_.reset(file);
+       bool mon = monitoring();
+       if (mon)
+               stopMonitoring();
+       filename_ = file;
+       if (mon)
+               startMonitoring();
 }
 
 
-void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y) const
+void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y, bool const) const
 {
        RenderPreview::draw(pi, x, y);
-       if (!monitoring())
-               startMonitoring();
+       startMonitoring();
+       monitor_->checkModifiedAsync();
 }
 
 
-boost::signals::connection
-RenderMonitoredPreview::fileChanged(slot_type const & slot)
+connection RenderMonitoredPreview::connect(slot const & slot)
 {
-       return monitor_.connect(slot);
+       return changed_.connect(slot);
 }
 
+
+bool RenderMonitoredPreview::monitoring() const
+{
+       return (bool) monitor_;
+}
+
+
+void RenderMonitoredPreview::startMonitoring() const
+{
+       if (!monitoring()) {
+               monitor_ = FileSystemWatcher::activeMonitor(filename_);
+               // Disconnected at the same time as this is destroyed.
+               monitor_->connect([this](bool /* exists */){ changed_(); });
+       }
+}
+
+
+void RenderMonitoredPreview::stopMonitoring() const
+{
+       monitor_ = nullptr;
+}
+
+
+
+
 } // namespace lyx