qdesigner_toolbar.cpp

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

CPP
454
字号
/******************************************************************************** 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.******************************************************************************//*TRANSLATOR qdesigner_internal::Sentinel*/#include "qdesigner_toolbar_p.h"#include "qdesigner_command_p.h"#include "actionrepository_p.h"#include "actionprovider_p.h"#include "qdesigner_utils_p.h"#include "qdesigner_objectinspector_p.h"#include <QtDesigner/QDesignerFormWindowInterface>#include <QtDesigner/QDesignerPropertyEditorInterface>#include <QtDesigner/QDesignerFormEditorInterface>#include <actionprovider_p.h>#include <QtDesigner/QExtensionManager>#include <QtDesigner/QDesignerWidgetFactoryInterface>#include <QtGui/QAction>#include <QtGui/QApplication>#include <QtGui/QToolButton>#include <QtGui/QToolBar>#include <QtGui/QMenu>#include <QtGui/qevent.h>#include <QtGui/private/qtoolbarlayout_p.h>Q_DECLARE_METATYPE(QAction*)namespace {    typedef QList<QAction*> ActionList;}namespace qdesigner_internal {// ------------------- ToolBarEventFiltervoid ToolBarEventFilter::install(QToolBar *tb){    ToolBarEventFilter *tf = new ToolBarEventFilter(tb);    tb->installEventFilter(tf);    tb->setAcceptDrops(true); // ### fake}ToolBarEventFilter::ToolBarEventFilter(QToolBar *tb) :    QObject(tb),    m_toolBar(tb),    m_sentinel(0){    QWidget *w = new QWidget(tb);    w->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);    w->setAttribute(Qt::WA_TransparentForMouseEvents, true);    w->setFocusPolicy(Qt::NoFocus);    m_sentinel = tb->addWidget(w);    tb->addAction(m_sentinel);}bool ToolBarEventFilter::eventFilter (QObject *watched, QEvent *event){    if (watched != m_toolBar)        return QObject::eventFilter (watched, event);    switch (event->type()) {    case QEvent::ChildAdded: {        // Children should not interact with the mouse        const QChildEvent *ce = static_cast<const QChildEvent *>(event);        if (QWidget *w = qobject_cast<QWidget *>(ce->child())) {            w->setAttribute(Qt::WA_TransparentForMouseEvents, true);            w->setFocusPolicy(Qt::NoFocus);        }    }        break;    case QEvent::ContextMenu:        return handleContextMenuEvent(static_cast<QContextMenuEvent*>(event));    case QEvent::DragEnter:    case QEvent::DragMove:        return handleDragEnterMoveEvent(static_cast<QDragMoveEvent *>(event));    case QEvent::DragLeave:        return handleDragLeaveEvent(static_cast<QDragLeaveEvent *>(event));    case QEvent::Drop:        return handleDropEvent(static_cast<QDropEvent *>(event));    case QEvent::MouseButtonPress:        return handleMousePressEvent(static_cast<QMouseEvent*>(event));    case QEvent::MouseButtonRelease:        return handleMouseReleaseEvent(static_cast<QMouseEvent*>(event));    case QEvent::MouseMove:        return handleMouseMoveEvent(static_cast<QMouseEvent*>(event));    default:        break;    }    return QObject::eventFilter (watched, event);}int  ToolBarEventFilter::findAction(const QPoint &pos) const{    // Default to sentinel action if out of geometry    const int index = actionIndexAt(m_toolBar, pos);    return index == -1 ? 0 : index;}bool ToolBarEventFilter::handleContextMenuEvent(QContextMenuEvent * event ){    event->accept();    const int index = findAction(m_toolBar->mapFromGlobal(event->globalPos()));    QAction *action = m_toolBar->actions().at(index);    QVariant itemData;    qVariantSetValue(itemData, action);    QMenu menu(0);    QAction *newSeperatorAct = menu.addAction(tr("Insert Separator"));    newSeperatorAct->setData(itemData);    connect(newSeperatorAct, SIGNAL(triggered()), this, SLOT(slotInsertSeparator()));    menu.addSeparator();    if (action && action != m_sentinel) {        QAction *a = menu.addAction(tr("Remove action '%1'").arg(action->objectName()));        a->setData(itemData);        connect(a, SIGNAL(triggered()), this, SLOT(slotRemoveSelectedAction()));    }    QAction *remove_toolbar = menu.addAction(tr("Remove Toolbar '%1'").arg(m_toolBar->objectName()));    connect(remove_toolbar, SIGNAL(triggered()), this, SLOT(slotRemoveToolBar()));    menu.exec(event->globalPos());    return true;}void ToolBarEventFilter::slotRemoveSelectedAction(){    QAction *action = qobject_cast<QAction*>(sender());    if (!action)        return;    QAction *a = qvariant_cast<QAction*>(action->data());    Q_ASSERT(a != 0);    QDesignerFormWindowInterface *fw = formWindow();    Q_ASSERT(fw);    const ActionList actions = m_toolBar->actions();    const int pos = actions.indexOf(a);    QAction *action_before = 0;    if (pos != -1 && actions.count() > pos + 1)        action_before = actions.at(pos + 1);    RemoveActionFromCommand *cmd = new RemoveActionFromCommand(fw);    cmd->init(m_toolBar, a, action_before);    fw->commandHistory()->push(cmd);}void ToolBarEventFilter::slotRemoveToolBar(){    QDesignerFormWindowInterface *fw = formWindow();    Q_ASSERT(fw);    DeleteToolBarCommand *cmd = new DeleteToolBarCommand(fw);    cmd->init(m_toolBar);    fw->commandHistory()->push(cmd);}void ToolBarEventFilter::slotInsertSeparator(){    QDesignerFormWindowInterface *fw = formWindow();    QAction *theSender = qobject_cast<QAction*>(sender());    QAction *previous = qvariant_cast<QAction *>(theSender->data());    fw->beginCommand(tr("Insert Separator"));    QAction *action = createAction(fw, QLatin1String("separator"), true);    InsertActionIntoCommand *cmd = new InsertActionIntoCommand(fw);    cmd->init(m_toolBar, action, previous);    fw->commandHistory()->push(cmd);    fw->endCommand();}QDesignerFormWindowInterface *ToolBarEventFilter::formWindow() const{    return QDesignerFormWindowInterface::findFormWindow(m_toolBar);}QAction *ToolBarEventFilter::createAction(QDesignerFormWindowInterface *fw, const QString &objectName, bool separator){    QAction *action = new QAction(fw);    fw->core()->widgetFactory()->initialize(action);    if (separator)        action->setSeparator(true);    action->setObjectName(objectName);    fw->ensureUniqueObjectName(action);    qdesigner_internal::AddActionCommand *cmd = new  qdesigner_internal::AddActionCommand(fw);    cmd->init(action);    fw->commandHistory()->push(cmd);    return action;}void ToolBarEventFilter::adjustDragIndicator(const QPoint &pos){    if (QDesignerFormWindowInterface *fw = formWindow()) {        QDesignerFormEditorInterface *core = fw->core();        if (QDesignerActionProviderExtension *a = qt_extension<QDesignerActionProviderExtension*>(core->extensionManager(), m_toolBar))            a->adjustIndicator(pos);    }}void ToolBarEventFilter::hideDragIndicator(){    adjustDragIndicator(QPoint(-1, -1));}void ToolBarEventFilter::adjustSpecialActions(QToolBar *tb){    if (ToolBarEventFilter *tef = qFindChild<ToolBarEventFilter *>(tb))        tef->positionSentinel();}void ToolBarEventFilter::positionSentinel(){    // Make sure dummy is last    m_toolBar->removeAction(m_sentinel);    m_toolBar->addAction(m_sentinel);}bool ToolBarEventFilter::handleMousePressEvent(QMouseEvent *event){    if (event->button() != Qt::LeftButton || withinHandleArea(m_toolBar, event->pos()))        return false;    if (QDesignerFormWindowInterface *fw = formWindow()) {        QDesignerFormEditorInterface *core = fw->core();        // Keep selection in sync        fw->clearSelection(false);        if (QDesignerObjectInspector *oi = qobject_cast<QDesignerObjectInspector *>(core->objectInspector())) {            oi->clearSelection();            oi->selectObject(m_toolBar);        }        core->propertyEditor()->setObject(m_toolBar);    }    m_startPosition = m_toolBar->mapFromGlobal(event->globalPos());    event->accept();    return true;}bool ToolBarEventFilter::handleMouseReleaseEvent(QMouseEvent *event){    if (event->button() != Qt::LeftButton || m_startPosition.isNull() || withinHandleArea(m_toolBar, event->pos()))        return false;    // Accept the event, otherwise, form window selection will trigger    m_startPosition = QPoint();    event->accept();    return true;}bool ToolBarEventFilter::handleMouseMoveEvent(QMouseEvent *event){    if (m_startPosition.isNull() || withinHandleArea(m_toolBar, event->pos()))        return false;    const QPoint pos = m_toolBar->mapFromGlobal(event->globalPos());    if ((pos - m_startPosition).manhattanLength() > qApp->startDragDistance()) {        startDrag(m_startPosition, event->modifiers());        m_startPosition = QPoint();        event->accept();        return true;    }    return false;}bool ToolBarEventFilter::handleDragEnterMoveEvent(QDragMoveEvent *event){    const ActionRepositoryMimeData *d = qobject_cast<const ActionRepositoryMimeData*>(event->mimeData());    if (!d)        return false;    if (d->actionList().isEmpty()) {        event->ignore();        hideDragIndicator();        return true;    }    QAction *action = d->actionList().first();    if (!action || action->menu() || m_toolBar->actions().contains(action) || !Utils::isObjectAncestorOf(formWindow()->mainContainer(), action)) {        event->ignore();        hideDragIndicator();        return true;    }    d->accept(event);    adjustDragIndicator(event->pos());    return true;}bool ToolBarEventFilter::handleDragLeaveEvent(QDragLeaveEvent *){    hideDragIndicator();    return false;}bool ToolBarEventFilter::handleDropEvent(QDropEvent *event){    const ActionRepositoryMimeData *d = qobject_cast<const ActionRepositoryMimeData*>(event->mimeData());    if (!d)        return false;    if (d->actionList().isEmpty()) {        event->ignore();        hideDragIndicator();        return true;    }    QAction *action = d->actionList().first();    const ActionList actions = m_toolBar->actions();    if (!action || actions.contains(action)) {        event->ignore();        hideDragIndicator();        return true;    }    event->acceptProposedAction();    int index = findAction(event->pos());    index = qMin(index, actions.count() - 1);    QDesignerFormWindowInterface *fw = formWindow();    InsertActionIntoCommand *cmd = new InsertActionIntoCommand(fw);    cmd->init(m_toolBar, action, actions.at(index));    fw->commandHistory()->push(cmd);    hideDragIndicator();    return true;}void ToolBarEventFilter::startDrag(const QPoint &pos, Qt::KeyboardModifiers modifiers){    const int index = findAction(pos);    const ActionList actions = m_toolBar->actions();    if (index == actions.count() - 1)        return;    QAction *action = actions.at(index);    QDesignerFormWindowInterface *fw = formWindow();    const Qt::DropAction dropAction = (modifiers & Qt::ControlModifier) ? Qt::CopyAction : Qt::MoveAction;    if (dropAction == Qt::MoveAction) {        RemoveActionFromCommand *cmd = new RemoveActionFromCommand(fw);        cmd->init(m_toolBar, action, actions.at(index + 1));        fw->commandHistory()->push(cmd);    }    QDrag *drag = new QDrag(m_toolBar);    drag->setPixmap(ActionRepositoryMimeData::actionDragPixmap( action));    drag->setMimeData(new ActionRepositoryMimeData(action, dropAction));    if (drag->start(dropAction) == Qt::IgnoreAction) {        hideDragIndicator();        if (dropAction == Qt::MoveAction) {            QAction *previous = m_toolBar->actions().at(index);            InsertActionIntoCommand *cmd = new InsertActionIntoCommand(fw);            cmd->init(m_toolBar, action, previous);            fw->commandHistory()->push(cmd);        }    }}int ToolBarEventFilter::actionIndexAt(const QToolBar *tb, const QPoint &pos){    const ActionList actionList = tb->actions();    if (const  int size = actionList.size()) {        for (int  i = 0; i < size; i++) {            QRect g = tb->actionGeometry(actionList.at(i));            g.setTopLeft(QPoint(0, 0));            if (g.contains(pos))                return i;        }    }    return -1;}QAction *ToolBarEventFilter::actionAt(const QToolBar *tb, const QPoint &pos){    const int index = actionIndexAt(tb, pos);    if (index == -1)        return 0;    return tb->actions().at(index);}bool ToolBarEventFilter::withinHandleArea(const QToolBar *tb, const QPoint &pos){    if (QToolBarLayout *tbl = qobject_cast<QToolBarLayout *>(tb->layout()))        return tbl->handleRect().contains(pos);    return false;}// ------------------- SentinelActionSentinelAction::SentinelAction(QWidget *widget)    : QAction(widget){    setSeparator(true);}SentinelAction::~SentinelAction(){}// ------------------- SentinelSentinel::Sentinel(QWidget *widget)    : QToolButton(widget){    setObjectName(QString::fromUtf8("__qt__passive_new"));    setText(QLatin1String(">>"));    setToolButtonStyle(Qt::ToolButtonTextOnly);    setToolTip(tr("New Tool Bar"));}Sentinel::~Sentinel(){}}

⌨️ 快捷键说明

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