]> git.lyx.org Git - lyx.git/commitdiff
InsetExternal: update renderer after preview status change
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 12 Nov 2017 13:44:18 +0000 (14:44 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 12 Nov 2017 17:31:00 +0000 (18:31 +0100)
This fixes a crash when changing instant preview prefs while
document with previewed external inset is opened.

Fixes: #10785
(cherry picked from commit 0842e22f4551e84dbf24259c65994c760fc22925)

src/insets/InsetExternal.cpp
src/insets/InsetExternal.h

index 7123d81fe916266caae1b438f25fd0e66f279b77..1f0f5f2b770d271dbcedfd52514849cf6c6932f0 100644 (file)
@@ -524,12 +524,18 @@ bool InsetExternal::showInsetDialog(BufferView * bv) const
 
 void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const
 {
+       if (!isRendererValid())
+               updatePreview();
+
        renderer_->metrics(mi, dim);
 }
 
 
 void InsetExternal::draw(PainterInfo & pi, int x, int y) const
 {
+       if (!isRendererValid())
+               updatePreview();
+
        if (renderer_->asButton())
                renderer_->setRenderState(mouse_hover_[pi.base.bv]);
        renderer_->draw(pi, x, y);
@@ -595,9 +601,22 @@ InsetExternalParams const & InsetExternal::params() const
 }
 
 
-void InsetExternal::updatePreview()
+bool InsetExternal::isPreviewed() const
+{
+       return (external::getTemplatePtr(params_) && !params_.filename.empty()
+               && params_.display
+               && lyxrc.display_graphics
+               && params_.preview_mode != PREVIEW_OFF
+               && (params_.preview_mode != PREVIEW_INSTANT
+                   || RenderPreview::previewText()));
+}
+
+
+bool InsetExternal::isRendererValid() const
 {
-       setParams(params_);
+       if (!renderer_->asButton())
+               return isPreviewed();
+       return !isPreviewed();
 }
 
 
@@ -609,12 +628,13 @@ void InsetExternal::setParams(InsetExternalParams const & p)
        // will use this.
        defaultTemplateName = params_.templatename();
 
-       if (!external::getTemplatePtr(params_) || params_.filename.empty()
-               || !params_.display
-               || !lyxrc.display_graphics
-               || params_.preview_mode == PREVIEW_OFF
-               || (params_.preview_mode == PREVIEW_INSTANT
-                   && !RenderPreview::previewText())) {
+       updatePreview();
+}
+
+
+void InsetExternal::updatePreview() const
+{
+       if (!isPreviewed()) {
                RenderButton * button_ptr = renderer_->asButton();
                if (!button_ptr) {
                        renderer_.reset(new RenderButton);
index 420550f924c0748a31a4bee5291856715cbcdd37..75b7f70ffa5f9d2690047422fec1145288552c13 100644 (file)
@@ -108,7 +108,7 @@ public:
        ///
        void setParams(InsetExternalParams const &);
        /// Update not loaded previews
-       void updatePreview();
+       void updatePreview() const;
        /// \returns the number of rows (\n's) of generated code.
        void latex(otexstream &, OutputParams const &) const;
        ///
@@ -163,11 +163,15 @@ private:
         *  and the preview should be regenerated.
         */
        void fileChanged() const;
+       /// Is this inset using (instant or graphics) preview?
+       bool isPreviewed() const;
+       /// Do we have the right renderer (button, graphic or monitored preview)?
+       bool isRendererValid() const;
 
        /// The current params
        InsetExternalParams params_;
        /// The thing that actually draws the image on LyX's screen.
-       unique_ptr<RenderBase> renderer_;
+       mutable unique_ptr<RenderBase> renderer_;
        /// changes color of the button when mouse enters/leaves this inset
        mutable std::map<BufferView const *, bool> mouse_hover_;
 };