X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finsets%2Finsetcollapsable.C;h=facf2f5f362fd3f6cfcfd26aa19105deab1eaa21;hb=b634b3eb3b5cc1c47fd3bc63294e16536d4f7664;hp=5d6739fbcf57fda2ed5940257b093a3b7d0135f5;hpb=55bf6460f304a4632af2136a62c8a82fb86053f3;p=lyx.git diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index 5d6739fbcf..0c8a5bef1b 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -1,453 +1,370 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 1998-2001 The LyX Team. +/** + * \file insetcollapsable.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * ====================================================== + * \author Alejandro Aguilar Sierra + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes + * + * Full author contact details are available in file CREDITS. */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "insetcollapsable.h" -#include "gettext.h" -#include "lyxfont.h" + +#include "buffer.h" #include "BufferView.h" -#include "Painter.h" -#include "insets/insettext.h" -#include "support/LOstream.h" -#include "support/lstrings.h" +#include "cursor.h" #include "debug.h" -#include "lyxtext.h" +#include "dispatchresult.h" +#include "LColor.h" +#include "lyxlex.h" +#include "funcrequest.h" +#include "metricsinfo.h" +#include "paragraph.h" -class LyXText; +#include "frontends/font_metrics.h" +#include "frontends/Painter.h" +#include "frontends/LyXView.h" + + +using lyx::graphics::PreviewLoader; -using std::ostream; using std::endl; +using std::string; using std::max; +using std::min; +using std::ostream; -InsetCollapsable::InsetCollapsable(bool collapsed) - : UpdatableInset(), collapsed_(collapsed), - button_length(0), button_top_y(0), button_bottom_y(0), - label("Label"), autocollapse(true), - widthCollapsed(0), oldWidth(0), need_update(FULL) - +InsetCollapsable::InsetCollapsable(BufferParams const & bp, + CollapseStatus status) + : inset(bp), label("Label"), status_(status), openinlined_(false) { inset.setOwner(this); inset.setAutoBreakRows(true); - inset.setDrawFrame(0, InsetText::ALWAYS); - inset.setFrameColor(0, LColor::collapsableframe); + inset.setDrawFrame(InsetText::ALWAYS); + inset.setFrameColor(LColor::collapsableframe); setInsetName("Collapsable"); + setButtonLabel(); } -bool InsetCollapsable::insertInset(BufferView * bv, Inset * in) +InsetCollapsable::InsetCollapsable(InsetCollapsable const & in) + : UpdatableInset(in), inset(in.inset), + labelfont_(in.labelfont_), label(in.label), status_(in.status_) { - if (!insetAllowed(in->lyxCode())) { - lyxerr << "InsetCollapsable::InsertInset: " - "Unable to insert inset." << endl; - return false; - } - return inset.insertInset(bv, in); + inset.setOwner(this); + setButtonLabel(); } -void InsetCollapsable::write(Buffer const * buf, ostream & os) const +void InsetCollapsable::write(Buffer const & buf, ostream & os) const { - os << "collapsed " << tostr(collapsed_) << "\n"; - inset.writeParagraphData(buf, os); + os << "status "; + switch (status_) { + case Open: + os << "open"; + break; + case Collapsed: + os << "collapsed"; + break; + case Inlined: + os << "inlined"; + break; + } + os << "\n"; + inset.text_.write(buf, os); } - -void InsetCollapsable::read(Buffer const * buf, LyXLex & lex) +void InsetCollapsable::read(Buffer const & buf, LyXLex & lex) { - if (lex.IsOK()) { + bool token_found = false; + if (lex.isOK()) { lex.next(); - string const token = lex.GetString(); - if (token == "collapsed") { + string const token = lex.getString(); + if (token == "status") { lex.next(); - collapsed_ = lex.GetBool(); + string const tmp_token = lex.getString(); + + if (tmp_token == "inlined") { + status_ = Inlined; + token_found = true; + } else if (tmp_token == "collapsed") { + status_ = Collapsed; + token_found = true; + } else if (tmp_token == "open") { + status_ = Open; + token_found = true; + } else { + lyxerr << "InsetCollapsable::read: Missing status!" + << endl; + // Take countermeasures + lex.pushToken(token); + } } else { - lyxerr << "InsetCollapsable::Read: Missing collapsed!" - << endl; + lyxerr << "InsetCollapsable::Read: Missing 'status'-tag!" + << endl; + // take countermeasures + lex.pushToken(token); } } inset.read(buf, lex); -} - - -int InsetCollapsable::ascent_collapsed(Painter & pain, LyXFont const &) const -{ - int width = 0; - int ascent = 0; - int descent = 0; - pain.buttonText(0, 0, label, labelfont, false, - width, ascent, descent); - return ascent; -} - - -int InsetCollapsable::descent_collapsed(Painter & pain, LyXFont const &) const -{ - int width = 0; - int ascent = 0; - int descent = 0; - pain.buttonText(0, 0, label, labelfont, false, - width, ascent, descent); - return descent; -} + if (!token_found) + status_ = isOpen() ? Open : Collapsed; -int InsetCollapsable::width_collapsed(Painter & pain, LyXFont const &) const -{ - int width; - int ascent; - int descent; - pain.buttonText(TEXT_TO_INSET_OFFSET, 0, label, labelfont, false, - width, ascent, descent); - return width + (2*TEXT_TO_INSET_OFFSET); + setButtonLabel(); } -int InsetCollapsable::ascent(BufferView * bv, LyXFont const & font) const +void InsetCollapsable::dimension_collapsed(Dimension & dim) const { - return ascent_collapsed(bv->painter(), font); + font_metrics::buttonText(label, labelfont_, dim.wid, dim.asc, dim.des); } -int InsetCollapsable::descent(BufferView * bv, LyXFont const & font) const +void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const { - if (collapsed_) - return descent_collapsed(bv->painter(), font); - - return descent_collapsed(bv->painter(), font) - + inset.descent(bv, font) - + inset.ascent(bv, font) - + TEXT_TO_BOTTOM_OFFSET; -} - - -int InsetCollapsable::width(BufferView * bv, LyXFont const & font) const -{ - if (!widthCollapsed) - widthCollapsed = width_collapsed(bv->painter(), font); - - if (collapsed_) - return widthCollapsed; - - return (inset.width(bv, font) > widthCollapsed) ? - inset.width(bv, font) : widthCollapsed; -} - - -void InsetCollapsable::draw_collapsed(Painter & pain, LyXFont const &, - int baseline, float & x) const -{ - int width = 0; - pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, - baseline, label, labelfont, true, width); - x += width + TEXT_TO_INSET_OFFSET; + if (status_ == Inlined) { + inset.metrics(mi, dim); + } else { + dimension_collapsed(dim); + if (status_ == Open) { + Dimension insetdim; + inset.metrics(mi, insetdim); + openinlined_ = (insetdim.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); + } else { + dim.des += insetdim.height() + + TEXT_TO_BOTTOM_OFFSET; + dim.wid = max(dim.wid, insetdim.wid); + } + } + } + dim_ = dim; } -void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, - int baseline, float & x, bool cleared) const +void InsetCollapsable::draw_collapsed(PainterInfo & pi, int x, int y) const { - if (nodraw()) - return; - - Painter & pain = bv->painter(); - - if (!widthCollapsed) - widthCollapsed = width_collapsed(pain, f); - - button_length = widthCollapsed; - button_top_y = -ascent(bv, f); - button_bottom_y = -ascent(bv, f) + ascent_collapsed(pain,f) + - descent_collapsed(pain, f); - - if (collapsed_) { - draw_collapsed(pain, f, baseline, x); - x += TEXT_TO_INSET_OFFSET; - return; - } - - float old_x = x; - -#if 0 - UpdatableInset::draw(bv, f, baseline, x, cleared); -#else - if (!owner()) - x += static_cast(scroll()); -#endif - if (!cleared && (inset.need_update == InsetText::FULL || - inset.need_update == InsetText::INIT || - top_x != int(x) || - top_baseline != baseline)) - { -#if 1 - // we don't need anymore to clear here we just have to tell - // the underlying LyXText that it should do the RowClear! - inset.setUpdateStatus(bv, InsetText::FULL); - bv->text->status(bv, LyXText::CHANGED_IN_DRAW); - return; -#else - int w = owner() ? width(bv, f) : pain.paperWidth(); - int h = ascent(bv, f) + descent(bv, f); - int const tx = (needFullRow() && !owner()) ? 0 : int(x); - int const ty = max(0, baseline - ascent(bv, f)); - - if ((ty + h) > pain.paperHeight()) - h = pain.paperHeight(); - if ((top_x + w) > pain.paperWidth()) - w = pain.paperWidth(); - if (baseline < 0) - h += (baseline - ascent(bv, f)); - pain.fillRectangle(tx, ty - 1, w, h + 2); - cleared = true; -#endif - } - - top_x = int(x); - top_baseline = baseline; - - int const bl = baseline - ascent(bv, f) + ascent_collapsed(pain, f); - - draw_collapsed(pain, f, bl, old_x); - inset.draw(bv, f, - bl + descent_collapsed(pain, f) + inset.ascent(bv, f), - x, cleared); - need_update = NONE; + pi.pain.buttonText(x, y, label, labelfont_); } -void InsetCollapsable::edit(BufferView * bv, int xp, int yp, - unsigned int button) +void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const { - UpdatableInset::edit(bv, xp, yp, button); + setPosCache(pi, x, y); - if (collapsed_) { - collapsed_ = false; - if (!bv->lockInset(this)) - return; - bv->updateInset(this, false); - inset.edit(bv, 0, 0, button); + if (status_ == Inlined) { + inset.draw(pi, x, y); } else { - if (!bv->lockInset(this)) - return; - LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + yp - - (ascent_collapsed(bv->painter(), font) + - descent_collapsed(bv->painter(), font) + - inset.ascent(bv, font)); - inset.edit(bv, xp, yy, button); + Dimension dimc; + dimension_collapsed(dimc); + int const aa = ascent(); + button_dim.x1 = x + 0; + button_dim.x2 = x + dimc.width(); + 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); + if (status_ == Open) { + if (!owner()) + x += scroll(); + + if (openinlined_) + inset.draw(pi, x + dimc.width(), y - aa + inset.ascent()); + else + inset.draw(pi, x, y - aa + dimc.height() + inset.ascent()); + } } } -void InsetCollapsable::edit(BufferView * bv, bool front) +void InsetCollapsable::drawSelection(PainterInfo & pi, int x, int y) const { - UpdatableInset::edit(bv, front); - - if (collapsed_) { - collapsed_ = false; - if (!bv->lockInset(this)) - return; - bv->updateInset(this, false); - inset.edit(bv, front); - } else { - if (!bv->lockInset(this)) - return; - inset.edit(bv, front); - } + inset.drawSelection(pi, x, y); } -Inset::EDITABLE InsetCollapsable::editable() const +InsetOld::EDITABLE InsetCollapsable::editable() const { - if (collapsed_) - return IS_EDITABLE; - return HIGHLY_EDITABLE; + return status_ != Collapsed ? HIGHLY_EDITABLE : IS_EDITABLE; } -void InsetCollapsable::insetUnlock(BufferView * bv) +bool InsetCollapsable::descendable() const { - if (autocollapse) { - collapsed_ = true; - } - inset.insetUnlock(bv); - if (scroll()) - scroll(bv, 0.0F); - bv->updateInset(this, false); + return status_ != Collapsed; } -void InsetCollapsable::insetButtonPress(BufferView * bv, int x, int y, - int button) +void InsetCollapsable::lfunMouseRelease(LCursor & cur, FuncRequest & cmd) { - if (!collapsed_ && (y > button_bottom_y)) { - LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter(), font) + - descent_collapsed(bv->painter(), font) + - inset.ascent(bv, font)); - inset.insetButtonPress(bv, x, yy, button); + if (cmd.button() == mouse_button::button3) { + showInsetDialog(&cur.bv()); + return; } -} - -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; - inset.insetButtonRelease(bv, 0, 0, button); - bv->updateInset(this, false); - } else { - collapsed_ = true; - bv->unlockInset(this); - bv->updateInset(this, false); + switch (status_) { + + case Collapsed: + lyxerr << "InsetCollapsable::lfunMouseRelease 1" << endl; + setStatus(Open); + edit(cur, true); + break; + + case Open: { + FuncRequest cmd1 = cmd; + if (hitButton(cmd1)) { + lyxerr << "InsetCollapsable::lfunMouseRelease 2" << endl; + setStatus(Collapsed); + cmd = FuncRequest(LFUN_FINISHED_RIGHT); + break; } - } else if (!collapsed_ && (y > button_top_y)) { - LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter(), font) + - descent_collapsed(bv->painter(), font) + - inset.ascent(bv, font)); - inset.insetButtonRelease(bv, x, yy, button); + lyxerr << "InsetCollapsable::lfunMouseRelease 3" << endl; + inset.dispatch(cur, cmd); + break; } -} - -void InsetCollapsable::insetMotionNotify(BufferView * bv, - int x, int y, int state) -{ - if (x > button_bottom_y) { - LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter(), font) + - descent_collapsed(bv->painter(), font) + - inset.ascent(bv, font)); - inset.insetMotionNotify(bv, x, yy, state); + case Inlined: + inset.dispatch(cur, cmd); + break; } } -void InsetCollapsable::insetKeyPress(XKeyEvent * xke) +int InsetCollapsable::latex(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - inset.insetKeyPress(xke); + return inset.latex(buf, os, runparams); } -int InsetCollapsable::latex(Buffer const * buf, ostream & os, - bool fragile, bool free_spc) const +int InsetCollapsable::plaintext(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - return inset.latex(buf, os, fragile, free_spc); + return inset.plaintext(buf, os, runparams); } -int InsetCollapsable::getMaxWidth(BufferView * bv, - UpdatableInset const * inset) const +int InsetCollapsable::linuxdoc(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - int const w = UpdatableInset::getMaxWidth(bv, inset); - - if (w < 0) { - // What does a negative max width signify? (Lgb) - // Use the max width of the draw-area (Jug) - return w; - } - // should be at least 30 pixels !!! - return max(30, w - widthCollapsed); + return inset.linuxdoc(buf, os, runparams); } -void InsetCollapsable::update(BufferView * bv, LyXFont const & font, - bool reinit) +int InsetCollapsable::docbook(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { -#if 0 - if (reinit) { - need_update = FULL; - if (owner()) - owner()->update(bv, font, true); - return; - } - if (!widthCollapsed) { - widthCollapsed = width_collapsed(bv->painter(), font); - inset.resizeLyXText(bv); - need_update = FULL; - if (owner()) { - owner()->update(bv, font); - return; - } - } - if (oldWidth != width(bv, font)) { - oldWidth = width(bv, font); - inset.resizeLyXText(bv); - need_update = FULL; - if (owner()) { - owner()->update(bv, font); - return; - } - } -#else - if (!widthCollapsed) - widthCollapsed = width_collapsed(bv->painter(), font); - inset.update(bv, font, reinit); -#endif + return inset.docbook(buf, os, runparams); } -UpdatableInset::RESULT -InsetCollapsable::localDispatch(BufferView * bv, kb_action action, - string const & arg) +bool InsetCollapsable::hitButton(FuncRequest & cmd) const { - UpdatableInset::RESULT result = inset.localDispatch(bv, action, arg); - if (result == FINISHED) - bv->unlockInset(this); - return result; + return button_dim.contains(cmd.x, cmd.y); } -bool InsetCollapsable::lockInsetInInset(BufferView * bv, UpdatableInset * in) +string const InsetCollapsable::getNewLabel(string const & l) const { - if (&inset == in) - return true; - return inset.lockInsetInInset(bv, in); + string label; + pos_type const max_length = 15; + pos_type const p_siz = inset.paragraphs().begin()->size(); + pos_type const n = min(max_length, p_siz); + pos_type i = 0; + pos_type j = 0; + for( ; i < n && j < p_siz; ++j) { + if (inset.paragraphs().begin()->isInset(j)) + continue; + label += inset.paragraphs().begin()->getChar(j); + ++i; + } + if (inset.paragraphs().size() > 1 || (i > 0 && j < p_siz)) { + label += "..."; + } + return label.empty() ? l : label; } -bool InsetCollapsable::unlockInsetInInset(BufferView * bv, UpdatableInset * in, - bool lr) +void InsetCollapsable::edit(LCursor & cur, bool left) { - if (&inset == in) { - bv->unlockInset(this); - return true; - } - return inset.unlockInsetInInset(bv, in, lr); + //lyxerr << "InsetCollapsable: edit left/right" << endl; + cur.push(*this); + inset.edit(cur, left); + open(); } -bool InsetCollapsable::updateInsetInInset(BufferView * bv, Inset *in) +InsetBase * InsetCollapsable::editXY(LCursor & cur, int x, int y) { - if (&inset == in) - return true; - return inset.updateInsetInInset(bv, in); + cur.push(*this); + //lyxerr << "InsetCollapsable: edit xy" << endl; + if (status_ == Collapsed) { + setStatus(Open); + inset.edit(cur, true); +#warning look here +//we are not calling edit(x,y) because there are no coordinates in the +//inset yet. I personally think it's ok. (ab) + return this; + } + return inset.editXY(cur, x, y); +} + + +void InsetCollapsable::priv_dispatch(LCursor & cur, FuncRequest & cmd) +{ + //lyxerr << "\nInsetCollapsable::priv_dispatch (begin): cmd: " << cmd + // << " button y: " << button_dim.y2 << endl; + switch (cmd.action) { + case LFUN_MOUSE_PRESS: + if (status_ == Inlined) + inset.dispatch(cur, cmd); + else if (status_ == Open && !hitButton(cmd)) + inset.dispatch(cur, cmd); + break; + + case LFUN_MOUSE_MOTION: + if (status_ == Inlined) + inset.dispatch(cur, cmd); + else if (status_ == Open && !hitButton(cmd)) + inset.dispatch(cur, cmd); + break; + + case LFUN_MOUSE_RELEASE: + lfunMouseRelease(cur, cmd); + break; + + case LFUN_INSET_TOGGLE: + if (inset.text_.toggleInset(cur)) + break; + if (status_ == Open) { + setStatus(Inlined); + break; + } + setStatus(Collapsed); + cmd = FuncRequest(LFUN_FINISHED_RIGHT); + break; + + default: + inset.dispatch(cur, cmd); + break; + } } -unsigned int InsetCollapsable::insetInInsetY() +bool InsetCollapsable::getStatus(LCursor & cur, FuncRequest const & cmd, + FuncStatus & flag) const { - return inset.insetInInsetY() - (top_baseline - inset.y()); + return inset.getStatus(cur, cmd, flag); } @@ -457,133 +374,113 @@ void InsetCollapsable::validate(LaTeXFeatures & features) const } -void InsetCollapsable::getCursorPos(BufferView * bv, int & x, int & y) const +void InsetCollapsable::getCursorPos(CursorSlice const & cur, + int & x, int & y) const { - inset.getCursorPos(bv, x , y); + inset.getCursorPos(cur, x, y); } -void InsetCollapsable::toggleInsetCursor(BufferView * bv) +void InsetCollapsable::getLabelList(Buffer const & buffer, + std::vector & list) const { - inset.toggleInsetCursor(bv); + inset.getLabelList(buffer, list); } -void InsetCollapsable::showInsetCursor(BufferView * bv, bool show) +int InsetCollapsable::scroll(bool recursive) const { - inset.showInsetCursor(bv, show); -} + int sx = UpdatableInset::scroll(false); + if (recursive) + sx += inset.scroll(false); -void InsetCollapsable::hideInsetCursor(BufferView * bv) -{ - inset.hideInsetCursor(bv); + return sx; } -UpdatableInset * InsetCollapsable::getLockingInset() const +size_t InsetCollapsable::nargs() const { - UpdatableInset * in = inset.getLockingInset(); - if (const_cast(&inset) == in) - return const_cast(this); - return in; + return inset.nargs(); } -UpdatableInset * InsetCollapsable::getFirstLockingInsetOfType(Inset::Code c) +LyXText * InsetCollapsable::getText(int i) const { - if (c == lyxCode()) - return this; - return inset.getFirstLockingInsetOfType(c); + return inset.getText(i); } -void InsetCollapsable::setFont(BufferView * bv, LyXFont const & font, - bool toggleall, bool selectall) +void InsetCollapsable::open() { - inset.setFont(bv, font, toggleall, selectall); + if (status_ == Collapsed) // ...but not inlined + setStatus(Open); } -bool InsetCollapsable::doClearArea() const +void InsetCollapsable::close() { - return inset.doClearArea(); + setStatus(Collapsed); } -LyXText * InsetCollapsable::getLyXText(BufferView const * bv, - bool const recursive) const +void InsetCollapsable::setLabel(string const & l) { - return inset.getLyXText(bv, recursive); + label = l; } -void InsetCollapsable::deleteLyXText(BufferView * bv, bool recursive) const +void InsetCollapsable::setStatus(CollapseStatus st) { - inset.deleteLyXText(bv, recursive); + status_ = st; + setButtonLabel(); } -void InsetCollapsable::resizeLyXText(BufferView * bv, bool force) const +void InsetCollapsable::markErased() { - inset.resizeLyXText(bv, force); - LyXFont font(LyXFont::ALL_SANE); - oldWidth = width(bv, font); + inset.markErased(); } -std::vector const InsetCollapsable::getLabelList() const +void InsetCollapsable::addPreview(PreviewLoader & loader) const { - return inset.getLabelList(); + inset.addPreview(loader); } -bool InsetCollapsable::nodraw() const +bool InsetCollapsable::insetAllowed(InsetOld::Code code) const { - return inset.nodraw(); + return inset.insetAllowed(code); } - -int InsetCollapsable::scroll(bool recursive) const -{ - int sx = UpdatableInset::scroll(false); - if (recursive) - sx += inset.scroll(recursive); - - return sx; -} - - -Paragraph * InsetCollapsable::getParFromID(int id) const +void InsetCollapsable::setLabelFont(LyXFont & font) { - return inset.getParFromID(id); + labelfont_ = font; } -Paragraph * InsetCollapsable::firstParagraph() const +void InsetCollapsable::scroll(BufferView & bv, float sx) const { - return inset.firstParagraph(); + UpdatableInset::scroll(bv, sx); } -LyXCursor const & InsetCollapsable::cursor(BufferView * bv) const +void InsetCollapsable::scroll(BufferView & bv, int offset) const { - return inset.cursor(bv); + UpdatableInset::scroll(bv, offset); } -Inset * InsetCollapsable::getInsetFromID(int id_arg) const +Box const & InsetCollapsable::buttonDim() const { - if (id_arg == id()) - return const_cast(this); - return inset.getInsetFromID(id_arg); + return button_dim; } -void InsetCollapsable::open(BufferView * bv, bool flag) + +void InsetCollapsable::setBackgroundColor(LColor_color color) { - if (flag == !collapsed_) - return; - collapsed_ = !flag; - bv->updateInset(this, false); + InsetOld::setBackgroundColor(color); + inset.setBackgroundColor(color); }