]> git.lyx.org Git - features.git/commitdiff
fix collapsables drawing problems
authorAlfredo Braunstein <abraunst@lyx.org>
Sat, 27 Mar 2004 13:29:17 +0000 (13:29 +0000)
committerAlfredo Braunstein <abraunst@lyx.org>
Sat, 27 Mar 2004 13:29:17 +0000 (13:29 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8547 a592a061-630c-0410-9148-cb99ea01b6c8

src/insets/ChangeLog
src/insets/insetcollapsable.C
src/insets/insetcollapsable.h
src/insets/insettext.C

index 5a1c607103f827c30c0aa7b1587423aa5598c366..136c9003ea4c6b595ddbd2b32475a06f9c832d67 100644 (file)
@@ -1,3 +1,12 @@
+2004-03-27  Alfredo Braunstein  <abraunst@lyx.org>
+
+       * insettext.C (draw): handle the responsability of adding the
+       ouside offset to collapsable. Clean code a bit.
+
+       * insetcollapsable.[Ch] (metrics, draw): handle the derivation
+       from insettext correctly, solve a couple of off-by-one drawing
+       bugs
+
 2004-03-25  Angus Leeming  <leeming@lyx.org>
 
        * insetcaption.C (draw): squash warning about unused variable.
index c9714b04a59de776a3597134853567e909e3e173..12736bef037aed3ac3d2933fd45737401ae9f3e3 100644 (file)
@@ -119,24 +119,28 @@ void InsetCollapsable::dimension_collapsed(Dimension & dim) const
 
 void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
 {
+       mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
        if (status_ == Inlined) {
                InsetText::metrics(mi, dim);
        } else {
                dimension_collapsed(dim);
                if (status_ == Open) {
-                       Dimension insetdim;
-                       InsetText::metrics(mi, insetdim);
-                       openinlined_ = (insetdim.wid + dim.wid <= mi.base.textwidth);
+                       InsetText::metrics(mi, textdim_);
+                       openinlined_ = (textdim_.wid + dim.wid <= mi.base.textwidth);
                        if (openinlined_) {
-                               dim.wid += insetdim.wid;
-                               dim.des = max(dim.des, insetdim.des);
-                               dim.asc = max(dim.asc, insetdim.asc);
+                               dim.wid += textdim_.wid;
+                               dim.des = max(dim.des, textdim_.des);
+                               dim.asc = max(dim.asc, textdim_.asc);
                        } else {
-                               dim.des += insetdim.height() + TEXT_TO_BOTTOM_OFFSET;
-                               dim.wid = max(dim.wid, insetdim.wid);
+                               dim.des += textdim_.height() + TEXT_TO_BOTTOM_OFFSET;
+                               dim.wid = max(dim.wid, textdim_.wid);
                        }
                }
        }
+       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;
        dim_ = dim;
 }
 
@@ -149,7 +153,8 @@ void InsetCollapsable::draw_collapsed(PainterInfo & pi, int x, int y) const
 
 void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 {
-       setPosCache(pi, x, y);
+       x += TEXT_TO_INSET_OFFSET;
+       y += TEXT_TO_INSET_OFFSET;
 
        if (status_ == Inlined) {
                InsetText::draw(pi, x, y);
@@ -162,15 +167,17 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
                button_dim.y1 = y - aa + pi.base.bv->top_y();
                button_dim.y2 = y - aa + pi.base.bv->top_y() + dimc.height();
 
-               draw_collapsed(pi, x, y);
+               draw_collapsed(pi, x, y - aa + dimc.asc);
                if (status_ == Open) {
-                       x += scroll();
                        if (openinlined_)
-                               InsetText::draw(pi, x + dimc.width(), y - aa + InsetText::ascent());
+                               InsetText::draw(pi, x + dimc.width(),
+                                               y - aa + textdim_.asc);
                        else 
-                               InsetText::draw(pi, x, y - aa + dimc.height() + InsetText::ascent());
+                               InsetText::draw(pi, x, dimc.height()
+                                               + y - aa + textdim_.asc);
                }
        }
+       setPosCache(pi, x, y);
 }
 
 
index 4b34329e350c03f95f15036bc67dbb825a4497a1..ba35c8b29c98f56c6be535cde3eecfdcd266d704 100644 (file)
@@ -119,6 +119,8 @@ private:
        mutable CollapseStatus status_;
        /// a substatus of the Open status, determined automatically in metrics
        mutable bool openinlined_;
+       ///
+       mutable Dimension textdim_;
 };
 
 #endif
index 7e88694b8ab50aece76ee8ccd90e18690ebcfbf7..a17764b90e2deff4c9dfe1e260ba06469a071979 100644 (file)
@@ -174,12 +174,7 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        //lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << endl;
        setViewCache(mi.base.bv);
-       mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
        text_.metrics(mi, dim);
-       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;
        dim_ = dim;
        font_ = mi.base.font;
        text_.font_ = mi.base.font;
@@ -192,21 +187,20 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
        // update our idea of where we are
        setPosCache(pi, x, y);
 
-       // repaint the background if needed
-       x += TEXT_TO_INSET_OFFSET;
-       if (backgroundColor() != LColor::background)
-               clearInset(pi.pain, x, y);
-
        BufferView * bv = pi.base.bv;
        bv->hideCursor();
 
        x += scroll();
-       y += bv->top_y() - text_.ascent();
+       y -= text_.ascent();
+
+       // repaint the background if needed
+       if (backgroundColor() != LColor::background)
+               clearInset(pi.pain, x, y);
 
-       text_.draw(pi, x, y);
+       text_.draw(pi, x, y + bv->top_y());
 
        if (drawFrame_ == ALWAYS || drawFrame_ == LOCKED)
-               drawFrame(pi.pain, xo_, yo_ - bv->top_y());
+               drawFrame(pi.pain, x, y);
 }
 
 
@@ -218,11 +212,17 @@ void InsetText::drawSelection(PainterInfo & pi, int x, int y) const
 
 void InsetText::drawFrame(Painter & pain, int x, int y) const
 {
-       int const frame_x = x + TEXT_TO_INSET_OFFSET / 2;
-       int const frame_y = y - dim_.asc + TEXT_TO_INSET_OFFSET / 2;
-       int const frame_w = text_.width();
-       int const frame_h = text_.height();
-       pain.rectangle(frame_x, frame_y, frame_w, frame_h, frameColor());
+       int const w = text_.width();
+       int const h = text_.height();
+       pain.rectangle(x, y, w, h, frameColor());
+}
+
+
+void InsetText::clearInset(Painter & pain, int x, int y) const
+{
+       int const w = text_.width();
+       int const h = text_.height();
+       pain.fillRectangle(x, y, w, h, backgroundColor());
 }
 
 
@@ -477,24 +477,6 @@ void InsetText::removeNewlines()
 }
 
 
-void InsetText::clearInset(Painter & pain, int x, int y) const
-{
-       int w = dim_.wid;
-       int h = dim_.asc + dim_.des;
-       int ty = y - dim_.asc;
-
-       if (ty < 0) {
-               h += ty;
-               ty = 0;
-       }
-       if (ty + h > pain.paperHeight())
-               h = pain.paperHeight();
-       if (xo_ + w > pain.paperWidth())
-               w = pain.paperWidth();
-       pain.fillRectangle(x + 1, ty + 1, w - 3, h - 1, backgroundColor());
-}
-
-
 LyXText * InsetText::getText(int i) const
 {
        return (i == 0) ? const_cast<LyXText*>(&text_) : 0;