From 11c6ea653ba7c601bedee9c2ea64ad5feff60357 Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Wed, 22 Oct 2003 22:26:47 +0000 Subject: [PATCH] Give InsetExternal the ability to preview its contents. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7959 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/qt2/ChangeLog | 6 + src/frontends/qt2/QExternal.C | 28 ++- src/frontends/qt2/ui/QExternalDialogBase.ui | 6 + src/frontends/xforms/ChangeLog | 6 + src/frontends/xforms/FormExternal.C | 28 ++- src/graphics/ChangeLog | 5 + src/graphics/PreviewImage.C | 2 +- src/insets/ChangeLog | 13 + src/insets/insetexternal.C | 257 ++++++++++++++++++-- src/insets/insetexternal.h | 27 +- src/insets/insetinclude.C | 28 +-- src/insets/render_preview.C | 105 ++++++-- src/insets/render_preview.h | 24 +- src/mathed/ChangeLog | 5 + src/mathed/formula.C | 3 +- 15 files changed, 455 insertions(+), 88 deletions(-) diff --git a/src/frontends/qt2/ChangeLog b/src/frontends/qt2/ChangeLog index 6de9680e83..0e2039ab5c 100644 --- a/src/frontends/qt2/ChangeLog +++ b/src/frontends/qt2/ChangeLog @@ -1,3 +1,9 @@ +2003-10-22 Angus Leeming + + * QExternal.C: + * QExternalDialogBase.ui: enable the user to choose to 'preview' the + external file. + 2003-10-14 Angus Leeming * lyx_gui.C (start): store the LyXView in the LyX list of all LyXViews. diff --git a/src/frontends/qt2/QExternal.C b/src/frontends/qt2/QExternal.C index 53b49a453d..da46a4c555 100644 --- a/src/frontends/qt2/QExternal.C +++ b/src/frontends/qt2/QExternal.C @@ -79,17 +79,18 @@ void QExternal::update_contents() int item = 0; switch (params.display) { - case lyx::graphics::DefaultDisplay: item = 0; break; - case lyx::graphics::MonochromeDisplay: item = 1; break; - case lyx::graphics::GrayscaleDisplay: item = 2; break; - case lyx::graphics::ColorDisplay: item = 3; break; - case lyx::graphics::NoDisplay: item = 0; break; + case lyx::external::DefaultDisplay: item = 0; break; + case lyx::external::MonochromeDisplay: item = 1; break; + case lyx::external::GrayscaleDisplay: item = 2; break; + case lyx::external::ColorDisplay: item = 3; break; + case lyx::external::PreviewDisplay: item = 4; break; + case lyx::external::NoDisplay: item = 0; break; } dialog_->showCB->setCurrentItem(item); - dialog_->showCB->setEnabled(params.display != lyx::graphics::NoDisplay && + dialog_->showCB->setEnabled(params.display != lyx::external::NoDisplay && !readOnly()); - dialog_->displayCB->setChecked(params.display != lyx::graphics::NoDisplay); - dialog_->displayscale->setEnabled(params.display != lyx::graphics::NoDisplay && + dialog_->displayCB->setChecked(params.display != lyx::external::NoDisplay); + dialog_->displayscale->setEnabled(params.display != lyx::external::NoDisplay && !readOnly()); dialog_->displayscale->setText(toqstr(tostr(params.lyxscale))); @@ -157,15 +158,16 @@ void QExternal::apply() controller().getTemplate(dialog_->externalCO->currentItem()).lyxName); switch (dialog_->showCB->currentItem()) { - case 0: params.display = lyx::graphics::DefaultDisplay; break; - case 1: params.display = lyx::graphics::MonochromeDisplay; break; - case 2: params.display = lyx::graphics::GrayscaleDisplay; break; - case 3: params.display = lyx::graphics::ColorDisplay; break; + case 0: params.display = lyx::external::DefaultDisplay; break; + case 1: params.display = lyx::external::MonochromeDisplay; break; + case 2: params.display = lyx::external::GrayscaleDisplay; break; + case 3: params.display = lyx::external::ColorDisplay; break; + case 4: params.display = lyx::external::PreviewDisplay; break; default:; } if (!dialog_->displayCB->isChecked()) - params.display = lyx::graphics::NoDisplay; + params.display = lyx::external::NoDisplay; params.lyxscale = strToInt(fromqstr(dialog_->displayscale->text())); diff --git a/src/frontends/qt2/ui/QExternalDialogBase.ui b/src/frontends/qt2/ui/QExternalDialogBase.ui index f80df519a2..39e29b0d33 100644 --- a/src/frontends/qt2/ui/QExternalDialogBase.ui +++ b/src/frontends/qt2/ui/QExternalDialogBase.ui @@ -318,6 +318,12 @@ Color + + + text + Preview + + name showCB diff --git a/src/frontends/xforms/ChangeLog b/src/frontends/xforms/ChangeLog index 05149c6a37..4588aab2b2 100644 --- a/src/frontends/xforms/ChangeLog +++ b/src/frontends/xforms/ChangeLog @@ -1,3 +1,9 @@ +2003-10-22 Angus Leeming + + * FormExternal.C: + * ui/QExternalDialogBase.ui: enable the user to choose to 'preview' the + external file. + 2003-10-14 Angus Leeming * lyx_gui.C (start): store the LyXView in the LyX list of all LyXViews. diff --git a/src/frontends/xforms/FormExternal.C b/src/frontends/xforms/FormExternal.C index f77022f2d1..77513de129 100644 --- a/src/frontends/xforms/FormExternal.C +++ b/src/frontends/xforms/FormExternal.C @@ -58,20 +58,23 @@ void FormExternal::apply() params.lyxscale = 100; switch (fl_get_choice(dialog_->choice_display)) { + case 6: + params.display = lyx::external::NoDisplay; + break; case 5: - params.display = lyx::graphics::NoDisplay; + params.display = lyx::external::PreviewDisplay; break; case 4: - params.display = lyx::graphics::ColorDisplay; + params.display = lyx::external::ColorDisplay; break; case 3: - params.display = lyx::graphics::GrayscaleDisplay; + params.display = lyx::external::GrayscaleDisplay; break; case 2: - params.display = lyx::graphics::MonochromeDisplay; + params.display = lyx::external::MonochromeDisplay; break; case 1: - params.display = lyx::graphics::DefaultDisplay; + params.display = lyx::external::DefaultDisplay; } std::map::const_iterator it = extra_.begin(); @@ -110,7 +113,7 @@ void FormExternal::build() fl_set_input_filter(dialog_->input_lyxscale, fl_unsigned_int_filter); string const display_List = - _("Default|Monochrome|Grayscale|Color|Do not display"); + _("Default|Monochrome|Grayscale|Color|Preview|Do not display"); fl_addto_choice(dialog_->choice_display, display_List.c_str()); // Set up the tooltips. @@ -148,19 +151,22 @@ void FormExternal::update() fl_set_input(dialog_->input_lyxscale, tostr(params.lyxscale).c_str()); switch (params.display) { - case lyx::graphics::NoDisplay: + case lyx::external::NoDisplay: + fl_set_choice(dialog_->choice_display, 6); + break; + case lyx::external::PreviewDisplay: fl_set_choice(dialog_->choice_display, 5); break; - case lyx::graphics::ColorDisplay: + case lyx::external::ColorDisplay: fl_set_choice(dialog_->choice_display, 4); break; - case lyx::graphics::GrayscaleDisplay: + case lyx::external::GrayscaleDisplay: fl_set_choice(dialog_->choice_display, 3); break; - case lyx::graphics::MonochromeDisplay: + case lyx::external::MonochromeDisplay: fl_set_choice(dialog_->choice_display, 2); break; - case lyx::graphics::DefaultDisplay: + case lyx::external::DefaultDisplay: fl_set_choice(dialog_->choice_display, 1); } } diff --git a/src/graphics/ChangeLog b/src/graphics/ChangeLog index 150bdfbb6f..4ee0957f45 100644 --- a/src/graphics/ChangeLog +++ b/src/graphics/ChangeLog @@ -1,3 +1,8 @@ +2003-10-22 Angus Leeming + + * PreviewImage.C (statusChanged): always pass on the signal, not just + when the preview is ready for display. + 2003-10-22 Angus Leeming * GraphicsConverter.C (Impl c-tor): add a warning message if the file diff --git a/src/graphics/PreviewImage.C b/src/graphics/PreviewImage.C index 6aa987e484..75d41634ce 100644 --- a/src/graphics/PreviewImage.C +++ b/src/graphics/PreviewImage.C @@ -150,9 +150,9 @@ void PreviewImage::Impl::statusChanged() case Ready: support::unlink(iloader_.filename()); - ploader_.emitSignal(parent_); break; } + ploader_.emitSignal(parent_); } } // namespace graphics diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 630b9a8091..aa9a5180d9 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,16 @@ +2003-10-22 Angus Leeming + +w * insetexternal.[Ch]: add the ability to 'preview' the external file + if so desired. + + * insetinclude.C: changes due to the changes in the RenderPreview + interface. + + * render_preview.[Ch]: Lots of small changes. Display a diagnostic + message if the preview image is not available. Only initiate the + loading of the preview from draw(). Ditto, start the monitoring + of an external file from RenderMonitoredPreview::draw. + 2003-10-22 Angus Leeming * insetcite.[Ch] (setLoadingBuffer): removed. diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index f18fbc0a8a..e58c7b4954 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -15,6 +15,7 @@ #include "insets/ExternalTemplate.h" #include "insets/render_button.h" #include "insets/render_graphic.h" +#include "insets/render_preview.h" #include "buffer.h" #include "BufferView.h" @@ -31,6 +32,10 @@ #include "frontends/lyx_gui.h" #include "frontends/LyXView.h" +#include "graphics/PreviewLoader.h" + +#include "support/FileInfo.h" +#include "support/filetools.h" #include "support/lstrings.h" #include "support/lyxlib.h" #include "support/tostr.h" @@ -42,6 +47,7 @@ namespace support = lyx::support; namespace external = lyx::external; +namespace graphics = lyx::graphics; using std::endl; using std::string; @@ -54,7 +60,7 @@ using std::vector; namespace { -lyx::graphics::DisplayType const defaultDisplayType = lyx::graphics::NoDisplay; +external::DisplayType const defaultDisplayType = external::NoDisplay; unsigned int defaultLyxScale = 100; @@ -93,6 +99,32 @@ TempName::operator=(TempName const & other) return *this; } +namespace { + +/// The translator between the Display enum and corresponding lyx string. +Translator const initTranslator() +{ + Translator translator(DefaultDisplay, "default"); + + // Fill the display translator + translator.addPair(MonochromeDisplay, "monochrome"); + translator.addPair(GrayscaleDisplay, "grayscale"); + translator.addPair(ColorDisplay, "color"); + translator.addPair(PreviewDisplay, "preview"); + translator.addPair(NoDisplay, "none"); + + return translator; +} + +} // namespace anon + +Translator const & displayTranslator() +{ + static Translator const translator = + initTranslator(); + return translator; +} + } // namespace external } // namespace lyx @@ -155,7 +187,7 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const if (display != defaultDisplayType) os << "\tdisplay " - << lyx::graphics::displayTranslator().find(display) + << external::displayTranslator().find(display) << '\n'; if (lyxscale != defaultLyxScale) @@ -260,7 +292,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) case EX_DISPLAY: { lex.next(); string const name = lex.getString(); - display = lyx::graphics::displayTranslator().find(name); + display = external::displayTranslator().find(name); break; } @@ -351,6 +383,55 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) } +namespace { + +enum RenderType { + RENDERBUTTON, + RENDERGRAPHIC, + RENDERPREVIEW +}; + +RenderType getRenderType(InsetExternalParams const & p) +{ + if (!external::getTemplatePtr(p) || p.filename.empty() || + p.display == external::NoDisplay) + return RENDERBUTTON; + + if (p.display == external::PreviewDisplay) { + if (RenderPreview::activated()) + return RENDERPREVIEW; + return RENDERBUTTON; + } + + if (p.display == external::DefaultDisplay && + lyxrc.display_graphics == graphics::NoDisplay) + return RENDERBUTTON; + return RENDERGRAPHIC; +} + + +RenderGraphic & +graphicRenderer(boost::scoped_ptr const & renderer) +{ + RenderGraphic * const ptr = + dynamic_cast(renderer.get()); + BOOST_ASSERT(ptr); + return *ptr; +} + + +RenderMonitoredPreview & +previewRenderer(boost::scoped_ptr const & renderer) +{ + RenderMonitoredPreview * const ptr = + dynamic_cast(renderer.get()); + BOOST_ASSERT(ptr); + return *ptr; +} + +} // namespace anon + + InsetExternal::InsetExternal() : renderer_(new RenderButton) {} @@ -362,10 +443,42 @@ InsetExternal::InsetExternal(InsetExternal const & other) params_(other.params_), renderer_(other.renderer_->clone()) { - RenderGraphic * ptr = - dynamic_cast(renderer_.get()); - if (ptr) + switch (getRenderType(params_)) { + case RENDERBUTTON: + break; + + case RENDERGRAPHIC: { + RenderGraphic * const ptr = + dynamic_cast(renderer_.get()); + if (!ptr) { + lyxerr << "InsetExternal::InsetExternal " + << "Not a RenderGraphic!!" + << std::endl; + return; + } ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); +// RenderGraphic & renderer = graphicRenderer(renderer_); +// renderer.connect(boost::bind(&InsetExternal::statusChanged, this)); + break; + } + + case RENDERPREVIEW: { + RenderMonitoredPreview * const ptr = + dynamic_cast(renderer_.get()); + if (!ptr) { + lyxerr << "InsetExternal::InsetExternal " + << "Not a RenderPreview!!" + << std::endl; + return; + } + ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); + ptr->fileChanged(boost::bind(&InsetExternal::fileChanged, this)); +// RenderMonitoredPreview & renderer = previewRenderer(renderer_); +// renderer.connect(boost::bind(&InsetExternal::statusChanged, this)); +// renderer.fileChanged(boost::bind(&InsetExternal::fileChanged, this)); + break; + } + } } @@ -443,9 +556,9 @@ void InsetExternal::draw(PainterInfo & pi, int x, int y) const namespace { -lyx::graphics::Params get_grfx_params(InsetExternalParams const & eparams) +graphics::Params get_grfx_params(InsetExternalParams const & eparams) { - lyx::graphics::Params gparams; + graphics::Params gparams; gparams.filename = eparams.filename.absFilename(); gparams.scale = eparams.lyxscale; @@ -453,12 +566,30 @@ lyx::graphics::Params get_grfx_params(InsetExternalParams const & eparams) gparams.bb = eparams.clipdata.bbox; gparams.angle = eparams.rotationdata.angle(); - gparams.display = eparams.display; - if (gparams.display == lyx::graphics::DefaultDisplay) + switch (eparams.display) { + case external::DefaultDisplay: + gparams.display = graphics::DefaultDisplay; + break; + case external::MonochromeDisplay: + gparams.display = graphics::MonochromeDisplay; + break; + case external::GrayscaleDisplay: + gparams.display = graphics::GrayscaleDisplay; + break; + case external::ColorDisplay: + gparams.display = graphics::ColorDisplay; + break; + case external::NoDisplay: + gparams.display = graphics::NoDisplay; + break; + default: + BOOST_ASSERT(false); + } + if (gparams.display == graphics::DefaultDisplay) gparams.display = lyxrc.display_graphics; // Override the above if we're not using a gui if (!lyx_gui::use_gui) - gparams.display = lyx::graphics::NoDisplay; + gparams.display = graphics::NoDisplay; return gparams; } @@ -475,6 +606,8 @@ string const getScreenLabel(InsetExternalParams const & params, return external::doSubstitution(params, buffer, ptr->guiName); } +void add_preview(RenderMonitoredPreview &, InsetExternal const &, Buffer const &); + } // namespace anon @@ -491,11 +624,8 @@ void InsetExternal::setParams(InsetExternalParams const & p, params_ = p; // We display the inset as a button by default. - bool display_button = (!external::getTemplatePtr(params_) || - params_.filename.empty() || - params_.display == lyx::graphics::NoDisplay); - - if (display_button) { + switch (getRenderType(params_)) { + case RENDERBUTTON: { RenderButton * button_ptr = dynamic_cast(renderer_.get()); if (!button_ptr) { @@ -504,8 +634,9 @@ void InsetExternal::setParams(InsetExternalParams const & p, } button_ptr->update(getScreenLabel(params_, buffer), true); + break; - } else { + } case RENDERGRAPHIC: { RenderGraphic * graphic_ptr = dynamic_cast(renderer_.get()); if (!graphic_ptr) { @@ -516,10 +647,45 @@ void InsetExternal::setParams(InsetExternalParams const & p, } graphic_ptr->update(get_grfx_params(params_)); + + break; + } case RENDERPREVIEW: { + RenderMonitoredPreview * preview_ptr = + dynamic_cast(renderer_.get()); + if (!preview_ptr) { + preview_ptr = new RenderMonitoredPreview; + preview_ptr->connect( + boost::bind(&InsetExternal::statusChanged, this)); + preview_ptr->fileChanged( + boost::bind(&InsetExternal::fileChanged, this)); + renderer_.reset(preview_ptr); + } + + if (preview_ptr->monitoring()) + preview_ptr->stopMonitoring(); + add_preview(*preview_ptr, *this, buffer); + + break; + } } } +void InsetExternal::fileChanged() const +{ + Buffer const * const buffer_ptr = LyX::cref().updateInset(this); + if (!buffer_ptr) + return; + + RenderMonitoredPreview & renderer = previewRenderer(renderer_); + + Buffer const & buffer = *buffer_ptr; + renderer.removePreview(buffer); + add_preview(renderer, *this, buffer); + renderer.startLoading(buffer); +} + + void InsetExternal::write(Buffer const & buffer, ostream & os) const { params_.write(buffer, os); @@ -611,6 +777,63 @@ void InsetExternal::validate(LaTeXFeatures & features) const } +// +// preview stuff +// + +namespace { + +bool preview_wanted(InsetExternalParams const & params) +{ + string const included_file = params.filename.absFilename(); + + return params.display == external::PreviewDisplay && + support::IsFileReadable(included_file); +} + + +string const latex_string(InsetExternal const & inset, Buffer const & buffer) +{ + ostringstream os; + LatexRunParams runparams; + runparams.flavor = LatexRunParams::LATEX; + inset.latex(buffer, os, runparams); + + return os.str(); +} + + +void add_preview(RenderMonitoredPreview & renderer, InsetExternal const & inset, + Buffer const & buffer) +{ + InsetExternalParams const & params = inset.params(); + if (RenderPreview::activated() && preview_wanted(params)) { + renderer.setAbsFile(params.filename.absFilename()); + string const snippet = latex_string(inset, buffer); + renderer.addPreview(snippet, buffer); + } +} + +} // namespace anon + + +void InsetExternal::addPreview(graphics::PreviewLoader & ploader) const +{ + if (getRenderType(params_) != RENDERPREVIEW) + return; + + RenderMonitoredPreview & renderer = previewRenderer(renderer_); + + if (preview_wanted(params())) { + renderer.setAbsFile(params_.filename.absFilename()); + string const snippet = latex_string(*this, ploader.buffer()); + renderer.addPreview(snippet, ploader); + } +} + + +/// Mailer stuff + string const InsetExternalMailer::name_("external"); InsetExternalMailer::InsetExternalMailer(InsetExternal & inset) diff --git a/src/insets/insetexternal.h b/src/insets/insetexternal.h index fe35b5abbf..6dbbddf1ad 100644 --- a/src/insets/insetexternal.h +++ b/src/insets/insetexternal.h @@ -15,9 +15,8 @@ #include "inset.h" #include "ExternalTransforms.h" -#include "graphics/GraphicsTypes.h" - #include "support/filename.h" +#include "support/translator.h" #include #include @@ -43,6 +42,20 @@ private: std::string tempname_; }; +/// How is the image to be displayed on the LyX screen? +enum DisplayType { + DefaultDisplay, + MonochromeDisplay, + GrayscaleDisplay, + ColorDisplay, + PreviewDisplay, + NoDisplay +}; + + +/// The translator between the Display enum and corresponding lyx string. +Translator const & displayTranslator(); + } // namespace external } // namespace lyx @@ -64,7 +77,7 @@ struct InsetExternalParams { /// The external file. lyx::support::FileName filename; /// How the inset is to be displayed by LyX. - lyx::graphics::DisplayType display; + lyx::external::DisplayType display; /// The scale of the displayed graphic (if shown). unsigned int lyxscale; @@ -123,6 +136,9 @@ public: /// InsetExternalParams const & params() const; void setParams(InsetExternalParams const &, Buffer const &); + /// + void addPreview(lyx::graphics::PreviewLoader &) const; + protected: /// virtual @@ -134,6 +150,11 @@ private: */ void statusChanged() const; + /** Slot receiving a signal that the external file has changed + * and the preview should be regenerated. + */ + void fileChanged() const; + /// The current params InsetExternalParams params_; /// The thing that actually draws the image on LyX's screen. diff --git a/src/insets/insetinclude.C b/src/insets/insetinclude.C index 5a02886a53..80405c0e26 100644 --- a/src/insets/insetinclude.C +++ b/src/insets/insetinclude.C @@ -194,7 +194,7 @@ string const includedFilename(Buffer const & buffer, } -void generate_preview(RenderPreview &, InsetInclude const &, Buffer const &); +void add_preview(RenderMonitoredPreview &, InsetInclude const &, Buffer const &); } // namespace anon @@ -208,7 +208,7 @@ void InsetInclude::set(InsetCommandParams const & p, Buffer const & buffer) preview_->stopMonitoring(); if (type(params_) == INPUT) - generate_preview(*preview_, *this, buffer); + add_preview(*preview_, *this, buffer); } @@ -547,13 +547,6 @@ void InsetInclude::draw(PainterInfo & pi, int x, int y) const return; } - BOOST_ASSERT(pi.base.bv); - Buffer const * const buffer = pi.base.bv->buffer(); - if (!preview_->monitoring() && buffer) { - string const included_file = includedFilename(*buffer, params_); - preview_->startMonitoring(included_file); - } - preview_->draw(pi, x + button_.box().x1, y); } @@ -576,7 +569,8 @@ void InsetInclude::fileChanged() const Buffer const & buffer = *buffer_ptr; preview_->removePreview(buffer); - generate_preview(*preview_.get(), *this, buffer); + add_preview(*preview_.get(), *this, buffer); + preview_->startLoading(buffer); } @@ -602,14 +596,14 @@ string const latex_string(InsetInclude const & inset, Buffer const & buffer) } -void generate_preview(RenderPreview & renderer, - InsetInclude const & inset, - Buffer const & buffer) +void add_preview(RenderMonitoredPreview & renderer, InsetInclude const & inset, + Buffer const & buffer) { InsetCommandParams const & params = inset.params(); if (RenderPreview::activated() && preview_wanted(params, buffer)) { + renderer.setAbsFile(includedFilename(buffer, params)); string const snippet = latex_string(inset, buffer); - renderer.generatePreview(snippet, buffer); + renderer.addPreview(snippet, buffer); } } @@ -618,8 +612,10 @@ void generate_preview(RenderPreview & renderer, void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const { - if (preview_wanted(params(), ploader.buffer())) { - string const snippet = latex_string(*this, ploader.buffer()); + Buffer const & buffer = ploader.buffer(); + if (preview_wanted(params(), buffer)) { + preview_->setAbsFile(includedFilename(buffer, params())); + string const snippet = latex_string(*this, buffer); preview_->addPreview(snippet, ploader); } } diff --git a/src/insets/render_preview.C b/src/insets/render_preview.C index 4fd2d80c18..f1dd4511c9 100644 --- a/src/insets/render_preview.C +++ b/src/insets/render_preview.C @@ -10,12 +10,16 @@ #include -#include "render_preview.h" +#include "insets/render_preview.h" +#include "insets/inset.h" +#include "BufferView.h" #include "dimension.h" +#include "gettext.h" #include "LColor.h" #include "metricsinfo.h" +#include "frontends/font_metrics.h" #include "frontends/Painter.h" #include "graphics/PreviewImage.h" @@ -57,16 +61,53 @@ RenderBase * RenderPreview::clone() const } -void RenderPreview::metrics(MetricsInfo &, Dimension & dim) const +namespace { + +string const statusMessage(BufferView const * bv, string const & snippet) +{ + BOOST_ASSERT(bv && bv->buffer()); + + Buffer const & buffer = *bv->buffer(); + graphics::Previews const & previews = graphics::Previews::get(); + graphics::PreviewLoader const & loader = previews.loader(buffer); + graphics::PreviewLoader::Status const status = loader.status(snippet); + + string message; + switch (status) { + case graphics::PreviewLoader::InQueue: + case graphics::PreviewLoader::Processing: + message = _("Preview loading"); + break; + case graphics::PreviewLoader::Ready: + message = _("Preview ready"); + break; + case graphics::PreviewLoader::NotFound: + message = _("Preview failed"); + break; + } + + return message; +} + +} // namespace anon + + +void RenderPreview::metrics(MetricsInfo & mi, 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.asc = 50; + dim.des = 0; + + LyXFont font(mi.base.font); + font.setFamily(LyXFont::SANS_FAMILY); + font.setSize(LyXFont::SIZE_FOOTNOTE); + dim.wid = 15 + + font_metrics::width(statusMessage(mi.base.bv, snippet_), + font); } dim_ = dim; @@ -75,12 +116,28 @@ void RenderPreview::metrics(MetricsInfo &, Dimension & dim) const void RenderPreview::draw(PainterInfo & pi, int x, int y) const { - if (!previewReady()) - pi.pain.rectangle(x, y - dim_.asc, dim_.wid, dim_.height(), - LColor::foreground); - else + BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer()); + Buffer const & buffer = *pi.base.bv->buffer(); + startLoading(buffer); + + if (previewReady()) { pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(), *(pimage_->image())); + return; + } + + pi.pain.rectangle(x + InsetOld::TEXT_TO_INSET_OFFSET, + y - dim_.asc, + dim_.wid - 2 * InsetOld::TEXT_TO_INSET_OFFSET, + dim_.asc + dim_.des, + LColor::foreground); + + LyXFont font(pi.base.font); + font.setFamily(LyXFont::SANS_FAMILY); + font.setSize(LyXFont::SIZE_FOOTNOTE); + pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6, + y - font_metrics::maxAscent(font) - 4, + statusMessage(pi.base.bv, snippet_), font); } @@ -90,8 +147,19 @@ boost::signals::connection RenderPreview::connect(slot_type const & slot) } -void RenderPreview::generatePreview(string const & latex_snippet, - Buffer const & buffer) +void RenderPreview::startLoading(Buffer const & buffer) const +{ + if (!activated() && !snippet_.empty()) + return; + + graphics::Previews & previews = graphics::Previews::get(); + graphics::PreviewLoader & loader = previews.loader(buffer); + loader.startLoading(); +} + + +void RenderPreview::addPreview(string const & latex_snippet, + Buffer const & buffer) { if (!activated()) return; @@ -99,13 +167,11 @@ void RenderPreview::generatePreview(string const & latex_snippet, 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) + graphics::PreviewLoader & ploader) { if (!activated()) return; @@ -161,10 +227,17 @@ void RenderPreview::imageReady(graphics::PreviewImage const & pimage) } -void RenderMonitoredPreview::startMonitoring(string const & file) +void RenderMonitoredPreview::setAbsFile(string const & file) { monitor_.reset(file); - monitor_.start(); +} + + +void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y) const +{ + RenderPreview::draw(pi, x, y); + if (!monitoring()) + startMonitoring(); } diff --git a/src/insets/render_preview.h b/src/insets/render_preview.h index 391ff05955..516eb99b1c 100644 --- a/src/insets/render_preview.h +++ b/src/insets/render_preview.h @@ -53,18 +53,20 @@ public: /// void draw(PainterInfo & pi, int x, int y) const; - /** Find the PreviewLoader, add a LaTeX snippet to it and - * start the loading process. + /** Find the PreviewLoader and add a LaTeX snippet to it. + * Do not start the loading process. */ - void generatePreview(std::string const & latex_snippet, - Buffer const &); + void addPreview(std::string const & latex_snippet, Buffer const &); - /** Add a LaTeX snippet to the PreviewLoader but do not start the - * loading process. + /** Add a LaTeX snippet to the PreviewLoader. + * Do not start the loading process. */ void addPreview(std::string const & latex_snippet, lyx::graphics::PreviewLoader & ploader); + /// Begin the loading process. + void startLoading(Buffer const & buffer) const; + /** Remove a snippet from the cache of previews. * Useful if previewing the contents of a file that has changed. */ @@ -104,18 +106,20 @@ class RenderMonitoredPreview : public RenderPreview { public: RenderMonitoredPreview() : monitor_(std::string(), 2000) {} /// - bool monitoring() const { return monitor_.monitoring(); } + void draw(PainterInfo & pi, int x, int y) const; /// - void startMonitoring(std::string const & file); + void setAbsFile(std::string const & file); /// - void stopMonitoring() { monitor_.stop(); } + bool monitoring() const { return monitor_.monitoring(); } + void startMonitoring() const { monitor_.start(); } + void stopMonitoring() const { monitor_.stop(); } /// Connect and you'll be informed when the file changes. boost::signals::connection fileChanged(slot_type const &); private: /// - lyx::support::FileMonitor monitor_; + mutable lyx::support::FileMonitor monitor_; }; #endif // RENDERPREVIEW_H diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index 7c349a3c56..5115db8168 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,3 +1,8 @@ +2003-10-22 Angus Leeming + + * formula.C (generatePreview): changes due to the changed + RenderPreview interface. + 2003-10-20 Martin Vermeer * formula.[Ch]: re-introduce display() for insets, fixing the diff --git a/src/mathed/formula.C b/src/mathed/formula.C index f5abd3aef2..f84b39ac7b 100644 --- a/src/mathed/formula.C +++ b/src/mathed/formula.C @@ -319,5 +319,6 @@ void InsetFormula::addPreview(lyx::graphics::PreviewLoader & ploader) const void InsetFormula::generatePreview(Buffer const & buffer) const { string const snippet = latex_string(*this, buffer); - preview_->generatePreview(snippet, buffer); + preview_->addPreview(snippet, buffer); + preview_->startLoading(buffer); } -- 2.39.2