Utils::PathChooser: Allow the core plugin to extend the context menu

And then use this to add the "Open in Graphical Shell" and "Open in
Terminal" actions.

Those actions cannot be implemented in Utils directly since the Core::FileUtils
depends on the Options dialog.

This affects all PathChoosers, and there's currently no way for a PathChooser
to opt out or have a different context menu. That can be added at a later
point.

Change-Id: I22121c19d66f08785381c7e0bca5317628eb6342
Task-number: QTCREATORBUG-14736
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
Daniel Teske
2015-08-03 12:44:48 +02:00
parent 06483d3720
commit cac53ea41f
4 changed files with 65 additions and 1 deletions

View File

@@ -39,6 +39,7 @@
#include <QDebug> #include <QDebug>
#include <QFileDialog> #include <QFileDialog>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QMenu>
#include <QPushButton> #include <QPushButton>
#include <QStandardPaths> #include <QStandardPaths>
@@ -66,6 +67,8 @@ static QString appBundleExpandedPath(const QString &path)
return path; return path;
} }
Utils::PathChooser::AboutToShowContextMenuHandler Utils::PathChooser::s_aboutToShowContextMenuHandler;
namespace Utils { namespace Utils {
// ------------------ BinaryVersionToolTipEventFilter // ------------------ BinaryVersionToolTipEventFilter
@@ -221,6 +224,9 @@ PathChooser::PathChooser(QWidget *parent) :
{ {
d->m_hLayout->setContentsMargins(0, 0, 0, 0); d->m_hLayout->setContentsMargins(0, 0, 0, 0);
d->m_lineEdit->setContextMenuPolicy(Qt::CustomContextMenu);
connect(d->m_lineEdit, &FancyLineEdit::customContextMenuRequested, this, &PathChooser::contextMenuRequested);
connect(d->m_lineEdit, &FancyLineEdit::validReturnPressed, this, &PathChooser::returnPressed); connect(d->m_lineEdit, &FancyLineEdit::validReturnPressed, this, &PathChooser::returnPressed);
connect(d->m_lineEdit, &QLineEdit::textChanged, this, [this] { emit changed(rawPath()); }); connect(d->m_lineEdit, &QLineEdit::textChanged, this, [this] { emit changed(rawPath()); });
connect(d->m_lineEdit, &FancyLineEdit::validChanged, this, &PathChooser::validChanged); connect(d->m_lineEdit, &FancyLineEdit::validChanged, this, &PathChooser::validChanged);
@@ -422,6 +428,18 @@ void PathChooser::slotBrowse()
triggerChanged(); triggerChanged();
} }
void PathChooser::contextMenuRequested(const QPoint &pos)
{
if (QMenu *menu = d->m_lineEdit->createStandardContextMenu()) {
menu->setAttribute(Qt::WA_DeleteOnClose);
if (s_aboutToShowContextMenuHandler)
s_aboutToShowContextMenuHandler(this, menu);
menu->popup(d->m_lineEdit->mapToGlobal(pos));
}
}
bool PathChooser::isValid() const bool PathChooser::isValid() const
{ {
return d->m_lineEdit->isValid(); return d->m_lineEdit->isValid();
@@ -437,6 +455,11 @@ void PathChooser::triggerChanged()
d->m_lineEdit->triggerChanged(); d->m_lineEdit->triggerChanged();
} }
void PathChooser::setAboutToShowContextMenuHandler(PathChooser::AboutToShowContextMenuHandler handler)
{
s_aboutToShowContextMenuHandler = handler;
}
FancyLineEdit::ValidationFunction PathChooser::defaultValidationFunction() const FancyLineEdit::ValidationFunction PathChooser::defaultValidationFunction() const
{ {
return std::bind(&PathChooser::validatePath, this, std::placeholders::_1, std::placeholders::_2); return std::bind(&PathChooser::validatePath, this, std::placeholders::_1, std::placeholders::_2);

View File

@@ -140,11 +140,17 @@ public:
void triggerChanged(); void triggerChanged();
// global handler for adding context menus to ALL pathchooser
// used by the coreplugin to add "Open in Terminal" and "Open in Explorer" context menu actions
using AboutToShowContextMenuHandler = std::function<void (Utils::PathChooser *, QMenu *)>;
static void setAboutToShowContextMenuHandler(AboutToShowContextMenuHandler handler);
private: private:
bool validatePath(FancyLineEdit *edit, QString *errorMessage) const; bool validatePath(FancyLineEdit *edit, QString *errorMessage) const;
// Returns overridden title or the one from <title> // Returns overridden title or the one from <title>
QString makeDialogTitle(const QString &title); QString makeDialogTitle(const QString &title);
void slotBrowse(); void slotBrowse();
void contextMenuRequested(const QPoint &pos);
signals: signals:
void validChanged(bool validState); void validChanged(bool validState);
@@ -161,6 +167,7 @@ public slots:
private: private:
PathChooserPrivate *d; PathChooserPrivate *d;
static AboutToShowContextMenuHandler s_aboutToShowContextMenuHandler;
}; };
} // namespace Utils } // namespace Utils

View File

@@ -44,9 +44,11 @@
#include <coreplugin/find/findplugin.h> #include <coreplugin/find/findplugin.h>
#include <coreplugin/locator/locator.h> #include <coreplugin/locator/locator.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/fileutils.h>
#include <extensionsystem/pluginerroroverview.h> #include <extensionsystem/pluginerroroverview.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/pathchooser.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/savefile.h> #include <utils/savefile.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
@@ -57,6 +59,7 @@
#include <QDebug> #include <QDebug>
#include <QDateTime> #include <QDateTime>
#include <QDir> #include <QDir>
#include <QMenu>
using namespace Core; using namespace Core;
using namespace Core::Internal; using namespace Core::Internal;
@@ -229,6 +232,8 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage)
// Make sure all wizards are there when the user might access the keyboard shortcuts: // Make sure all wizards are there when the user might access the keyboard shortcuts:
connect(ICore::instance(), &ICore::optionsDialogRequested, []() { IWizardFactory::allWizardFactories(); }); connect(ICore::instance(), &ICore::optionsDialogRequested, []() { IWizardFactory::allWizardFactories(); });
Utils::PathChooser::setAboutToShowContextMenuHandler(&CorePlugin::addToPathChooserContextMenu);
return success; return success;
} }
@@ -271,6 +276,27 @@ void CorePlugin::fileOpenRequest(const QString &f)
remoteCommand(QStringList(), QString(), QStringList(f)); remoteCommand(QStringList(), QString(), QStringList(f));
} }
void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QMenu *menu)
{
QList<QAction*> actions = menu->actions();
QAction *firstAction = actions.isEmpty() ? nullptr : actions.first();
auto *showInGraphicalShell = new QAction(Core::FileUtils::msgGraphicalShellAction(), menu);
connect(showInGraphicalShell, &QAction::triggered, pathChooser, [pathChooser]() {
Core::FileUtils::showInGraphicalShell(pathChooser, pathChooser->path());
});
menu->insertAction(firstAction, showInGraphicalShell);
auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalAction(), menu);
connect(showInTerminal, &QAction::triggered, pathChooser, [pathChooser]() {
Core::FileUtils::openTerminal(pathChooser->path());
});
menu->insertAction(firstAction, showInTerminal);
if (firstAction)
menu->insertSeparator(firstAction);
}
ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown()
{ {
m_findPlugin->aboutToShutdown(); m_findPlugin->aboutToShutdown();

View File

@@ -33,7 +33,14 @@
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
namespace Utils { class Theme; } QT_BEGIN_NAMESPACE
class QMenu;
QT_END_NAMESPACE
namespace Utils {
class PathChooser;
class Theme;
}
namespace Core { namespace Core {
@@ -77,6 +84,7 @@ private slots:
private: private:
void parseArguments(const QStringList & arguments); void parseArguments(const QStringList & arguments);
static void addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QMenu *menu);
MainWindow *m_mainWindow; MainWindow *m_mainWindow;
EditMode *m_editMode; EditMode *m_editMode;