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
This commit is contained in:
Pavel Sanda 2009-12-23 16:02:37 +00:00
parent b52f6c09f7
commit 0b5fe5494b
2 changed files with 136 additions and 1 deletions

View File

@ -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

View File

@ -14,7 +14,10 @@
#define INSETERT_H
#include "InsetCollapsable.h"
#include "RenderPreview.h"
#include "graphics/PreviewLoader.h"
#include <boost/scoped_ptr.hpp>
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<RenderPreview> preview_;
///
mutable bool use_preview_;
};