]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetcollapsable.C
Clean up InsetGraphics::Cache and rename as GraphicsInset.
[lyx.git] / src / insets / insetcollapsable.C
index ddac8d46c7e0be076c0d7659462995ea06461650..facf2f5f362fd3f6cfcfd26aa19105deab1eaa21 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "BufferView.h"
 #include "debug.h"
+#include "dimension.h"
 #include "gettext.h"
 #include "lyxfont.h"
 #include "lyxlex.h"
@@ -24,6 +25,7 @@
 #include "WordLangTuple.h"
 #include "funcrequest.h"
 #include "buffer.h"
+#include "metricsinfo.h"
 
 #include "frontends/font_metrics.h"
 #include "frontends/Painter.h"
@@ -55,8 +57,8 @@ InsetCollapsable::InsetCollapsable(BufferParams const & bp, bool collapsed)
 }
 
 
-InsetCollapsable::InsetCollapsable(InsetCollapsable const & in, bool same_id)
-       : UpdatableInset(in, same_id), collapsed_(in.collapsed_),
+InsetCollapsable::InsetCollapsable(InsetCollapsable const & in)
+       : UpdatableInset(in), collapsed_(in.collapsed_),
          framecolor(in.framecolor), labelfont(in.labelfont), inset(in.inset),
          button_length(0), button_top_y(0), button_bottom_y(0),
          label(in.label),
@@ -65,7 +67,7 @@ InsetCollapsable::InsetCollapsable(InsetCollapsable const & in, bool same_id)
 #endif
          oldWidth(0), in_update(false), first_after_edit(false)
 {
-       inset.init(&(in.inset), same_id);
+       inset.init(&(in.inset));
        inset.setOwner(this);
 }
 
@@ -88,7 +90,6 @@ void InsetCollapsable::write(Buffer const * buf, ostream & os) const
 }
 
 
-
 void InsetCollapsable::read(Buffer const * buf, LyXLex & lex)
 {
        if (lex.isOK()) {
@@ -108,132 +109,91 @@ void InsetCollapsable::read(Buffer const * buf, LyXLex & lex)
 }
 
 
-int InsetCollapsable::ascent_collapsed() const
-{
-       int width = 0;
-       int ascent = 0;
-       int descent = 0;
-       font_metrics::buttonText(label, labelfont, width, ascent, descent);
-       return ascent;
-}
-
-
-int InsetCollapsable::descent_collapsed() const
+void InsetCollapsable::dimension_collapsed(Dimension & dim) const
 {
-       int width = 0;
-       int ascent = 0;
-       int descent = 0;
-       font_metrics::buttonText(label, labelfont, width, ascent, descent);
-       return descent;
+       font_metrics::buttonText(label, labelfont, dim.wid, dim.asc, dim.des);
+       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
 }
 
 
-//int InsetCollapsable::width_collapsed(Painter & pain) const
-int InsetCollapsable::width_collapsed() const
+int InsetCollapsable::height_collapsed() const
 {
-       int width;
-       int ascent;
-       int descent;
-       font_metrics::buttonText(label, labelfont, width, ascent, descent);
-       return width + 2 * TEXT_TO_INSET_OFFSET;
-}
-
-
-int InsetCollapsable::ascent(BufferView * /*bv*/, LyXFont const &) const
-{
-       return ascent_collapsed();
-}
-
-
-int InsetCollapsable::descent(BufferView * bv, LyXFont const & font) const
-{
-       if (collapsed_)
-               return descent_collapsed();
-
-       return descent_collapsed()
-               + inset.descent(bv, font)
-               + inset.ascent(bv, font)
-               + TEXT_TO_BOTTOM_OFFSET;
+       Dimension dim;
+       font_metrics::buttonText(label, labelfont, dim.wid, dim.asc, dim.des);
+       return dim.asc + dim.des;
 }
 
 
-int InsetCollapsable::width(BufferView * bv, LyXFont const & font) const
+void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
 {
+       dimension_collapsed(dim);
        if (collapsed_)
-               return width_collapsed();
-
-       int const collapsed_width = width_collapsed();
-       int const contents_width = inset.width(bv, font);
-
-       return max(collapsed_width, contents_width);
+               return;
+       Dimension insetdim;
+       inset.metrics(mi, insetdim);
+       dim.des += insetdim.height() + TEXT_TO_BOTTOM_OFFSET;
+       dim.wid = max(dim.wid, insetdim.wid);
 }
 
 
-void InsetCollapsable::draw_collapsed(Painter & pain,
-                                     int baseline, float & x) const
+void InsetCollapsable::draw_collapsed(PainterInfo & pi, int x, int y) const
 {
-       pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET,
-                       baseline, label, labelfont);
-       x += width_collapsed();
+       pi.pain.buttonText(x + TEXT_TO_INSET_OFFSET, y, label, labelfont);
 }
 
 
-void InsetCollapsable::draw(BufferView * bv, LyXFont const & f,
-                            int baseline, float & x, bool inlined) const
+void InsetCollapsable::draw(PainterInfo & pi, int x, int y, bool inlined) const
 {
-       lyx::Assert(bv);
-       cache(bv);
+       lyx::Assert(pi.base.bv);
+       cache(pi.base.bv);
 
        if (nodraw())
                return;
 
-       Painter & pain = bv->painter();
+       Dimension dim_collapsed;
+       dimension_collapsed(dim_collapsed);
 
-       button_length = width_collapsed();
-       button_top_y = -ascent(bv, f);
-       button_bottom_y = -ascent(bv, f) + ascent_collapsed() +
-               descent_collapsed();
+       int const aa    = ascent(pi.base.bv, pi.base.font);
+       button_length   = dim_collapsed.width();
+       button_top_y    = -aa;
+       button_bottom_y = -aa + dim_collapsed.height();
 
        if (!isOpen()) {
-               draw_collapsed(pain, baseline, x);
+               draw_collapsed(pi, x, y);
                return;
        }
 
-       float old_x = x;
+       int old_x = x;
 
        if (!owner())
                x += scroll();
 
-       top_x = int(x);
-       top_baseline = baseline;
+       top_x = x;
+       top_baseline = y;
 
-       int const bl = baseline - ascent(bv, f) + ascent_collapsed();
+       int const bl = y - aa + dim_collapsed.ascent();
 
        if (inlined) {
-               inset.draw(bv, f, baseline, x);
+               inset.draw(pi, x, y);
        } else {
-               draw_collapsed(pain, bl, old_x);
-               inset.draw(bv, f, bl + descent_collapsed() + inset.ascent(bv, f), x);
-               // contained inset may be shorter than the button
-               if (x < (top_x + button_length + TEXT_TO_INSET_OFFSET))
-                       x = top_x + button_length + TEXT_TO_INSET_OFFSET;
+               draw_collapsed(pi, old_x, bl);
+               int const yy = bl + dim_collapsed.descent()
+                       + inset.ascent(pi.base.bv, pi.base.font);
+               inset.draw(pi, x, yy);
        }
 }
 
 
-void InsetCollapsable::draw(BufferView * bv, LyXFont const & f,
-                           int baseline, float & x) const
+void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 {
        // by default, we are not inlined-drawing
-       draw(bv, f, baseline, x, false);
+       draw(pi, x, y, false);
 }
 
 
 Inset::EDITABLE InsetCollapsable::editable() const
 {
-       if (collapsed_)
-               return IS_EDITABLE;
-       return HIGHLY_EDITABLE;
+       return collapsed_ ? IS_EDITABLE : HIGHLY_EDITABLE;
 }
 
 
@@ -256,31 +216,34 @@ void InsetCollapsable::insetUnlock(BufferView * bv)
 }
 
 
-void InsetCollapsable::lfunMousePress(FuncRequest const & cmd)
+FuncRequest InsetCollapsable::adjustCommand(FuncRequest const & cmd)
 {
-       if (!collapsed_ && (cmd.y > button_bottom_y)) {
-               LyXFont font(LyXFont::ALL_SANE);
-               FuncRequest cmd1 = cmd;
-               cmd1.y = ascent(cmd.view(), font) + cmd.y -
-                   (ascent_collapsed() +
-                    descent_collapsed() +
-                    inset.ascent(cmd.view(), font));
-               inset.localDispatch(cmd1);
-       }
+       LyXFont font(LyXFont::ALL_SANE);
+       FuncRequest cmd1 = cmd;
+       cmd1.y = ascent(cmd.view(), font) + cmd.y -
+           (height_collapsed() + inset.ascent(cmd.view(), font));
+       return cmd1;
 }
 
 
-bool InsetCollapsable::lfunMouseRelease(FuncRequest const & cmd)
+void InsetCollapsable::lfunMouseRelease(FuncRequest const & cmd)
 {
        bool ret = false;
        BufferView * bv = cmd.view();
+
+       if (collapsed_ && cmd.button() != mouse_button::button3) {
+               collapsed_ = false;
+               inset.setUpdateStatus(bv, InsetText::FULL);
+               bv->updateInset(this);
+               bv->buffer()->markDirty();
+               return;
+       }
+
        if ((cmd.button() != mouse_button::button3) && (cmd.x < button_length) &&
            (cmd.y >= button_top_y) && (cmd.y <= button_bottom_y))
        {
                if (collapsed_) {
                        collapsed_ = false;
-// should not be called on inset open!
-//                     inset.insetButtonRelease(bv, 0, 0, button);
                        inset.setUpdateStatus(bv, InsetText::FULL);
                        bv->updateInset(this);
                        bv->buffer()->markDirty();
@@ -291,38 +254,17 @@ bool InsetCollapsable::lfunMouseRelease(FuncRequest const & cmd)
                        bv->buffer()->markDirty();
                }
        } else if (!collapsed_ && (cmd.y > button_bottom_y)) {
-               LyXFont font(LyXFont::ALL_SANE);
-               FuncRequest cmd1 = cmd;
-               cmd1.y = ascent(cmd.view(), font) + cmd.y -
-                   (ascent_collapsed() +
-                    descent_collapsed() +
-                    inset.ascent(cmd.view(), font));
-               ret = (inset.localDispatch(cmd1) == DISPATCHED);
+               ret = (inset.localDispatch(adjustCommand(cmd)) == DISPATCHED);
        }
        if (cmd.button() == mouse_button::button3 && !ret)
-               return showInsetDialog(bv);
-       return ret;
-}
-
-
-void InsetCollapsable::lfunMouseMotion(FuncRequest const & cmd)
-{
-       if (cmd.y > button_bottom_y) {
-               LyXFont font(LyXFont::ALL_SANE);
-               FuncRequest cmd1 = cmd;
-               cmd1.y = ascent(cmd.view(), font) + cmd.y -
-                   (ascent_collapsed() +
-                    descent_collapsed() +
-                    inset.ascent(cmd.view(), font));
-               inset.localDispatch(cmd1);
-       }
+               showInsetDialog(bv);
 }
 
 
 int InsetCollapsable::latex(Buffer const * buf, ostream & os,
-                           bool fragile, bool free_spc) const
+                           LatexRunParams const & runparams) const
 {
-       return inset.latex(buf, os, fragile, free_spc);
+       return inset.latex(buf, os, runparams);
 }
 
 
@@ -363,6 +305,7 @@ void InsetCollapsable::update(BufferView * bv, bool reinit)
 
 Inset::RESULT InsetCollapsable::localDispatch(FuncRequest const & cmd)
 {
+       //lyxerr << "InsetCollapsable::localDispatch: " << cmd.action << "\n";
        BufferView * bv = cmd.view();
        switch (cmd.action) {
                case LFUN_INSET_EDIT: {
@@ -411,9 +354,7 @@ Inset::RESULT InsetCollapsable::localDispatch(FuncRequest const & cmd)
                                } else {
                                        LyXFont font(LyXFont::ALL_SANE);
                                        cmd1.y = ascent(bv, font) + cmd.y -
-                                               (ascent_collapsed() +
-                                               descent_collapsed() +
-                                               inset.ascent(bv, font));
+                                               (height_collapsed() + inset.ascent(bv, font));
                                }
                                inset.localDispatch(cmd);
                        }
@@ -421,11 +362,13 @@ Inset::RESULT InsetCollapsable::localDispatch(FuncRequest const & cmd)
                }
 
                case LFUN_MOUSE_PRESS:
-                       lfunMousePress(cmd);
+                       if (!collapsed_ && cmd.y > button_bottom_y)
+                               inset.localDispatch(adjustCommand(cmd));
                        return DISPATCHED;
 
                case LFUN_MOUSE_MOTION:
-                       lfunMouseMotion(cmd);
+                       if (!collapsed_ && cmd.y > button_bottom_y)
+                               inset.localDispatch(adjustCommand(cmd));
                        return DISPATCHED;
 
                case LFUN_MOUSE_RELEASE: