From: Peter Penz Date: Sun, 21 Jan 2007 21:20:37 +0000 (+0000) Subject: Cleanup of DolphinContextMenu: X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/70999c96a27777c2b1d0774b410680abd47eb131 Cleanup of DolphinContextMenu: - don't use any deprecated methods anymore - temporary deactivated the "Open With..." submenu. There's a crash in KDirModel when invoking KFileItem::mimetype(); although the same code worked with an older version of kdelibs, I assume this is a Dolphin issue -> I'll do some further analyses... svn path=/trunk/playground/utils/dolphin/; revision=626023 --- diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 6c4dda80a..ddc8c9155 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -20,31 +20,29 @@ #include "dolphincontextmenu.h" +#include "dolphinmainwindow.h" +#include "dolphinsettings.h" +#include "dolphinview.h" +#include "editbookmarkdialog.h" + +#include + #include #include #include -#include -#include -#include -#include -//Added by qt3to4: -#include +#include #include -#include #include -#include -#include -#include -#include #include #include +#include +#include +#include +#include #include +#include -#include "dolphinmainwindow.h" -#include "dolphinview.h" -#include "editbookmarkdialog.h" -#include "dolphinsettings.h" - +#include DolphinContextMenu::DolphinContextMenu(DolphinView* parent, KFileItem* fileInfo, @@ -78,52 +76,31 @@ void DolphinContextMenu::openViewportContextMenu() assert(m_fileInfo == 0); + DolphinMainWindow* dolphin = m_dolphinView->mainWindow(); KMenu* popup = new KMenu(m_dolphinView); - DolphinMainWindow *dolphin = m_dolphinView->mainWindow(); // setup 'Create New' menu - KMenu* createNewMenu = new KMenu(); + KMenu* createNewMenu = new KMenu(i18n("Create New")); + createNewMenu->setIcon(SmallIcon("filenew")); QAction* createFolderAction = dolphin->actionCollection()->action("create_folder"); if (createFolderAction != 0) { createNewMenu->addAction(createFolderAction); } - createNewMenu->insertSeparator(); - QLinkedListIterator fileGrouptIt(dolphin->fileGroupActions()); while (fileGrouptIt.hasNext()) { createNewMenu->addAction(fileGrouptIt.next()); } - // TODO: not used yet. See documentation of Dolphin::linkGroupActions() - // and Dolphin::linkToDeviceActions() in the header file for details. - // - //createNewMenu->insertSeparator(); - // - //QPtrListIterator linkGroupIt(dolphin->linkGroupActions()); - //while ((action = linkGroupIt.current()) != 0) { - // action->plug(createNewMenu); - // ++linkGroupIt; - //} - // - //KMenu* linkToDeviceMenu = new KMenu(); - //QPtrListIterator linkToDeviceIt(dolphin->linkToDeviceActions()); - //while ((action = linkToDeviceIt.current()) != 0) { - // action->plug(linkToDeviceMenu); - // ++linkToDeviceIt; - //} - // - //createNewMenu->insertItem(i18n("Link to Device"), linkToDeviceMenu); - - popup->insertItem(SmallIcon("filenew"), i18n("Create New"), createNewMenu); - popup->insertSeparator(); + popup->addMenu(createNewMenu); QAction* pasteAction = dolphin->actionCollection()->action(KStandardAction::stdName(KStandardAction::Paste)); popup->addAction(pasteAction); + popup->insertSeparator(pasteAction); // setup 'View Mode' menu - KMenu* viewModeMenu = new KMenu(); + KMenu* viewModeMenu = new KMenu(i18n("View Mode")); QAction* iconsMode = dolphin->actionCollection()->action("icons"); viewModeMenu->addAction(iconsMode); @@ -134,15 +111,15 @@ void DolphinContextMenu::openViewportContextMenu() QAction* previewsMode = dolphin->actionCollection()->action("previews"); viewModeMenu->addAction(previewsMode); - popup->insertItem(i18n("View Mode"), viewModeMenu); - popup->insertSeparator(); + popup->addMenu(viewModeMenu); - QAction *bookmarkAction = popup->addAction(i18n("Bookmark this folder")); - popup->insertSeparator(); + QAction* bookmarkAction = popup->addAction(i18n("Bookmark this folder")); + popup->insertSeparator(bookmarkAction); - QAction *propertiesAction = popup->addAction(i18n("Properties...")); + QAction* propertiesAction = popup->addAction(i18n("Properties...")); + popup->insertSeparator(propertiesAction); - QAction *activatedAction = popup->exec(m_pos); + QAction* activatedAction = popup->exec(m_pos); if (activatedAction == propertiesAction) { new KPropertiesDialog(dolphin->activeView()->url()); } @@ -167,7 +144,7 @@ void DolphinContextMenu::openItemContextMenu() { // Parts of the following code have been taken // from the class KonqOperations located in - // libqonq/konq_operations.h of Konqueror. + // libkonq/konq_operations.h of Konqueror. // (Copyright (C) 2000 David Faure ) assert(m_fileInfo != 0); @@ -177,7 +154,12 @@ void DolphinContextMenu::openItemContextMenu() const KUrl::List urls = m_dolphinView->selectedUrls(); // insert 'Cut', 'Copy' and 'Paste' - const KStandardAction::StandardAction actionNames[] = { KStandardAction::Cut, KStandardAction::Copy, KStandardAction::Paste }; + const KStandardAction::StandardAction actionNames[] = { + KStandardAction::Cut, + KStandardAction::Copy, + KStandardAction::Paste + }; + const int count = sizeof(actionNames) / sizeof(KStandardAction::StandardAction); for (int i = 0; i < count; ++i) { QAction* action = dolphin->actionCollection()->action(KStandardAction::stdName(actionNames[i])); @@ -185,11 +167,11 @@ void DolphinContextMenu::openItemContextMenu() popup->addAction(action); } } - popup->insertSeparator(); // insert 'Rename' QAction* renameAction = dolphin->actionCollection()->action("rename"); popup->addAction(renameAction); + popup->insertSeparator(renameAction); // insert 'Move to Trash' for local Urls, otherwise insert 'Delete' const KUrl& url = dolphin->activeView()->url(); @@ -210,24 +192,22 @@ void DolphinContextMenu::openItemContextMenu() bookmarkAction = popup->addAction(i18n("Bookmark this folder")); } - popup->insertSeparator(); - // Insert 'Open With...' sub menu - Q3ValueVector openWithVector; + QVector openWithVector; const QList openWithActions = insertOpenWithItems(popup, openWithVector); // Insert 'Actions' sub menu - Q3ValueVector actionsVector; + QVector actionsVector; const QList serviceActions = insertActionItems(popup, actionsVector); // insert 'Properties...' entry - popup->insertSeparator(); QAction* propertiesAction = dolphin->actionCollection()->action("properties"); popup->addAction(propertiesAction); + popup->insertSeparator(propertiesAction); - QAction *activatedAction = popup->exec(m_pos); + QAction* activatedAction = popup->exec(m_pos); - if (bookmarkAction!=0 && activatedAction == bookmarkAction) { + if ((bookmarkAction!= 0) && (activatedAction == bookmarkAction)) { const KUrl selectedUrl(m_fileInfo->url()); KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add folder as bookmark"), selectedUrl.fileName(), @@ -247,7 +227,7 @@ void DolphinContextMenu::openItemContextMenu() } else if (openWithActions.contains(activatedAction)) { // one of the 'Open With' items has been selected - if (openWithActions.last()==activatedAction) { + if (openWithActions.last() == activatedAction) { // the item 'Other...' has been selected KRun::displayOpenWithDialog(urls, m_dolphinView); } @@ -264,7 +244,7 @@ void DolphinContextMenu::openItemContextMenu() } QList DolphinContextMenu::insertOpenWithItems(KMenu* popup, - Q3ValueVector& openWithVector) + QVector& openWithVector) { // Prepare 'Open With' sub menu. Usually a sub menu is created, where all applications // are listed which are registered to open the item. As last entry "Other..." will be @@ -273,7 +253,12 @@ QList DolphinContextMenu::insertOpenWithItems(KMenu* popup, const KFileItemList list = m_dolphinView->selectedItems(); bool insertOpenWithItems = true; - const QString contextMimeType(m_fileInfo->mimetype()); + + // TODO: a crash occurs in KFileItem although m_fileInfo seems to be valid. Temporary + // commented out the following command, otherwise it won't be possible to open a context menu: + //const QString contextMimeType(m_fileInfo->mimetype()); + const QString contextMimeType; + QListIterator mimeIt(list); while (insertOpenWithItems && mimeIt.hasNext()) { KFileItem* item = mimeIt.next(); @@ -290,7 +275,7 @@ QList DolphinContextMenu::insertOpenWithItems(KMenu* popup, "Type == 'Application'"); if (offers.count() > 0) { KService::List::Iterator it; - KMenu* openWithMenu = new KMenu(); + KMenu* openWithMenu = new KMenu(i18n("Open With")); for(it = offers.begin(); it != offers.end(); ++it) { // The offer list from the KTrader returns duplicate // application entries. Although this seems to be a configuration @@ -305,23 +290,25 @@ QList DolphinContextMenu::insertOpenWithItems(KMenu* popup, } } - openWithMenu->insertSeparator(); - QAction *action = openWithMenu->addAction(i18n("&Other...")); + QAction* action = openWithMenu->addAction(i18n("&Other...")); + openWithMenu->insertSeparator(action); + openWithActions << action; - popup->insertItem(i18n("Open With"), openWithMenu); + popup->addMenu(openWithMenu); } else { // No applications are registered, hence just offer // a "Open With..." item instead of a sub menu containing // only one entry. - QAction *action = popup->addAction(i18n("Open With...")); + QAction* action = popup->addAction(i18n("Open With...")); openWithActions << action; } } else { // At least one of the selected items has a different MIME type. In this case // just show a disabled "Open With..." entry. - QAction *action = popup->addAction(i18n("Open With...")); + QAction* action = popup->addAction(i18n("Open With...")); + popup->insertSeparator(action); action->setEnabled(false); } @@ -329,9 +316,9 @@ QList DolphinContextMenu::insertOpenWithItems(KMenu* popup, } QList DolphinContextMenu::insertActionItems(KMenu* popup, - Q3ValueVector& actionsVector) + QVector& actionsVector) { - KMenu* actionsMenu = new KMenu(); + KMenu* actionsMenu = new KMenu(i18n("Actions")); QList serviceActions; @@ -340,13 +327,18 @@ QList DolphinContextMenu::insertActionItems(KMenu* popup, KMenu* menu = 0; for (QStringList::ConstIterator dirIt = dirs.begin(); dirIt != dirs.end(); ++dirIt) { QDir dir(*dirIt); - QStringList entries = dir.entryList("*.desktop", QDir::Files); + QStringList filters; + filters << "*.desktop"; + dir.setNameFilters(filters); + QStringList entries = dir.entryList(QDir::Files); for (QStringList::ConstIterator entryIt = entries.begin(); entryIt != entries.end(); ++entryIt) { KSimpleConfig cfg(*dirIt + *entryIt, true); cfg.setDesktopGroup(); if ((cfg.hasKey("Actions") || cfg.hasKey("X-KDE-GetActionMenu")) && cfg.hasKey("ServiceTypes")) { - const QStringList types = cfg.readListEntry("ServiceTypes"); + //const QStringList types = cfg.readListEntry("ServiceTypes"); + QStringList types; + types = cfg.readEntry("ServiceTypes", types); for (QStringList::ConstIterator it = types.begin(); it != types.end(); ++it) { // check whether the mime type is equal or whether the // mimegroup (e. g. image/*) is supported @@ -389,8 +381,8 @@ QList DolphinContextMenu::insertActionItems(KMenu* popup, const QString submenuName = cfg.readEntry( "X-KDE-Submenu" ); if (!submenuName.isEmpty()) { - menu = new KMenu(); - actionsMenu->insertItem(submenuName, menu, submenuID); + menu = new KMenu(submenuName); + actionsMenu->addMenu(menu); } Q3ValueList userServices = @@ -400,7 +392,7 @@ QList DolphinContextMenu::insertActionItems(KMenu* popup, for (serviceIt = userServices.begin(); serviceIt != userServices.end(); ++serviceIt) { KDEDesktopMimeType::Service service = (*serviceIt); if (!service.m_strIcon.isEmpty()) { - QAction *action = menu->addAction(SmallIcon(service.m_strIcon), + QAction* action = menu->addAction(SmallIcon(service.m_strIcon), service.m_strName); serviceActions << action; } @@ -416,7 +408,7 @@ QList DolphinContextMenu::insertActionItems(KMenu* popup, } } - const int itemsCount = actionsMenu->count(); + const int itemsCount = actionsMenu->actions().count(); if (itemsCount == 0) { // no actions are available at all, hence show the "Actions" // submenu disabled @@ -428,29 +420,31 @@ QList DolphinContextMenu::insertActionItems(KMenu* popup, // only one item, show the item directly in the root menu. if (menu == actionsMenu) { // The item is an action, hence show the action in the root menu. - const int id = actionsMenu->idAt(0); - const QString text(actionsMenu->text(id)); - QIcon iconSet = actionsMenu->iconSet(id); - if (iconSet.isNull()) { - QAction *action = popup->addAction(text); + const QList actions = actionsMenu->actions(); + assert(actions.count() == 1); + + const QString text = actions[0]->text(); + const QIcon icon = actions[0]->icon(); + if (icon.isNull()) { + QAction* action = popup->addAction(text); serviceActions.clear(); serviceActions << action; } else { - QAction *action = popup->addAction(iconSet, text); + QAction* action = popup->addAction(icon, text); serviceActions.clear(); serviceActions << action; } } else { // The item is a sub menu, hence show the sub menu in the root menu. - popup->insertItem(actionsMenu->text(submenuID), menu); + popup->addMenu(menu); } actionsMenu->deleteLater(); actionsMenu = 0; } else { - popup->insertItem(i18n("Actions"), actionsMenu); + popup->addMenu(actionsMenu); } return serviceActions; @@ -461,10 +455,11 @@ bool DolphinContextMenu::containsEntry(const KMenu* menu, { assert(menu != 0); - const uint count = menu->count(); + const QList list = menu->actions(); + const uint count = list.count(); for (uint i = 0; i < count; ++i) { - const int id = menu->idAt(i); - if (menu->text(id) == entryName) { + const QAction* action = list.at(i); + if (action->text() == entryName) { return true; } } diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h index 9f31b6271..69554b01f 100644 --- a/src/dolphincontextmenu.h +++ b/src/dolphincontextmenu.h @@ -21,10 +21,9 @@ #ifndef DOLPHINCONTEXTMENU_H #define DOLPHINCONTEXTMENU_H -#include -#include -#include -#include +#include +#include + #include #include #include @@ -84,7 +83,7 @@ private: * to the predecessor. */ QList insertOpenWithItems(KMenu* popup, - Q3ValueVector& openWithVector); + QVector& openWithVector); /** * Inserts the 'Actions...' submenu to \a popup. @@ -94,7 +93,7 @@ private: * services. */ QList insertActionItems(KMenu* popup, - Q3ValueVector& actionsVector); + QVector& actionsVector); /** * Returns true, if 'menu' contains already @@ -103,13 +102,6 @@ private: bool containsEntry(const KMenu* menu, const QString& entryName) const; - enum { - submenuID = 90, - bookmarkID = 91, - openWithIDStart = 100, - actionsIDStart = 1000 - }; - DolphinView* m_dolphinView; KFileItem* m_fileInfo; QPoint m_pos; diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp index 11fbf69a0..6d5509275 100644 --- a/src/dolphiniconsview.cpp +++ b/src/dolphiniconsview.cpp @@ -61,9 +61,7 @@ void DolphinIconsView::contextMenuEvent(QContextMenuEvent* event) const QModelIndex index = indexAt(event->pos()); if (index.isValid()) { - const QAbstractProxyModel* proxyModel = static_cast(model()); - const KDirModel* dirModel = static_cast(proxyModel->sourceModel()); - item = dirModel->itemForIndex(index); + item = m_parentView->fileItem(index); } m_parentView->openContextMenu(item, event->globalPos()); diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 470abe5b7..63bbf22b8 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -499,9 +499,9 @@ KUrl::List DolphinView::selectedUrls() const return urls; } -const KFileItem* DolphinView::currentFileItem() const +KFileItem* DolphinView::fileItem(const QModelIndex index) const { - return 0; // fileView()->currentFileItem(); + return m_dirModel->itemForIndex(index); } void DolphinView::openContextMenu(KFileItem* fileInfo, const QPoint& pos) diff --git a/src/dolphinview.h b/src/dolphinview.h index 396892c21..ba7242a8e 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -240,12 +240,9 @@ public: KUrl::List selectedUrls() const; /** - * Returns the current item, where the cursor is. 0 is returned, if there is no - * current item (e. g. if the view is empty). Note that the current item must - * not be a selected item. - * @see DolphinView::selectedItems() + * Returns the file item for the given model index \a index. */ - const KFileItem* currentFileItem() const; + KFileItem* fileItem(const QModelIndex index) const; /** * Opens the context menu for the item indicated by \a fileInfo diff --git a/src/urlnavigator.cpp b/src/urlnavigator.cpp index b9621d5b6..d7c586961 100644 --- a/src/urlnavigator.cpp +++ b/src/urlnavigator.cpp @@ -16,7 +16,7 @@ * 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 * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "urlnavigator.h" @@ -447,7 +447,7 @@ void UrlNavigator::slotClicked() void UrlNavigator::updateHistoryElem() { assert(m_historyIndex >= 0); - const KFileItem* item = m_dolphinView->currentFileItem(); + const KFileItem* item = 0; // TODO: m_dolphinView->currentFileItem(); if (item != 0) { m_history[m_historyIndex].setCurrentFileName(item->name()); }