diff --git a/src/plugins/qmldesigner/QmlDesigner.pluginspec b/src/plugins/qmldesigner/QmlDesigner.pluginspec index bb2ed107848474f10f783688182f796c621becdd..26e62766327ef3f8db07ca5e4b997055c1c59e7c 100644 --- a/src/plugins/qmldesigner/QmlDesigner.pluginspec +++ b/src/plugins/qmldesigner/QmlDesigner.pluginspec @@ -1,4 +1,4 @@ -<plugin name="QmlDesigner" version="1.3.82" compatVersion="1.3.82"> +<plugin name="QmlDesigner" version="1.3.82" compatVersion="1.3.82" experimental="true"> <vendor>Nokia Corporation</vendor> <copyright>(C) 2010 Nokia Corporation</copyright> <license> diff --git a/src/plugins/qmljseditor/qmljseditorfactory.cpp b/src/plugins/qmljseditor/qmljseditorfactory.cpp index 474b05fc4f0b806016e766561189fa794cfba40c..64d62a01d89ba13d775ca10c9e11e3f67de62841 100644 --- a/src/plugins/qmljseditor/qmljseditorfactory.cpp +++ b/src/plugins/qmljseditor/qmljseditorfactory.cpp @@ -33,10 +33,49 @@ #include "qmljseditorconstants.h" #include "qmljseditorplugin.h" +#include <extensionsystem/pluginmanager.h> +#include <extensionsystem/pluginspec.h> + +#include <coreplugin/icore.h> #include <coreplugin/editormanager/editormanager.h> #include <QtCore/QFileInfo> #include <QtCore/QDebug> +#include <QtCore/QSettings> +#include <QtGui/QMessageBox> +#include <QtGui/QPushButton> +#include <QtGui/QMainWindow> + +namespace { + const char * const QMLDESIGNER_INFO_BAR = "QmlJSEditor.QmlDesignerInfoBar"; + const char * const KEY_QMLGROUP = "QML"; + const char * const KEY_NAGABOUTDESIGNER = "AskAboutVisualDesigner"; + + bool isQmlDesignerExperimentallyDisabled() + { + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + foreach (const ExtensionSystem::PluginSpec *spec, pm->plugins()) { + if (spec->name() == QLatin1String("QmlDesigner")) { + if (spec->isExperimental() && !spec->isEnabled()) + return true; + return false; + } + } + return false; + } + + bool isNaggingAboutExperimentalDesignerEnabled() + { + if (!isQmlDesignerExperimentallyDisabled()) { + return false; + } + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(QLatin1String(KEY_QMLGROUP)); + bool nag = settings->value(QLatin1String(KEY_NAGABOUTDESIGNER), true).toBool(); + settings->endGroup(); + return nag; + } +} using namespace QmlJSEditor::Internal; using namespace QmlJSEditor::Constants; @@ -77,6 +116,14 @@ Core::IFile *QmlJSEditorFactory::open(const QString &fileName) Core::IEditor *QmlJSEditorFactory::createEditor(QWidget *parent) { + static bool listenerInitialized = false; + if (!listenerInitialized) { + listenerInitialized = true; + if (isNaggingAboutExperimentalDesignerEnabled()) { + connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), + SLOT(updateEditorInfoBar(Core::IEditor*))); + } + } QmlJSTextEditor *rc = new QmlJSTextEditor(parent); QmlJSEditorPlugin::instance()->initializeEditor(rc); return rc->editableInterface(); @@ -86,3 +133,58 @@ QStringList QmlJSEditorFactory::mimeTypes() const { return m_mimeTypes; } + +void QmlJSEditorFactory::updateEditorInfoBar(Core::IEditor *editor) +{ + if (qobject_cast<QmlJSEditorEditable *>(editor)) { + Core::EditorManager::instance()->showEditorInfoBar(QMLDESIGNER_INFO_BAR, + tr("Do you want to enable the experimental Quick Designer?"), + tr("Enable Quick Designer"), this, SLOT(activateQmlDesigner())); + } else { + Core::EditorManager::instance()->hideEditorInfoBar(QMLDESIGNER_INFO_BAR); + } +} + +void QmlJSEditorFactory::activateQmlDesigner() +{ + QString menu; +#ifdef Q_WS_MAC + menu = tr("Qt Creator -> About Plugins..."); +#else + menu = tr("Help -> About Plugins..."); +#endif + QMessageBox message(Core::ICore::instance()->mainWindow()); + message.setWindowTitle(tr("Enable experimental Quick Designer?")); + message.setText(tr("Do you want to enable the experimental Quick Designer? " + "After enabling it, you can access the visual design capabilities by switching to Design Mode. " + "This can affect the overall stability of Qt Creator. " + "To disable Quick Designer again, visit the menu '%1' and disable 'QmlDesigner'.").arg(menu)); + message.setIcon(QMessageBox::Question); + QPushButton *enable = message.addButton(tr("Enable Quick Designer"), QMessageBox::AcceptRole); + QPushButton *dontNag = message.addButton(tr("Never ask me again"), QMessageBox::ActionRole); + message.addButton(tr("Cancel"), QMessageBox::RejectRole); + message.exec(); + if (message.clickedButton() == enable) { + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + foreach (ExtensionSystem::PluginSpec *spec, pm->plugins()) { + if (spec->name() == QLatin1String("QmlDesigner")) { + spec->setEnabled(true); + pm->writeSettings(); + QMessageBox::information(Core::ICore::instance()->mainWindow(), tr("Please restart Qt Creator"), + tr("Please restart Qt Creator to make the change effective.")); + disconnect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(updateEditorInfoBar(Core::IEditor*))); + Core::EditorManager::instance()->hideEditorInfoBar(QMLDESIGNER_INFO_BAR); + return; + } + } + } else if (message.clickedButton() == dontNag) { + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(QLatin1String(KEY_QMLGROUP)); + settings->setValue(QLatin1String(KEY_NAGABOUTDESIGNER), false); + settings->endGroup(); + disconnect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(updateEditorInfoBar(Core::IEditor*))); + Core::EditorManager::instance()->hideEditorInfoBar(QMLDESIGNER_INFO_BAR); + } +} diff --git a/src/plugins/qmljseditor/qmljseditorfactory.h b/src/plugins/qmljseditor/qmljseditorfactory.h index 084d99c341be355e10c464df463d9c27e41f0a59..5527a93c8c19f4cfa060e67269df8a4322f442d7 100644 --- a/src/plugins/qmljseditor/qmljseditorfactory.h +++ b/src/plugins/qmljseditor/qmljseditorfactory.h @@ -58,6 +58,10 @@ public: Core::IFile *open(const QString &fileName); Core::IEditor *createEditor(QWidget *parent); +private slots: + void activateQmlDesigner(); + void updateEditorInfoBar(Core::IEditor *editor); + private: QStringList m_mimeTypes; };