qdesigner_taskmenu.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 413 行

CPP
413
字号
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qdesigner_taskmenu_p.h"#include "qdesigner_command_p.h"#include "richtexteditor_p.h"#include "stylesheeteditor_p.h"#include "qlayout_widget_p.h"#include "layout_p.h"#include "spacer_widget_p.h"#include "textpropertyeditor_p.h"#include "promotiontaskmenu_p.h"#include "metadatabase_p.h"#include "scriptdialog_p.h"#include "scriptcommand_p.h"#include <shared_enums_p.h>#include <QtDesigner/QDesignerFormWindowInterface>#include <QtDesigner/QDesignerFormWindowCursorInterface>#include <QtDesigner/QDesignerPropertySheetExtension>#include <QtDesigner/QDesignerFormEditorInterface>#include <QtDesigner/QDesignerLanguageExtension>#include <QtDesigner/QExtensionManager>#include <QtGui/QAction>#include <QtGui/QWidget>#include <QtGui/QMenuBar>#include <QtGui/QMainWindow>#include <QtGui/QStatusBar>#include <QtGui/QDialogButtonBox>#include <QtGui/QVBoxLayout>#include <QtGui/QPushButton>static QMenuBar *findMenuBar(const QWidget *widget){    const QList<QObject*> children = widget->children();    foreach (QObject *obj, widget->children()) {        if (QMenuBar *mb = qobject_cast<QMenuBar*>(obj)) {            return mb;        }    }    return 0;}static QStatusBar *findStatusBar(const QWidget *widget){    const QList<QObject*> children = widget->children();    foreach (QObject *obj, widget->children()) {        if (QStatusBar *sb = qobject_cast<QStatusBar*>(obj)) {            return sb;        }    }    return 0;}namespace  {class ObjectNameDialog : public QDialog{     public:         ObjectNameDialog(QWidget *parent, const QString &oldName);         QString newObjectName() const;     private:         qdesigner_internal::TextPropertyEditor *m_editor;};ObjectNameDialog::ObjectNameDialog(QWidget *parent, const QString &oldName)    : QDialog(parent),      m_editor( new qdesigner_internal::TextPropertyEditor(qdesigner_internal::TextPropertyEditor::EmbeddingNone,                                                           qdesigner_internal::ValidationObjectName, this)){    setWindowTitle(QObject::tr("Change Object Name"));    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);    QVBoxLayout *vboxLayout = new QVBoxLayout(this);    vboxLayout->addWidget(new QLabel(QObject::tr("Object Name")));    m_editor->setText(oldName);    m_editor->selectAll();    m_editor->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);    vboxLayout->addWidget(m_editor);    QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,                                                       Qt::Horizontal, this);    QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);    okButton->setDefault(true);    vboxLayout->addWidget(buttonBox);    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));}QString ObjectNameDialog::newObjectName() const{    return m_editor->text();}}namespace qdesigner_internal {QDesignerTaskMenu::QDesignerTaskMenu(QWidget *widget, QObject *parent) :    QObject(parent),    m_widget(widget),    m_separator(createSeparator()),    m_separator2(createSeparator()),    m_separator3(createSeparator()),    m_separator4(createSeparator()),    m_changeObjectNameAction(new QAction(tr("Change objectName..."), this)),    m_changeToolTip(new QAction(tr("Change toolTip..."), this)),    m_changeWhatsThis(new QAction(tr("Change whatsThis..."), this)),    m_changeStyleSheet(new QAction(tr("Change styleSheet..."), this)),    m_addMenuBar(new QAction(tr("Create Menu Bar"), this)),    m_addToolBar(new QAction(tr("Add Tool Bar"), this)),    m_addStatusBar(new QAction(tr("Create Status Bar"), this)),    m_removeStatusBar(new QAction(tr("Remove Status Bar"), this)),    m_changeScript(new QAction(tr("Change script..."), this)),    m_promotionTaskMenu(new PromotionTaskMenu(widget, PromotionTaskMenu::ModeMultiSelection, this)){    Q_ASSERT(qobject_cast<QDesignerFormWindowInterface*>(widget) == 0);    connect(m_changeObjectNameAction, SIGNAL(triggered()), this, SLOT(changeObjectName()));    connect(m_changeToolTip, SIGNAL(triggered()), this, SLOT(changeToolTip()));    connect(m_changeWhatsThis, SIGNAL(triggered()), this, SLOT(changeWhatsThis()));    connect(m_changeStyleSheet, SIGNAL(triggered()), this,  SLOT(changeStyleSheet()));    connect(m_addMenuBar, SIGNAL(triggered()), this, SLOT(createMenuBar()));    connect(m_addToolBar, SIGNAL(triggered()), this, SLOT(addToolBar()));    connect(m_addStatusBar, SIGNAL(triggered()), this, SLOT(createStatusBar()));    connect(m_removeStatusBar, SIGNAL(triggered()), this, SLOT(removeStatusBar()));    connect(m_changeScript, SIGNAL(triggered()), this, SLOT(changeScript()));}QDesignerTaskMenu::~QDesignerTaskMenu(){}QAction *QDesignerTaskMenu::createSeparator() {    QAction *rc = new QAction(this);    rc->setSeparator(true);    return rc;}QWidget *QDesignerTaskMenu::widget() const{    return m_widget;}QDesignerFormWindowInterface *QDesignerTaskMenu::formWindow() const{    QDesignerFormWindowInterface *result = QDesignerFormWindowInterface::findFormWindow(widget());    Q_ASSERT(result != 0);    return result;}void QDesignerTaskMenu::createMenuBar(){    if (QDesignerFormWindowInterface *fw = formWindow()) {        QMainWindow *mw = qobject_cast<QMainWindow*>(fw->mainContainer());        if (!mw) {            // ### warning message            return;        }        CreateMenuBarCommand *cmd = new CreateMenuBarCommand(fw);        cmd->init(mw);        fw->commandHistory()->push(cmd);    }}void QDesignerTaskMenu::addToolBar(){    if (QDesignerFormWindowInterface *fw = formWindow()) {        QMainWindow *mw = qobject_cast<QMainWindow*>(fw->mainContainer());        if (!mw) {            // ### warning message            return;        }        AddToolBarCommand *cmd = new AddToolBarCommand(fw);        cmd->init(mw);        fw->commandHistory()->push(cmd);    }}void QDesignerTaskMenu::createStatusBar(){    if (QDesignerFormWindowInterface *fw = formWindow()) {        QMainWindow *mw = qobject_cast<QMainWindow*>(fw->mainContainer());        if (!mw) {            // ### warning message            return;        }        CreateStatusBarCommand *cmd = new CreateStatusBarCommand(fw);        cmd->init(mw);        fw->commandHistory()->push(cmd);    }}void QDesignerTaskMenu::removeStatusBar(){    if (QDesignerFormWindowInterface *fw = formWindow()) {        QMainWindow *mw = qobject_cast<QMainWindow*>(fw->mainContainer());        if (!mw) {            // ### warning message            return;        }        DeleteStatusBarCommand *cmd = new DeleteStatusBarCommand(fw);        cmd->init(findStatusBar(mw));        fw->commandHistory()->push(cmd);    }}QList<QAction*> QDesignerTaskMenu::taskActions() const{    QDesignerFormWindowInterface *formWindow = QDesignerFormWindowInterface::findFormWindow(widget());    Q_ASSERT(formWindow);    const bool isMainContainer = formWindow->mainContainer() == widget();    QList<QAction*> actions;    if (const QMainWindow *mw = qobject_cast<const QMainWindow*>(formWindow->mainContainer()))  {        if (isMainContainer || mw->centralWidget() == widget()) {            if (!findMenuBar(mw)) {                actions.append(m_addMenuBar);            }            actions.append(m_addToolBar);            // ### create the status bar            if (!findStatusBar(mw))                actions.append(m_addStatusBar);            else                actions.append(m_removeStatusBar);            actions.append(m_separator);        }    }    actions.append(m_changeObjectNameAction);    actions.append(m_separator2);    actions.append(m_changeToolTip);    actions.append(m_changeWhatsThis);    actions.append(m_changeStyleSheet);    m_promotionTaskMenu->addActions(formWindow, PromotionTaskMenu::LeadingSeparator, actions);#ifdef WANT_SCRIPT_OPTION    if (!isMainContainer) {        actions.append(m_separator4);        actions.append(m_changeScript);    }#endif    return actions;}void QDesignerTaskMenu::changeObjectName(){    QDesignerFormWindowInterface *fw = formWindow();    Q_ASSERT(fw != 0);    QDesignerFormEditorInterface *core = fw->core();    QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core->extensionManager(), widget());    Q_ASSERT(sheet != 0);    ObjectNameDialog dialog(fw, sheet->property(sheet->indexOf(QLatin1String("objectName"))).toString());    if (dialog.exec() == QDialog::Accepted) {        const QString newObjectName = dialog.newObjectName();        if (!newObjectName.isEmpty())            fw->cursor()->setProperty(QLatin1String("objectName"), newObjectName);    }}QDesignerTaskMenuFactory::QDesignerTaskMenuFactory(QExtensionManager *extensionManager)    : QExtensionFactory(extensionManager){}QObject *QDesignerTaskMenuFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const{    if (iid != Q_TYPEID(QDesignerTaskMenuExtension))        return 0;    QWidget *widget = qobject_cast<QWidget*>(object);    if (widget == 0)        return 0;    // check if is an internal widget (### generalize)    if (qobject_cast<const QLayoutWidget*>(widget) || qobject_cast<const Spacer*>(widget))        return 0;    return new QDesignerTaskMenu(widget, parent);}void QDesignerTaskMenu::changeRichTextProperty(const QString &propertyName){    if (QDesignerFormWindowInterface *fw = formWindow()) {        Q_ASSERT(m_widget->parentWidget() != 0);        RichTextEditorDialog dlg(fw);        RichTextEditor *editor = dlg.editor();        QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(fw->core()->extensionManager(), m_widget);        Q_ASSERT(sheet != 0);        editor->setDefaultFont(m_widget->font());        editor->setText(sheet->property(sheet->indexOf(propertyName)).toString());        editor->selectAll();        editor->setFocus();        if (dlg.exec()) {            const QString text = editor->text(Qt::RichText);            fw->cursor()->setWidgetProperty(m_widget, propertyName, QVariant(text));        }    }}void QDesignerTaskMenu::changeToolTip(){    changeRichTextProperty(QLatin1String("toolTip"));}void QDesignerTaskMenu::changeWhatsThis(){    changeRichTextProperty(QLatin1String("whatsThis"));}void QDesignerTaskMenu::changeStyleSheet(){    if (QDesignerFormWindowInterface *fw = formWindow()) {        StyleSheetEditorDialog dlg(fw, m_widget);        dlg.exec();    }}void QDesignerTaskMenu::changeScript(){    QDesignerFormWindowInterface *fw = formWindow();    if (!fw)        return;    MetaDataBase *metaDataBase = qobject_cast<MetaDataBase*>(fw->core()->metaDataBase());    if (!metaDataBase)        return;    const MetaDataBaseItem* item = metaDataBase->metaDataBaseItem(m_widget);    if (!item)        return;    const QString oldScript = item->script();    QString newScript = oldScript;       ScriptDialog scriptDialog(fw);    if (!scriptDialog.editScript(newScript))        return;        // compile list of selected objects    ScriptCommand::ObjectList objects;    objects += (QWidget *)m_widget;    const QDesignerFormWindowCursorInterface *cursor = fw->cursor();    const int selectionCount =  cursor->selectedWidgetCount();    for (int i = 0; i < selectionCount; i++) {        QWidget *w = cursor->selectedWidget(i);        if (w != m_widget)             objects += w;    }    ScriptCommand *scriptCommand = new ScriptCommand(fw);    if (!scriptCommand->init(objects, newScript)) {        delete scriptCommand;        return;    }        fw->commandHistory()->push(scriptCommand); }} // namespace qdesigner_internal

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?