On Sun, Aug 19, 2007 at 01:06:28PM +0300, Martin Vermeer wrote: > > Will commit presently. > > - Martin
Second part: mostly moving things around charstyle -> collapsble. One nontrivial change: now autoOpen also affects charstyle insets. They open up (display the label) when you're inside them, even if they are set to status collapsed. This made it necessary to provide a visual cue for what state the 'internal' status var is in. You can toggle this with the right mouse as before. It would be confusing not to show any visual change. - Martin
Index: InsetCharStyle.cpp =================================================================== --- InsetCharStyle.cpp (revision 19642) +++ InsetCharStyle.cpp (working copy) @@ -134,18 +134,9 @@ getDrawFont(mi.base.font); mi.base.font.reduce(Font(Font::ALL_SANE)); mi.base.font.realize(tmpfont); - mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET; - InsetText::metrics(mi, dim); + bool changed = InsetCollapsable::metrics(mi, dim); mi.base.font = tmpfont; 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 docstring s(from_utf8(params_.name)); if (undefined()) @@ -153,21 +144,8 @@ // Chop off prefix: if (s.find(':') != string::npos) s = s.substr(s.find(':')); - theFontMetrics(font).rectText(s, w, a, d); - dim.wid = max(dim.wid, w); + layout_.labelstring = s; } - 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; } @@ -183,27 +161,8 @@ InsetCollapsable::draw(pi, x, y); 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. 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(from_utf8(params_.name)); if (undefined()) @@ -211,23 +170,8 @@ // Chop off prefix: if (s.find(':') != string::npos) s = s.substr(s.find(':')); - theFontMetrics(font).rectText(s, w, a, d); - pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a, - s, font, Color::none, Color::none); + layout_.labelstring = s; } - - // 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 @@ case LFUN_MOUSE_RELEASE: if (cmd.button() == mouse_button::button3) - if (status() == Open) + if (internalStatus() == Open) setStatus(cur, Collapsed); else setStatus(cur, Open); @@ -257,7 +201,7 @@ else if (cmd.argument() == "close") setStatus(cur, Collapsed); else if (cmd.argument() == "toggle" || cmd.argument().empty()) - if (status() == Open) + if (internalStatus() == Open) setStatus(cur, Collapsed); else setStatus(cur, Open); Index: InsetCollapsable.cpp =================================================================== --- InsetCollapsable.cpp (revision 19642) +++ InsetCollapsable.cpp (working copy) @@ -178,8 +178,29 @@ switch (decoration()) { case Minimalistic: + InsetText::metrics(mi, dim); + break; case Conglomerate: 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; case Classic: dim = dimensionCollapsed(); @@ -259,13 +280,64 @@ break; case SubLabel: case Corners: - // FIXME add handling of SubLabel, Corners - // still in CharStyle textx = xx; texty = y + textdim_.asc; const_cast<InsetCollapsable *>(this)->setDrawFrame(false); InsetText::draw(pi, textx, texty); 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; } setPosCache(pi, x, y); Index: InsetCollapsable.h =================================================================== --- InsetCollapsable.h (revision 19642) +++ InsetCollapsable.h (working copy) @@ -154,6 +154,8 @@ mutable int topbaseline; /// mutable InsetLayout layout_; + /// + CollapseStatus internalStatus() const { return status_; } private: /// mutable CollapseStatus status_;