void PackageModel::publishTargets() { QFileSystemFilter fsf; fsf.applications = QFileSystemFilter::Set; QList<QFileSystem*> fl = QStorageMetaInfo::instance()->fileSystems( &fsf ); QStringList targets; bool installMediaValid = installControl()->installMedia().isEmpty() ? true : false; for ( int i = 0; i < fl.count(); i++ ) { mediaNames[ fl[i]->name() ] = fl[i]->path(); targets << fl[i]->path(); if ( !installMediaValid && fl[i]->path() == installControl()->installMedia() ) installMediaValid = true; } emit targetsUpdated( targets ); if ( !installMediaValid ) { // install target went away (SD card removed etc) installControl()->setInstallMedia( QString() ); } }
PackageModel::PackageModel( QObject* parent ) : QAbstractItemModel( parent ) , storage( 0 ) { networked = AbstractPackageController::factory( AbstractPackageController::network, this ); installed = AbstractPackageController::factory( AbstractPackageController::installed, this ); // can only have a max of 15 top level items rootItems << installed << networked; //this must stay in sync with installedIndex //and networkedIndex for ( int i = 0; i < rootItems.count(); i++ ) connect( rootItems[i], SIGNAL(updated()), this, SLOT(controllerUpdate()) ); connect( networked, SIGNAL(packageInstalled(InstallControl::PackageInfo)), installed, SLOT(addPackage(InstallControl::PackageInfo)) ); connect( networked, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); connect( networked, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(rowsRemoved(QModelIndex,int,int))); connect( networked, SIGNAL(packageInstalled(InstallControl::PackageInfo)), this, SLOT(packageInstalled(InstallControl::PackageInfo)) ); connect( networked, SIGNAL(serverStatus(QString)), this, SLOT(serverStatusUpdated(QString)) ); // can only have a max of 4 columns, if more are needed, change the // macros used for PackageModel::index(...) below // columnHeads << "Name" << "Size"; QStorageMetaInfo *s = QStorageMetaInfo::instance(); connect( s, SIGNAL(disksChanged()), this, SLOT(publishTargets()) ); connect( this, SIGNAL(targetsUpdated(QStringList)), installed, SLOT(reloadInstalledLocations(QStringList)) ); if ( !QDir( Qtopia::packagePath() ).exists() ) QDir::root().mkpath( Qtopia::packagePath() ); }
PackageView::PackageView( QWidget *parent, Qt::WFlags flags ) : QMainWindow( parent, flags ) { setWindowTitle( tr( "Package Manager" )); model = new PackageModel( this ); connect(model, SIGNAL(targetsUpdated(QStringList)), this, SLOT(targetsChanged(QStringList))); connect(model, SIGNAL(serversUpdated(QStringList)), this, SLOT(serversChanged(QStringList))); connect(this, SIGNAL(targetChoiceChanged(QString)), model, SLOT(userTargetChoice(QString))); connect(model, SIGNAL(serverStatus(QString)), this, SLOT(postServerStatus(QString))); connect(model, SIGNAL(newlyInstalled(QModelIndex)), this, SLOT(selectNewlyInstalled(QModelIndex))); //setup view for installed packages installedView = new QTreeView( this ); installedView->setModel( model ); installedView->setRootIndex( model->index(InstalledIndex,0,QModelIndex()) ); installedView->setRootIsDecorated( false ); installedView->setFrameStyle(QFrame::NoFrame); connect( installedView, SIGNAL(activated(QModelIndex)), this, SLOT(activateItem(QModelIndex)) ); connect( model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), installedView, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); connect( model, SIGNAL(rowsRemoved(QModelIndex,int,int)), installedView, SLOT(rowsRemoved(QModelIndex,int,int))); //setup page for installed packages QWidget *installedPage = new QWidget; QVBoxLayout *vbInstalledPage = new QVBoxLayout( installedPage ); vbInstalledPage->setMargin( 0 ); vbInstalledPage->addWidget( installedView ); //setup view for downloadable packages downloadView = new QTreeView( this ); downloadView->setModel( model ); downloadView->setRootIndex( model->index(DownloadIndex,0,QModelIndex()) ); downloadView->setRootIsDecorated( false ); downloadView->setFrameStyle(QFrame::NoFrame); connect( downloadView, SIGNAL(activated(QModelIndex)), this, SLOT(activateItem(QModelIndex)) ); connect( model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), downloadView, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); connect( model, SIGNAL(rowsRemoved(QModelIndex,int,int)), downloadView, SLOT(rowsRemoved(QModelIndex,int,int))); downloadView->setItemDelegate(new DownloadViewDelegate(this)); installedView->setItemDelegate(new ViewDelegate(this)); //setup page for downloadable packages QWidget *downloadPage = new QWidget(this); QVBoxLayout *vbDownloadPage = new QVBoxLayout( downloadPage ); vbDownloadPage->setSpacing( 2 ); vbDownloadPage->setMargin( 2 ); vbDownloadPage->addWidget( downloadView ); statusLabel = new QLabel( "No Server Chosen", this ); statusLabel->setWordWrap( true ); vbDownloadPage->addWidget( statusLabel ); installedView->hideColumn( 1 ); installedView->header()->hide(); downloadView->hideColumn( 1 ); downloadView->header()->hide(); //TODO: install to media card menuTarget = new QMenu( tr( "Install to" ), this ); new PackageManagerService( this ); tabWidget = new QTabWidget( this ); tabWidget->addTab( installedPage, tr( "Installed" ) ); tabWidget->addTab( downloadPage, tr( "Downloads" ) ); setCentralWidget( tabWidget ); KeyFilter *keyFilter = new KeyFilter(tabWidget, this); installedView->installEventFilter(keyFilter); downloadView->installEventFilter(keyFilter); QTimer::singleShot( 0, this, SLOT(init()) ); }