diff --git a/navigatorappitem.cpp b/navigatorappitem.cpp index b9d663a7..0cb600fe 100644 --- a/navigatorappitem.cpp +++ b/navigatorappitem.cpp @@ -1,93 +1,127 @@ /* * This file is part of the KDE Help Center * * Copyright (C) 1999 Matthias Elter (me@kde.org) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "navigatorappitem.h" #include "docentry.h" #include "toc.h" #include "view.h" #include "khc_debug.h" #include #include using namespace KHC; +QMap< QString,NavigatorAppItem* > NavigatorAppItem::s_menuItemsMap; + NavigatorAppItem::NavigatorAppItem( DocEntry *entry, QTreeWidgetItem *parent ) : NavigatorItem( entry, parent ), mToc( nullptr ) { + auto iter = s_menuItemsMap.find(entry->url()); + if (iter == s_menuItemsMap.end()) + { + s_menuItemsMap.insert(entry->url(), this); + } } NavigatorAppItem::NavigatorAppItem( DocEntry *entry, QTreeWidget *parent, QTreeWidgetItem *after ) : NavigatorItem( entry, parent, after ), mToc( nullptr ) { + auto iter = s_menuItemsMap.find(entry->url()); + if (iter == s_menuItemsMap.end()) + { + s_menuItemsMap.insert(entry->url(), this); + } } NavigatorAppItem::NavigatorAppItem( DocEntry *entry, QTreeWidgetItem *parent, QTreeWidgetItem *after ) : NavigatorItem( entry, parent, after ), mToc( nullptr ) { + auto iter = s_menuItemsMap.find(entry->url()); + if (iter == s_menuItemsMap.end()) + { + s_menuItemsMap.insert(entry->url(), this); + } } NavigatorAppItem::~NavigatorAppItem() { + auto iter = s_menuItemsMap.find(entry()->url()); + if ((iter != s_menuItemsMap.end()) && (iter.value() == this)) + { + s_menuItemsMap.erase(iter); + } + delete mToc; } void NavigatorAppItem::itemExpanded( bool open ) { if ( open ) { - scheduleTOCBuild(); + QUrl expanded_url(entry()->url()); + expanded_url.setFragment(QString()); + + auto iter = s_menuItemsMap.find(expanded_url.toString()); + if (iter != s_menuItemsMap.end()) + { + iter.value()->scheduleTOCBuild(); + } + else + { + scheduleTOCBuild(); + } } } void NavigatorAppItem::scheduleTOCBuild() { if ( mToc ) { return; } const QUrl url(entry()->url()); if ( url.scheme() == QLatin1String( "help" ) ) { mToc = new TOC( this ); qCDebug(KHC_LOG) << "Trying to build TOC for" << entry()->name(); mToc->setApplication( url.toString( QUrl::RemoveScheme | QUrl::RemoveFilename | QUrl::StripTrailingSlash ) ); QString doc = View::langLookup( url.path() ); // Enforce the original .docbook version, in case langLookup returns a // cached version if ( !doc.isNull() ) { int pos = doc.indexOf( QLatin1String( ".html" ) ); if ( pos >= 0 ) { doc.replace( pos, 5, QLatin1String( ".docbook" ) ); } qCDebug(KHC_LOG) << "doc =" << doc; mToc->build( doc ); // ensure the newly populated item is expanded QMetaObject::invokeMethod( treeWidget(), "expandItem", Qt::QueuedConnection, Q_ARG( const QTreeWidgetItem*, this ) ); } } } // vim:ts=2:sw=2:et diff --git a/navigatorappitem.h b/navigatorappitem.h index 51a05a95..b9638b35 100644 --- a/navigatorappitem.h +++ b/navigatorappitem.h @@ -1,53 +1,56 @@ /* * navigatorappitem.h - part of the KDE Help Center * * Copyright (C) 1999 Matthias Elter (me@kde.org) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KHC_NAVIGATORAPPITEM_H #define KHC_NAVIGATORAPPITEM_H #include "navigatoritem.h" namespace KHC { class TOC; class NavigatorAppItem : public NavigatorItem { public: NavigatorAppItem( DocEntry *entry, QTreeWidgetItem *parent ); NavigatorAppItem( DocEntry *entry, QTreeWidget *parent, QTreeWidgetItem *after ); NavigatorAppItem( DocEntry *entry, QTreeWidgetItem *parent, QTreeWidgetItem *after ); ~NavigatorAppItem(); void itemExpanded( bool open ) override; private: void scheduleTOCBuild(); TOC *mToc; + + static QMap< QString,NavigatorAppItem* > s_menuItemsMap; + }; } #endif //KHC_NAVIGATORAPPITEM_H // vim:ts=2:sw=2:et