From 0b5fe5494b3d724d369abe7f5c6505c65dd01d0c Mon Sep 17 00:00:00 2001 From: Pavel Sanda Date: Wed, 23 Dec 2009 16:02:37 +0000 Subject: [PATCH] Vincent's initial support for ERT instant preview git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32624 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/InsetERT.cpp | 109 +++++++++++++++++++++++++++++++++++++++- src/insets/InsetERT.h | 28 +++++++++++ 2 files changed, 136 insertions(+), 1 deletion(-) diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp index d1e15bae8b..80b3af3890 100644 --- a/src/insets/InsetERT.cpp +++ b/src/insets/InsetERT.cpp @@ -23,6 +23,7 @@ #include "Language.h" #include "Layout.h" #include "Lexer.h" +#include "LyXRC.h" #include "LyXAction.h" #include "MetricsInfo.h" #include "OutputParams.h" @@ -30,6 +31,10 @@ #include "Paragraph.h" #include "TextClass.h" +#include "graphics/PreviewImage.h" + +#include "insets/RenderPreview.h" + #include "frontends/alert.h" #include "frontends/Application.h" @@ -45,12 +50,29 @@ using namespace lyx::support; namespace lyx { InsetERT::InsetERT(Buffer * buf, CollapseStatus status) - : InsetCollapsable(buf) + : InsetCollapsable(buf), preview_(new RenderPreview(this)) { status_ = status; } +InsetERT::InsetERT(InsetERT const & other) : InsetCollapsable(other) +{ + operator=(other); +} + +InsetERT & InsetERT::operator=(InsetERT const & other) +{ + if (this == &other) + return *this; + InsetCollapsable::operator=(other); + buffer_ = other.buffer_; + preview_.reset(new RenderPreview(*other.preview_, this)); + + return *this; +} + + InsetERT::~InsetERT() { hideDialogs("ert", this); @@ -189,4 +211,89 @@ docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const return docstring(); } + +bool InsetERT::previewState(BufferView * bv) const +{ + if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) { + graphics::PreviewImage const * pimage = + preview_->getPreviewImage(bv->buffer()); + return pimage && pimage->image(); + } + return false; +} + + +void InsetERT::addPreview(DocIterator const & inset_pos, + graphics::PreviewLoader & ploader) const +{ + preparePreview(inset_pos); +} + + +void InsetERT::preparePreview(DocIterator const & pos) const +{ + odocstringstream str; + OutputParams runparams(&pos.buffer()->params().encoding()); + latex(str, runparams); + docstring const snippet = str.str(); + LYXERR(Debug::MACROS, "Preview snippet: " << snippet); + preview_->addPreview(snippet, *pos.buffer()); +} + + +void InsetERT::reloadPreview(DocIterator const & pos) const +{ + preparePreview(pos); + preview_->startLoading(*pos.buffer()); +} + + +bool InsetERT::notifyCursorLeaves(Cursor const & old, Cursor & cur) +{ + reloadPreview(old); + cur.updateFlags(Update::Force); + return InsetCollapsable::notifyCursorLeaves(old, cur); +} + + +void InsetERT::draw(PainterInfo & pi, int x, int y) const +{ + use_preview_ = previewState(pi.base.bv); + + if (use_preview_) { + // one pixel gap in front + preview_->draw(pi, x + 1, y); + setPosCache(pi, x, y); + return; + } + InsetCollapsable::draw(pi, x, y); +} + + +Inset * InsetERT::editXY(Cursor & cur, int x, int y) +{ + if (use_preview_) { + edit(cur, true); + return this; + } + return InsetCollapsable::editXY(cur, x, y); +} + + +void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const +{ + if (previewState(mi.base.bv)) { + preview_->metrics(mi, dim); + // insert a one pixel gap in front of the formula + dim.wid += 1; + // Cache the inset dimension. + setDimCache(mi, dim); + Dimension dim_dummy = dim; + MetricsInfo mi_dummy = mi; + InsetCollapsable::metrics(mi_dummy, dim_dummy); + return; + } + InsetCollapsable::metrics(mi, dim); +} + } // namespace lyx diff --git a/src/insets/InsetERT.h b/src/insets/InsetERT.h index 3f38f0e70e..4be3ece467 100644 --- a/src/insets/InsetERT.h +++ b/src/insets/InsetERT.h @@ -14,7 +14,10 @@ #define INSETERT_H #include "InsetCollapsable.h" +#include "RenderPreview.h" +#include "graphics/PreviewLoader.h" +#include namespace lyx { @@ -34,11 +37,32 @@ public: /// InsetERT(Buffer *, CollapseStatus status = Open); /// + InsetERT(InsetERT const & other); + /// ~InsetERT(); + // + InsetERT & operator=(InsetERT const & other); /// static CollapseStatus string2params(std::string const &); /// static std::string params2string(CollapseStatus); + /// + void addPreview(DocIterator const & inset_pos, + graphics::PreviewLoader & ploader) const; + /// + void preparePreview(DocIterator const & pos) const; + /// + void reloadPreview(DocIterator const & pos) const; + /// + bool notifyCursorLeaves(Cursor const & old, Cursor & cur); + /// + void draw(PainterInfo & pi, int x, int y) const; + /// + Inset * editXY(Cursor & cur, int x, int y); + /// + void metrics(MetricsInfo & mi, Dimension & dim) const; + /// + bool previewState(BufferView * bv) const; private: /// InsetCode lyxCode() const { return ERT_CODE; } @@ -68,6 +92,10 @@ private: docstring const buttonLabel(BufferView const & bv) const; /// bool allowSpellCheck() const { return false; } + /// + boost::scoped_ptr preview_; + /// + mutable bool use_preview_; };