Cleanup 2: moving more stuff charstyle -> collapsable

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19648 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Martin Vermeer 2007-08-19 15:45:35 +00:00
parent 3e13089402
commit 2b927e1575
3 changed files with 81 additions and 63 deletions

View File

@ -134,18 +134,9 @@ bool InsetCharStyle::metrics(MetricsInfo & mi, Dimension & dim) const
getDrawFont(mi.base.font); getDrawFont(mi.base.font);
mi.base.font.reduce(Font(Font::ALL_SANE)); mi.base.font.reduce(Font(Font::ALL_SANE));
mi.base.font.realize(tmpfont); mi.base.font.realize(tmpfont);
mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET; bool changed = InsetCollapsable::metrics(mi, dim);
InsetText::metrics(mi, dim);
mi.base.font = tmpfont; mi.base.font = tmpfont;
if (status() == Open) { if (status() == Open) {
// consider width of the inset label
Font font(layout_.labelfont);
font.realize(Font(Font::ALL_SANE));
font.decSize();
font.decSize();
int w = 0;
int a = 0;
int d = 0;
// FIXME UNICODE // FIXME UNICODE
docstring s(from_utf8(params_.name)); docstring s(from_utf8(params_.name));
if (undefined()) if (undefined())
@ -153,21 +144,8 @@ bool InsetCharStyle::metrics(MetricsInfo & mi, Dimension & dim) const
// Chop off prefix: // Chop off prefix:
if (s.find(':') != string::npos) if (s.find(':') != string::npos)
s = s.substr(s.find(':')); s = s.substr(s.find(':'));
theFontMetrics(font).rectText(s, w, a, d); layout_.labelstring = s;
dim.wid = max(dim.wid, w);
} }
dim.asc += TEXT_TO_INSET_OFFSET;
dim.des += TEXT_TO_INSET_OFFSET;
dim.wid += 2 * TEXT_TO_INSET_OFFSET;
mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
if (status() == Open)
dim.des += ascent();
else {
dim.des -= 3;
dim.asc -= 3;
}
bool const changed = dim_ != dim;
dim_ = dim;
return changed; return changed;
} }
@ -183,27 +161,8 @@ void InsetCharStyle::draw(PainterInfo & pi, int x, int y) const
InsetCollapsable::draw(pi, x, y); InsetCollapsable::draw(pi, x, y);
pi.base.font = tmpfont; pi.base.font = tmpfont;
int desc = InsetText::descent();
if (status() == Open)
desc -= ascent();
else
desc -= 3;
pi.pain.line(x, y + desc - 4, x, y + desc, layout_.labelfont.color());
pi.pain.line(x, y + desc, x + dim_.wid - 3, y + desc,
layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 3, y + desc, x + dim_.wid - 3, y + desc - 4,
layout_.labelfont.color());
// the name of the charstyle. Can be toggled. // the name of the charstyle. Can be toggled.
if (status() == Open) { if (status() == Open) {
Font font(layout_.labelfont);
font.realize(Font(Font::ALL_SANE));
font.decSize();
font.decSize();
int w = 0;
int a = 0;
int d = 0;
// FIXME UNICODE // FIXME UNICODE
docstring s(from_utf8(params_.name)); docstring s(from_utf8(params_.name));
if (undefined()) if (undefined())
@ -211,22 +170,7 @@ void InsetCharStyle::draw(PainterInfo & pi, int x, int y) const
// Chop off prefix: // Chop off prefix:
if (s.find(':') != string::npos) if (s.find(':') != string::npos)
s = s.substr(s.find(':')); s = s.substr(s.find(':'));
theFontMetrics(font).rectText(s, w, a, d); layout_.labelstring = s;
pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a,
s, font, Color::none, Color::none);
}
// a visual cue when the cursor is inside the inset
Cursor & cur = pi.base.bv->cursor();
if (cur.isInside(this)) {
y -= ascent();
y += 3;
pi.pain.line(x, y + 4, x, y, layout_.labelfont.color());
pi.pain.line(x + 4, y, x, y, layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 3, y + 4, x + dim_.wid - 3, y,
layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 7, y, x + dim_.wid - 3, y,
layout_.labelfont.color());
} }
} }
@ -243,7 +187,7 @@ void InsetCharStyle::doDispatch(Cursor & cur, FuncRequest & cmd)
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3) if (cmd.button() == mouse_button::button3)
if (status() == Open) if (internalStatus() == Open)
setStatus(cur, Collapsed); setStatus(cur, Collapsed);
else else
setStatus(cur, Open); setStatus(cur, Open);
@ -257,7 +201,7 @@ void InsetCharStyle::doDispatch(Cursor & cur, FuncRequest & cmd)
else if (cmd.argument() == "close") else if (cmd.argument() == "close")
setStatus(cur, Collapsed); setStatus(cur, Collapsed);
else if (cmd.argument() == "toggle" || cmd.argument().empty()) else if (cmd.argument() == "toggle" || cmd.argument().empty())
if (status() == Open) if (internalStatus() == Open)
setStatus(cur, Collapsed); setStatus(cur, Collapsed);
else else
setStatus(cur, Open); setStatus(cur, Open);

View File

@ -178,8 +178,29 @@ bool InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
switch (decoration()) { switch (decoration()) {
case Minimalistic: case Minimalistic:
InsetText::metrics(mi, dim);
break;
case Conglomerate: case Conglomerate:
InsetText::metrics(mi, dim); InsetText::metrics(mi, dim);
if (status() == Open) {
// consider width of the inset label
Font font(layout_.labelfont);
font.realize(Font(Font::ALL_SANE));
font.decSize();
font.decSize();
int w = 0;
int a = 0;
int d = 0;
docstring s = layout_.labelstring;
theFontMetrics(font).rectText(s, w, a, d);
dim.wid = max(dim.wid, w);
}
if (status() == Open)
dim.des += ascent();
else {
dim.des -= 3;
dim.asc -= 3;
}
break; break;
case Classic: case Classic:
dim = dimensionCollapsed(); dim = dimensionCollapsed();
@ -259,13 +280,64 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
break; break;
case SubLabel: case SubLabel:
case Corners: case Corners:
// FIXME add handling of SubLabel, Corners
// still in CharStyle
textx = xx; textx = xx;
texty = y + textdim_.asc; texty = y + textdim_.asc;
const_cast<InsetCollapsable *>(this)->setDrawFrame(false); const_cast<InsetCollapsable *>(this)->setDrawFrame(false);
InsetText::draw(pi, textx, texty); InsetText::draw(pi, textx, texty);
const_cast<InsetCollapsable *>(this)->setDrawFrame(true); const_cast<InsetCollapsable *>(this)->setDrawFrame(true);
int desc = InsetText::descent();
if (status() == Open)
desc -= ascent();
else
desc -= 3;
pi.pain.line(x, y + desc - 4, x, y + desc,
layout_.labelfont.color());
if (internalStatus() == Open)
pi.pain.line(x, y + desc,
x + dim_.wid - 3, y + desc,
layout_.labelfont.color());
else {
// Make status_ value visible:
pi.pain.line(x, y + desc,
x + 4, y + desc,
layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 7, y + desc,
x + dim_.wid -3, y + desc,
layout_.labelfont.color());
}
pi.pain.line(x + dim_.wid - 3, y + desc, x + dim_.wid - 3, y + desc - 4,
layout_.labelfont.color());
// the label of the charstyle. Can be toggled.
if (status() == Open) {
Font font(layout_.labelfont);
font.realize(Font(Font::ALL_SANE));
font.decSize();
font.decSize();
int w = 0;
int a = 0;
int d = 0;
// FIXME UNICODE
docstring s = layout_.labelstring;
theFontMetrics(font).rectText(s, w, a, d);
pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a,
s, font, Color::none, Color::none);
}
// a visual cue when the cursor is inside the inset
Cursor & cur = pi.base.bv->cursor();
if (cur.isInside(this)) {
y -= ascent();
y += 3;
pi.pain.line(x, y + 4, x, y, layout_.labelfont.color());
pi.pain.line(x + 4, y, x, y, layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 3, y + 4, x + dim_.wid - 3, y,
layout_.labelfont.color());
pi.pain.line(x + dim_.wid - 7, y, x + dim_.wid - 3, y,
layout_.labelfont.color());
}
break; break;
} }
setPosCache(pi, x, y); setPosCache(pi, x, y);

View File

@ -154,6 +154,8 @@ protected:
mutable int topbaseline; mutable int topbaseline;
/// ///
mutable InsetLayout layout_; mutable InsetLayout layout_;
///
CollapseStatus internalStatus() const { return status_; }
private: private:
/// ///
mutable CollapseStatus status_; mutable CollapseStatus status_;