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

📄 hierarchyview.cpp

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000 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.**** 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.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "hierarchyview.h"#include "formwindow.h"#include "globaldefs.h"#include "mainwindow.h"#include "command.h"#include "widgetfactory.h"#include "widgetdatabase.h"#include "pixmapchooser.h"#include <qpalette.h>#include <qobjectlist.h>#include <qheader.h>#include <qpopupmenu.h>#include <qtabwidget.h>#include <qwizard.h>#include <qwidgetstack.h>#include <qtabbar.h>HierarchyItem::HierarchyItem( QListViewItem *parent, const QString &txt1, const QString &txt2 )    : QListViewItem( parent, txt1, txt2 ){}HierarchyItem::HierarchyItem( QListView *parent, const QString &txt1, const QString &txt2 )    : QListViewItem( parent, txt1, txt2 ){}void HierarchyItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align ){    QColorGroup g( cg );    g.setColor( QColorGroup::Base, backgroundColor() );    g.setColor( QColorGroup::Foreground, Qt::black );    g.setColor( QColorGroup::Text, Qt::black );    QListViewItem::paintCell( p, g, column, width, align );    p->save();    p->setPen( QPen( cg.dark(), 1 ) );    if ( column == 0 )	p->drawLine( 0, 0, 0, height() - 1 );    if ( listView()->firstChild() != this ) {	if ( nextSibling() != itemBelow() && itemBelow()->depth() < depth() ) {	    int d = depth() - itemBelow()->depth();	    p->drawLine( -listView()->treeStepSize() * d, height() - 1, 0, height() - 1 );	}    }    p->drawLine( 0, height() - 1, width, height() - 1 );    p->drawLine( width - 1, 0, width - 1, height() );    p->restore();}QColor HierarchyItem::backgroundColor(){    updateBackColor();    return backColor;}void HierarchyItem::updateBackColor(){    if ( listView()->firstChild() == this ) { 	backColor = backColor1;	return;    }    QListViewItemIterator it( this );    --it;    if ( it.current() ) {	if ( ( ( HierarchyItem*)it.current() )->backColor == backColor1 )	    backColor = backColor2;	else	    backColor = backColor1;    } else {	backColor == backColor1;    }}void HierarchyItem::setWidget( QWidget *w ){    wid = w;}QWidget *HierarchyItem::widget() const{    return wid;}HierarchyList::HierarchyList( QWidget *parent, HierarchyView *view )    : QListView( parent ), hierarchyView( view ){    normalMenu = 0;    tabWidgetMenu = 0;    addColumn( tr( "Name" ) );    addColumn( tr( "Class" ) );    setRootIsDecorated( TRUE );    QPalette p( palette() );    p.setColor( QColorGroup::Base, QColor( backColor2 ) );    setPalette( p );    disconnect( header(), SIGNAL( sectionClicked( int ) ),		this, SLOT( changeSortColumn( int ) ) );    setSorting( -1 );    setHScrollBarMode( AlwaysOff );    connect( header(), SIGNAL( sizeChange( int, int, int ) ),	     this, SLOT( updateHeader() ) );    connect( this, SIGNAL( clicked( QListViewItem * ) ),	     this, SLOT( objectClicked( QListViewItem * ) ) );    connect( this, SIGNAL( returnPressed( QListViewItem * ) ),	     this, SLOT( objectClicked( QListViewItem * ) ) );    connect( this, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint&, int ) ),	     this, SLOT( showRMBMenu( QListViewItem *, const QPoint & ) ) );    deselect = TRUE;}void HierarchyList::keyPressEvent( QKeyEvent *e ){    if ( e->key() == Key_Shift || e->key() == Key_Control )	deselect = FALSE;    else	deselect = TRUE;    QListView::keyPressEvent( e );}void HierarchyList::keyReleaseEvent( QKeyEvent *e ){    deselect = TRUE;    QListView::keyReleaseEvent( e );}void HierarchyList::viewportMousePressEvent( QMouseEvent *e ){    if ( e->state() & ShiftButton || e->state() & ControlButton )	deselect = FALSE;    else	deselect = TRUE;    QListView::viewportMousePressEvent( e );}void HierarchyList::viewportMouseReleaseEvent( QMouseEvent *e ){    QListView::viewportMouseReleaseEvent( e );}void HierarchyList::objectClicked( QListViewItem *i ){    if ( !i )	return;    QWidget *w = findWidget( i );    if ( !w )	return;    if ( hierarchyView->formWindow() == w ) {	if ( deselect )	    hierarchyView->formWindow()->clearSelection( FALSE );	hierarchyView->formWindow()->emitShowProperties( hierarchyView->formWindow() );	return;    }    if ( !hierarchyView->formWindow()->widgets()->find( w ) ) {	if ( w->parent() && w->parent()->inherits( "QWidgetStack" ) &&	     w->parent()->parent() &&	     ( w->parent()->parent()->inherits( "QTabWidget" ) ||	       w->parent()->parent()->inherits( "QWizard" ) ) ) {	    if ( w->parent()->parent()->inherits( "QTabWidget" ) )		( (QTabWidget*)w->parent()->parent() )->showPage( w );	    else		( (QDesignerWizard*)w->parent()->parent() )->setCurrentPage( ( (QDesignerWizard*)w->parent()->parent() )->pageNum( w ) );	    w = (QWidget*)w->parent()->parent();	    hierarchyView->formWindow()->emitUpdateProperties( hierarchyView->formWindow()->currentWidget() );	} else {	    return;	}    }    if ( deselect )	hierarchyView->formWindow()->clearSelection( FALSE );    if ( w->isVisibleTo( hierarchyView->formWindow() ) )	hierarchyView->formWindow()->selectWidget( w, TRUE );}QWidget *HierarchyList::findWidget( QListViewItem *i ){	    return ( (HierarchyItem*)i )->widget();}QListViewItem *HierarchyList::findItem( QWidget *w ){    QListViewItemIterator it( this );    while ( it.current() ) {	if ( ( (HierarchyItem*)it.current() )->widget() == w )	    return it.current();	++it;    }    return 0;}QWidget *HierarchyList::current() const{    if ( currentItem() )	return ( (HierarchyItem*)currentItem() )->widget();    return 0;}void HierarchyList::changeNameOf( QWidget *w, const QString &name ){    QListViewItem *item = findItem( w );    if ( !item )	return;    item->setText( 0, name );}void HierarchyList::resizeEvent( QResizeEvent *e ){    QListView::resizeEvent( e );    QSize vs = viewportSize( 0, contentsHeight() );    int os = header()->sectionSize( 1 );    int ns = vs.width() - header()->sectionSize( 0 );    if ( ns < 16 )	ns = 16;	    header()->resizeSection( 1, ns );    header()->repaint( header()->width() - header()->sectionSize( 1 ), 0, header()->sectionSize( 1 ), header()->height() );    int elipsis = fontMetrics().width("...") + 10;    viewport()->repaint( header()->sectionPos(1) + os - elipsis, 0, elipsis, viewport()->height(), FALSE );}void HierarchyList::setup(){    clear();    QWidget *w = hierarchyView->formWindow()->mainContainer();    if ( w )	insertObject( w, 0 );    updateHeader();}void HierarchyList::setOpen( QListViewItem *i, bool b ){    QListView::setOpen( i, b );}void HierarchyList::updateHeader(){    QSize s( header()->sectionPos(1) + header()->sectionSize(1), height() );    QResizeEvent e( s, size() );    resizeEvent( &e );    viewport()->repaint( s.width(), 0, width() - s.width(), height(), FALSE );}void HierarchyList::insertObject( QObject *o, QListViewItem *parent ){    QListViewItem *item = 0;    QString className = WidgetFactory::classNameOf( o );    if ( o->inherits( "QLayoutWidget" ) ) {	switch ( WidgetFactory::layoutType( (QWidget*)o ) ) {	case WidgetFactory::HBox:	    className = "HBox";	    break;	case WidgetFactory::VBox:	    className = "VBox";	    break;	case WidgetFactory::Grid:	    className = "Grid";	    break;	default:	    break;	}    }    QString name = o->name();    if ( o->parent() && o->parent()->inherits( "QWidgetStack" ) &&	 o->parent()->parent() ) {	if ( o->parent()->parent()->inherits( "QTabWidget" ) )	    name = ( (QTabWidget*)o->parent()->parent() )->tabLabel( (QWidget*)o );	else if ( o->parent()->parent()->inherits( "QWizard" ) )	    name = ( (QWizard*)o->parent()->parent() )->title( (QWidget*)o );    }    if ( !parent )	item = new HierarchyItem( this, name, className );    else	item = new HierarchyItem( parent, name, className );    if ( !parent ) 	item->setPixmap( 0, PixmapChooser::loadPixmap( "form.xpm", PixmapChooser::Mini ) );    else if ( o->inherits( "QLayoutWidget") ) 	item->setPixmap( 0, PixmapChooser::loadPixmap( "layout.xpm", PixmapChooser::Small ) );    else	item->setPixmap( 0, WidgetDatabase::iconSet( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( o ) ) ).			 pixmap( QIconSet::Small, QIconSet::Normal ) );    ( (HierarchyItem*)item )->setWidget( (QWidget*)o );    const QObjectList *l = o->children();    if ( !l )	return;    QObjectListIt it( *l );    it.toLast();    for ( ; it.current(); --it ) {	if ( !it.current()->isWidgetType() || ( (QWidget*)it.current() )->isHidden() )	    continue;	if (  !hierarchyView->formWindow()->widgets()->find( (QWidget*)it.current() ) ) {	    if ( it.current()->parent() &&		 ( it.current()->parent()->inherits( "QTabWidget" ) ||		   it.current()->parent()->inherits( "QWizard" ) ) &&		 it.current()->inherits( "QWidgetStack" ) ) {		QObject *obj = it.current();		QObjectList *l2 = obj->queryList( "QWidget", 0, TRUE, FALSE );		QDesignerTabWidget *tw = 0;		QDesignerWizard *dw = 0;		if ( it.current()->parent()->inherits( "QTabWidget" ) )		    tw = (QDesignerTabWidget*)it.current()->parent();		if ( it.current()->parent()->inherits( "QWizard" ) )		    dw = (QDesignerWizard*)it.current()->parent();		QWidgetStack *stack = (QWidgetStack*)obj;		for ( obj = l2->last(); obj; obj = l2->prev() ) {		    if ( qstrcmp( obj->className(), "QWidgetStackPrivate::Invisible" ) == 0 ||			 ( tw && !tw->tabBar()->tab( stack->id( (QWidget*)obj ) ) ) ||			 ( dw && dw->isPageRemoved( (QWidget*)obj ) ) )			continue;		    insertObject( obj, item );		}		delete l2;	    }	    continue;	}	insertObject( it.current(), item );    }    if ( item->firstChild() )	item->setOpen( TRUE );}void HierarchyList::setCurrent( QWidget *w ){    QListViewItemIterator it( this );    while ( it.current() ) {	if ( ( (HierarchyItem*)it.current() )->widget() == w ) {	    blockSignals( TRUE );	    setCurrentItem( it.current() );	    ensureItemVisible( it.current() );	    blockSignals( FALSE );	    return;	}	++it;    }}void HierarchyList::showRMBMenu( QListViewItem *i, const QPoint & p ){    if ( !i )	return;    QWidget *w = findWidget( i );    if ( !w )	return;    if ( w != hierarchyView->formWindow() &&	 !hierarchyView->formWindow()->widgets()->find( w ) )	return;    if ( w->isVisibleTo( hierarchyView->formWindow() ) ) {	if ( !w->inherits( "QTabWidget" ) && !w->inherits( "QWizard" ) ) {	    if ( !normalMenu )		normalMenu = hierarchyView->formWindow()->mainWindow()->setupNormalHierarchyMenu( this );	    normalMenu->popup( p );	} else {	    if ( !tabWidgetMenu )		tabWidgetMenu =		    hierarchyView->formWindow()->mainWindow()->setupTabWidgetHierarchyMenu( this, SLOT( addTabPage() ),											  SLOT( removeTabPage() ) );	    tabWidgetMenu->popup( p );	}    }}void HierarchyList::addTabPage(){    QWidget *w = current();    if ( !w )	return;    if ( w->inherits( "QTabWidget" ) ) {	QTabWidget *tw = (QTabWidget*)w;	AddTabPageCommand *cmd = new AddTabPageCommand( tr( "Add Page to %1" ).arg( tw->name() ), hierarchyView->formWindow(),							tw, "Tab" );	hierarchyView->formWindow()->commandHistory()->addCommand( cmd );	cmd->execute();    } else if ( w->inherits( "QWizard" ) ) {	QWizard *wiz = (QWizard*)hierarchyView->formWindow()->mainContainer();	AddWizardPageCommand *cmd = new AddWizardPageCommand( tr( "Add Page to %1" ).arg( wiz->name() ), hierarchyView->formWindow(),							      wiz, "Page" );	hierarchyView->formWindow()->commandHistory()->addCommand( cmd );	cmd->execute();    }}void HierarchyList::removeTabPage(){    QWidget *w = current();    if ( !w )	return;    if ( w->inherits( "QTabWidget" ) ) {	QTabWidget *tw = (QTabWidget*)w;	if ( tw->currentPage() ) {	    QDesignerTabWidget *dtw = (QDesignerTabWidget*)tw;	    DeleteTabPageCommand *cmd = new DeleteTabPageCommand( tr( "Remove Page %1 of %2" ).								  arg( dtw->pageTitle() ).arg( tw->name() ),								  hierarchyView->formWindow(), tw, tw->currentPage() );	    hierarchyView->formWindow()->commandHistory()->addCommand( cmd );	    cmd->execute();	}    } else if ( w->inherits( "QWizard" ) ) {	QWizard *wiz = (QWizard*)hierarchyView->formWindow()->mainContainer();	if ( wiz->currentPage() ) {	    QDesignerWizard *dw = (QDesignerWizard*)wiz;	    DeleteWizardPageCommand *cmd = new DeleteWizardPageCommand( tr( "Remove Page %1 of %2" ).									arg( dw->pageTitle() ).arg( wiz->name() ),									hierarchyView->formWindow(), wiz,									wiz->currentPage() );	    hierarchyView->formWindow()->commandHistory()->addCommand( cmd );	    cmd->execute();	}    }}HierarchyView::HierarchyView( QWidget *parent )    : QVBox( parent, 0, WStyle_Customize | WStyle_NormalBorder | WStyle_Title |	     WStyle_Tool |WStyle_MinMax | WStyle_SysMenu ){    setIcon( PixmapChooser::loadPixmap( "logo" ) );    listview = new HierarchyList( this, this );    formwindow = 0;}void HierarchyView::setFormWindow( FormWindow *fw, QWidget *w ){    if ( fw == 0 || w == 0 ) {	listview->clear();	formwindow = 0;    }    if ( fw == formwindow ) {	listview->setCurrent( w );	return;    }    formwindow = fw;    listview->setup();    listview->setCurrent( w );}FormWindow *HierarchyView::formWindow() const{    return formwindow;}void HierarchyView::closeEvent( QCloseEvent *e ){    emit hidden();    e->accept();}void HierarchyView::widgetInserted( QWidget * ){    listview->setup();}void HierarchyView::widgetRemoved( QWidget * ){    listview->setup();}void HierarchyView::widgetsInserted( const QWidgetList & ){    listview->setup();}void HierarchyView::widgetsRemoved( const QWidgetList & ){    listview->setup();}void HierarchyView::namePropertyChanged( QWidget *w, const QVariant & ){    listview->changeNameOf( w, w->name() );}void HierarchyView::tabsChanged( QTabWidget * ){    listview->setup();}void HierarchyView::pagesChanged( QWizard * ){    listview->setup();}void HierarchyView::rebuild(){    listview->setup();}void HierarchyView::closed( FormWindow *fw ){    if ( fw == formwindow )	listview->clear();}

⌨️ 快捷键说明

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