RenderButton, RenderGraphic and RenderPreview now have a common lineage.

Almost sane code ;-)


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7894 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2003-10-10 21:08:55 +00:00
parent f690ef67a6
commit dff822442a
31 changed files with 691 additions and 530 deletions

View File

@ -168,7 +168,7 @@ src/insets/insettheorem.C
src/insets/insettoc.C
src/insets/inseturl.C
src/insets/insetwrap.C
src/insets/renderers.C
src/insets/render_graphic.C
src/ispell.C
src/kbsequence.C
src/lengthcommon.C
@ -188,7 +188,6 @@ src/mathed/ref_inset.C
src/paragraph.C
src/paragraph_funcs.C
src/rowpainter.C
src/support/path_defines.C
src/text.C
src/text2.C
src/text3.C

View File

@ -1,3 +1,9 @@
2003-10-10 Angus Leeming <leeming@lyx.org>
* PreviewedInset.[Ch]: removed.
* Makefile.am: remove PreviewedInset.[Ch].
2003-10-09 Angus Leeming <leeming@lyx.org>
* PreviewedInset.[Ch] (previewReady): remove the side effects.

View File

@ -26,6 +26,4 @@ libgraphics_la_SOURCES = \
PreviewLoader.h \
PreviewLoader.C \
Previews.h \
Previews.C \
PreviewedInset.h \
PreviewedInset.C
Previews.C

View File

@ -1,109 +0,0 @@
/**
* \file PreviewedInset.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "PreviewedInset.h"
#include "PreviewImage.h"
#include "PreviewLoader.h"
#include "Previews.h"
#include "support/lstrings.h"
#include <boost/bind.hpp>
namespace graphics = lyx::graphics;
namespace support = lyx::support;
bool PreviewedInset::activated()
{
return graphics::Previews::activated();
}
PreviewedInset::PreviewedInset()
: pimage_(0)
{}
boost::signals::connection PreviewedInset::connect(slot_type const & slot)
{
return preview_ready_signal_.connect(slot);
}
void PreviewedInset::generatePreview(Buffer const & buffer)
{
if (!activated() || !previewWanted(buffer))
return;
graphics::Previews & previews = graphics::Previews::get();
graphics::PreviewLoader & loader = previews.loader(buffer);
addPreview(loader);
if (!snippet_.empty())
loader.startLoading();
}
void PreviewedInset::addPreview(graphics::PreviewLoader & ploader)
{
if (!activated() || !previewWanted(ploader.buffer()))
return;
snippet_ = support::trim(latexString(ploader.buffer()));
pimage_ = 0;
if (snippet_.empty())
return;
pimage_ = ploader.preview(snippet_);
if (pimage_)
return;
// 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(
boost::bind(&PreviewedInset::imageReady, this, _1));
}
ploader.add(snippet_);
}
void PreviewedInset::removePreview(Buffer const & buffer)
{
if (snippet_.empty())
return;
graphics::Previews & previews = graphics::Previews::get();
graphics::PreviewLoader & loader = previews.loader(buffer);
loader.remove(snippet_);
snippet_.erase();
pimage_ = 0;
}
bool PreviewedInset::previewReady() const
{
return pimage_ ? pimage_->image() : false;
}
void PreviewedInset::imageReady(graphics::PreviewImage const & pimage) const
{
// Check the current snippet is the same as that previewed.
if (snippet_ != pimage.snippet())
return;
pimage_ = &pimage;
preview_ready_signal_();
}

View File

@ -1,3 +1,29 @@
2003-10-10 Angus Leeming <leeming@lyx.org>
* renderers.[Ch]: removed.
* render_base.[Ch]:
* render_button.[Ch]:
* render_graphic.[Ch]:
* render_preview.[Ch]: new files. The first three are split out of
renderers.[Ch]. The last one is a renamed PreviewedInset.[Ch]. which
contains a re-worked InsetInclude::PreviewImpl also.
* Makefile.am: reflect the changed files.
* insetcommand.h:
* insetexternal.[Ch]:
* insetgraphics.[Ch]: trivial changes ButtonRenderer -> RenderButton, etc.
* insetinclude.[Ch]: changes reflecting the change from
InsetInclude::PreviewImpl to RenderMonitoredPreview.
* insethfill.C:
* insetindex.C:
* insetlabel.C:
* insettoc.C:
* inseturl.C: add #include "support/std_ostream.h"
2003-10-09 Angus Leeming <leeming@lyx.org>
* insetinclude.C (metrics, draw): no longer need to pass a Buffer arg

View File

@ -19,8 +19,14 @@ libinsets_la_SOURCES = \
ExternalTemplate.h \
ExternalTransforms.C \
ExternalTransforms.h \
renderers.C \
renderers.h \
render_base.C \
render_base.h \
render_button.C \
render_button.h \
render_graphic.C \
render_graphic.h \
render_preview.C \
render_preview.h \
inset.C \
inset.h \
insetbase.h \

View File

@ -16,7 +16,7 @@
#include "inset.h"
#include "insetcommandparams.h"
#include "renderers.h"
#include "render_button.h"
#include "mailinset.h"
// Created by Alejandro 970222
@ -67,7 +67,7 @@ public:
///
std::string const & getOptions() const { return p_.getOptions(); }
///
ButtonRenderer & button() const { return button_; }
RenderButton & button() const { return button_; }
protected:
///
@ -89,7 +89,7 @@ private:
///
InsetCommandParams p_;
mutable bool set_label_;
mutable ButtonRenderer button_;
mutable RenderButton button_;
};

View File

@ -11,9 +11,10 @@
#include <config.h>
#include "insetexternal.h"
#include "insets/renderers.h"
#include "insets/ExternalSupport.h"
#include "insets/ExternalTemplate.h"
#include "insets/render_button.h"
#include "insets/render_graphic.h"
#include "buffer.h"
#include "BufferView.h"
@ -358,7 +359,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex)
InsetExternal::InsetExternal()
: renderer_(new ButtonRenderer)
: renderer_(new RenderButton)
{}
@ -368,8 +369,8 @@ InsetExternal::InsetExternal(InsetExternal const & other)
params_(other.params_),
renderer_(other.renderer_->clone())
{
GraphicRenderer * ptr =
dynamic_cast<GraphicRenderer *>(renderer_.get());
RenderGraphic * ptr =
dynamic_cast<RenderGraphic *>(renderer_.get());
if (ptr)
ptr->connect(boost::bind(&InsetExternal::statusChanged, this));
}
@ -503,20 +504,20 @@ void InsetExternal::setParams(InsetExternalParams const & p,
params_.display == lyx::graphics::NoDisplay);
if (display_button) {
ButtonRenderer * button_ptr =
dynamic_cast<ButtonRenderer *>(renderer_.get());
RenderButton * button_ptr =
dynamic_cast<RenderButton *>(renderer_.get());
if (!button_ptr) {
button_ptr = new ButtonRenderer;
button_ptr = new RenderButton;
renderer_.reset(button_ptr);
}
button_ptr->update(getScreenLabel(params_, buffer), true);
} else {
GraphicRenderer * graphic_ptr =
dynamic_cast<GraphicRenderer *>(renderer_.get());
RenderGraphic * graphic_ptr =
dynamic_cast<RenderGraphic *>(renderer_.get());
if (!graphic_ptr) {
graphic_ptr = new GraphicRenderer;
graphic_ptr = new RenderGraphic;
graphic_ptr->connect(
boost::bind(&InsetExternal::statusChanged, this));
renderer_.reset(graphic_ptr);

View File

@ -79,7 +79,7 @@ private:
};
class RenderInset;
class RenderBase;
///
class InsetExternal : public InsetOld, public boost::signals::trackable
@ -136,7 +136,7 @@ private:
/// The current params
InsetExternalParams params_;
/// The thing that actually draws the image on LyX's screen.
boost::scoped_ptr<RenderInset> renderer_;
boost::scoped_ptr<RenderBase> renderer_;
};

View File

@ -53,7 +53,7 @@ TODO
#include <config.h>
#include "insets/insetgraphics.h"
#include "insets/renderers.h"
#include "insets/render_graphic.h"
#include "buffer.h"
#include "BufferView.h"
@ -152,7 +152,7 @@ string findTargetFormat(string const & suffix, LatexRunParams const & runparams)
InsetGraphics::InsetGraphics()
: graphic_label(uniqueID()),
graphic_(new GraphicRenderer)
graphic_(new RenderGraphic)
{
graphic_->connect(boost::bind(&InsetGraphics::statusChanged, this));
}
@ -162,7 +162,7 @@ InsetGraphics::InsetGraphics(InsetGraphics const & ig)
: InsetOld(ig),
boost::signals::trackable(),
graphic_label(uniqueID()),
graphic_(new GraphicRenderer(*ig.graphic_))
graphic_(new RenderGraphic(*ig.graphic_))
{
graphic_->connect(boost::bind(&InsetGraphics::statusChanged, this));
setParams(ig.params());

View File

@ -21,7 +21,7 @@
class Dialogs;
class GraphicRenderer;
class RenderGraphic;
class LaTeXFeatures;
///
@ -104,7 +104,7 @@ private:
std::string const graphic_label;
/// The thing that actually draws the image on LyX's screen.
boost::scoped_ptr<GraphicRenderer> const graphic_;
boost::scoped_ptr<RenderGraphic> const graphic_;
};

View File

@ -12,6 +12,8 @@
#include "insethfill.h"
#include "support/std_ostream.h"
using std::ostream;

View File

@ -27,24 +27,25 @@
#include "frontends/Painter.h"
#include "graphics/PreviewedInset.h"
#include "graphics/PreviewImage.h"
#include "graphics/PreviewLoader.h"
#include "insets/render_preview.h"
#include "support/FileInfo.h"
#include "support/FileMonitor.h"
#include "support/filetools.h"
#include "support/lstrings.h" // contains
#include "support/tostr.h"
#include <boost/bind.hpp>
#include "support/std_ostream.h"
#include "support/std_sstream.h"
using lyx::support::AddName;
using lyx::support::ChangeExtension;
using lyx::support::contains;
using lyx::support::FileInfo;
using lyx::support::FileMonitor;
using lyx::support::GetFileContents;
using lyx::support::IsFileReadable;
using lyx::support::IsLyXFilename;
@ -65,33 +66,6 @@ using std::ostringstream;
extern BufferList bufferlist;
class InsetInclude::PreviewImpl : public PreviewedInset {
public:
///
PreviewImpl(InsetInclude const & p) : parent_(p) {}
///
bool previewWanted(Buffer const &) const;
///
string const latexString(Buffer const &) const;
///
///
bool monitoring() const { return monitor_.get(); }
///
void startMonitoring(string const & file);
///
void stopMonitoring() { monitor_.reset(); }
private:
/// Invoked by monitor_ should the parent file change.
void restartLoading();
///
boost::scoped_ptr<FileMonitor> monitor_;
///
InsetInclude const & parent_;
};
namespace {
string const uniqueID()
@ -105,10 +79,11 @@ string const uniqueID()
InsetInclude::InsetInclude(InsetCommandParams const & p)
: params_(p), include_label(uniqueID()),
preview_(new PreviewImpl(*this)),
preview_(new RenderMonitoredPreview),
set_label_(false)
{
preview_->connect(boost::bind(&InsetInclude::statusChanged, this));
preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
}
@ -116,10 +91,11 @@ InsetInclude::InsetInclude(InsetInclude const & other)
: InsetOld(other),
params_(other.params_),
include_label(other.include_label),
preview_(new PreviewImpl(*this)),
preview_(new RenderMonitoredPreview),
set_label_(other.set_label_)
{
preview_->connect(boost::bind(&InsetInclude::statusChanged, this));
preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
}
@ -201,6 +177,23 @@ bool isVerbatim(InsetCommandParams const & params)
command_name == "verbatiminput*";
}
string const masterFilename(Buffer const & buffer)
{
return buffer.fileName();
}
string const includedFilename(Buffer const & buffer,
InsetCommandParams const & params)
{
return MakeAbsPath(params.getContents(),
OnlyPath(masterFilename(buffer)));
}
void generate_preview(RenderPreview &, InsetInclude const &, Buffer const &);
} // namespace anon
@ -212,8 +205,8 @@ void InsetInclude::set(InsetCommandParams const & p, Buffer const & buffer)
if (preview_->monitoring())
preview_->stopMonitoring();
if (PreviewedInset::activated() && type(params_) == INPUT)
preview_->generatePreview(buffer);
if (type(params_) == INPUT)
generate_preview(*preview_, *this, buffer);
}
@ -272,20 +265,6 @@ string const InsetInclude::getScreenLabel(Buffer const &) const
namespace {
string const masterFilename(Buffer const & buffer)
{
return buffer.fileName();
}
string const includedFilename(Buffer const & buffer,
InsetCommandParams const & params)
{
return MakeAbsPath(params.getContents(),
OnlyPath(masterFilename(buffer)));
}
/// return true if the file is or got loaded.
bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
{
@ -598,51 +577,63 @@ void InsetInclude::statusChanged() const
}
void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const
void InsetInclude::fileChanged() const
{
preview_->addPreview(ploader);
BufferView * const bv = view();
if (!bv)
return;
bv->updateInset(this);
if (!bv->buffer())
return;
Buffer const & buffer = *bv->buffer();
preview_->removePreview(buffer);
generate_preview(*preview_.get(), *this, buffer);
}
bool InsetInclude::PreviewImpl::previewWanted(Buffer const & buffer) const
{
string const included_file = includedFilename(buffer, parent_.params());
namespace {
return type(parent_.params_) == INPUT &&
parent_.params_.preview() &&
bool preview_wanted(InsetCommandParams const & params, Buffer const & buffer)
{
string const included_file = includedFilename(buffer, params);
return type(params) == INPUT && params.preview() &&
IsFileReadable(included_file);
}
string const InsetInclude::PreviewImpl::latexString(Buffer const & buffer) const
string const latex_string(InsetInclude const & inset, Buffer const & buffer)
{
ostringstream os;
LatexRunParams runparams;
runparams.flavor = LatexRunParams::LATEX;
parent_.latex(buffer, os, runparams);
inset.latex(buffer, os, runparams);
return os.str();
}
void InsetInclude::PreviewImpl::startMonitoring(string const & file)
void generate_preview(RenderPreview & renderer,
InsetInclude const & inset,
Buffer const & buffer)
{
monitor_.reset(new FileMonitor(file, 2000));
monitor_->connect(boost::bind(&PreviewImpl::restartLoading, this));
monitor_->start();
InsetCommandParams const & params = inset.params();
if (RenderPreview::activated() && preview_wanted(params, buffer)) {
string const snippet = latex_string(inset, buffer);
renderer.generatePreview(snippet, buffer);
}
}
} // namespace anon
void InsetInclude::PreviewImpl::restartLoading()
void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const
{
BufferView * const view = parent_.view();
if (!view)
return;
view->updateInset(&parent_);
if (view->buffer()) {
Buffer const & buffer = *view->buffer();
removePreview(buffer);
generatePreview(buffer);
if (preview_wanted(params(), ploader.buffer())) {
string const snippet = latex_string(*this, ploader.buffer());
preview_->addPreview(snippet, ploader);
}
}

View File

@ -14,15 +14,15 @@
#include "inset.h"
#include "insetcommandparams.h"
#include "renderers.h"
#include "render_button.h"
#include <boost/scoped_ptr.hpp>
class Buffer;
class Dimension;
struct LaTeXFeatures;
class RenderMonitoredPreview;
// Created by AAS 970521
/// for including tex/lyx files
class InsetInclude: public InsetOld {
@ -85,6 +85,11 @@ public:
private:
/// Slot receiving a signal that the preview is ready to display.
void statusChanged() const;
/** Slot receiving a signal that the external file has changed
* and the preview should be regenerated.
*/
void fileChanged() const;
friend class InsetIncludeMailer;
@ -102,15 +107,12 @@ private:
/// holds the entity name that defines the file location (SGML)
std::string const include_label;
/// Use the Pimpl idiom to hide the internals of the previewer.
class PreviewImpl;
friend class PreviewImpl;
/// The pointer never changes although *preview_'s contents may.
boost::scoped_ptr<PreviewImpl> const preview_;
boost::scoped_ptr<RenderMonitoredPreview> const preview_;
/// cache
mutable bool set_label_;
mutable ButtonRenderer button_;
mutable RenderButton button_;
};

View File

@ -16,6 +16,7 @@
#include "LaTeXFeatures.h"
#include "metricsinfo.h"
#include "support/std_ostream.h"
using std::string;
using std::ostream;

View File

@ -17,6 +17,8 @@
#include "support/lstrings.h"
#include "support/std_ostream.h"
using lyx::support::escape;
using std::string;

View File

@ -16,6 +16,7 @@
#include "metricsinfo.h"
#include "toc.h"
#include "support/std_ostream.h"
using std::string;
using std::ostream;

View File

@ -19,6 +19,7 @@
#include "support/lstrings.h"
#include "support/std_ostream.h"
using lyx::support::subst;

21
src/insets/render_base.C Normal file
View File

@ -0,0 +1,21 @@
/**
* \file render_base.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "render_base.h"
#include "BufferView.h"
BufferView * RenderBase::view() const
{
return view_.lock().get();
}

48
src/insets/render_base.h Normal file
View File

@ -0,0 +1,48 @@
// -*- C++ -*-
/**
* \file render_base.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#ifndef RENDER_BASE_H
#define RENDER_BASE_H
#include "dimension.h"
#include <boost/weak_ptr.hpp>
class BufferView;
class MetricsInfo;
class PainterInfo;
class RenderBase {
public:
virtual ~RenderBase() {}
virtual RenderBase * clone() const = 0;
/// compute the size of the object returned in dim
virtual void metrics(MetricsInfo & mi, Dimension & dim) const = 0;
/// draw inset and update (xo, yo)-cache
virtual void draw(PainterInfo & pi, int x, int y) const = 0;
/// An accessor function to the cached store.
BufferView * view() const;
protected:
RenderBase() {}
RenderBase(RenderBase const &) {}
void operator=(RenderBase const &) {}
/// These are cached variables (are not copied).
mutable boost::weak_ptr<BufferView> view_;
mutable Dimension dim_;
};
#endif // NOT RENDER_BASE_H

View File

@ -0,0 +1,74 @@
/**
* \file render_button.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "render_button.h"
#include "BufferView.h"
#include "LColor.h"
#include "metricsinfo.h"
#include "frontends/font_metrics.h"
#include "frontends/LyXView.h"
#include "frontends/Painter.h"
using std::string;
RenderButton::RenderButton()
: editable_(false)
{}
RenderBase * RenderButton::clone() const
{
return new RenderButton(*this);
}
void RenderButton::update(string const & text, bool editable)
{
text_ = text;
editable_ = editable;
}
void RenderButton::metrics(MetricsInfo &, Dimension & dim) const
{
LyXFont font(LyXFont::ALL_SANE);
font.decSize();
if (editable_)
font_metrics::buttonText(text_, font, dim.wid, dim.asc, dim.des);
else
font_metrics::rectText(text_, font, dim.wid, dim.asc, dim.des);
dim.wid += 4;
}
void RenderButton::draw(PainterInfo & pi, int x, int y) const
{
BOOST_ASSERT(pi.base.bv);
view_ = pi.base.bv->owner()->view();
// Draw it as a box with the LaTeX text
LyXFont font(LyXFont::ALL_SANE);
font.setColor(LColor::command);
font.decSize();
if (editable_) {
pi.pain.buttonText(x + 2, y, text_, font);
} else {
pi.pain.rectText(x + 2, y, text_, font,
LColor::commandbg, LColor::commandframe);
}
}

View File

@ -0,0 +1,47 @@
// -*- C++ -*-
/**
* \file render_button.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#ifndef RENDER_BUTTON_H
#define RENDER_BUTTON_H
#include "render_base.h"
#include "box.h"
#include <string>
class RenderButton : public RenderBase
{
public:
RenderButton();
RenderBase * clone() const;
/// compute the size of the object returned in dim
virtual void metrics(MetricsInfo & mi, Dimension & dim) const;
/// draw inset and update (xo, yo)-cache
virtual void draw(PainterInfo & pi, int x, int y) const;
/// Provide the text for the button
void update(std::string const &, bool editable);
/// The "sensitive area" box, i.e., the button area
Box box() const { return button_box_; }
///
void setBox(Box b) { button_box_ = b; }
private:
/// The stored data.
std::string text_;
bool editable_;
Box button_box_;
};
#endif // NOT RENDER_BUTTON_H

View File

@ -1,5 +1,5 @@
/**
* \file renderers.C
* \file render_graphic.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
@ -10,7 +10,7 @@
#include <config.h>
#include "insets/renderers.h"
#include "render_graphic.h"
#include "insets/inset.h"
@ -34,106 +34,26 @@ using lyx::support::OnlyFilename;
using std::string;
RenderInset::RenderInset()
{}
RenderInset::RenderInset(RenderInset const &)
{
// Cached variables are not copied
}
RenderInset::~RenderInset()
{}
RenderInset & RenderInset::operator=(RenderInset const &)
{
// Cached variables are not copied
return *this;
}
BufferView * RenderInset::view() const
{
return view_.lock().get();
}
ButtonRenderer::ButtonRenderer()
: editable_(false)
{}
RenderInset * ButtonRenderer::clone() const
{
return new ButtonRenderer(*this);
}
void ButtonRenderer::update(string const & text, bool editable)
{
text_ = text;
editable_ = editable;
}
void ButtonRenderer::metrics(MetricsInfo & mi, Dimension & dim) const
{
BOOST_ASSERT(mi.base.bv);
LyXFont font(LyXFont::ALL_SANE);
font.decSize();
if (editable_)
font_metrics::buttonText(text_, font, dim.wid, dim.asc, dim.des);
else
font_metrics::rectText(text_, font, dim.wid, dim.asc, dim.des);
dim.wid += 4;
}
void ButtonRenderer::draw(PainterInfo & pi, int x, int y) const
{
BOOST_ASSERT(pi.base.bv);
view_ = pi.base.bv->owner()->view();
// Draw it as a box with the LaTeX text
LyXFont font(LyXFont::ALL_SANE);
font.setColor(LColor::command);
font.decSize();
if (editable_) {
pi.pain.buttonText(x + 2, y, text_, font);
} else {
pi.pain.rectText(x + 2, y, text_, font,
LColor::commandbg, LColor::commandframe);
}
}
GraphicRenderer::GraphicRenderer()
RenderGraphic::RenderGraphic()
: checksum_(0)
{}
GraphicRenderer::GraphicRenderer(GraphicRenderer const & other)
: RenderInset(other),
RenderGraphic::RenderGraphic(RenderGraphic const & other)
: RenderBase(other),
loader_(other.loader_),
params_(other.params_),
checksum_(0)
{}
RenderInset * GraphicRenderer::clone() const
RenderBase * RenderGraphic::clone() const
{
return new GraphicRenderer(*this);
return new RenderGraphic(*this);
}
void GraphicRenderer::update(lyx::graphics::Params const & params)
void RenderGraphic::update(lyx::graphics::Params const & params)
{
params_ = params;
@ -144,7 +64,7 @@ void GraphicRenderer::update(lyx::graphics::Params const & params)
}
bool GraphicRenderer::hasFileChanged() const
bool RenderGraphic::hasFileChanged() const
{
unsigned long const new_checksum = loader_.checksum();
bool const file_has_changed = checksum_ != new_checksum;
@ -154,13 +74,13 @@ bool GraphicRenderer::hasFileChanged() const
}
boost::signals::connection GraphicRenderer::connect(slot_type const & slot) const
boost::signals::connection RenderGraphic::connect(slot_type const & slot) const
{
return loader_.connect(slot);
}
string const GraphicRenderer::statusMessage() const
string const RenderGraphic::statusMessage() const
{
switch (loader_.status()) {
case lyx::graphics::WaitingToLoad:
@ -190,7 +110,7 @@ string const GraphicRenderer::statusMessage() const
}
bool GraphicRenderer::readyToDisplay() const
bool RenderGraphic::readyToDisplay() const
{
if (!loader_.image() || loader_.status() != lyx::graphics::Ready)
return false;
@ -198,7 +118,7 @@ bool GraphicRenderer::readyToDisplay() const
}
void GraphicRenderer::metrics(MetricsInfo & mi, Dimension & dim) const
void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
{
bool image_ready = readyToDisplay();
@ -234,36 +154,11 @@ void GraphicRenderer::metrics(MetricsInfo & mi, Dimension & dim) const
}
void GraphicRenderer::draw(PainterInfo & pi, int x, int y) const
void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
{
BOOST_ASSERT(pi.base.bv);
view_ = pi.base.bv->owner()->view();
#if 0
// Comment this out and see if anything goes wrong.
// The explanation for why it _was_ needed once upon a time is below.
// MakeAbsPath returns filename_ unchanged if it is absolute
// already.
string const file_with_path =
MakeAbsPath(params_.filename, view_->buffer()->filePath());
// A 'paste' operation creates a new inset with the correct filepath,
// but then the 'old' inset stored in the 'copy' operation is actually
// added to the buffer.
// Thus, pasting a graphic into a new buffer with different
// buffer->filePath() will result in the image being displayed in LyX even
// though the relative path now points at nothing at all. Subsequent
// loading of the file into LyX will therefore fail.
// We should ensure that the filepath is correct.
if (file_with_path != loader_.filename()) {
params_.filename = file_with_path;
update(params_);
}
#endif
if (params_.display != lyx::graphics::NoDisplay &&
loader_.status() == lyx::graphics::WaitingToLoad)
loader_.startLoading();

View File

@ -0,0 +1,66 @@
// -*- C++ -*-
/**
* \file render_graphic.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#ifndef RENDER_GRAPHIC_H
#define RENDER_GRAPHIC_H
#include "render_base.h"
#include "graphics/GraphicsLoader.h"
#include "graphics/GraphicsParams.h"
#include <boost/signals/signal0.hpp>
class RenderGraphic : public RenderBase
{
public:
RenderGraphic();
RenderGraphic(RenderGraphic const &);
RenderBase * clone() const;
/// compute the size of the object returned in dim
void metrics(MetricsInfo & mi, Dimension & dim) const;
/// draw inset and update (xo, yo)-cache
void draw(PainterInfo & pi, int x, int y) const;
/// Refresh the info about which file to display and how to display it.
void update(lyx::graphics::Params const & params);
/// Is the stored checksum different to that of the graphics loader?
bool hasFileChanged() const;
/** Connect and you'll be informed when the loading status of the image
* changes.
*/
typedef boost::signal0<void>::slot_type slot_type;
boost::signals::connection connect(slot_type const &) const;
private:
/// Not implemented.
RenderGraphic & operator=(RenderGraphic const &);
/// The message to display instead of the graphic itself.
std::string const statusMessage() const;
/// Is the image ready to draw, or should we display a message instead?
bool readyToDisplay() const;
/// The stored data.
lyx::graphics::Loader loader_;
lyx::graphics::Params params_;
/// Cached variable (not copied).
mutable unsigned long checksum_;
};
#endif // NOT RENDER_GRAPHIC_H

178
src/insets/render_preview.C Normal file
View File

@ -0,0 +1,178 @@
/**
* \file render_preview.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "render_preview.h"
#include "dimension.h"
#include "LColor.h"
#include "metricsinfo.h"
#include "frontends/Painter.h"
#include "graphics/PreviewImage.h"
#include "graphics/PreviewLoader.h"
#include "graphics/Previews.h"
#include "support/lstrings.h"
#include <boost/bind.hpp>
using std::string;
namespace graphics = lyx::graphics;
namespace support = lyx::support;
bool RenderPreview::activated()
{
return graphics::Previews::activated();
}
RenderPreview::RenderPreview()
: pimage_(0)
{}
RenderPreview::RenderPreview(RenderPreview const & other)
: RenderBase(other),
boost::signals::trackable(),
snippet_(other.snippet_),
pimage_(0)
{}
RenderBase * RenderPreview::clone() const
{
return new RenderPreview(*this);
}
void RenderPreview::metrics(MetricsInfo &, Dimension & dim) const
{
if (previewReady()) {
dim.asc = pimage()->ascent();
dim.des = pimage()->descent();
dim.wid = pimage()->width();
} else {
dim.asc = 20;
dim.des = 20;
dim.wid = 20;
}
dim_ = dim;
}
void RenderPreview::draw(PainterInfo & pi, int x, int y) const
{
BOOST_ASSERT(pi.base.bv);
view_ = pi.base.bv->owner()->view();
if (!previewReady())
pi.pain.rectangle(x, y - dim_.asc, dim_.wid, dim_.height(),
LColor::foreground);
else
pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
*(pimage()->image()));
}
boost::signals::connection RenderPreview::connect(slot_type const & slot)
{
return preview_ready_signal_.connect(slot);
}
void RenderPreview::generatePreview(string const & latex_snippet,
Buffer const & buffer)
{
if (!activated())
return;
graphics::Previews & previews = graphics::Previews::get();
graphics::PreviewLoader & loader = previews.loader(buffer);
addPreview(latex_snippet, loader);
if (!snippet_.empty())
loader.startLoading();
}
void RenderPreview::addPreview(string const & latex_snippet,
graphics::PreviewLoader & ploader)
{
if (!activated())
return;
snippet_ = support::trim(latex_snippet);
pimage_ = 0;
if (snippet_.empty())
return;
pimage_ = ploader.preview(snippet_);
if (pimage_)
return;
// 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(
boost::bind(&RenderPreview::imageReady, this, _1));
}
ploader.add(snippet_);
}
void RenderPreview::removePreview(Buffer const & buffer)
{
if (snippet_.empty())
return;
graphics::Previews & previews = graphics::Previews::get();
graphics::PreviewLoader & loader = previews.loader(buffer);
loader.remove(snippet_);
snippet_.erase();
pimage_ = 0;
}
bool RenderPreview::previewReady() const
{
return pimage_ ? pimage_->image() : false;
}
void RenderPreview::imageReady(graphics::PreviewImage const & pimage)
{
// Check the current snippet is the same as that previewed.
if (snippet_ != pimage.snippet())
return;
pimage_ = &pimage;
preview_ready_signal_();
}
void RenderMonitoredPreview::startMonitoring(string const & file)
{
monitor_.reset(file);
monitor_.start();
}
boost::signals::connection
RenderMonitoredPreview::fileChanged(slot_type const & slot)
{
return monitor_.connect(slot);
}

View File

@ -1,6 +1,6 @@
// -*- C++ -*-
/**
* \file PreviewedInset.h
* \file render_preview.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
@ -8,13 +8,17 @@
*
* Full author contact details are available in file CREDITS.
*
* lyx::graphics::PreviewedInset is an abstract base class that can help
* lyx::graphics::RenderPreview is an abstract base class that can help
* insets to generate previews. The daughter class must instantiate two small
* methods. The Inset would own an instance of this daughter class.
*/
#ifndef PREVIEWEDINSET_H
#define PREVIEWEDINSET_H
#ifndef RENDER_PREVIEW_H
#define RENDER_PREVIEW_H
#include "render_base.h"
#include "support/FileMonitor.h"
#include <boost/signals/signal0.hpp>
#include <boost/signals/trackable.hpp>
@ -22,7 +26,8 @@
class Buffer;
class BufferView;
class MetricsInfo;
class PainterInfo;
namespace lyx {
namespace graphics {
@ -33,23 +38,32 @@ class PreviewLoader;
} // namespace graphics
} // namespace lyx
class PreviewedInset : public boost::signals::trackable {
class RenderPreview : public RenderBase, public boost::signals::trackable {
public:
/// a wrapper for Previews::activated()
static bool activated();
RenderPreview();
RenderPreview(RenderPreview const &);
RenderBase * clone() const;
/// Compute the size of the object, returned in dim
void metrics(MetricsInfo &, Dimension & dim) const;
///
PreviewedInset();
void draw(PainterInfo & pi, int x, int y) const;
/** Find the PreviewLoader, add a LaTeX snippet to it and
* start the loading process.
*/
void generatePreview(Buffer const &);
void generatePreview(std::string const & latex_snippet,
Buffer const &);
/** Add a LaTeX snippet to the PreviewLoader but do not start the
* loading process.
*/
void addPreview(lyx::graphics::PreviewLoader & ploader);
void addPreview(std::string const & latex_snippet,
lyx::graphics::PreviewLoader & ploader);
/** Remove a snippet from the cache of previews.
* Useful if previewing the contents of a file that has changed.
@ -60,30 +74,25 @@ public:
bool previewReady() const;
/// If the preview is not ready, returns 0.
lyx::graphics::PreviewImage const * const pimage() const { return pimage_; }
lyx::graphics::PreviewImage const * const pimage() const
{ return pimage_; }
/// Connect and you'll be informed when the preview is ready.
typedef boost::signal0<void>::slot_type slot_type;
boost::signals::connection connect(slot_type const &);
protected:
///
virtual ~PreviewedInset() {}
private:
/// This method is connected to the PreviewLoader::imageReady signal.
void imageReady(lyx::graphics::PreviewImage const &) const;
/// Not implemented.
void operator=(RenderPreview const &);
/// Does the owning inset want a preview?
virtual bool previewWanted(Buffer const &) const = 0;
/// a wrapper to Inset::latex
virtual std::string const latexString(Buffer const &) const = 0;
/// This method is connected to the PreviewLoader::imageReady signal.
void imageReady(lyx::graphics::PreviewImage const &);
/// The thing that we're trying to generate a preview of.
std::string snippet_;
/// We don't own this. Cached for efficiency reasons.
mutable lyx::graphics::PreviewImage const * pimage_;
lyx::graphics::PreviewImage const * pimage_;
/** Store the connection to the preview loader so that we connect
* only once.
@ -94,4 +103,23 @@ private:
boost::signal0<void> preview_ready_signal_;
};
#endif // PREVIEWEDINSET_H
class RenderMonitoredPreview : public RenderPreview {
public:
RenderMonitoredPreview() : monitor_(std::string(), 2000) {}
///
bool monitoring() const { return monitor_.monitoring(); }
///
void startMonitoring(std::string const & file);
///
void stopMonitoring() { monitor_.stop(); }
/// Connect and you'll be informed when the file changes.
boost::signals::connection fileChanged(slot_type const &);
private:
///
lyx::support::FileMonitor monitor_;
};
#endif // RENDERPREVIEW_H

View File

@ -1,128 +0,0 @@
// -*- C++ -*-
/**
* \file renderers.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#ifndef RENDERERS_H
#define RENDERERS_H
#include "box.h"
#include "dimension.h"
#include "graphics/GraphicsLoader.h"
#include "graphics/GraphicsParams.h"
#include <boost/weak_ptr.hpp>
#include <boost/signals/signal0.hpp>
class BufferView;
class MetricsInfo;
class PainterInfo;
class RenderInset
{
public:
virtual ~RenderInset();
virtual RenderInset * clone() const = 0;
/// compute the size of the object returned in dim
virtual void metrics(MetricsInfo & mi, Dimension & dim) const = 0;
/// draw inset and update (xo, yo)-cache
virtual void draw(PainterInfo & pi, int x, int y) const = 0;
/// An accessor function to the cached store.
BufferView * view() const;
protected:
RenderInset();
RenderInset(RenderInset const &);
RenderInset & operator=(RenderInset const &);
/// These are cached variables (are not copied).
mutable boost::weak_ptr<BufferView> view_;
mutable Dimension dim_;
};
class ButtonRenderer : public RenderInset
{
public:
ButtonRenderer();
virtual RenderInset * clone() const;
/// This should provide the text for the button
void update(std::string const &, bool editable);
/// compute the size of the object returned in dim
virtual void metrics(MetricsInfo & mi, Dimension & dim) const;
/// draw inset and update (xo, yo)-cache
virtual void draw(PainterInfo & pi, int x, int y) const;
/// The "sensitive area" box, i.e., the button area
Box box() const { return button_box_; }
///
void setBox(Box b) { button_box_ = b; }
private:
/// The stored data.
std::string text_;
bool editable_;
Box button_box_;
};
class GraphicRenderer : public RenderInset
{
public:
GraphicRenderer();
GraphicRenderer(GraphicRenderer const &);
virtual RenderInset * clone() const;
/// Refresh the info about which file to display and how to display it.
void update(lyx::graphics::Params const & params);
/// compute the size of the object returned in dim
virtual void metrics(MetricsInfo & mi, Dimension & dim) const;
/// draw inset and update (xo, yo)-cache
virtual void draw(PainterInfo & pi, int x, int y) const;
/// Is the stored checksum different to that of the graphics loader?
bool hasFileChanged() const;
/** Connect and you'll be informed when the loading status of the image
* changes.
*/
typedef boost::signal0<void>::slot_type slot_type;
virtual boost::signals::connection connect(slot_type const &) const;
private:
/// Not implemented.
GraphicRenderer & operator=(GraphicRenderer const &);
/// The message to display instead of the graphic itself.
std::string const statusMessage() const;
/// Is the image ready to draw, or should we display a message instead?
bool readyToDisplay() const;
/// The stored data.
lyx::graphics::Loader loader_;
lyx::graphics::Params params_;
/// Cached variable (not copied).
mutable unsigned long checksum_;
};
#endif // NOT RENDERERS_H

View File

@ -1,3 +1,10 @@
2003-10-10 Angus Leeming <leeming@lyx.org>
* command_inset.h:trivial changes ButtonRenderer -> RenderButton.
* formula.[Ch]: get rid of InsetFormula::PreviewImpl entirely. Use
RenderPreview and some free-standing functions in its place.
2003-10-10 Angus Leeming <leeming@lyx.org>
* formula.C (draw): don't try and generate the previews from draw.

View File

@ -14,7 +14,7 @@
#define COMMAND_INSET_H
#include "math_nestinset.h"
#include "insets/renderers.h"
#include "insets/render_button.h"
/// Inset for things like \name[options]{contents}
@ -44,7 +44,7 @@ public:
private:
std::string name_;
mutable bool set_label_;
mutable ButtonRenderer button_;
mutable RenderButton button_;
};
#endif

View File

@ -25,8 +25,10 @@
#include "frontends/Painter.h"
#include "graphics/PreviewedInset.h"
#include "graphics/PreviewImage.h"
#include "graphics/PreviewLoader.h"
#include "insets/render_preview.h"
#include "support/std_sstream.h"
@ -40,24 +42,9 @@ using std::auto_ptr;
using std::endl;
class InsetFormula::PreviewImpl : public PreviewedInset {
public:
///
PreviewImpl(InsetFormula const & p) : parent_(p) {}
private:
///
bool previewWanted(Buffer const &) const;
///
string const latexString(Buffer const &) const;
///
InsetFormula const & parent_;
};
InsetFormula::InsetFormula(bool chemistry)
: par_(MathAtom(new MathHullInset)),
preview_(new PreviewImpl(*this))
preview_(new RenderPreview)
{
preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
if (chemistry)
@ -68,7 +55,7 @@ InsetFormula::InsetFormula(bool chemistry)
InsetFormula::InsetFormula(InsetFormula const & other)
: InsetFormulaBase(other),
par_(other.par_),
preview_(new PreviewImpl(*this))
preview_(new RenderPreview)
{
preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
}
@ -76,7 +63,7 @@ InsetFormula::InsetFormula(InsetFormula const & other)
InsetFormula::InsetFormula(BufferView *)
: par_(MathAtom(new MathHullInset)),
preview_(new PreviewImpl(*this))
preview_(new RenderPreview)
{
preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
}
@ -84,7 +71,7 @@ InsetFormula::InsetFormula(BufferView *)
InsetFormula::InsetFormula(string const & data)
: par_(MathAtom(new MathHullInset)),
preview_(new PreviewImpl(*this))
preview_(new RenderPreview)
{
preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
if (!data.size())
@ -193,6 +180,7 @@ void InsetFormula::read(Buffer const &, LyXLex & lex)
void InsetFormula::draw(PainterInfo & pi, int x, int y) const
{
BOOST_ASSERT(pi.base.bv);
BufferView * bv = pi.base.bv;
cache(bv);
@ -206,8 +194,8 @@ void InsetFormula::draw(PainterInfo & pi, int x, int y) const
int const h = a + d;
if (use_preview) {
pi.pain.image(x + 1, y - a, w, h, // one pixel gap in front
*(preview_->pimage()->image()));
// one pixel gap in front
preview_->draw(pi, x + 1, y);
} else {
PainterInfo p(bv);
p.base.style = LM_ST_TEXT;
@ -260,16 +248,16 @@ bool InsetFormula::insetAllowed(InsetOld::Code code) const
void InsetFormula::metrics(MetricsInfo & m, Dimension & dim) const
{
BOOST_ASSERT(m.base.bv);
view_ = m.base.bv;
bool const editing_inset = mathcursor && mathcursor->formula() == this;
bool const use_preview = !editing_inset && preview_->previewReady();
if (use_preview) {
dim.asc = preview_->pimage()->ascent();
dim.des = preview_->pimage()->descent();
preview_->metrics(m, dim);
// insert a one pixel gap in front of the formula
dim.wid = 1 + preview_->pimage()->width();
dim.wid += 1;
if (display())
dim.des += 12;
} else {
@ -309,28 +297,39 @@ void InsetFormula::statusChanged() const
}
namespace {
bool preview_wanted(InsetFormula const & inset, Buffer const &)
{
// Don't want a preview when we're editing the inset
return !(mathcursor && mathcursor->formula() == &inset);
}
string const latex_string(InsetFormula const & inset, Buffer const &)
{
ostringstream ls;
WriteStream wi(ls, false, false);
inset.par()->write(wi);
return ls.str();
}
} // namespace anon
void InsetFormula::addPreview(lyx::graphics::PreviewLoader & ploader) const
{
preview_->addPreview(ploader);
if (preview_wanted(*this, ploader.buffer())) {
string const snippet = latex_string(*this, ploader.buffer());
preview_->addPreview(snippet, ploader);
}
}
void InsetFormula::generatePreview(Buffer const & buffer) const
{
preview_->generatePreview(buffer);
}
bool InsetFormula::PreviewImpl::previewWanted(Buffer const &) const
{
return !parent_.par_->asNestInset()->editing();
}
string const InsetFormula::PreviewImpl::latexString(Buffer const &) const
{
ostringstream ls;
WriteStream wi(ls, false, false);
parent_.par_->write(wi);
return ls.str();
if (preview_wanted(*this, buffer)) {
string const snippet = latex_string(*this, buffer);
preview_->generatePreview(snippet, buffer);
}
}

View File

@ -18,6 +18,8 @@
#include <boost/scoped_ptr.hpp>
class RenderPreview;
/// The main LyX math inset
class InsetFormula : public InsetFormulaBase {
@ -84,10 +86,7 @@ private:
/// x offset for drawing displayed formula
mutable int offset_;
/// Use the Pimpl idiom to hide the internals of the previewer.
class PreviewImpl;
friend class PreviewImpl;
/// The pointer never changes although *preview_'s contents may.
boost::scoped_ptr<PreviewImpl> const preview_;
boost::scoped_ptr<RenderPreview> const preview_;
};
#endif