LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File kmenu-search-slowdown-fix.diff of Package kdebase3 (Project openSUSE:Factory)

Index: kicker/kicker/ui/k_mnu.cpp
===================================================================
--- kicker/kicker/ui/k_mnu.cpp.orig
+++ kicker/kicker/ui/k_mnu.cpp
@@ -771,6 +771,7 @@ void PanelKMenu::updateRecent()
             insertSeparator(RecentlyLaunchedApps::the().m_nNumMenuItems);
         }
     }
+    iconsLoaded_ = false;
 }
 
 void PanelKMenu::clearRecentMenuItems()
Index: kicker/kicker/ui/service_mnu.cpp
===================================================================
--- kicker/kicker/ui/service_mnu.cpp.orig
+++ kicker/kicker/ui/service_mnu.cpp
@@ -63,13 +63,20 @@ PanelServiceMenu::PanelServiceMenu(const
       insertInlineHeader_( insertInlineHeader ),
       clearOnClose_(false),
       addmenumode_(addmenumode),
-      popupMenu_(0)
+      popupMenu_(0),
+      iconsLoaded_(false)
 {
     excludeNoDisplay_=true;
 
     connect(KSycoca::self(), SIGNAL(databaseChanged()),
             SLOT(slotClearOnClose()));
     connect(this, SIGNAL(aboutToHide()), this, SLOT(slotClose()));
+
+    const int iconSize = KickerSettings::menuEntryHeight();
+    QPixmap pix(iconSize,iconSize);
+    QBitmap map(iconSize,iconSize,true);
+    pix.setMask(map);
+    emptyiconset = QIconSet(pix,pix);
 }
 
 PanelServiceMenu::~PanelServiceMenu()
@@ -103,6 +110,7 @@ void PanelServiceMenu::initialize()
     clearSubmenus();
     searchSubMenuIDs.clear();
     searchMenuItems.clear();
+    iconsLoaded_ = false;
     doInitialize();
 }
 
@@ -289,15 +297,13 @@ void PanelServiceMenu::fillMenu(KService
                 newSubMenu(g->name(), g->relPath(), this, g->name().utf8(), inlineHeaderName);
             m->setCaption(groupCaption);
 
-            QIconSet iconset = KickerLib::menuIconSet(g->icon());
-
             if (separatorNeeded)
             {
                 insertSeparator();
                 separatorNeeded = false;
             }
 
-            int newId = insertItem(iconset, groupCaption, m, id++);
+            int newId = insertItem(emptyiconset,groupCaption, m, id++);
             entryMap_.insert(newId, static_cast<KSycocaEntry*>(g));
             // This submenu will be searched when applying a search string
             searchSubMenuIDs[m] = newId;
@@ -392,6 +398,12 @@ void PanelServiceMenu::doInitialize()
 
 void PanelServiceMenu::configChanged()
 {
+    const int iconSize = KickerSettings::menuEntryHeight();
+    QPixmap pix(iconSize,iconSize);
+    QBitmap map(iconSize,iconSize,true);
+    pix.setMask(map);
+    emptyiconset = QIconSet(pix,pix);
+
     deinitialize();
 }
 
@@ -456,9 +468,9 @@ void PanelServiceMenu::insertMenuItem(KS
 
     int newId;
     if ( label.isEmpty() )
-       newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex);
+       newId = insertItem(emptyiconset, serviceName, nId, nIndex);       
     else
-       newId = insertItem(KickerLib::menuIconSet(s->icon()), label, nId, nIndex);
+       newId = insertItem(emptyiconset, label, nId, nIndex);
     entryMap_.insert(newId, static_cast<KSycocaEntry*>(s));
 }
 
@@ -1003,3 +1015,23 @@ bool PanelServiceMenu::hasSearchResults(
 {
     return hasSearchResults_;
 }
+
+void PanelServiceMenu::slotAboutToShow()
+{
+   KPanelMenu::slotAboutToShow();
+
+   if (!iconsLoaded_) {
+     EntryMap::Iterator mapIt;
+     for ( mapIt = entryMap_.begin(); mapIt != entryMap_.end(); ++mapIt ) {
+        KService *s = dynamic_cast<KService *>(static_cast<KSycocaEntry*>(mapIt.data()));
+        if (s)
+          changeItem(mapIt.key(),KickerLib::menuIconSet(s->icon()),text(mapIt.key()));
+        else {
+          KServiceGroup *g = dynamic_cast<KServiceGroup *>(static_cast<KSycocaEntry*>(mapIt.data()));
+          if (g)
+            changeItem(mapIt.key(),KickerLib::menuIconSet(g->icon()),text(mapIt.key()));
+        }
+     }
+     iconsLoaded_ = true;
+ }
+}
Index: kicker/kicker/ui/service_mnu.h
===================================================================
--- kicker/kicker/ui/service_mnu.h.orig
+++ kicker/kicker/ui/service_mnu.h
@@ -124,9 +124,12 @@ protected:
     PanelServiceMenuMap searchSubMenuIDs;
     bool hasSearchResults_;
     std::set<int> searchMenuItems;
+    QIconSet emptyiconset;
+    bool iconsLoaded_;
 
 private slots:
     void slotContextMenu(int);
+    void slotAboutToShow();
 
 private:
     enum ContextMenuEntry { AddItemToPanel, EditItem, AddMenuToPanel, EditMenu,