diff --git a/src/lay/lay/layGSIHelpProvider.cc b/src/lay/lay/layGSIHelpProvider.cc index a1f026a6b..3389f5e7e 100644 --- a/src/lay/lay/layGSIHelpProvider.cc +++ b/src/lay/lay/layGSIHelpProvider.cc @@ -437,9 +437,15 @@ void produce_toc (const gsi::ClassBase *cls, std::vector &toc) void GSIHelpProvider::toc (std::vector &t) { + std::set mod_names; for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) { + mod_names.insert (c->module ()); produce_toc (c.operator-> (), t); } + + for (std::set::const_iterator m = mod_names.begin (); m != mod_names.end (); ++m) { + t.push_back (module_doc_path (*m)); + } } QDomDocument @@ -484,7 +490,24 @@ GSIHelpProvider::get (const std::string &path) const } static -void produce_doc_index (const gsi::ClassBase *cls, const std::string &module, std::ostringstream &os, std::vector > > &class_names, std::vector > > &qt_class_names) +void produce_doc_index (const gsi::ClassBase *cls, std::ostringstream &os) +{ + DocumentationParser &doc = cls_documentation (cls); + std::string qname = make_qualified_name (cls); + + // Only list the name if the class is not hidden, it's a top-level class or the path is an expanded one + // (the last criterion avoids generating classes such as A::B_C) + if (! doc.hidden) { + os << "" << std::endl; + } + + for (tl::weak_collection::const_iterator cc = cls->begin_child_classes (); cc != cls->end_child_classes (); ++cc) { + produce_doc_index (cc.operator-> (), os); + } +} + +static +void collect_class_info (const gsi::ClassBase *cls, const std::string &module, std::vector > > &class_names, std::vector > > &qt_class_names) { DocumentationParser &doc = cls_documentation (cls); std::string qname = make_qualified_name (cls); @@ -497,15 +520,14 @@ void produce_doc_index (const gsi::ClassBase *cls, const std::string &module, st } else { qt_class_names.push_back (std::make_pair (qname, std::make_pair (module, doc.brief_doc))); } - os << "" << std::endl; } for (tl::weak_collection::const_iterator cc = cls->begin_child_classes (); cc != cls->end_child_classes (); ++cc) { - produce_doc_index (cc.operator-> (), module, os, class_names, qt_class_names); + collect_class_info (cc.operator-> (), module, class_names, qt_class_names); } } -std::string +std::string GSIHelpProvider::produce_class_index (const char *module_name) const { std::ostringstream os; @@ -518,42 +540,27 @@ GSIHelpProvider::produce_class_index (const char *module_name) const if (!module_name) { os << "" << tl::to_string (QObject::tr ("Class Index")) << "" << std::endl; } else { - os << "" << tl::to_string (QObject::tr ("Class Index for Module ")) << module_name << "" << std::endl; + os << "" << tl::to_string (QObject::tr ("Class Index for Module ")) << escape_xml (module_name) << "" << std::endl; + os << "" << std::endl; } typedef std::vector > > class_index_t; class_index_t class_names; class_index_t qt_class_names; + for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) { - produce_doc_index (&*c, c->module (), os, class_names, qt_class_names); + if (! module_name || c->module () == module_name) { + collect_class_info (c.operator-> (), c->module (), class_names, qt_class_names); + } } - if (module_name) { + if (! module_name) { - // filter out the classes for this module - class_index_t filtered_class_names; - class_index_t filtered_qt_class_names; - - for (class_index_t::iterator i = class_names.begin (); i != class_names.end (); ++i) { - if (i->second.first == module_name) { - filtered_class_names.push_back (*i); - } + for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) { + produce_doc_index (c.operator-> (), os); } - for (class_index_t::iterator i = qt_class_names.begin (); i != qt_class_names.end (); ++i) { - if (i->second.first == module_name) { - filtered_qt_class_names.push_back (*i); - } - } - - class_names.swap (filtered_class_names); - qt_class_names.swap (filtered_qt_class_names); - - } else { - - os << "

" << tl::to_string (QObject::tr ("Per-Module documentation:")) << "

"; - std::set mod_names; std::set qt_mod_names; @@ -565,12 +572,21 @@ GSIHelpProvider::produce_class_index (const char *module_name) const qt_mod_names.insert (i->second.first); } - os << "