diff --git a/src/plugins/qmldesigner/componentsplugin/componentsplugin.cpp b/src/plugins/qmldesigner/componentsplugin/componentsplugin.cpp index cae3b5b3439..8bdb0c90478 100644 --- a/src/plugins/qmldesigner/componentsplugin/componentsplugin.cpp +++ b/src/plugins/qmldesigner/componentsplugin/componentsplugin.cpp @@ -31,6 +31,7 @@ #include "tabviewindexmodel.h" #include "addtabdesigneraction.h" +#include "entertabdesigneraction.h" #include #include @@ -43,7 +44,9 @@ namespace QmlDesigner { ComponentsPlugin::ComponentsPlugin() { TabViewIndexModel::registerDeclarativeType(); - QmlDesignerPlugin::instance()->viewManager().designerActionManager().addDesignerAction(new AddTabDesignerAction); + DesignerActionManager *actionManager = &QmlDesignerPlugin::instance()->viewManager().designerActionManager(); + actionManager->addDesignerAction(new AddTabDesignerAction); + actionManager->addDesignerAction(new EnterTabDesignerAction); } QString ComponentsPlugin::pluginName() const diff --git a/src/plugins/qmldesigner/componentsplugin/componentsplugin.pri b/src/plugins/qmldesigner/componentsplugin/componentsplugin.pri index 7ba72fe89bb..727a0d594f6 100644 --- a/src/plugins/qmldesigner/componentsplugin/componentsplugin.pri +++ b/src/plugins/qmldesigner/componentsplugin/componentsplugin.pri @@ -21,13 +21,15 @@ HEADERS += \ $$PWD/componentsplugin.h \ $$PWD/../designercore/include/iwidgetplugin.h \ $$PWD/addtabdesigneraction.h \ - $$PWD/addtabtotabviewdialog.h + $$PWD/addtabtotabviewdialog.h \ + $$PWD/entertabdesigneraction.h SOURCES += \ $$PWD/componentsplugin.cpp \ $$PWD/tabviewindexmodel.cpp \ $$PWD/addtabdesigneraction.cpp \ - $$PWD/addtabtotabviewdialog.cpp + $$PWD/addtabtotabviewdialog.cpp \ + $$PWD/entertabdesigneraction.cpp FORMS += \ $$PWD/addtabtotabviewdialog.ui diff --git a/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp new file mode 100644 index 00000000000..fd3c689ea7d --- /dev/null +++ b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "entertabdesigneraction.h" + +#include +#include +#include +#include +#include +#include + +#include + +namespace QmlDesigner { + +class EnterTabAction : public DefaultAction +{ + +public: + EnterTabAction(const QString &description) + : DefaultAction(description) + { } + +public /*slots*/: + void actionTriggered(bool) QTC_OVERRIDE + { + DocumentManager::goIntoComponent(m_selectionContext.targetNode()); + } +}; + +EnterTabDesignerAction::EnterTabDesignerAction() + : AbstractActionGroup(QCoreApplication::translate("TabViewToolAction", "Edit Tab")) +{ +} + +QByteArray EnterTabDesignerAction::category() const +{ + return QByteArray(); +} + +QByteArray EnterTabDesignerAction::menuId() const +{ + return "TabViewAction"; +} + +int EnterTabDesignerAction::priority() const +{ + //Editing tabs is above adding tabs + return CustomActionsPriority + 10; +} + +void EnterTabDesignerAction::updateContext() +{ + menu()->clear(); + if (selectionContext().isValid()) { + + action()->setEnabled(isEnabled(selectionContext())); + action()->setVisible(isVisible(selectionContext())); + + if (action()->isEnabled()) { + const ModelNode selectedModelNode = selectionContext().currentSingleSelectedNode(); + if (selectedModelNode.metaInfo().isValid() + && selectedModelNode.metaInfo().isSubclassOf("QtQuick.Controls.TabView", -1, -1)) { + + const NodeAbstractProperty defaultProperty = selectedModelNode.defaultNodeAbstractProperty(); + foreach (const QmlDesigner::ModelNode &childModelNode, defaultProperty.directSubNodes()) { + createActionForTab(childModelNode); + } + } + } + } +} + +bool EnterTabDesignerAction::isVisible(const SelectionContext &selectionContext) const +{ + if (selectionContext.singleNodeIsSelected()) { + ModelNode selectedModelNode = selectionContext.currentSingleSelectedNode(); + return selectedModelNode.metaInfo().isValid() && selectedModelNode.metaInfo().isTabView(); + } + + return false; +} + +static bool tabViewIsNotEmpty(const SelectionContext &selectionContext) +{ + return selectionContext.currentSingleSelectedNode().defaultNodeAbstractProperty().isNodeListProperty(); +} + +bool EnterTabDesignerAction::isEnabled(const SelectionContext &selectionContext) const +{ + return isVisible(selectionContext) && tabViewIsNotEmpty(selectionContext); +} + +void EnterTabDesignerAction::createActionForTab(const ModelNode &modelNode) +{ + if (modelNode.metaInfo().isValid() + && modelNode.metaInfo().isSubclassOf("QtQuick.Controls.Tab", -1, -1)) { + + QmlDesigner::QmlItemNode itemNode(modelNode); + + if (itemNode.isValid()) { + QString what = QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit: %1")). + arg(itemNode.instanceValue("title").toString()); + EnterTabAction *selectionAction = new EnterTabAction(what); + + SelectionContext nodeSelectionContext = selectionContext(); + nodeSelectionContext.setTargetNode(modelNode); + selectionAction->setSelectionContext(nodeSelectionContext); + + menu()->addAction(selectionAction); + + } + } +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.h b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.h new file mode 100644 index 00000000000..e4d7db2c424 --- /dev/null +++ b/src/plugins/qmldesigner/componentsplugin/entertabdesigneraction.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef ENTERTABDESIGNERACTION_H +#define ENTERTABDESIGNERACTION_H + +#include + +namespace QmlDesigner { + +class EnterTabDesignerAction : public AbstractActionGroup +{ +public: + EnterTabDesignerAction(); + + QByteArray category() const QTC_OVERRIDE; + QByteArray menuId() const QTC_OVERRIDE; + int priority() const QTC_OVERRIDE; + void updateContext() QTC_OVERRIDE; + +protected: + bool isVisible(const SelectionContext &selectionContext) const; + bool isEnabled(const SelectionContext &selectionContext) const; + +private: + void createActionForTab(const ModelNode &modelNode); +}; + +} // namespace QmlDesigner + +#endif // ENTERTABDESIGNERACTION_H