Draw a small red frame around preview images that are too small.

(cherry picked from commit 1bb7c3baafb636eb02c09ee651b4f7b7a5836b04)
This commit is contained in:
Richard Heck 2014-03-19 12:43:21 -04:00
parent 755b3131b0
commit 3da5fe4413
2 changed files with 49 additions and 12 deletions

View File

@ -44,6 +44,7 @@
#include "insets/InsetRef.h" #include "insets/InsetRef.h"
#include "insets/RenderPreview.h" #include "insets/RenderPreview.h"
#include "graphics/GraphicsImage.h"
#include "graphics/PreviewImage.h" #include "graphics/PreviewImage.h"
#include "graphics/PreviewLoader.h" #include "graphics/PreviewLoader.h"
@ -410,7 +411,7 @@ ColorCode InsetMathHull::standardColor() const
} }
bool InsetMathHull::previewState(BufferView * bv) const bool InsetMathHull::previewState(const BufferView *const bv) const
{ {
if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON
&& type_ != hullRegexp) && type_ != hullRegexp)
@ -423,14 +424,24 @@ bool InsetMathHull::previewState(BufferView * bv) const
} }
namespace {
static const int ERROR_FRAME_WIDTH = 2;
}
void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
{ {
if (previewState(mi.base.bv)) { if (previewState(mi.base.bv)) {
preview_->metrics(mi, dim); preview_->metrics(mi, dim);
// insert a one pixel gap in front of the formula if (previewTooSmall(dim)) {
dim.wid += 1; // preview image is too small
if (display()) dim.wid += 2 * ERROR_FRAME_WIDTH;
dim.des += displayMargin(); dim.asc += 2 * ERROR_FRAME_WIDTH;
} else {
// insert a one pixel gap in front of the formula
dim.wid += 1;
if (display())
dim.des += displayMargin();
}
// Cache the inset dimension. // Cache the inset dimension.
setDimCache(mi, dim); setDimCache(mi, dim);
return; return;
@ -471,10 +482,21 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
} }
bool InsetMathHull::previewTooSmall(Dimension const & dim) const
{
return dim.width() <= 10 && dim.height() <= 10;
}
ColorCode InsetMathHull::backgroundColor(PainterInfo const & pi) const ColorCode InsetMathHull::backgroundColor(PainterInfo const & pi) const
{ {
if (previewState(pi.base.bv)) BufferView const * const bv = pi.base.bv;
if (previewState(bv)) {
Dimension const dim = dimension(*pi.base.bv);
if (previewTooSmall(dim))
return Color_error;
return graphics::PreviewLoader::backgroundColor(); return graphics::PreviewLoader::backgroundColor();
}
return Color_mathbg; return Color_mathbg;
} }
@ -482,23 +504,36 @@ ColorCode InsetMathHull::backgroundColor(PainterInfo const & pi) const
void InsetMathHull::drawBackground(PainterInfo & pi, int x, int y) const void InsetMathHull::drawBackground(PainterInfo & pi, int x, int y) const
{ {
Dimension const dim = dimension(*pi.base.bv); Dimension const dim = dimension(*pi.base.bv);
if (previewTooSmall(dim)) {
pi.pain.fillRectangle(x, y - 2 * ERROR_FRAME_WIDTH,
dim.wid, dim.asc + dim.des, backgroundColor(pi));
return;
}
pi.pain.fillRectangle(x + 1, y - dim.asc + 1, dim.wid - 2, pi.pain.fillRectangle(x + 1, y - dim.asc + 1, dim.wid - 2,
dim.asc + dim.des - 1, pi.backgroundColor(this)); dim.asc + dim.des - 1, backgroundColor(pi));
} }
void InsetMathHull::draw(PainterInfo & pi, int x, int y) const void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
{ {
use_preview_ = previewState(pi.base.bv); BufferView const * const bv = pi.base.bv;
use_preview_ = previewState(bv);
if (type_ == hullRegexp) { if (type_ == hullRegexp) {
Dimension const dim = dimension(*pi.base.bv); Dimension const dim = dimension(*bv);
pi.pain.rectangle(x + 1, y - dim.ascent() + 1, pi.pain.rectangle(x + 1, y - dim.ascent() + 1,
dim.width() - 2, dim.height() - 2, Color_regexpframe); dim.width() - 2, dim.height() - 2, Color_regexpframe);
} }
if (use_preview_) { if (use_preview_) {
// one pixel gap in front Dimension const dim = dimension(*bv);
preview_->draw(pi, x + 1, y); if (previewTooSmall(dim)) {
// we have an extra frame
preview_->draw(pi, x + ERROR_FRAME_WIDTH, y);
} else {
// one pixel gap in front
preview_->draw(pi, x + 1, y);
}
setPosCache(pi, x, y); setPosCache(pi, x, y);
return; return;
} }

View File

@ -271,7 +271,9 @@ protected:
/// ///
void handleFont2(Cursor & cur, docstring const & arg); void handleFont2(Cursor & cur, docstring const & arg);
/// ///
bool previewState(BufferView * bv) const; bool previewState(BufferView const * const bv) const;
///
bool previewTooSmall(Dimension const & dim) const;
}; };