📄 resource.cpp
字号:
formwindow->setPropertyShowingBlocked( FALSE ); formwindow->emitShowProperties(); buf.close(); PasteCommand *cmd = new PasteCommand( FormWindow::tr( "Paste" ), formwindow, widgets ); formwindow->commandHistory()->addCommand( cmd );}void Resource::saveObject( QObject *obj, QDesignerGridLayout* grid, QTextStream &ts, int indent ){ if ( obj && obj->isWidgetType() && ( (QWidget*)obj )->isHidden() ) return; QString closeTag; if ( obj->isWidgetType() ) { const char* className = WidgetFactory::classNameOf( obj ); if ( obj->isA( "CustomWidget" ) ) usedCustomWidgets << QString( className ); if ( obj != formwindow && !formwindow->widgets()->find( (QWidget*)obj ) ) return; // we don't know anything about this thing QString attributes; if ( grid ) { QDesignerGridLayout::Item item = grid->items[ (QWidget*)obj ]; attributes += QString(" row=\"") + QString::number(item.row) + "\" "; attributes += QString(" column=\"") + QString::number(item.column) + "\" "; if ( item.rowspan * item.colspan != 1 ) { attributes += QString(" rowspan=\"") + QString::number(item.rowspan) + "\" "; attributes += QString(" colspan=\"") + QString::number(item.colspan) + "\" "; } } if ( qstrcmp( className, "Spacer" ) == 0 ) { closeTag = makeIndent( indent ) + "</spacer>\n"; ts << makeIndent( indent ) << "<spacer" << attributes << ">" << endl; ++indent; } else { closeTag = makeIndent( indent ) + "</widget>\n"; ts << makeIndent( indent ) << "<widget" << attributes << ">" << endl; ++indent; ts << makeIndent( indent ) << "<class>" << className << "</class>" << endl; } if ( WidgetFactory::hasItems( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( obj ) ) ) ) saveItems( obj, ts, indent ); saveObjectProperties( obj, ts, indent ); } else { // test for other objects we created. Nothing so far. return; } if ( obj->inherits( "QTabWidget" ) ) { QTabWidget* tw = (QTabWidget*) obj; QObjectList* tmpl = tw->queryList( "QWidgetStack" ); const QObjectList *l = tmpl->first()->children(); for ( QListIterator<QObject> it ( *l ); it.current(); ++it ) { if ( !it.current()->isWidgetType() || qstrcmp( it.current()->className(), "QWidgetStackPrivate::Invisible" ) == 0 || !( ((QDesignerTabWidget*)tw)->tabBar()->tab( ((QWidgetStack*)tmpl->first())->id( ((QWidget*)it.current()) ) ) ) ) continue; if ( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( it.current() ) ) == -1 ) continue; // we don't know this widget ts << makeIndent( indent ) << "<widget>" << endl; ++indent; ts << makeIndent( indent ) << "<class>" << "QWidget" << "</class>" << endl; ts << makeIndent( indent ) << "<property stdset=\"1\">" << endl; indent++; ts << makeIndent( indent ) << "<name>name</name>" << endl; ts << makeIndent( indent ) << "<cstring>" << entitize( it.current()->name() ) << "</cstring>" << endl; indent--; ts << makeIndent( indent ) << "</property>" << endl; ts << makeIndent( indent ) << "<attribute>" << endl; indent++; ts << makeIndent( indent ) << "<name>" << "title" << "</name>" << endl; ts << makeIndent( indent ) << "<string>" << entitize( tw->tabLabel( (QWidget*)it.current() ) ) << "</string>" << endl; indent--; ts << makeIndent( indent ) << "</attribute>" << endl;; saveChildrenOf( it.current(), ts, indent ); --indent; ts << makeIndent( indent ) << "</widget>" << endl; } delete tmpl; } else if ( obj->inherits( "QWizard" ) ) { QWizard* wiz = (QWizard*)obj; QObjectList* tmpl = wiz->queryList( "QWidgetStack" ); const QObjectList *l = tmpl->first()->children(); for ( QListIterator<QObject> it ( *l ); it.current(); ++it ) { if ( !it.current()->isWidgetType() || qstrcmp( it.current()->className(), "QWidgetStackPrivate::Invisible" ) == 0 || ( (QDesignerWizard*)wiz )->isPageRemoved( (QWidget*)it.current() ) ) continue; if ( WidgetDatabase::idFromClassName( WidgetFactory::classNameOf( it.current() ) ) == -1 ) continue; // we don't know this widget ts << makeIndent( indent ) << "<widget>" << endl; ++indent; ts << makeIndent( indent ) << "<class>" << "QWidget" << "</class>" << endl; ts << makeIndent( indent ) << "<property stdset=\"1\">" << endl; indent++; ts << makeIndent( indent ) << "<name>name</name>" << endl; ts << makeIndent( indent ) << "<cstring>" << entitize( it.current()->name() ) << "</cstring>" << endl; indent--; ts << makeIndent( indent ) << "</property>" << endl; ts << makeIndent( indent ) << "<attribute>" << endl; indent++; ts << makeIndent( indent ) << "<name>" << "title" << "</name>" << endl; ts << makeIndent( indent ) << "<string>" << entitize( wiz->title( (QWidget*)it.current() ) ) << "</string>" << endl; indent--; ts << makeIndent( indent ) << "</attribute>" << endl;; saveChildrenOf( it.current(), ts, indent ); --indent; ts << makeIndent( indent ) << "</widget>" << endl; } delete tmpl; } else { saveChildrenOf( obj, ts, indent ); } indent--; ts << closeTag;}void Resource::saveItems( QObject *obj, QTextStream &ts, int indent ){ if ( obj->inherits( "QListBox" ) || obj->inherits( "QComboBox" ) ) { QListBox *lb = 0; if ( obj->inherits( "QListBox" ) ) lb = (QListBox*)obj; else lb = ( (QComboBox*)obj )->listBox(); QListBoxItem *i = lb->firstItem(); for ( ; i; i = i->next() ) { ts << makeIndent( indent ) << "<item>" << endl; indent++; QStringList text; text << i->text(); QList<QPixmap> pixmaps; if ( i->pixmap() ) pixmaps.append( i->pixmap() ); saveItem( text, pixmaps, ts, indent ); indent--; ts << makeIndent( indent ) << "</item>" << endl; } } else if ( obj->inherits( "QIconView" ) ) { QIconView *iv = (QIconView*)obj; QIconViewItem *i = iv->firstItem(); for ( ; i; i = i->nextItem() ) { ts << makeIndent( indent ) << "<item>" << endl; indent++; QStringList text; text << i->text(); QList<QPixmap> pixmaps; if ( i->pixmap() ) pixmaps.append( i->pixmap() ); saveItem( text, pixmaps, ts, indent ); indent--; ts << makeIndent( indent ) << "</item>" << endl; } } else if ( obj->inherits( "QListView" ) ) { QListView *lv = (QListView*)obj; int i; for ( i = 0; i < lv->header()->count(); ++i ) { ts << makeIndent( indent ) << "<column>" << endl; indent++; QStringList l; l << lv->header()->label( i ); QList<QPixmap> pix; pix.setAutoDelete( TRUE ); if ( lv->header()->iconSet( i ) ) pix.append( new QPixmap( lv->header()->iconSet( i )->pixmap() ) ); saveItem( l, pix, ts, indent ); ts << makeIndent( indent ) << "<property>" << endl; indent++; ts << makeIndent( indent ) << "<name>clickable</name>" << endl; ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isClickEnabled( i ) )<< "</bool>" << endl; indent--; ts << makeIndent( indent ) << "</property>" << endl; ts << makeIndent( indent ) << "<property>" << endl; indent++; ts << makeIndent( indent ) << "<name>resizeable</name>" << endl; ts << makeIndent( indent ) << "<bool>" << mkBool( lv->header()->isResizeEnabled( i ) ) << "</bool>" << endl; indent--; ts << makeIndent( indent ) << "</property>" << endl; indent--; ts << makeIndent( indent ) << "</column>" << endl; } saveItem( lv->firstChild(), ts, indent - 1 ); }}void Resource::saveItem( QListViewItem *i, QTextStream &ts, int indent ){ QListView *lv = i->listView(); while ( i ) { ts << makeIndent( indent ) << "<item>" << endl; indent++; QList<QPixmap> pixmaps; QStringList textes; for ( int c = 0; c < lv->columns(); ++c ) { pixmaps.append( i->pixmap( c ) ); textes << i->text( c ); } saveItem( textes, pixmaps, ts, indent ); if ( i->firstChild() ) saveItem( i->firstChild(), ts, indent ); indent--; ts << makeIndent( indent ) << "</item>" << endl; i = i->nextSibling(); }}void Resource::savePixmap( const QPixmap &p, QTextStream &ts, int indent ){ if ( p.isNull() ) { ts << makeIndent( indent ) << "<pixmap></pixmap>" << endl; return; } if ( formwindow && !formwindow->savePixmapInline() ) ts << makeIndent( indent ) << "<pixmap>" << MetaDataBase::pixmapArgument( formwindow, p.serialNumber() ) << "</pixmap>" << endl; else ts << makeIndent( indent ) << "<pixmap>" << saveInCollection( p ) << "</pixmap>" << endl;}QPixmap Resource::loadPixmap( const QDomElement &e ){ QString arg = e.firstChild().toText().data(); if ( formwindow && !formwindow->savePixmapInline() ) { QPixmap pix = PixmapChooser::loadPixmap( "image.xpm" ); MetaDataBase::setPixmapArgument( formwindow, pix.serialNumber(), arg ); return pix; } QImage img = loadFromCollection( arg ); QPixmap pix; pix.convertFromImage( img ); MetaDataBase::setPixmapArgument( formwindow, pix.serialNumber(), arg ); return pix;}void Resource::saveItem( const QStringList &text, const QList<QPixmap> &pixmaps, QTextStream &ts, int indent ){ QStringList::ConstIterator it = text.begin(); for ( ; it != text.end(); ++it ) { ts << makeIndent( indent ) << "<property>" << endl; indent++; ts << makeIndent( indent ) << "<name>text</name>" << endl; ts << makeIndent( indent ) << "<string>" << entitize( *it ) << "</string>" << endl; indent--; ts << makeIndent( indent ) << "</property>" << endl; } for ( int i = 0; i < (int)pixmaps.count(); ++i ) { QPixmap *p = ( (QList<QPixmap>)pixmaps ).at( i ); ts << makeIndent( indent ) << "<property>" << endl; indent++; ts << makeIndent( indent ) << "<name>pixmap</name>" << endl; if ( p ) savePixmap( *p, ts, indent ); else savePixmap( QPixmap(), ts, indent ); indent--; ts << makeIndent( indent ) << "</property>" << endl; }}void Resource::saveChildrenOf( QObject* obj, QTextStream &ts, int indent ){ const QObjectList *l = obj->children(); if ( !l ) return; // no children to save QString closeTag; // if the widget has a layout we pretend that all widget's childs are childs of the layout - makes the structure nicer QLayout *layout = 0; QDesignerGridLayout* grid = 0; if ( obj->isWidgetType() && WidgetFactory::layoutType( (QWidget*)obj, layout ) != WidgetFactory::NoLayout ) { WidgetFactory::LayoutType lay = WidgetFactory::layoutType( (QWidget*)obj, layout ); switch ( lay ) { case WidgetFactory::HBox: closeTag = makeIndent( indent ) + "</hbox>"; ts << makeIndent( indent ) << "<hbox>" << endl; ++indent; break; case WidgetFactory::VBox: closeTag = makeIndent( indent ) + "</vbox>"; ts << makeIndent( indent ) << "<vbox>" << endl; ++indent; break; case WidgetFactory::Grid: closeTag = makeIndent( indent ) + "</grid>"; ts << makeIndent( indent ) << "<grid>" << endl; ++indent; grid = (QDesignerGridLayout*) layout; break; default: break; } // save properties of layout if ( lay != WidgetFactory::NoLayout ) saveObjectProperties( layout, ts, indent ); } for ( QListIterator<QObject> it ( *l ); it.current(); ++it ) saveObject( it.current(), grid, ts, indent ); if ( !closeTag.isEmpty() ) { indent--; ts << closeTag << endl; }}void Resource::saveObjectProperties( QObject *w, QTextStream &ts, int indent ){ QStringList changed; if ( w->isWidgetType() ) { changed = MetaDataBase::changedProperties( w ); if ( w->inherits( "Spacer" ) ) { if ( changed.find( "sizeHint" ) == changed.end() ) changed << "sizeHint"; } } else if ( w->inherits( "QLayout" ) ) { // #### should be cleaner (RS) changed << "margin" << "spacing"; } if ( w == formwindow->mainContainer() ) { if ( changed.findIndex( "geometry" ) == -1 ) changed << "geometry"; if ( changed.findIndex( "caption" ) == -1 ) changed << "caption"; } if ( changed.isEmpty() ) return; bool inLayout = w != formwindow->mainContainer() && !copying && w->isWidgetType() && ( (QWidget*)w )->parentWidget() && WidgetFactory::layoutType( ( (QWidget*)w )->parentWidget() ) != WidgetFactory::NoLayout; QStrList lst = w->metaObject()->propertyNames( !w->inherits( "Spacer" ) ); for ( QListIterator<char> it( lst ); it.current(); ++it ) { if ( changed.find( QString::fromLatin1( it.current() ) ) == changed.end() ) continue; const QMetaProperty* p = w->metaObject()->property( it.current(), TRUE ); if ( !p || !p->stored( w ) || ( inLayout && qstrcmp( p->name(), "geometry" ) == 0 ) ) continue; if ( w->inherits( "QLabel" ) && qstrcmp( p->name(), "pixmap" ) == 0 && ( !( (QLabel*)w )->pixmap() || ( (QLabel*)w )->pixmap()->isNull() ) ) continue; if ( qstrcmp( p->name(), "name" ) == 0 ) knownNames << w->property( "name" ).toString(); ts << makeIndent( indent ) << "<property"; if ( p->testFlags( QMetaProperty::StdSet ) ) ts << " stdset=\"1\""; ts << ">" << endl; indent++; ts << makeIndent( indent ) << "<name>" << it.current() << "</name>" << endl; if ( p->isSetType() ) { saveSetProperty( w, it.current(), QVariant::nameToType( p->type() ), ts, indent ); } else if ( p->isEnumType() ) { saveEnumProperty( w, it.current(), QVariant::nameToType( p->type() ), ts, indent ); } else { saveProperty( w, it.current(), w->property( p->name() ), QVariant::nameToType( p->type() ), ts, indent ); } indent--; ts << makeIndent( indent ) << "</property>" << endl; } if ( w->isWidgetType() && MetaDataBase::fakeProperties( w ) ) { QMap<QString, QVariant>* fakeProperties = MetaDataBase::fakeProperties( w ); for ( QMap<QString, QVariant>::Iterator fake = fakeProperties->begin();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -