📄 project.cpp
字号:
FormFile *Project::fakeFormFileFor( QObject *o ) const{ return fakeFormFiles.find( (void*)o );}QObject *Project::objectForFakeForm( FormWindow *fw ) const{ for ( QPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) { if ( it.current()->formWindow() == fw || it.current() == fw->formFile() ) return (QObject*)it.currentKey(); } return 0;}QObject *Project::objectForFakeFormFile( FormFile *ff ) const{ for ( QPtrDictIterator<FormFile> it( fakeFormFiles ); it.current(); ++it ) { if ( it.current() == ff ) return (QObject*)it.currentKey(); } return 0;}void Project::removeTempProject(){ if ( !singleProjectMode() ) return; QDir d( QFileInfo( filename ).dirPath() ); if ( !d.exists( QFileInfo( filename ).dirPath() ) ) return; QStringList files = d.entryList( QDir::Files ); QStringList::Iterator it; for ( it = files.begin(); it != files.end(); ++it ) { d.remove( *it ); } if ( d.exists( QFileInfo( filename ).dirPath() + "/images" ) ) { d = QDir( QFileInfo( filename ).dirPath() + "/images" ); files = d.entryList( QDir::Files ); for ( it = files.begin(); it != files.end(); ++it ) d.remove( *it ); d = QDir( QFileInfo( filename ).dirPath() ); d.remove( "images" ); } d.remove( QFileInfo( filename ).dirPath() );#if defined(Q_OS_UNIX) // ##### implement for all platforms, ideally should be in Qt ::rmdir( d.absPath().latin1() );#endif}void Project::addAndEditFunction( const QString &function, const QString &functionBody, bool openDeveloper ){ for ( SourceFile *f = sourcefiles.first(); f; f = sourcefiles.next() ) { if ( QFileInfo( f->fileName() ).baseName() == "main" ) { QValueList<LanguageInterface::Function> funcs; LanguageInterface *iface = MetaDataBase::languageInterface( language() ); if ( !iface ) return; iface->functions( f->text(), &funcs ); QString func = function; int i = func.find( '(' ); if ( i != -1 ) func = func.left( i ); bool found = FALSE; for ( QValueList<LanguageInterface::Function>::Iterator it = funcs.begin(); it != funcs.end(); ++it ) { if ( (*it).name.left( (*it).name.find( '(' ) ) == func ) { found = TRUE; break; } } if ( !found ) { QString code = f->text(); if ( functionBody.isEmpty() ) code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) + "()\n{\n\n}\n"; else code += "\n\n" + iface->createFunctionStart( "", func, "", "" ) + "()\n" + functionBody + "\n"; f->setText( code ); if ( f->editor() ) f->editor()->refresh( FALSE ); } if ( openDeveloper ) { if ( MainWindow::self ) MainWindow::self->editSource( f ); f->editor()->setFunction( func, "" ); } break; } }}bool Project::hasParentObject( QObject *o ){ for ( QObject *p = objs.first(); p; p = objs.next() ) { QObject *c = p->child( o->name(), o->className() ); if ( c ) return TRUE; } return FALSE;}QString Project::qualifiedName( QObject *o ){ QString name = o->name(); QObject *p = o->parent(); while ( p ) { name.prepend( QString( p->name() ) + "." ); if ( objs.findRef( p ) != -1 ) break; p = p->parent(); } return name;}bool Project::singleProjectMode() const{ return !MainWindow::self || MainWindow::self->singleProjectMode();}QWidget *Project::messageBoxParent() const{ return MainWindow::self;}extern QMap<QWidget*, QString> *qwf_forms;extern QString *qwf_language;extern bool qwf_execute_code;extern bool qwf_stays_on_top;extern QObject* qwf_form_object;extern QString *qwf_plugin_dir;QObjectList *Project::run(){ setupProjectPluginManagers(); if ( !programPluginManager ) return 0; ProgramInterface *piface = 0; programPluginManager->queryInterface( language(), &piface); if ( !piface ) return 0; static QWidget *invisibleGroupLeader = 0; if ( !invisibleGroupLeader &&hasGUI() ) { invisibleGroupLeader = new QWidget( 0, "designer_invisible_group_leader", WGroupLeader ); invisibleGroupLeader->hide(); } if ( MainWindow::self ) MainWindow::self->runProjectPrecondition(); if ( hasGUI() ) QApplication::setOverrideCursor( WaitCursor ); delete qwf_forms; qwf_forms = 0; delete qwf_language; qwf_language = new QString( language() ); qwf_execute_code = FALSE; for ( QPtrListIterator<FormFile> it = formFiles(); it.current(); ++it ) { if ( (*it)->isFake() ) qwf_form_object = objectForFakeFormFile( *it ); else qwf_form_object = 0; QWidget *w = QWidgetFactory::create( makeAbsolute( (*it)->fileName() ), 0, invisibleGroupLeader ); if ( w && !(*it)->isFake() ) w->hide(); QStringList error; QValueList<uint> line; if ( !piface->check( (*it)->code(), error, line ) && !error.isEmpty() && !error[ 0 ].isEmpty() ) { QStringList l; QObjectList l2; for ( int i = 0; i < (int)error.count(); ++i ) { if ( qwf_form_object ) l << QString( QString( qwf_form_object-> name() ) + " [Source]" ); else l << QString( QString( w->name() ) + " [Source]" ); l2.append( w ? w : qwf_form_object ); } emit runtimeError( error[0], l[0], line[0] ); if ( hasGUI() ) QApplication::restoreOverrideCursor(); if ( MainWindow::self ) { MainWindow::self->showSourceLine( qwf_form_object ? qwf_form_object : w, line[ 0 ] - 1, MainWindow::Error ); MainWindow::self->outputWindow()->setErrorMessages( error, line, FALSE, l, l2 ); } return 0; } } QPtrListIterator<SourceFile> sources( sourceFiles() ); for ( ; sources.current(); ++sources ) { SourceFile* f = sources.current(); QStringList error; QValueList<uint> line; if ( !piface->check( f->text(), error, line ) && !error.isEmpty() && !error[ 0 ].isEmpty() ) { QStringList l; QObjectList l2; for ( int i = 0; i < (int)error.count(); ++i ) { l << f->fileName(); l2.append( f ); } emit runtimeError( error[0], l[0], line[0] ); if ( MainWindow::self ) { MainWindow::self->showSourceLine( f, line[ 0 ] - 1, MainWindow::Error ); MainWindow::self->outputWindow()->setErrorMessages( error, line, FALSE, l, l2 ); } if ( hasGUI() ) QApplication::restoreOverrideCursor(); return 0; } } delete qwf_forms; qwf_forms = 0; delete qwf_language; qwf_language = new QString( language() ); qwf_execute_code = TRUE; qwf_stays_on_top = TRUE; InterpreterInterface *iiface = 0; if ( !interpreterPluginManager ) { piface->release(); return 0; } iiface = 0; interpreterPluginManager->queryInterface( language(), &iiface ); if ( !iiface ) { piface->release(); return 0; } if ( MainWindow::self ) { iiface->onShowDebugStep( MainWindow::self, SLOT( showDebugStep( QObject *, int ) ) ); iiface->onShowStackFrame( MainWindow::self, SLOT( showStackFrame( QObject *, int ) ) ); } iiface->onFinish( this, SIGNAL( runFinished() ) ); iiface->onShowError( this, SLOT( emitRuntimeError( QObject *, int, const QString & ) ) ); iiface->init(); for ( sources = sourceFiles(); sources.current(); ++sources ) { SourceFile* f = sources.current(); iiface->exec( f, f->text() ); } QObjectList *l = new QObjectList; for ( QPtrListIterator<FormFile> forms = formFiles(); forms.current(); ++forms ) { FormFile* f = forms.current(); if ( !f->formWindow() ) continue; FormWindow* fw = f->formWindow(); QValueList<uint> bps = MetaDataBase::breakPoints( fw ); if ( MainWindow::self && !bps.isEmpty() && MainWindow::self->isVisible() ) iiface->setBreakPoints( fw, bps ); } for ( sources = sourceFiles(); sources.current(); ++sources ) { SourceFile* f = sources.current(); QValueList<uint> bps = MetaDataBase::breakPoints( f ); if ( MainWindow::self && !bps.isEmpty() && MainWindow::self->isVisible() ) iiface->setBreakPoints( f, bps ); } for ( QPtrListIterator<FormFile> it2 = formFiles(); it2.current(); ++it2 ) { if ( (*it2)->isFake() ) qwf_form_object = objectForFakeFormFile( *it2 ); else qwf_form_object = 0; QWidget *w = QWidgetFactory::create( (*it2)->absFileName(), 0, invisibleGroupLeader ); if ( w ) { if ( !qwf_form_object ) l->append( w ); else l->append( qwf_form_object ); if ( !(*it2)->isFake() ) w->hide(); } else { l->append( qwf_form_object ); } } if ( hasGUI() ) { for ( QObject *o = l->first(); o; o = l->next() ) { FormWindow *fw = (FormWindow*)findRealForm( (QWidget*)o ); if ( !fw ) continue; QValueList<uint> bps = MetaDataBase::breakPoints( fw ); if ( MainWindow::self && !bps.isEmpty() && MainWindow::self->isVisible() ) iiface->setBreakPoints( o, bps ); } } iiface->release(); if ( hasGUI() ) QApplication::restoreOverrideCursor(); qwf_stays_on_top = FALSE; if ( MainWindow::self ) MainWindow::self->runProjectPostcondition( l ); piface->release(); return l;}QWidget *Project::findRealForm( QWidget *wid ){ if ( MainWindow::self ) { QWidgetList windows = MainWindow::self->qWorkspace()->windowList(); for ( QWidget *w = windows.first(); w; w = windows.next() ) { if ( QString( w->name() ) == QString( wid->name() ) ) return w; } } for ( QPtrListIterator<FormFile> it = formFiles(); it.current(); ++it ) { if ( (*it)->formWindow() && qstrcmp( (*it)->formWindow()->mainContainer()->name(), wid->name() ) == 0 ) return (*it)->formWindow(); } FormFile *ff = fakeFormFileFor( wid ); if ( ff ) return ff->formWindow(); return 0;}void Project::designerCreated(){ for ( FormFile *ff = formfiles.first(); ff; ff = formfiles.next() ) { FormWindow *fw = ff->formWindow(); if ( !fw || fw->mainWindow() ) continue; fw->setMainWindow( MainWindow::self ); connect( fw, SIGNAL( undoRedoChanged( bool, bool, const QString &, const QString & ) ), MainWindow::self, SLOT( updateUndoRedo( bool, bool, const QString &, const QString & ) ) ); fw->reparent( MainWindow::self->qWorkspace(), QPoint( 0, 0 ), FALSE ); QApplication::sendPostedEvents( MainWindow::self->qWorkspace(), QEvent::ChildInserted ); fw->parentWidget()->setFixedSize( 1, 1 ); fw->show(); } connect( this, SIGNAL( runFinished() ), MainWindow::self, SLOT( finishedRun() ) );}void Project::emitRuntimeError( QObject *o, int l, const QString &msg ){ emit runtimeError( msg, locationOfObject( o ), l ); if ( MainWindow::self ) MainWindow::self->showErrorMessage( o, l, msg );}void Project::formOpened( FormWindow *fw ){ if ( fw->isFake() ) return; emit newFormOpened( fw );}QString Project::locationOfObject( QObject *o ){ if ( !o ) return QString::null; if ( MainWindow::self ) { QWidgetList windows = MainWindow::self->qWorkspace()->windowList(); for ( QWidget *w = windows.first(); w; w = windows.next() ) { FormWindow *fw = 0; SourceEditor *se = 0; if ( w->inherits( "FormWindow" ) ) { fw = (FormWindow*)w; if ( fw->isFake() ) return objectForFakeForm( fw )->name() + QString( " [Source]" ); else return fw->name() + QString( " [Source]" ); } else if ( w->inherits( "SourceEditor" ) ) { se = (SourceEditor*)w; if ( !se->object() ) continue; if ( se->formWindow() ) return se->formWindow()->name() + QString( " [Source]" ); else return makeRelative( se->sourceFile()->fileName() ); } } } if ( o->inherits( "SourceFile" ) ) { for ( QPtrListIterator<SourceFile> sources = sourceFiles(); sources.current(); ++sources ) { SourceFile* f = sources.current(); if ( f == o ) return makeRelative( f->fileName() ); } } if ( !qwf_forms ) { qWarning( "Project::locationOfObject: qwf_forms is NULL!" ); return QString::null; } QString s = makeRelative( *qwf_forms->find( (QWidget*)o ) ); s += " [Source]"; return s;}bool Project::hasGUI() const{ return qApp->type() != QApplication::Tty;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -