X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetcollapsable.C;h=3bc130945558ae3f71fca171c33886faac1d035e;hb=ee72ce87743857b4317da00e6e09cb6842095664;hp=289f1614e1ca7927851374d207ec2cdaa249dca3;hpb=33868acd2c62d5d5393962bdc3bf1351cf8434c8;p=lyx.git diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index 289f1614e1..3bc1309455 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -18,17 +18,19 @@ #include "lyxfont.h" #include "BufferView.h" #include "Painter.h" +#include "support/LOstream.h" +#include "support/lstrings.h" +using std::ostream; -InsetCollapsable::InsetCollapsable(Buffer * bf) - : InsetText(bf) +InsetCollapsable::InsetCollapsable() : InsetText() { collapsed = true; label = "Label"; autocollapse = true; autoBreakRows = true; framecolor = LColor::footnoteframe; - widthOffset = 10; + widthOffset = 2 * TEXT_TO_INSET_OFFSET + 2; // 1+1 (frame) button_length = button_top_y = button_bottom_y = 0; setInsetName("Collapsable"); } @@ -36,25 +38,22 @@ InsetCollapsable::InsetCollapsable(Buffer * bf) Inset * InsetCollapsable::Clone() const { - InsetCollapsable * result = new InsetCollapsable(buffer); - result->init(buffer, this); + InsetCollapsable * result = new InsetCollapsable(); + result->init(this); result->collapsed = collapsed; return result; } -void InsetCollapsable::Write(ostream & os) const + +void InsetCollapsable::Write(Buffer const * buf, ostream & os) const { - os << getInsetName() << "\n\ncollapsed "; - if (display()) - os << "false\n"; - else - os << "true\n"; - WriteParagraphData(os); + os << "collapsed " << tostr(!display()) << "\n"; + WriteParagraphData(buf, os); } -void InsetCollapsable::Read(LyXLex & lex) +void InsetCollapsable::Read(Buffer const * buf, LyXLex & lex) { if (lex.IsOK()) { lex.next(); @@ -64,7 +63,7 @@ void InsetCollapsable::Read(LyXLex & lex) collapsed = lex.GetBool(); } } - InsetText::Read(lex); + InsetText::Read(buf, lex); } @@ -118,53 +117,54 @@ int InsetCollapsable::width(Painter & pain, LyXFont const & font) const if (collapsed) return width_collapsed(pain, font); - return getMaxWidth(pain, this) - widthOffset + 2; + return InsetText::width(pain, font) + width_collapsed(pain,font) + + widthOffset; } -void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &, +void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const & font, int baseline, float & x) const { int width = 0; - pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline, + pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, + baseline-ascent(pain, font)+ascent_collapsed(pain, font), label.c_str(), labelfont, true, width); x += width + (2 * TEXT_TO_INSET_OFFSET); } -void InsetCollapsable::draw(Painter & pain, LyXFont const & f, - int baseline, float & x) const +void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, + int baseline, float & x, bool cleared) const { + Painter & pain = bv->painter(); + button_length = width_collapsed(pain, labelfont) + 2; button_top_y = -ascent_collapsed(pain, f); button_bottom_y = descent_collapsed(pain, f); + top_x = int(x); + top_baseline = baseline; if (collapsed) { draw_collapsed(pain, f, baseline, x); return; } - int - top_x = int(x); - draw_collapsed(pain, f, baseline, x); - x += 2; - - int w = getMaxTextWidth(pain,this); - int h = ascent(pain,f) + descent(pain,f); - - pain.rectangle(int(x), baseline - ascent(pain, f), w, h, framecolor); - - x += 4; - drawTextXOffset = int(x) - top_x; - InsetText::draw(pain, f, baseline, x); + x -= TEXT_TO_INSET_OFFSET; + + int w = InsetText::width(pain, f) + (2 * TEXT_TO_INSET_OFFSET); + int h = ascent(pain,f) + descent(pain, f); + int save_x = static_cast(x); + x += TEXT_TO_INSET_OFFSET; + InsetText::draw(bv, f, baseline, x, cleared); + pain.rectangle(save_x, baseline - ascent(pain, f), w, h, framecolor); } -void InsetCollapsable::Edit(BufferView *bv, int x, int y, unsigned int button) +void InsetCollapsable::Edit(BufferView * bv, int x, int y, unsigned int button) { if (collapsed && autocollapse) { collapsed = false; - UpdateLocal(bv, true); + UpdateLocal(bv, FULL, false); InsetText::Edit(bv, 0, 0, button); } else if (!collapsed) { InsetText::Edit(bv, x, y, button); @@ -179,23 +179,18 @@ Inset::EDITABLE InsetCollapsable::Editable() const return HIGHLY_EDITABLE; } -void InsetCollapsable::InsetUnlock(BufferView *bv) + +void InsetCollapsable::InsetUnlock(BufferView * bv) { if (autocollapse) { collapsed = true; } InsetText::InsetUnlock(bv); - UpdateLocal(bv, false); + UpdateLocal(bv, FULL, false); } -void InsetCollapsable::UpdateLocal(BufferView * bv, bool flag) -{ - InsetText::UpdateLocal(bv, flag); -} - - -void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button) +void InsetCollapsable::InsetButtonPress(BufferView * bv,int x,int y,int button) { if (!collapsed && (x >= button_length)) { InsetText::InsetButtonPress(bv, x, y, button); @@ -203,17 +198,18 @@ void InsetCollapsable::InsetButtonPress(BufferView *bv,int x,int y,int button) } -void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int button) +void InsetCollapsable::InsetButtonRelease(BufferView * bv, + int x, int y, int button) { if ((x >= 0) && (x < button_length) && (y >= button_top_y) && (y < button_bottom_y)) { if (collapsed) { collapsed = false; InsetText::InsetButtonRelease(bv, 0, 0, button); - UpdateLocal(bv, true); + UpdateLocal(bv, FULL, false); } else { collapsed = true; - UpdateLocal(bv, false); + UpdateLocal(bv, FULL, false); bv->unlockInset(this); } } else if (!collapsed && (x >= button_length) && (y >= button_top_y)) { @@ -221,29 +217,42 @@ void InsetCollapsable::InsetButtonRelease(BufferView *bv, int x, int y, int butt } } -void InsetCollapsable::InsetMotionNotify(BufferView *bv, int x, int y, int state) + +void InsetCollapsable::InsetMotionNotify(BufferView * bv, + int x, int y, int state) { if (x >= button_length) { InsetText::InsetMotionNotify(bv, x, y, state); } } -int InsetCollapsable::getMaxWidth(Painter & pain, UpdatableInset const * inset) const + +int InsetCollapsable::getMaxWidth(Painter & pain, + UpdatableInset const * inset) const { if ((this == inset) && !owner()) return pain.paperWidth(); if (this == inset) - return (static_cast(owner())->getMaxWidth(pain,inset)); + return static_cast(owner())->getMaxWidth(pain,inset); if (owner()) - return (static_cast(owner())->getMaxWidth(pain,inset)- - width_collapsed(pain, labelfont) - 2 - widthOffset); + return static_cast(owner())->getMaxWidth(pain,inset)- + width_collapsed(pain, labelfont) - widthOffset; - return pain.paperWidth()-width_collapsed(pain, labelfont)-2-widthOffset; + return pain.paperWidth()-width_collapsed(pain, labelfont) - widthOffset; } + int InsetCollapsable::getMaxTextWidth(Painter & pain, - UpdatableInset const * inset, int) const + UpdatableInset const * inset) const { return getMaxWidth(pain, inset) - - width_collapsed(pain, labelfont) - widthOffset - 2; + width_collapsed(pain, labelfont) - widthOffset; +} + + +void InsetCollapsable::update(BufferView * bv, + LyXFont const & font, bool dodraw) +{ + drawTextXOffset = width_collapsed(bv->painter(), font); + InsetText::update(bv, font, dodraw); }