EditorToolBar: Show editor context menu when clicking on file icon

Change-Id: I0a66d7a2a77ed0b2c7c87005887a7847bb9ee5f5
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Eike Ziller
2014-09-10 17:03:13 +02:00
parent e0c5d2365f
commit 0e0471d698
4 changed files with 51 additions and 31 deletions

View File

@@ -83,8 +83,7 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) :
connect(m_toolBar, SIGNAL(verticalSplitClicked()), this, SLOT(splitVertically())); connect(m_toolBar, SIGNAL(verticalSplitClicked()), this, SLOT(splitVertically()));
connect(m_toolBar, SIGNAL(splitNewWindowClicked()), this, SLOT(splitNewWindow())); connect(m_toolBar, SIGNAL(splitNewWindowClicked()), this, SLOT(splitNewWindow()));
connect(m_toolBar, SIGNAL(closeSplitClicked()), this, SLOT(closeSplit())); connect(m_toolBar, SIGNAL(closeSplitClicked()), this, SLOT(closeSplit()));
connect(m_toolBar, &EditorToolBar::listContextMenuRequested, m_toolBar->setMenuProvider([this](QMenu *menu) { fillListContextMenu(menu); });
this, &EditorView::showListContextMenu);
tl->addWidget(m_toolBar); tl->addWidget(m_toolBar);
} }
@@ -316,16 +315,14 @@ void EditorView::listSelectionActivated(int index)
EditorManagerPrivate::activateEditorForEntry(this, DocumentModel::entryAtRow(index)); EditorManagerPrivate::activateEditorForEntry(this, DocumentModel::entryAtRow(index));
} }
void EditorView::showListContextMenu(QPoint pos) void EditorView::fillListContextMenu(QMenu *menu)
{ {
IEditor *editor = currentEditor(); IEditor *editor = currentEditor();
DocumentModel::Entry entry; DocumentModel::Entry *entry = editor ? DocumentModel::entryForDocument(editor->document())
entry.document = editor ? editor->document() : 0; : 0;
QMenu menu; EditorManager::addSaveAndCloseEditorActions(menu, entry, editor);
EditorManager::addSaveAndCloseEditorActions(&menu, &entry, editor); menu->addSeparator();
menu.addSeparator(); EditorManager::addNativeDirAndOpenWithActions(menu, entry);
EditorManager::addNativeDirAndOpenWithActions(&menu, &entry);
menu.exec(pos);
} }
void EditorView::splitHorizontally() void EditorView::splitHorizontally()

View File

@@ -46,6 +46,7 @@ class QAction;
class QComboBox; class QComboBox;
class QFrame; class QFrame;
class QLabel; class QLabel;
class QMenu;
class QSplitter; class QSplitter;
class QStackedLayout; class QStackedLayout;
class QStackedWidget; class QStackedWidget;
@@ -114,7 +115,6 @@ protected:
private slots: private slots:
void closeCurrentEditor(); void closeCurrentEditor();
void listSelectionActivated(int index); void listSelectionActivated(int index);
void showListContextMenu(QPoint pos);
void splitHorizontally(); void splitHorizontally();
void splitVertically(); void splitVertically();
void splitNewWindow(); void splitNewWindow();
@@ -125,6 +125,7 @@ private:
friend class SplitterOrView; // for setParentSplitterOrView friend class SplitterOrView; // for setParentSplitterOrView
void setParentSplitterOrView(SplitterOrView *splitterOrView); void setParentSplitterOrView(SplitterOrView *splitterOrView);
void fillListContextMenu(QMenu *menu);
void updateNavigatorActions(); void updateNavigatorActions();
void updateToolBar(IEditor *editor); void updateToolBar(IEditor *editor);
void checkProjectLoaded(IEditor *editor); void checkProjectLoaded(IEditor *editor);

View File

@@ -70,6 +70,8 @@ struct EditorToolBarPrivate
QToolButton *m_closeEditorButton; QToolButton *m_closeEditorButton;
QToolButton *m_lockButton; QToolButton *m_lockButton;
QToolButton *m_dragHandle; QToolButton *m_dragHandle;
QMenu *m_dragHandleMenu;
EditorToolBar::MenuProvider m_menuProvider;
QAction *m_goBackAction; QAction *m_goBackAction;
QAction *m_goForwardAction; QAction *m_goForwardAction;
QToolButton *m_backButton; QToolButton *m_backButton;
@@ -127,10 +129,11 @@ EditorToolBar::EditorToolBar(QWidget *parent) :
d->m_lockButton->setAutoRaise(true); d->m_lockButton->setAutoRaise(true);
d->m_lockButton->setEnabled(false); d->m_lockButton->setEnabled(false);
d->m_dragHandle->setCheckable(false); d->m_dragHandle->setProperty("noArrow", true);
d->m_dragHandle->setChecked(false);
d->m_dragHandle->setToolTip(tr("Drag to drag documents between splits")); d->m_dragHandle->setToolTip(tr("Drag to drag documents between splits"));
d->m_dragHandle->installEventFilter(this); d->m_dragHandle->installEventFilter(this);
d->m_dragHandleMenu = new QMenu(d->m_dragHandle);
d->m_dragHandle->setMenu(d->m_dragHandleMenu);
connect(d->m_goBackAction, SIGNAL(triggered()), this, SIGNAL(goBackClicked())); connect(d->m_goBackAction, SIGNAL(triggered()), this, SIGNAL(goBackClicked()));
connect(d->m_goForwardAction, SIGNAL(triggered()), this, SIGNAL(goForwardClicked())); connect(d->m_goForwardAction, SIGNAL(triggered()), this, SIGNAL(goForwardClicked()));
@@ -194,7 +197,15 @@ EditorToolBar::EditorToolBar(QWidget *parent) :
// a private slot connection // a private slot connection
connect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int))); connect(d->m_editorList, SIGNAL(activated(int)), this, SIGNAL(listSelectionActivated(int)));
connect(d->m_editorList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(listContextMenu(QPoint))); connect(d->m_editorList, &QComboBox::customContextMenuRequested, [this](QPoint p) {
QMenu menu;
fillListContextMenu(&menu);
menu.exec(d->m_editorList->mapToGlobal(p));
});
connect(d->m_dragHandleMenu, &QMenu::aboutToShow, [this]() {
d->m_dragHandleMenu->clear();
fillListContextMenu(d->m_dragHandleMenu);
});
connect(d->m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable())); connect(d->m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable()));
connect(d->m_closeEditorButton, SIGNAL(clicked()), this, SLOT(closeEditor()), Qt::QueuedConnection); connect(d->m_closeEditorButton, SIGNAL(clicked()), this, SLOT(closeEditor()), Qt::QueuedConnection);
connect(d->m_horizontalSplitAction, SIGNAL(triggered()), connect(d->m_horizontalSplitAction, SIGNAL(triggered()),
@@ -302,6 +313,11 @@ void EditorToolBar::setToolbarCreationFlags(ToolbarCreationFlags flags)
} }
} }
void EditorToolBar::setMenuProvider(const EditorToolBar::MenuProvider &provider)
{
d->m_menuProvider = provider;
}
void EditorToolBar::setCurrentEditor(IEditor *editor) void EditorToolBar::setCurrentEditor(IEditor *editor)
{ {
IDocument *document = editor ? editor->document() : 0; IDocument *document = editor ? editor->document() : 0;
@@ -326,19 +342,17 @@ void EditorToolBar::changeActiveEditor(int row)
EditorManager::activateEditorForEntry(DocumentModel::entryAtRow(row)); EditorManager::activateEditorForEntry(DocumentModel::entryAtRow(row));
} }
void EditorToolBar::listContextMenu(QPoint pos) void EditorToolBar::fillListContextMenu(QMenu *menu)
{ {
if (d->m_isStandalone) { if (d->m_menuProvider) {
IEditor *editor = EditorManager::currentEditor(); d->m_menuProvider(menu);
DocumentModel::Entry entry;
entry.document = editor ? editor->document() : 0;
QMenu menu;
EditorManager::addSaveAndCloseEditorActions(&menu, &entry, editor);
menu.addSeparator();
EditorManager::addNativeDirAndOpenWithActions(&menu, &entry);
menu.exec(d->m_editorList->mapToGlobal(pos));
} else { } else {
emit listContextMenuRequested(d->m_editorList->mapToGlobal(pos)); IEditor *editor = EditorManager::currentEditor();
DocumentModel::Entry *entry = editor ? DocumentModel::entryForDocument(editor->document())
: 0;
EditorManager::addSaveAndCloseEditorActions(menu, entry, editor);
menu->addSeparator();
EditorManager::addNativeDirAndOpenWithActions(menu, entry);
} }
} }
@@ -422,11 +436,12 @@ bool EditorToolBar::eventFilter(QObject *obj, QEvent *event)
if (obj == d->m_dragHandle) { if (obj == d->m_dragHandle) {
if (event->type() == QEvent::MouseButtonPress) { if (event->type() == QEvent::MouseButtonPress) {
auto me = static_cast<QMouseEvent *>(event); auto me = static_cast<QMouseEvent *>(event);
if (me->buttons() == Qt::LeftButton) { if (me->buttons() == Qt::LeftButton)
d->m_dragStartPosition = me->pos(); d->m_dragStartPosition = me->pos();
return true; return true; // do not pop up menu already on press
} } else if (event->type() == QEvent::MouseButtonRelease) {
return Utils::StyledBar::eventFilter(obj, event); d->m_dragHandle->showMenu();
return true;
} else if (event->type() == QEvent::MouseMove) { } else if (event->type() == QEvent::MouseMove) {
auto me = static_cast<QMouseEvent *>(event); auto me = static_cast<QMouseEvent *>(event);
if (me->buttons() != Qt::LeftButton) if (me->buttons() != Qt::LeftButton)

View File

@@ -36,6 +36,12 @@
#include <QIcon> #include <QIcon>
#include <functional>
QT_BEGIN_NAMESPACE
class QMenu;
QT_END_NAMESPACE
namespace Core { namespace Core {
class IEditor; class IEditor;
class IDocument; class IDocument;
@@ -54,6 +60,7 @@ public:
explicit EditorToolBar(QWidget *parent = 0); explicit EditorToolBar(QWidget *parent = 0);
virtual ~EditorToolBar(); virtual ~EditorToolBar();
typedef std::function<void(QMenu*)> MenuProvider;
enum ToolbarCreationFlags { FlagsNone = 0, FlagsStandalone = 1 }; enum ToolbarCreationFlags { FlagsNone = 0, FlagsStandalone = 1 };
/** /**
@@ -68,6 +75,7 @@ public:
void setCurrentEditor(IEditor *editor); void setCurrentEditor(IEditor *editor);
void setToolbarCreationFlags(ToolbarCreationFlags flags); void setToolbarCreationFlags(ToolbarCreationFlags flags);
void setMenuProvider(const MenuProvider &provider);
/** /**
* Adds a toolbar to the widget and sets invisible by default. * Adds a toolbar to the widget and sets invisible by default.
@@ -93,7 +101,6 @@ signals:
void splitNewWindowClicked(); void splitNewWindowClicked();
void closeSplitClicked(); void closeSplitClicked();
void listSelectionActivated(int row); void listSelectionActivated(int row);
void listContextMenuRequested(QPoint globalpos);
void currentDocumentMoved(); void currentDocumentMoved();
protected: protected:
@@ -102,7 +109,6 @@ protected:
private slots: private slots:
void updateEditorListSelection(Core::IEditor *newSelection); void updateEditorListSelection(Core::IEditor *newSelection);
void changeActiveEditor(int row); void changeActiveEditor(int row);
void listContextMenu(QPoint pos);
void makeEditorWritable(); void makeEditorWritable();
void checkDocumentStatus(); void checkDocumentStatus();
@@ -110,6 +116,7 @@ private slots:
void updateActionShortcuts(); void updateActionShortcuts();
private: private:
void fillListContextMenu(QMenu *menu);
void updateToolBar(QWidget *toolBar); void updateToolBar(QWidget *toolBar);
EditorToolBarPrivate *d; EditorToolBarPrivate *d;