Make context menu on a bookmark menu action work again

Solves a todo from porting to kf5

Reviewed by Albert Astals
remotes/origin/Applications/16.12
Aleix Pol 10 years ago
parent 7304d320e3
commit c75a2e52d9
  1. 50
      part.cpp
  2. 3
      part.h

@ -44,6 +44,7 @@
#include <QSpinBox> #include <QSpinBox>
#include <QStandardPaths> #include <QStandardPaths>
#include <QWidgetAction> #include <QWidgetAction>
#include <QContextMenuEvent>
#include <KAboutApplicationDialog> #include <KAboutApplicationDialog>
#include <KActionCollection> #include <KActionCollection>
@ -2156,15 +2157,8 @@ void Part::slotRenameCurrentViewportBookmark()
slotRenameBookmark( m_document->viewport() ); slotRenameBookmark( m_document->viewport() );
} }
void Part::slotAboutToShowContextMenu(QMenu * /*menu*/, QAction *action, QMenu *contextMenu) bool Part::aboutToShowContextMenu(QMenu * /*menu*/, QAction *action, QMenu *contextMenu)
{ {
const QList<QAction*> actions = contextMenu->findChildren<QAction*>(QStringLiteral("OkularPrivateRenameBookmarkActions"));
foreach(QAction *a, actions)
{
contextMenu->removeAction(a);
delete a;
}
KBookmarkAction *ba = dynamic_cast<KBookmarkAction*>(action); KBookmarkAction *ba = dynamic_cast<KBookmarkAction*>(action);
if (ba != NULL) if (ba != NULL)
{ {
@ -2174,6 +2168,7 @@ void Part::slotAboutToShowContextMenu(QMenu * /*menu*/, QAction *action, QMenu *
renameAction->setData(ba->property("htmlRef").toString()); renameAction->setData(ba->property("htmlRef").toString());
renameAction->setObjectName(QStringLiteral("OkularPrivateRenameBookmarkActions")); renameAction->setObjectName(QStringLiteral("OkularPrivateRenameBookmarkActions"));
} }
return ba;
} }
void Part::slotPreviousBookmark() void Part::slotPreviousBookmark()
@ -3009,12 +3004,10 @@ void Part::rebuildBookmarkMenu( bool unplugActions )
bool containerFound = false; bool containerFound = false;
for (int i = 0; !containerFound && i < clients.size(); ++i) for (int i = 0; !containerFound && i < clients.size(); ++i)
{ {
QWidget *container = factory()->container(QStringLiteral("bookmarks"), clients[i]); QMenu *container = dynamic_cast<QMenu*>(factory()->container(QStringLiteral("bookmarks"), clients[i]));
if (container && container->actions().contains(m_bookmarkActions.first())) if (container && container->actions().contains(m_bookmarkActions.first()))
{ {
Q_ASSERT(dynamic_cast<QMenu*>(container)); container->installEventFilter(this);
disconnect(container, 0, this, 0);
connect(container, SIGNAL(aboutToShowContextMenu(QMenu*,QAction*,QMenu*)), this, SLOT(slotAboutToShowContextMenu(QMenu*,QAction*,QMenu*))); // kf5 FIXME
containerFound = true; containerFound = true;
} }
} }
@ -3024,6 +3017,39 @@ void Part::rebuildBookmarkMenu( bool unplugActions )
m_nextBookmark->setEnabled( havebookmarks ); m_nextBookmark->setEnabled( havebookmarks );
} }
bool Part::eventFilter(QObject * watched, QEvent * event)
{
switch (event->type()) {
case QEvent::ContextMenu: {
QContextMenuEvent *e = static_cast<QContextMenuEvent *>(event);
QMenu *menu = static_cast<QMenu *>(watched);
QScopedPointer<QMenu> ctxMenu(new QMenu);
QPoint pos;
bool ret = false;
if (e->reason() == QContextMenuEvent::Mouse) {
pos = e->pos();
ret = aboutToShowContextMenu(menu, menu->actionAt(e->pos()), ctxMenu.data());
} else if (menu->activeAction()) {
pos = menu->actionGeometry(menu->activeAction()).center();
ret = aboutToShowContextMenu(menu, menu->activeAction(), ctxMenu.data());
}
ctxMenu->exec(menu->mapToGlobal(pos));
if (ret) {
event->accept();
}
return ret;
}
default:
break;
}
return false;
}
void Part::updateAboutBackendAction() void Part::updateAboutBackendAction()
{ {
const KPluginMetaData data = m_document->generatorInfo(); const KPluginMetaData data = m_document->generatorInfo();

@ -190,7 +190,6 @@ class OKULARPART_EXPORT Part : public KParts::ReadWritePart, public Okular::Docu
void slotAddBookmark(); void slotAddBookmark();
void slotRenameBookmarkFromMenu(); void slotRenameBookmarkFromMenu();
void slotRenameCurrentViewportBookmark(); void slotRenameCurrentViewportBookmark();
void slotAboutToShowContextMenu(QMenu *menu, QAction *action, QMenu *contextMenu);
void slotPreviousBookmark(); void slotPreviousBookmark();
void slotNextBookmark(); void slotNextBookmark();
void slotFindNext(); void slotFindNext();
@ -240,6 +239,8 @@ class OKULARPART_EXPORT Part : public KParts::ReadWritePart, public Okular::Docu
void moveSplitter( const int sideWidgetSize ); void moveSplitter( const int sideWidgetSize );
private: private:
bool aboutToShowContextMenu(QMenu *menu, QAction *action, QMenu *contextMenu);
bool eventFilter(QObject * watched, QEvent * event) override;
Document::OpenResult doOpenFile(const QMimeType &mime, const QString &fileNameToOpen, bool *isCompressedFile); Document::OpenResult doOpenFile(const QMimeType &mime, const QString &fileNameToOpen, bool *isCompressedFile);
void setupViewerActions(); void setupViewerActions();

Loading…
Cancel
Save