⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 actiondnd.cpp

📁 Trolltech公司发布的基于C++图形开发环境
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of Qt Designer.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition** licenses may use this file in accordance with the Qt Commercial License** Agreement provided with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for**   information about Qt Commercial License Agreements.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "actiondnd.h"#include "command.h"#include "defs.h"#include "formwindow.h"#include "mainwindow.h"#include "metadatabase.h"#include "widgetfactory.h"#include "hierarchyview.h"#include <qaction.h>#include <qapplication.h>#include <qbitmap.h>#include <qdragobject.h>#include <qinputdialog.h>#include <qlayout.h>#include <qmainwindow.h>#include <qmenudata.h>#include <qmessagebox.h>#include <qobjectlist.h>#include <qpainter.h>#include <qstyle.h>#include <qtimer.h>QAction *ActionDrag::the_action = 0;ActionDrag::ActionDrag(QAction *action, QWidget *source): QStoredDrag("application/x-designer-actions", source){    Q_ASSERT(the_action == 0);    the_action = action;}ActionDrag::ActionDrag(QActionGroup *group, QWidget *source): QStoredDrag("application/x-designer-actiongroup", source){    Q_ASSERT(the_action == 0);    the_action = group;}ActionDrag::ActionDrag(const QString &type, QAction *action, QWidget *source): QStoredDrag(type, source){    Q_ASSERT(the_action == 0);    the_action = action;}bool ActionDrag::canDecode(QDropEvent *e){    return e->provides( "application/x-designer-actions" ) ||	   e->provides( "application/x-designer-actiongroup" ) ||	   e->provides( "application/x-designer-separator" );}ActionDrag::~ActionDrag(){    the_action = 0;}void QDesignerAction::init(){    MetaDataBase::addEntry( this );    int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) );    WidgetFactory::saveDefaultProperties( this, id );    WidgetFactory::saveChangedProperties( this, id );}void QDesignerActionGroup::init(){    MetaDataBase::addEntry( this );    int id = WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( this ) );    WidgetFactory::saveDefaultProperties( this, id );    WidgetFactory::saveChangedProperties( this, id );}bool QDesignerAction::addTo( QWidget *w ){    if ( !widgetToInsert )	return QAction::addTo( w );    if ( ::qt_cast<QPopupMenu*>(w) )	return FALSE;    widgetToInsert->reparent( w, QPoint( 0, 0 ), FALSE );    widgetToInsert->show();    addedTo( widgetToInsert, w );    return TRUE;}bool QDesignerAction::removeFrom( QWidget *w ){    if ( !widgetToInsert )	return QAction::removeFrom( w );    remove();    return TRUE;}void QDesignerAction::remove(){    if ( !widgetToInsert )	return;    MainWindow::self->formWindow()->selectWidget( widgetToInsert, FALSE );    widgetToInsert->reparent( 0, QPoint( 0, 0 ), FALSE );}class QDesignerIndicatorWidget : public QWidget{    Q_OBJECTpublic:    QDesignerIndicatorWidget( QWidget *p )	: QWidget( p, "qt_dockwidget_internal" ) {	    setBackgroundColor( red );    }};QDesignerToolBarSeparator::QDesignerToolBarSeparator(Orientation o , QToolBar *parent,                                     const char* name )    : QWidget( parent, name ){    connect( parent, SIGNAL(orientationChanged(Orientation)),             this, SLOT(setOrientation(Orientation)) );    setOrientation( o );    setBackgroundMode( parent->backgroundMode() );    setBackgroundOrigin( ParentOrigin );    setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) );}void QDesignerToolBarSeparator::setOrientation( Orientation o ){    orient = o;}void QDesignerToolBarSeparator::styleChange( QStyle& ){    setOrientation( orient );}QSize QDesignerToolBarSeparator::sizeHint() const{    int extent = style().pixelMetric( QStyle::PM_DockWindowSeparatorExtent,				      this );    if ( orient == Horizontal )	return QSize( extent, 0 );    else	return QSize( 0, extent );}void QDesignerToolBarSeparator::paintEvent( QPaintEvent * ){    QPainter p( this );    QStyle::SFlags flags = QStyle::Style_Default;    if ( orientation() == Horizontal )	flags |= QStyle::Style_Horizontal;    style().drawPrimitive( QStyle::PE_DockWindowSeparator, &p, rect(),			   colorGroup(), flags );}QSeparatorAction::QSeparatorAction( QObject *parent )    : QAction( parent, "qt_designer_separator" ), wid( 0 ){}bool QSeparatorAction::addTo( QWidget *w ){    if ( ::qt_cast<QToolBar*>(w) ) {	QToolBar *tb = (QToolBar*)w;	wid = new QDesignerToolBarSeparator( tb->orientation(), tb );	return TRUE;    } else if ( ::qt_cast<QPopupMenu*>(w) ) {	idx = ( (QPopupMenu*)w )->count();	( (QPopupMenu*)w )->insertSeparator( idx );	return TRUE;    }    return FALSE;}bool QSeparatorAction::removeFrom( QWidget *w ){    if ( ::qt_cast<QToolBar*>(w) ) {	delete wid;	return TRUE;    } else if ( ::qt_cast<QPopupMenu*>(w) ) {	( (QPopupMenu*)w )->removeItemAt( idx );	return TRUE;    }    return FALSE;}QWidget *QSeparatorAction::widget() const{    return wid;}QDesignerToolBar::QDesignerToolBar( QMainWindow *mw )    : QToolBar( mw ), lastIndicatorPos( -1, -1 ){    insertAnchor = 0;    afterAnchor = TRUE;    setAcceptDrops( TRUE );    MetaDataBase::addEntry( this );    lastIndicatorPos = QPoint( -1, -1 );    indicator = new QDesignerIndicatorWidget( this );    indicator->hide();    installEventFilter( this );    widgetInserting = FALSE;    findFormWindow();    mw->setDockEnabled( DockTornOff, FALSE );}QDesignerToolBar::QDesignerToolBar( QMainWindow *mw, Dock dock )    : QToolBar( QString::null, mw, dock), lastIndicatorPos( -1, -1 ){    insertAnchor = 0;    afterAnchor = TRUE;    setAcceptDrops( TRUE );    indicator = new QDesignerIndicatorWidget( this );    indicator->hide();    MetaDataBase::addEntry( this );    installEventFilter( this );    widgetInserting = FALSE;    findFormWindow();    mw->setDockEnabled( DockTornOff, FALSE );}void QDesignerToolBar::findFormWindow(){    QWidget *w = this;    while ( w ) {	formWindow = ::qt_cast<FormWindow*>(w);	if ( formWindow )	    break;	w = w->parentWidget();    }}void QDesignerToolBar::addAction( QAction *a ){    actionList.append( a );    connect( a, SIGNAL( destroyed() ), this, SLOT( actionRemoved() ) );    if ( ::qt_cast<QActionGroup*>(a) ) {	( (QDesignerActionGroup*)a )->widget()->installEventFilter( this );	actionMap.insert( ( (QDesignerActionGroup*)a )->widget(), a );    } else if ( ::qt_cast<QSeparatorAction*>(a) ) {	( (QSeparatorAction*)a )->widget()->installEventFilter( this );	actionMap.insert( ( (QSeparatorAction*)a )->widget(), a );    } else {	( (QDesignerAction*)a )->widget()->installEventFilter( this );	actionMap.insert( ( (QDesignerAction*)a )->widget(), a );    }}static void fixObject( QObject *&o ){    while ( o && o->parent() && !::qt_cast<QDesignerToolBar*>(o->parent()) )	o = o->parent();}bool QDesignerToolBar::eventFilter( QObject *o, QEvent *e ){    if ( !o || !e || o->inherits( "QDockWindowHandle" ) || o->inherits( "QDockWindowTitleBar" ) )	return QToolBar::eventFilter( o, e );    if ( o == this && e->type() == QEvent::MouseButtonPress &&	 ( ( QMouseEvent*)e )->button() == LeftButton ) {	mousePressEvent( (QMouseEvent*)e );	return TRUE;    }    if ( o == this )	return QToolBar::eventFilter( o, e );    if ( e->type() == QEvent::MouseButtonPress ) {	QMouseEvent *ke = (QMouseEvent*)e;	fixObject( o );	if ( !o )	    return FALSE;	buttonMousePressEvent( ke, o );	return TRUE;    } else if(e->type() == QEvent::ContextMenu ) {	QContextMenuEvent *ce = (QContextMenuEvent*)e;	fixObject( o );	if( !o )	    return FALSE;	buttonContextMenuEvent( ce, o );	return TRUE;    } else if ( e->type() == QEvent::MouseMove ) {	QMouseEvent *ke = (QMouseEvent*)e;	fixObject( o );	if ( !o )	    return FALSE;	buttonMouseMoveEvent( ke, o );	return TRUE;    } else if ( e->type() == QEvent::MouseButtonRelease ) {	QMouseEvent *ke = (QMouseEvent*)e;	fixObject( o );	if ( !o )	    return FALSE;	buttonMouseReleaseEvent( ke, o );	return TRUE;    } else if ( e->type() == QEvent::DragEnter ) {	QDragEnterEvent *de = (QDragEnterEvent*)e;	if (ActionDrag::canDecode(de))	    de->accept();    } else if ( e->type() == QEvent::DragMove ) {	QDragMoveEvent *de = (QDragMoveEvent*)e;	if (ActionDrag::canDecode(de))	    de->accept();    }    return QToolBar::eventFilter( o, e );}void QDesignerToolBar::paintEvent( QPaintEvent *e ){    QToolBar::paintEvent( e );    if ( e->rect() != rect() )	return;    lastIndicatorPos = QPoint( -1, -1 );}void QDesignerToolBar::contextMenuEvent( QContextMenuEvent *e ){    e->accept();    QPopupMenu menu( 0 );    menu.insertItem( tr( "Delete Toolbar" ), 1 );    int res = menu.exec( e->globalPos() );    if ( res != -1 ) {	RemoveToolBarCommand *cmd = new RemoveToolBarCommand( tr( "Delete Toolbar '%1'" ).arg( name() ),							      formWindow, 0, this );	formWindow->commandHistory()->addCommand( cmd );	cmd->execute();    }}void QDesignerToolBar::mousePressEvent( QMouseEvent *e )

⌨️ 快捷键说明

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