📄 customwidgeteditorimpl.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 "customwidgeteditorimpl.h"#include "defs.h"#include "pixmapchooser.h"#include "mainwindow.h"#include "asciivalidator.h"#include "resource.h"#include "widgetfactory.h"#include "widgetdatabase.h"#include <qlistbox.h>#include <qpushbutton.h>#include <qlineedit.h>#include <qcombobox.h>#include <qspinbox.h>#include <qlabel.h>#include <qmessagebox.h>#include <qfiledialog.h>#include <qmessagebox.h>#include <qtimer.h>#include <qapplication.h>#include <qlistview.h>#include <qfile.h>#include <qtextstream.h>#include <qdom.h>#include <qtextcodec.h>#include <qcheckbox.h>CustomWidgetEditor::CustomWidgetEditor( QWidget *parent, MainWindow *mw ) : CustomWidgetEditorBase( parent, 0, TRUE ), mainWindow( mw ){ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) ); checkTimer = new QTimer( this ); connect( checkTimer, SIGNAL( timeout() ), this, SLOT( checkWidgetName() ) ); editClass->setEnabled( FALSE ); editHeader->setEnabled( FALSE ); buttonChooseHeader->setEnabled( FALSE ); buttonChoosePixmap->setEnabled( FALSE ); spinWidth->setEnabled( FALSE ); spinHeight->setEnabled( FALSE ); sizeHor->setEnabled( FALSE ); sizeVer->setEnabled( FALSE ); checkContainer->setEnabled( FALSE ); localGlobalCombo->setEnabled( FALSE ); editClass->setValidator( new AsciiValidator( QString(":"), editClass ) ); editSignal->setValidator( new AsciiValidator( TRUE, editSignal ) ); editSlot->setValidator( new AsciiValidator( TRUE, editSignal ) ); editProperty->setValidator( new AsciiValidator( editSignal ) ); editSignal->setEnabled( FALSE ); buttonRemoveSignal->setEnabled( FALSE ); setupDefinition(); setupSignals(); setupSlots(); setupProperties();}void CustomWidgetEditor::setupDefinition(){ QPtrList<MetaDataBase::CustomWidget> *lst = MetaDataBase::customWidgets(); for ( MetaDataBase::CustomWidget *w = lst->first(); w; w = lst->next() ) { QListBoxItem *i; if ( w->pixmap ) i = new QListBoxPixmap( boxWidgets, *w->pixmap, w->className ); else i = new QListBoxText( boxWidgets, w->className ); customWidgets.insert( i, w ); } if ( boxWidgets->firstItem() ) { boxWidgets->setCurrentItem( boxWidgets->firstItem() ); boxWidgets->setSelected( boxWidgets->firstItem(), TRUE ); } oldItem = 0;}void CustomWidgetEditor::setupSignals(){ editSignal->setEnabled( FALSE ); buttonRemoveSignal->setEnabled( FALSE ); MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); if ( !w ) return; listSignals->clear(); for ( QValueList<QCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) listSignals->insertItem( QString( *it ) ); if ( listSignals->firstItem() ) { listSignals->setCurrentItem( listSignals->firstItem() ); listSignals->setSelected( listSignals->firstItem(), TRUE ); }}void CustomWidgetEditor::setupSlots(){ editSlot->setEnabled( FALSE ); comboAccess->setEnabled( FALSE ); buttonRemoveSlot->setEnabled( FALSE ); MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); if ( !w ) return; listSlots->clear(); for ( QValueList<MetaDataBase::Function>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) (void)new QListViewItem( listSlots, (*it).function, (*it).access ); if ( listSlots->firstChild() ) { listSlots->setCurrentItem( listSlots->firstChild() ); listSlots->setSelected( listSlots->firstChild(), TRUE ); }}void CustomWidgetEditor::setupProperties(){ editProperty->setEnabled( FALSE ); comboType->setEnabled( FALSE ); buttonRemoveProperty->setEnabled( FALSE ); MetaDataBase::CustomWidget *w = findWidget( boxWidgets->item( boxWidgets->currentItem() ) ); if ( !w ) return; listProperties->clear(); for ( QValueList<MetaDataBase::Property>::Iterator it = w->lstProperties.begin(); it != w->lstProperties.end(); ++it ) (void)new QListViewItem( listProperties, (*it).property, (*it).type ); if ( listProperties->firstChild() ) { listProperties->setCurrentItem( listProperties->firstChild() ); listProperties->setSelected( listProperties->firstChild(), TRUE ); }}void CustomWidgetEditor::currentWidgetChanged( QListBoxItem *i ){ checkTimer->stop(); checkWidgetName(); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) { buttonChooseHeader->setEnabled( FALSE ); editClass->setEnabled( FALSE ); editHeader->setEnabled( FALSE ); buttonChoosePixmap->setEnabled( FALSE ); spinWidth->setEnabled( FALSE ); spinHeight->setEnabled( FALSE ); localGlobalCombo->setEnabled( FALSE ); sizeHor->setEnabled( FALSE ); sizeVer->setEnabled( FALSE ); checkContainer->setEnabled( FALSE ); return; } buttonChooseHeader->setEnabled( TRUE ); editClass->setEnabled( TRUE ); editHeader->setEnabled( TRUE ); buttonChoosePixmap->setEnabled( TRUE ); spinWidth->setEnabled( TRUE ); spinHeight->setEnabled( TRUE ); localGlobalCombo->setEnabled( TRUE ); sizeHor->setEnabled( TRUE ); sizeVer->setEnabled( TRUE ); checkContainer->setEnabled( TRUE ); editClass->blockSignals( TRUE ); editClass->setText( w->className ); editClass->blockSignals( FALSE ); editHeader->setText( w->includeFile ); localGlobalCombo->setCurrentItem( (int)w->includePolicy ); if ( w->pixmap ) previewPixmap->setPixmap( *w->pixmap ); else previewPixmap->setText( "" ); spinWidth->setValue( w->sizeHint.width() ); spinHeight->setValue( w->sizeHint.height() ); sizeHor->setCurrentItem( size_type_to_int( w->sizePolicy.horData() ) ); sizeVer->setCurrentItem( size_type_to_int( w->sizePolicy.verData() ) ); checkContainer->setChecked( w->isContainer ); setupSignals(); setupSlots(); setupProperties();}void CustomWidgetEditor::addWidgetClicked(){ oldItem = 0; checkTimer->stop(); checkWidgetName(); MetaDataBase::CustomWidget *w = new MetaDataBase::CustomWidget; QString s = w->className; if ( !MetaDataBase::addCustomWidget( w ) ) { QMessageBox::information( this, tr( "Adding a Custom Widget" ), tr( "Custom widget names must be unique.\n" "A custom widget called '%1' already exists, so it is not possible " "to add another widget with this name." ).arg( s ) ); return; } QListBoxPixmap *i = new QListBoxPixmap( boxWidgets, *w->pixmap, w->className ); customWidgets.insert( i, w ); boxWidgets->setCurrentItem( i ); boxWidgets->setSelected( i, TRUE );}void CustomWidgetEditor::classNameChanged( const QString &s ){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; WidgetDatabase::customWidgetClassNameChanged( w->className, s ); checkTimer->stop(); boxWidgets->blockSignals( TRUE ); oldName = w->className; w->className = s; QListBoxItem *old = i; if ( w->pixmap ) boxWidgets->changeItem( *w->pixmap, s, boxWidgets->currentItem() ); else boxWidgets->changeItem( s, boxWidgets->currentItem() ); i = boxWidgets->item( boxWidgets->currentItem() ); oldItem = i; customWidgets.insert( i, w ); customWidgets.remove( old ); boxWidgets->blockSignals( FALSE ); checkTimer->start( 1000, TRUE );}void CustomWidgetEditor::deleteWidgetClicked(){ oldItem = 0; checkTimer->stop(); checkWidgetName(); QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( mainWindow->isCustomWidgetUsed( w ) ) { QMessageBox::information( mainWindow, tr( "Removing Custom Widget" ), tr( "The custom widget '%1' is in use, so it cannot be removed." ). arg( w->className ) ); return; } if ( !i || !w ) return; MetaDataBase::removeCustomWidget( w ); customWidgets.remove( i ); delete i; i = boxWidgets->item( boxWidgets->currentItem() ); if ( i ) { boxWidgets->setCurrentItem( i ); boxWidgets->setSelected( i, TRUE ); }}void CustomWidgetEditor::headerFileChanged( const QString &s ){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; w->includeFile = s;}void CustomWidgetEditor::heightChanged( int h ){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; w->sizeHint.setHeight( h ); updateCustomWidgetSizes();}void CustomWidgetEditor::includePolicyChanged( int p ){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; w->includePolicy = (MetaDataBase::CustomWidget::IncludePolicy)p;}void CustomWidgetEditor::pixmapChoosen(){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; QPixmap pix = qChoosePixmap( this ); if ( pix.isNull() ) return; delete w->pixmap; w->pixmap = new QPixmap( pix ); boxWidgets->blockSignals( TRUE ); QListBoxItem *old = i; boxWidgets->changeItem( *w->pixmap, w->className, boxWidgets->currentItem() ); i = boxWidgets->item( boxWidgets->currentItem() ); customWidgets.insert( i, w ); customWidgets.remove( old ); boxWidgets->blockSignals( FALSE ); previewPixmap->setPixmap( *w->pixmap );}void CustomWidgetEditor::widthChanged( int wid ){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; w->sizeHint.setWidth( wid ); updateCustomWidgetSizes();}MetaDataBase::CustomWidget *CustomWidgetEditor::findWidget( QListBoxItem *i ){ if ( !i ) return 0; QMap<QListBoxItem*, MetaDataBase::CustomWidget*>::Iterator it = customWidgets.find( i ); if ( it == customWidgets.end() ) return 0; return *it;}void CustomWidgetEditor::chooseHeader(){ QListBoxItem *i = boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); if ( !i || !w ) return; QString h = QFileDialog::getOpenFileName( QString::null, tr( "Header Files (*.h *.h++ *.hxx)" ), this ); if ( h.isEmpty() ) return; editHeader->setText( h ); localGlobalCombo->setCurrentItem( (int)MetaDataBase::CustomWidget::Global );}void CustomWidgetEditor::checkWidgetName(){ QListBoxItem *i = oldItem ? oldItem : boxWidgets->item( boxWidgets->currentItem() ); MetaDataBase::CustomWidget *w = findWidget( i ); oldItem = 0; if ( !i || !w ) return; if ( MetaDataBase::isWidgetNameUsed( w ) ) { QString s = w->className; w->className = oldName; QMessageBox::information( this, tr( "Renaming a Custom Widget" ), tr( "Custom widget names must be unique.\n" "A custom widget called '%1' already exists, so it is not possible " "to rename this widget with this name." ).arg( s ) ); if ( i != boxWidgets->item( boxWidgets->currentItem() ) ) { boxWidgets->setCurrentItem( i ); qApp->processEvents(); } editClass->setText( w->className ); classNameChanged( w->className ); }}void CustomWidgetEditor::closeClicked(){ oldItem = 0; checkTimer->stop(); checkWidgetName(); accept();}void CustomWidgetEditor::currentSignalChanged( QListBoxItem *i ){ editSignal->blockSignals( TRUE ); editSignal->setText( "" ); editSignal->blockSignals( FALSE ); if ( !i ) { editSignal->setEnabled( FALSE ); buttonRemoveSignal->setEnabled( FALSE ); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -