From cae848cf70970fd131c44fa48b6992a702d1d3ea Mon Sep 17 00:00:00 2001 From: "Aaron J. Seigo" Date: Sun, 21 Dec 2003 10:01:10 +0000 Subject: [PATCH] fix for BR69099: allow for servicemenu items in toplevel menu. will document fully in the servicemenus HOWTO. reviewed by David. svn path=/trunk/kdebase/libkonq/; revision=274147 --- lib/konq/konq_popupmenu.cc | 139 +++++++++++++++++++++++++------------ lib/konq/konq_popupmenu.h | 6 +- 2 files changed, 98 insertions(+), 47 deletions(-) diff --git a/lib/konq/konq_popupmenu.cc b/lib/konq/konq_popupmenu.cc index e57b36e346..d6cd846cc9 100644 --- a/lib/konq/konq_popupmenu.cc +++ b/lib/konq/konq_popupmenu.cc @@ -158,12 +158,39 @@ void KonqPopupMenu::init (QWidget * parentWidget, KonqPopupFlags kpf, KParts::Br } +int KonqPopupMenu::insertServicesSubmenus(const QMap& submenus, + QDomElement& menu, + bool isBuiltin) +{ + int count = 0; + QMap::ConstIterator it; -void KonqPopupMenu::insertServices(const ServiceList& list, - QDomElement& menu, - bool isBuiltin) + for (it = submenus.begin(); it != submenus.end(); ++it) + { + if (it.data().isEmpty()) + { + //avoid empty sub-menus + continue; + } + + QDomElement actionSubmenu = m_doc.createElement( "menu" ); + actionSubmenu.setAttribute( "name", "actions " + it.key() ); + menu.appendChild( actionSubmenu ); + QDomElement subtext = m_doc.createElement( "text" ); + actionSubmenu.appendChild( subtext ); + subtext.appendChild( m_doc.createTextNode( it.key() ) ); + count += insertServices(it.data(), actionSubmenu, isBuiltin); + } + + return count; +} + +int KonqPopupMenu::insertServices(const ServiceList& list, + QDomElement& menu, + bool isBuiltin) { static int id = 1000; + int count = 0; ServiceList::const_iterator it = list.begin(); for( ; it != list.end(); ++it ) @@ -197,8 +224,11 @@ void KonqPopupMenu::insertServices(const ServiceList& list, addAction( act, menu ); // Add to toplevel menu m_mapPopupServices[ id++ ] = *it; + ++count; } } + + return count; } bool KonqPopupMenu::KIOSKAuthorizedAction(KConfig& cfg) @@ -488,8 +518,8 @@ void KonqPopupMenu::setup(KonqPopupFlags kpf) ////////////////////////////////////////////////////// ServiceList builtin; - ServiceList user; - QMap userSubmenus; + ServiceList user, userToplevel, userPriority; + QMap userSubmenus, userToplevelSubmenus, userPrioritySubmenus; bool isSingleLocal = (m_lstItems.count() == 1 && m_lstItems.first()->url().isLocalFile()); // 1 - Look for builtin and user-defined services @@ -610,15 +640,35 @@ void KonqPopupMenu::setup(KonqPopupFlags kpf) { // we use the categories .desktop entry to define submenus // if none is defined, we just pop it in the main menu + int priority = cfg.readNumEntry("X-KDE-Priority", 2); QString submenuName = cfg.readEntry( "X-KDE-Submenu" ); + ServiceList* list = &user; + if (submenuName.isEmpty()) { - user += KDEDesktopMimeType::userDefinedServices( *dIt + *eIt, url.isLocalFile() ); + if (priority == PriorityTopLevel) + { + list = &userToplevel; + } + else if (priority == PriorityImportant) + { + list = &userPriority; + } + } + else if (priority == PriorityTopLevel) + { + list = &(userToplevelSubmenus[submenuName]); + } + else if (priority == PriorityImportant) + { + list = &(userPrioritySubmenus[submenuName]); } else { - userSubmenus[submenuName] += KDEDesktopMimeType::userDefinedServices( *dIt + *eIt, url.isLocalFile() ); + list = &(userSubmenus[submenuName]); } + + (*list) += KDEDesktopMimeType::userDefinedServices( *dIt + *eIt, url.isLocalFile() ); } } } @@ -696,48 +746,47 @@ void KonqPopupMenu::setup(KonqPopupFlags kpf) addGroup( "preview" ); } } + // Second block, builtin + user - if ( !user.isEmpty() || !userSubmenus.empty() || !builtin.isEmpty() ) + QDomElement actionMenu = m_menuElement; + int userItemCount = 0; + if (user.count() + userSubmenus.count() + + userPriority.count() + userPrioritySubmenus.count()) { - QDomElement actionMenu; - - if (user.count() + userSubmenus.count() + builtin.count() > 1) - { - actionMenu = m_doc.createElement( "menu" ); - actionMenu.setAttribute( "name", "actions submenu" ); - m_menuElement.appendChild( actionMenu ); - QDomElement text = m_doc.createElement( "text" ); - actionMenu.appendChild( text ); - text.appendChild( m_doc.createTextNode( i18n("Ac&tions") ) ); - } - else - { - actionMenu = m_menuElement; - } - - QMap::Iterator it; - for (it = userSubmenus.begin(); it != userSubmenus.end(); ++it) - { - if (it.data().isEmpty()) - { - //avoid empty sub-menus - continue; - } - - QDomElement actionSubmenu = m_doc.createElement( "menu" ); - actionSubmenu.setAttribute( "name", "actions " + it.key() ); - actionMenu.appendChild( actionSubmenu ); - QDomElement subtext = m_doc.createElement( "text" ); - actionSubmenu.appendChild( subtext ); - subtext.appendChild( m_doc.createTextNode( it.key() ) ); - insertServices(it.data(), actionSubmenu, false); - } - - insertServices(user, actionMenu, false); - insertServices(builtin, actionMenu, true); + // we have more than one item, so let's make a submenu + actionMenu = m_doc.createElement( "menu" ); + actionMenu.setAttribute( "name", "actions submenu" ); + m_menuElement.appendChild( actionMenu ); + QDomElement text = m_doc.createElement( "text" ); + actionMenu.appendChild( text ); + text.appendChild( m_doc.createTextNode( i18n("Ac&tions") ) ); } - addSeparator(); + userItemCount += insertServicesSubmenus(userPrioritySubmenus, actionMenu, false); + userItemCount += insertServices(userPriority, actionMenu, false); + + // see if we need to put a separator between our priority items and our regular items + if (userItemCount > 0 && + (user.count() > 0 || + userSubmenus.count() > 0 || + builtin.count() > 0) && + actionMenu.lastChild().toElement().tagName().lower() != "separator") + { + QDomElement separator = m_doc.createElement( "separator" ); + actionMenu.appendChild(separator); + } + + userItemCount += insertServicesSubmenus(userSubmenus, actionMenu, false); + userItemCount += insertServices(user, actionMenu, false); + userItemCount += insertServices(builtin, m_menuElement, true); + + userItemCount += insertServicesSubmenus(userToplevelSubmenus, m_menuElement, false); + userItemCount += insertServices(userToplevel, m_menuElement, false); + + if (userItemCount > 0) + { + addSeparator(); + } if ( !isCurrentTrash && !isIntoTrash && !devicesFile) addPlugins( ); // now it's time to add plugins diff --git a/lib/konq/konq_popupmenu.h b/lib/konq/konq_popupmenu.h index 4524790c44..caf940d967 100644 --- a/lib/konq/konq_popupmenu.h +++ b/lib/konq/konq_popupmenu.h @@ -62,7 +62,8 @@ public: ShowProperties = 1, // whether to show the "Properties" menu item IsLink = 2, // HTML link. If set, we won't have cut/copy/paste, and we'll say "bookmark this link" ShowNewWindow = 4 }; - // WARNING: bitfield. Next item is 8 + // WARNING: bitfield. Next item is 8 + enum { PriorityTopLevel = 0, PriorityImportant, PriorityNormal }; /** * @deprecated, lacks parentWidget pointer, and @@ -173,7 +174,8 @@ private: void init (QWidget * parentWidget, KonqPopupFlags kpf, KParts::BrowserExtension::PopupFlags itemFlags); void setup(KonqPopupFlags kpf); void addPlugins( ); - void insertServices(const ServiceList& list, QDomElement& menu, bool isBuiltin); + int insertServicesSubmenus(const QMap& list, QDomElement& menu, bool isBuiltin); + int insertServices(const ServiceList& list, QDomElement& menu, bool isBuiltin); bool KIOSKAuthorizedAction(KConfig& cfg); class KonqPopupMenuPrivate;