📄 qdesigner_menubar.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 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://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** 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_menubar_p.h"#include "qdesigner_menu_p.h"#include "qdesigner_toolbar_p.h"#include "qdesigner_command_p.h"#include "actionrepository_p.h"#include "actionprovider_p.h"#include "actioneditor_p.h"#include "qdesigner_utils_p.h"#include <QtDesigner/QtDesigner>#include <QtCore/QTimer>#include <QtCore/qdebug.h>#include <QtGui/QAction>#include <QtGui/QApplication>#include <QtGui/QMenu>#include <QtGui/QToolButton>#include <QtGui/QDrag>#include <QtGui/QLayout>#include <QtGui/QLineEdit>#include <QtGui/QPainter>#include <QtGui/qevent.h>Q_DECLARE_METATYPE(QAction*)Q_DECLARE_METATYPE(QListWidgetItem*)using namespace qdesigner_internal;namespace qdesigner_internal{/////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialMenuAction::SpecialMenuAction(QObject *parent) : QAction(parent){}SpecialMenuAction::~SpecialMenuAction(){}} // namespace qdesigner_internal/////////////////////////////////////////////////////////////////////////////////////////////////////////QDesignerMenuBar::QDesignerMenuBar(QWidget *parent) : QMenuBar(parent), m_interactive(true){ m_currentIndex = 0; m_lastMenuActionIndex = -1; m_dragging = false; setContextMenuPolicy(Qt::DefaultContextMenu); setAcceptDrops(true); // ### fake m_addMenu = new SpecialMenuAction(this); m_addMenu->setText(tr("Type Here")); addAction(m_addMenu); QFont italic; italic.setItalic(true); m_addMenu->setFont(italic); m_editor = new QLineEdit(this); m_editor->setObjectName("__qt__passive_editor"); m_editor->hide(); m_editor->installEventFilter(this); qApp->installEventFilter(this);}QDesignerMenuBar::~QDesignerMenuBar(){}void QDesignerMenuBar::paintEvent(QPaintEvent *event){ QMenuBar::paintEvent(event); QPainter p(this); foreach (QAction *a, actions()) { if (qobject_cast<SpecialMenuAction*>(a)) { QRect g = actionGeometry(a); QLinearGradient lg(g.left(), g.top(), g.left(), g.bottom()); lg.setColorAt(0.0, Qt::transparent); lg.setColorAt(0.7, QColor(0, 0, 0, 32)); lg.setColorAt(1.0, Qt::transparent); p.fillRect(g, lg); } } QAction *action = currentAction(); if (m_dragging || !action) return; if (hasFocus()) { QRect g = actionGeometry(action); QDesignerMenu::drawSelection(&p, g.adjusted(1, 1, -1, -1)); } else if (action->menu() && action->menu()->isVisible()) { QRect g = actionGeometry(action); p.drawRect(g.adjusted(1, 1, -1, -1)); }}bool QDesignerMenuBar::handleEvent(QWidget *widget, QEvent *event){ if (!formWindow()) return false; if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) update(); switch (event->type()) { default: break; case QEvent::MouseButtonDblClick: return handleMouseDoubleClickEvent(widget, static_cast<QMouseEvent*>(event)); case QEvent::MouseButtonPress: return handleMousePressEvent(widget, static_cast<QMouseEvent*>(event)); case QEvent::MouseButtonRelease: return handleMouseReleaseEvent(widget, static_cast<QMouseEvent*>(event)); case QEvent::MouseMove: return handleMouseMoveEvent(widget, static_cast<QMouseEvent*>(event)); case QEvent::ContextMenu: return handleContextMenuEvent(widget, static_cast<QContextMenuEvent*>(event)); case QEvent::KeyPress: return handleKeyPressEvent(widget, static_cast<QKeyEvent*>(event)); case QEvent::FocusIn: case QEvent::FocusOut: return widget != m_editor; } return true;}bool QDesignerMenuBar::handleMouseDoubleClickEvent(QWidget *, QMouseEvent *event){ if (!rect().contains(event->pos())) return true; if ((event->buttons() & Qt::LeftButton) != Qt::LeftButton) return true; event->accept(); m_startPosition = QPoint(); m_currentIndex = actionAtPosition(event->pos()); if (m_currentIndex != -1) { showLineEdit(); } return true;}bool QDesignerMenuBar::handleKeyPressEvent(QWidget *, QKeyEvent *e){ if (m_editor->isHidden()) { // In navigation mode switch (e->key()) { case Qt::Key_Delete: if (m_currentIndex == -1 || m_currentIndex >= realActionCount()) break; hideMenu(); deleteMenu(); break; case Qt::Key_Left: e->accept(); moveLeft(e->modifiers() & Qt::ControlModifier); return true; case Qt::Key_Right: e->accept(); moveRight(e->modifiers() & Qt::ControlModifier); return true; // no update case Qt::Key_Up: e->accept(); moveUp(); return true; case Qt::Key_Down: e->accept(); moveDown(); return true; case Qt::Key_PageUp: m_currentIndex = 0; break; case Qt::Key_PageDown: m_currentIndex = actions().count() - 1; break; case Qt::Key_Enter: case Qt::Key_Return: e->accept(); enterEditMode(); return true; // no update case Qt::Key_Alt: case Qt::Key_Shift: case Qt::Key_Control: case Qt::Key_Escape: e->ignore(); setFocus(); // FIXME: this is because some other widget get the focus when CTRL is pressed return true; // no update default: if (!e->text().isEmpty() && e->text().at(0).toLatin1() >= 32) { showLineEdit(); QApplication::sendEvent(m_editor, e); e->accept(); } else { e->ignore(); } return true; } } else { // In edit mode switch (e->key()) { default: return false; case Qt::Key_Control: e->ignore(); return true; case Qt::Key_Enter: case Qt::Key_Return: if (!m_editor->text().isEmpty()) { leaveEditMode(ForceAccept); if (m_lastFocusWidget) m_lastFocusWidget->setFocus(); m_editor->hide(); showMenu(); break; } // fall through case Qt::Key_Escape: update(); setFocus(); break; } } e->accept(); update(); return true;}void QDesignerMenuBar::startDrag(const QPoint &pos){ int index = findAction(pos); if (m_currentIndex == -1 || index >= realActionCount()) return; QAction *action = safeActionAt(index); RemoveActionFromCommand *cmd = new RemoveActionFromCommand(formWindow()); cmd->init(this, action, actions().at(index + 1)); formWindow()->commandHistory()->push(cmd); adjustSize(); hideMenu(index); QDrag *drag = new QDrag(this); drag->setPixmap(action->icon().pixmap(QSize(22, 22))); ActionRepositoryMimeData *data = new ActionRepositoryMimeData(); data->items.append(action); drag->setMimeData(data); int old_index = m_currentIndex; m_currentIndex = -1; if (drag->start() == Qt::IgnoreAction) { InsertActionIntoCommand *cmd = new InsertActionIntoCommand(formWindow()); cmd->init(this, action, safeActionAt(index)); formWindow()->commandHistory()->push(cmd); m_currentIndex = old_index; adjustSize(); }}bool QDesignerMenuBar::handleMousePressEvent(QWidget *, QMouseEvent *event){ m_startPosition = QPoint(); event->accept(); if (event->button() != Qt::LeftButton) return true; m_startPosition = event->pos(); m_currentIndex = actionAtPosition(m_startPosition); update(); return true;}bool QDesignerMenuBar::handleMouseReleaseEvent(QWidget *, QMouseEvent *event){ m_startPosition = QPoint(); if (event->button() != Qt::LeftButton) return true; event->accept(); m_currentIndex = actionAtPosition(event->pos()); if (!m_editor->isVisible() && m_currentIndex != -1 && m_currentIndex < realActionCount()) showMenu(); return true;}bool QDesignerMenuBar::handleMouseMoveEvent(QWidget *, QMouseEvent *event){ if ((event->buttons() & Qt::LeftButton) != Qt::LeftButton) return true; if (m_startPosition.isNull()) return true; QPoint pos = mapFromGlobal(event->globalPos()); if ((pos - m_startPosition).manhattanLength() < qApp->startDragDistance()) return true; int index = actionAtPosition(m_startPosition); if (index < actions().count()) { hideMenu(index); update(); } startDrag(m_startPosition); m_startPosition = QPoint(); return true;}bool QDesignerMenuBar::handleContextMenuEvent(QWidget *, QContextMenuEvent *event){ event->accept(); m_currentIndex = actionAtPosition(mapFromGlobal(event->globalPos())); QAction *action = safeActionAt(m_currentIndex); update(); QMenu menu(this); if (action && !qobject_cast<SpecialMenuAction*>(action)) { QVariant itemData; qVariantSetValue(itemData, action); QAction *remove_action = menu.addAction(tr("Remove Menu '%1'").arg(action->menu()->objectName())); remove_action->setData(itemData); connect(remove_action, SIGNAL(triggered()), this, SLOT(slotRemoveSelectedAction())); menu.addSeparator(); } QAction *remove_menubar = menu.addAction(tr("Remove Menu Bar")); connect(remove_menubar, SIGNAL(triggered()), this, SLOT(slotRemoveMenuBar())); menu.exec(event->globalPos()); return true;}void QDesignerMenuBar::slotRemoveMenuBar(){ Q_ASSERT(formWindow() != 0); QDesignerFormWindowInterface *fw = formWindow(); DeleteMenuBarCommand *cmd = new DeleteMenuBarCommand(fw); cmd->init(this); fw->commandHistory()->push(cmd);}void QDesignerMenuBar::slotRemoveSelectedAction(){ QAction *action = qobject_cast<QAction*>(sender()); if (!action) return; QAction *a = qvariant_cast<QAction*>(action->data()); if (qobject_cast<SpecialMenuAction*>(a)) return; // nothing to do int pos = actions().indexOf(a); QAction *action_before = 0; if (pos != -1) action_before = safeActionAt(pos + 1); RemoveActionFromCommand *cmd = new RemoveActionFromCommand(formWindow()); cmd->init(this, a, action_before); formWindow()->commandHistory()->push(cmd);}void QDesignerMenuBar::focusOutEvent(QFocusEvent *event){ QMenuBar::focusOutEvent(event);}QAction *QDesignerMenuBar::createAction(const QString &name){ Q_ASSERT(formWindow() != 0); QDesignerFormWindowInterface *fw = formWindow(); QDesignerFormEditorInterface *core = fw->core(); QMenu *menu = qobject_cast<QMenu*>(core->widgetFactory()->createWidget("QMenu", this)); core->widgetFactory()->initialize(menu); menu->setObjectName(name); menu->setTitle(tr("Menu")); fw->ensureUniqueObjectName(menu); QAction *menuAction = menu->menuAction(); AddMenuActionCommand *cmd = new AddMenuActionCommand(formWindow()); cmd->init(menuAction, this); formWindow()->commandHistory()->push(cmd); return menuAction;}void QDesignerMenuBar::enterEditMode(){ if (m_currentIndex >= 0 && m_currentIndex <= realActionCount()) { showLineEdit();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -