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_;

Reply via email to