X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCollapsable.cpp;h=6c880cd514c53c4eeff51d38c114d34a2640516b;hb=3588f2f69675df8dbf829800b0ed6e4a455c68b4;hp=f6d94c26be7879e091b96ef1079593f1d664f303;hpb=c6c0559be0566c921c279cbf78d51ac4bcca4fcd;p=lyx.git diff --git a/src/insets/InsetCollapsable.cpp b/src/insets/InsetCollapsable.cpp index f6d94c26be..6c880cd514 100644 --- a/src/insets/InsetCollapsable.cpp +++ b/src/insets/InsetCollapsable.cpp @@ -26,6 +26,7 @@ #include "Lexer.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "TextClass.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" @@ -42,8 +43,7 @@ using namespace std; namespace lyx { InsetCollapsable::InsetCollapsable(Buffer * buf, InsetText::UsePlain ltype) - : InsetText(buf, ltype), status_(Open), - openinlined_(false), mouse_hover_(false) + : InsetText(buf, ltype), status_(Open), openinlined_(false) { setAutoBreakRows(true); setDrawFrame(true); @@ -51,16 +51,24 @@ InsetCollapsable::InsetCollapsable(Buffer * buf, InsetText::UsePlain ltype) } +// The sole purpose of this copy constructor is to make sure +// that the mouse_hover_ map is not copied and remains empty. InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs) : InsetText(rhs), status_(rhs.status_), labelstring_(rhs.labelstring_), button_dim(rhs.button_dim), - openinlined_(rhs.openinlined_), - auto_open_(rhs.auto_open_), - // the sole purpose of this copy constructor - mouse_hover_(false) + openinlined_(rhs.openinlined_) +{} + + +InsetCollapsable::~InsetCollapsable() { + map::iterator it = mouse_hover_.begin(); + map::iterator end = mouse_hover_.end(); + for (; it != end; ++it) + if (it->second) + it->first->clearLastInset(this); } @@ -122,7 +130,7 @@ InsetCollapsable::Geometry InsetCollapsable::geometry() const docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const { - Dimension dim = dimensionCollapsed(bv); + Dimension const dim = dimensionCollapsed(bv); if (geometry(bv) == NoButton) return translateIfPossible(getLayout().labelstring()); if (x > xo(bv) + dim.wid || y > yo(bv) + dim.des || isOpen(bv)) @@ -173,7 +181,7 @@ Dimension InsetCollapsable::dimensionCollapsed(BufferView const & bv) const void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const { - auto_open_[mi.base.bv] = mi.base.bv->cursor().isInside(this); + auto_open_[mi.base.bv] = mi.base.bv->cursor().isInside(this); FontInfo tmpfont = mi.base.font; mi.base.font = getLayout().font(); @@ -230,9 +238,10 @@ void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const } -bool InsetCollapsable::setMouseHover(bool mouse_hover) +bool InsetCollapsable::setMouseHover(BufferView const * bv, bool mouse_hover) + const { - mouse_hover_ = mouse_hover; + mouse_hover_[bv] = mouse_hover; return true; } @@ -241,7 +250,7 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const { BufferView const & bv = *pi.base.bv; - auto_open_[&bv] = bv.cursor().isInside(this); + auto_open_[&bv] = bv.cursor().isInside(this); FontInfo tmpfont = pi.base.font; pi.base.font = getLayout().font(); @@ -261,7 +270,7 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const FontInfo labelfont = getLayout().labelfont(); labelfont.setColor(labelColor()); pi.pain.buttonText(x, y, buttonLabel(bv), labelfont, - mouse_hover_); + mouse_hover_[&bv]); } else { button_dim.x1 = 0; button_dim.y1 = 0; @@ -306,22 +315,22 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const const int xx2 = x + textdim.wid - TEXT_TO_INSET_OFFSET + 1; pi.pain.line(xx1, y + desc - 4, xx1, y + desc, - labelColor()); + Color_foreground); if (status_ == Open) pi.pain.line(xx1, y + desc, xx2, y + desc, - labelColor()); + Color_foreground); else { // Make status_ value visible: pi.pain.line(xx1, y + desc, xx1 + 4, y + desc, - labelColor()); + Color_foreground); pi.pain.line(xx2 - 4, y + desc, xx2, y + desc, - labelColor()); + Color_foreground); } pi.pain.line(x + textdim.wid - 3, y + desc, x + textdim.wid - 3, - y + desc - 4, labelColor()); + y + desc - 4, Color_foreground); // the label below the text. Can be toggled. if (geometry(bv) == SubLabel) { @@ -344,12 +353,10 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const if (cur.isInside(this)) { y -= textdim.asc; y += 3; - pi.pain.line(xx1, y + 4, xx1, y, labelColor()); - pi.pain.line(xx1 + 4, y, xx1, y, labelColor()); - pi.pain.line(xx2, y + 4, xx2, y, - labelColor()); - pi.pain.line(xx2 - 4, y, xx2, y, - labelColor()); + pi.pain.line(xx1, y + 4, xx1, y, Color_foreground); + pi.pain.line(xx1 + 4, y, xx1, y, Color_foreground); + pi.pain.line(xx2, y + 4, xx2, y, Color_foreground); + pi.pain.line(xx2 - 4, y, xx2, y, Color_foreground); } break; } @@ -405,6 +412,13 @@ bool InsetCollapsable::hitButton(FuncRequest const & cmd) const } +bool InsetCollapsable::clickable(int x, int y) const +{ + FuncRequest cmd(LFUN_NOACTION, x, y, mouse_button::none); + return hitButton(cmd); +} + + docstring const InsetCollapsable::getNewLabel(docstring const & l) const { docstring label; @@ -466,7 +480,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd) case mouse_button::button4: case mouse_button::button5: // Nothing to do. - cur.noUpdate(); + cur.noScreenUpdate(); break; } } else if (geometry(cur.bv()) != ButtonOnly) @@ -479,7 +493,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_MOUSE_DOUBLE: case LFUN_MOUSE_TRIPLE: if (hitButton(cmd)) - cur.noUpdate(); + cur.noScreenUpdate(); else if (geometry(cur.bv()) != ButtonOnly) InsetText::doDispatch(cur, cmd); else @@ -497,7 +511,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd) } if (cmd.button() != mouse_button::button1) { // Nothing to do. - cur.noUpdate(); + cur.noScreenUpdate(); break; } // if we are selecting, we do not want to @@ -507,7 +521,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd) // Left button is clicked, the user asks to // toggle the inset visual state. cur.dispatched(); - cur.updateFlags(Update::Force | Update::FitCursor); + cur.screenUpdateFlags(Update::Force | Update::FitCursor); if (geometry(cur.bv()) == ButtonOnly) { setStatus(cur, Open); edit(cur, true); @@ -523,11 +537,9 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd) else if (cmd.argument() == "close") setStatus(cur, Collapsed); else if (cmd.argument() == "toggle" || cmd.argument().empty()) - if (status_ == Open) { + if (status_ == Open) setStatus(cur, Collapsed); - if (geometry(cur.bv()) == ButtonOnly) - cur.top().forwardPos(); - } else + else setStatus(cur, Open); else // if assign or anything else cur.undispatched(); @@ -571,9 +583,9 @@ void InsetCollapsable::setLabel(docstring const & l) docstring const InsetCollapsable::buttonLabel(BufferView const & bv) const { - docstring const label = labelstring_.empty() ? - translateIfPossible(getLayout().labelstring()) : labelstring_; InsetLayout const & il = getLayout(); + docstring const label = labelstring_.empty() ? + translateIfPossible(il.labelstring()) : labelstring_; if (!il.contentaslabel() || geometry(bv) != ButtonOnly) return label; return getNewLabel(label); @@ -584,10 +596,8 @@ void InsetCollapsable::setStatus(Cursor & cur, CollapseStatus status) { status_ = status; setButtonLabel(); - if (status_ == Collapsed) { + if (status_ == Collapsed) cur.leaveInset(*this); - mouse_hover_ = false; - } } @@ -608,20 +618,35 @@ InsetLayout::InsetDecoration InsetCollapsable::decoration() const } -docstring InsetCollapsable::contextMenu(BufferView const & bv, int x, +string InsetCollapsable::contextMenu(BufferView const & bv, int x, int y) const { + string context_menu = contextMenuName(); + string const it_context_menu = InsetText::contextMenuName(); if (decoration() == InsetLayout::CONGLOMERATE) - return from_ascii("context-conglomerate"); + return context_menu + ";" + it_context_menu; + + string const ic_context_menu = InsetCollapsable::contextMenuName(); + if (ic_context_menu != context_menu) + context_menu += ";" + ic_context_menu; if (geometry(bv) == NoButton) - return from_ascii("context-collapsable"); + return context_menu + ";" + it_context_menu; Dimension dim = dimensionCollapsed(bv); if (x < xo(bv) + dim.wid && y < yo(bv) + dim.des) - return from_ascii("context-collapsable"); + return context_menu; + + return it_context_menu; +} + - return InsetText::contextMenu(bv, x, y); +string InsetCollapsable::contextMenuName() const +{ + if (decoration() == InsetLayout::CONGLOMERATE) + return "context-conglomerate"; + else + return "context-collapsable"; } } // namespace lyx