buddyeditor.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 352 行
CPP
352 行
/******************************************************************************** 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::BuddyEditor*/#include "buddyeditor.h"#include <QtDesigner/QDesignerFormWindowInterface>#include <QtDesigner/QDesignerPropertySheetExtension>#include <QtDesigner/QDesignerFormEditorInterface>#include <QtDesigner/QExtensionManager>#include <qdesigner_command_p.h>#include <qdesigner_propertycommand_p.h>#include <qdesigner_utils_p.h>#include <qlayout_widget_p.h>#include <connectionedit_p.h>#include <QtCore/qdebug.h>#include <QtGui/QLabel>namespace { bool canBeBuddy(QWidget *w, QDesignerFormWindowInterface *form) { if (qobject_cast<const QLayoutWidget*>(w) || w == form->mainContainer() || w->isHidden()) return false; QExtensionManager *ext = form->core()->extensionManager(); if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(ext, w)) { const int index = sheet->indexOf(QLatin1String("focusPolicy")); if (index != -1) { bool ok = false; const Qt::FocusPolicy q = static_cast<Qt::FocusPolicy>(qdesigner_internal::Utils::valueOf(sheet->property(index), &ok)); return ok && q != Qt::NoFocus; } } return false; } QString buddy(QLabel *label, QDesignerFormEditorInterface *core) { QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core->extensionManager(), label); if (sheet == 0) return QString(); const int prop_idx = sheet->indexOf(QLatin1String("buddy")); if (prop_idx == -1) return QString(); return sheet->property(prop_idx).toString(); } typedef QList<QLabel*> LabelList;}namespace qdesigner_internal {/********************************************************************************* BuddyEditor*/BuddyEditor::BuddyEditor(QDesignerFormWindowInterface *form, QWidget *parent) : ConnectionEdit(parent, form), m_formWindow(form), m_updating(false){}QWidget *BuddyEditor::widgetAt(const QPoint &pos) const{ QWidget *w = ConnectionEdit::widgetAt(pos); while (w != 0 && !m_formWindow->isManaged(w)) w = w->parentWidget(); if (!w) return w; if (state() == Editing) { QLabel *label = qobject_cast<QLabel*>(w); if (label == 0) return 0; const int cnt = connectionCount(); for (int i = 0; i < cnt; ++i) { Connection *con = connection(i); if (con->widget(EndPoint::Source) == w) return 0; } } else { if (!canBeBuddy(w, m_formWindow)) return 0; } return w;}Connection *BuddyEditor::createConnection(QWidget *source, QWidget *destination){ return new Connection(this, source, destination);}QDesignerFormWindowInterface *BuddyEditor::formWindow() const{ return m_formWindow;}void BuddyEditor::updateBackground(){ if (m_updating || background() == 0) return; ConnectionEdit::updateBackground(); m_updating = true; QList<Connection *> newList; const LabelList label_list = qFindChildren<QLabel*>(background()); foreach (QLabel *label, label_list) { const QString buddy_name = buddy(label, m_formWindow->core()); if (buddy_name.isEmpty()) continue; const QList<QWidget *> targets = qFindChildren<QWidget*>(background(), buddy_name); if (targets.isEmpty()) continue; QWidget *target = 0; QListIterator<QWidget *> it(targets); while (it.hasNext()) { QWidget *widget = it.next(); if (widget && !widget->isHidden()) { target = widget; break; } } if (target == 0) continue; Connection *con = new Connection(this); con->setEndPoint(EndPoint::Source, label, widgetRect(label).center()); con->setEndPoint(EndPoint::Target, target, widgetRect(target).center()); newList.append(con); } QList<Connection *> toRemove; const int c = connectionCount(); for (int i = 0; i < c; i++) { Connection *con = connection(i); QObject *source = con->object(EndPoint::Source); QObject *target = con->object(EndPoint::Target); bool found = false; QListIterator<Connection *> it(newList); while (it.hasNext()) { Connection *newConn = it.next(); if (newConn->object(EndPoint::Source) == source && newConn->object(EndPoint::Target) == target) { found = true; break; } } if (found == false) toRemove.append(con); } if (!toRemove.isEmpty()) { DeleteConnectionsCommand command(this, toRemove); command.redo(); foreach (Connection *con, toRemove) { if (m_con_list.contains(con)) { m_con_list.removeAll(con); delete con; } } } QListIterator<Connection *> it(newList); while (it.hasNext()) { Connection *newConn = it.next(); bool found = false; const int c = connectionCount(); for (int i = 0; i < c; i++) { Connection *con = connection(i); if (con->object(EndPoint::Source) == newConn->object(EndPoint::Source) && con->object(EndPoint::Target) == newConn->object(EndPoint::Target)) { found = true; break; } } if (found == false) { AddConnectionCommand command(this, newConn); command.redo(); } else { delete newConn; } } m_updating = false;}void BuddyEditor::setBackground(QWidget *background){ clear(); ConnectionEdit::setBackground(background); const LabelList label_list = qFindChildren<QLabel*>(background); foreach (QLabel *label, label_list) { const QString buddy_name = buddy(label, m_formWindow->core()); if (buddy_name.isEmpty()) continue; QWidget *target = qFindChild<QWidget*>(background, buddy_name); if (target == 0) continue; Connection *con = new Connection(this); con->setEndPoint(EndPoint::Source, label, widgetRect(label).center()); con->setEndPoint(EndPoint::Target, target, widgetRect(target).center()); addConnection(con); }}void BuddyEditor::endConnection(QWidget *target, const QPoint &pos){ Q_ASSERT(m_tmp_con != 0); m_tmp_con->setEndPoint(EndPoint::Target, target, pos); QWidget *source = m_tmp_con->widget(EndPoint::Source); Q_ASSERT(source != 0); Q_ASSERT(target != 0); setEnabled(false); Connection *new_con = createConnection(source, target); setEnabled(true); if (new_con != 0) { new_con->setEndPoint(EndPoint::Source, source, m_tmp_con->endPointPos(EndPoint::Source)); new_con->setEndPoint(EndPoint::Target, target, m_tmp_con->endPointPos(EndPoint::Target)); selectNone(); m_con_list.append(new_con); QWidget *source = new_con->widget(EndPoint::Source); QWidget *target = new_con->widget(EndPoint::Target); if (qobject_cast<QLabel*>(source) == 0) { qDebug("BuddyEditor::endConnection(): not a label"); } else { undoStack()->beginMacro(tr("Add buddy")); SetPropertyCommand *command = new SetPropertyCommand(formWindow()); command->init(source, QLatin1String("buddy"), target->objectName()); undoStack()->push(command); undoStack()->endMacro(); } setSelected(new_con, true); } delete m_tmp_con; m_tmp_con = 0; findObjectsUnderMouse(mapFromGlobal(QCursor::pos()));}void BuddyEditor::widgetRemoved(QWidget *widget){ QList<QWidget*> child_list = qFindChildren<QWidget*>(widget); child_list.prepend(widget); ConnectionSet remove_set; foreach (QWidget *w, child_list) { foreach (Connection *con, m_con_list) { if (con->widget(EndPoint::Source) == w || con->widget(EndPoint::Target) == w) remove_set.insert(con, con); } } if (!remove_set.isEmpty()) { undoStack()->beginMacro(tr("Remove buddies")); foreach (Connection *con, remove_set) { setSelected(con, false); con->update(); QWidget *source = con->widget(EndPoint::Source); if (qobject_cast<QLabel*>(source) == 0) { qDebug("BuddyConnection::widgetRemoved(): not a label"); } else { ResetPropertyCommand *command = new ResetPropertyCommand(formWindow()); command->init(source, QLatin1String("buddy")); undoStack()->push(command); } if (m_con_list.contains(con)) { m_con_list.removeAll(con); delete con; } } undoStack()->endMacro(); }}void BuddyEditor::deleteSelected(){ if (m_sel_con_set.isEmpty()) return; if (!m_sel_con_set.isEmpty()) { undoStack()->beginMacro(tr("Remove buddies")); foreach (Connection *con, m_sel_con_set) { setSelected(con, false); con->update(); QWidget *source = con->widget(EndPoint::Source); if (qobject_cast<QLabel*>(source) == 0) { qDebug("BuddyConnection::deleteSelected(): not a label"); } else { ResetPropertyCommand *command = new ResetPropertyCommand(formWindow()); command->init(source, QLatin1String("buddy")); undoStack()->push(command); } if (m_con_list.contains(con)) { m_con_list.removeAll(con); delete con; } } undoStack()->endMacro(); }}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?