Outliner: distinguish non-active refs from broken refs

See #11782
This commit is contained in:
Juergen Spitzmueller 2020-03-14 16:29:53 +01:00
parent 0f9ef6877c
commit b96ce9a9c1
3 changed files with 31 additions and 3 deletions

View File

@ -230,7 +230,7 @@ void InsetLabel::addToToc(DocIterator const & cpit, bool output_active,
else else
toc->push_back(TocItem(ref_pit, 1, toc->push_back(TocItem(ref_pit, 1,
static_cast<InsetRef *>(p.first)->getTOCString(), static_cast<InsetRef *>(p.first)->getTOCString(),
output_active)); static_cast<InsetRef *>(p.first)->outputActive()));
} }
} }
} }

View File

@ -22,6 +22,7 @@
#include "LyX.h" #include "LyX.h"
#include "OutputParams.h" #include "OutputParams.h"
#include "output_xhtml.h" #include "output_xhtml.h"
#include "Paragraph.h"
#include "ParIterator.h" #include "ParIterator.h"
#include "sgml.h" #include "sgml.h"
#include "texstream.h" #include "texstream.h"
@ -40,12 +41,12 @@ namespace lyx {
InsetRef::InsetRef(Buffer * buf, InsetCommandParams const & p) InsetRef::InsetRef(Buffer * buf, InsetCommandParams const & p)
: InsetCommand(buf, p), broken_(false) : InsetCommand(buf, p), broken_(false), active_(true)
{} {}
InsetRef::InsetRef(InsetRef const & ir) InsetRef::InsetRef(InsetRef const & ir)
: InsetCommand(ir), broken_(false) : InsetCommand(ir), broken_(false), active_(true)
{} {}
@ -401,6 +402,23 @@ void InsetRef::forOutliner(docstring & os, size_t const, bool const) const
void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*deleted*/) void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*deleted*/)
{ {
docstring const & ref = getParam("reference"); docstring const & ref = getParam("reference");
// Check if this one is active (i.e., neither deleted with change-tracking
// nor in an inset that does not produce output, such as notes or inactive branches)
Paragraph const & para = it.paragraph();
active_ = !para.isDeleted(it.pos()) && para.inInset().producesOutput();
// If not, check whether we are in a deleted/non-outputting inset
if (active_) {
for (size_type sl = 0 ; sl < it.depth() ; ++sl) {
Paragraph const & outer_par = it[sl].paragraph();
if (outer_par.isDeleted(it[sl].pos())
|| !outer_par.inInset().producesOutput()) {
active_ = false;
break;
}
}
}
// register this inset into the buffer reference cache. // register this inset into the buffer reference cache.
buffer().addReference(ref, this, it); buffer().addReference(ref, this, it);
@ -456,6 +474,7 @@ docstring InsetRef::screenLabel() const
void InsetRef::addToToc(DocIterator const & cpit, bool output_active, void InsetRef::addToToc(DocIterator const & cpit, bool output_active,
UpdateType, TocBackend & backend) const UpdateType, TocBackend & backend) const
{ {
active_ = output_active;
docstring const & label = getParam("reference"); docstring const & label = getParam("reference");
if (buffer().insetLabel(label)) { if (buffer().insetLabel(label)) {
broken_ = !buffer().activeLabel(label); broken_ = !buffer().activeLabel(label);
@ -541,6 +560,11 @@ InsetRef::type_info const InsetRef::types[] = {
docstring InsetRef::getTOCString() const docstring InsetRef::getTOCString() const
{ {
docstring const & label = getParam("reference");
if (buffer().insetLabel(label))
broken_ = !buffer().activeLabel(label) && active_;
else
broken_ = active_;
return tooltip_.empty() ? screenLabel() : tooltip_; return tooltip_.empty() ? screenLabel() : tooltip_;
} }

View File

@ -90,6 +90,8 @@ public:
/// ///
static bool isCompatibleCommand(std::string const & s); static bool isCompatibleCommand(std::string const & s);
//@} //@}
///
bool outputActive() const { return active_; }
protected: protected:
/// ///
@ -122,6 +124,8 @@ private:
/// ///
mutable bool broken_; mutable bool broken_;
/// ///
mutable bool active_;
///
mutable docstring tooltip_; mutable docstring tooltip_;
}; };