]> git.lyx.org Git - features.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>
Mon, 13 Nov 2017 08:54:37 +0000 (09:54 +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
status.22x

index 4122cfdb05160a1a37a7d1926eb158b86954e4e9..cb1bc7bda1e3a909e96a41f3e34cb4670711b6c7 100644 (file)
@@ -520,12 +520,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);
@@ -592,9 +598,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();
 }
 
 
@@ -606,12 +625,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 813e933a0a1d9088ca72576a7fd4826feb3beb86..c5f106cef51099467d24ce43734a30f114cf6d6b 100644 (file)
@@ -110,7 +110,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;
        ///
@@ -165,11 +165,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.
-       boost::scoped_ptr<RenderBase> renderer_;
+       mutable boost::scoped_ptr<RenderBase> renderer_;
        /// changes color of the button when mouse enters/leaves this inset
        mutable std::map<BufferView const *, bool> mouse_hover_;
 };
index aac55fc5de7317134f7cb2acc999c577f8443eac..b5af1fea1dd7b695d2e3fd211c62dc5e143d3d13 100644 (file)
@@ -100,6 +100,9 @@ What's new
 
 - Fix crash with undo and child documents (bug 10643).
 
+- Fix crash when changing preview preferences while previewable
+  external inset is open (bug 10785).
+
 - Remove duplicate entries from the Symbols dialog (bug 10644).
 
 - Always show the float type in the float inset label (bug 10618).