X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Femulauncher.cpp;h=23e8b0e97f65a6e1f4c29fe3faa9e52a3feccff0;hb=6b18730f76f38e5347c4e80b43ca14a24934384b;hp=171b8970e7fb5b536ee1aa4b7b813e25f7ca886c;hpb=52cc8aaa401db7203376791bd477db8a615cfa29;p=emufront diff --git a/src/emulauncher.cpp b/src/emulauncher.cpp index 171b897..23e8b0e 100644 --- a/src/emulauncher.cpp +++ b/src/emulauncher.cpp @@ -32,14 +32,13 @@ #include "utils/emuhelper.h" #include "dialogs/emufrontinputdialog.h" -EmuLauncher::EmuLauncher(QWidget *parent) : - QWidget(parent) +EmuLauncher::EmuLauncher(QWidget *parent, QString tmp) : + QWidget(parent), tmpDirPath(tmp) { dbPlatform = new DbPlatform(this); dbMediaType = new DbMediaType(this); dbExec = new DbExecutable(this); dbMic = 0; - proc = 0; emuHelper = new EmuHelper(this); initWidgets(); layout(); @@ -48,39 +47,48 @@ EmuLauncher::EmuLauncher(QWidget *parent) : EmuLauncher::~EmuLauncher() { - if (proc) { - proc->kill(); // TODO: do this in a more sophisticated way - delete proc; - } + if (emuHelper) { + qDebug() << "EmuLauncher destructor"; + if (emuHelper->state() == EmuHelper::Running) + qDebug() << "EmuHelper process is running, killing..."; + emuHelper->kill(); + } } void EmuLauncher::updateData() { platformSelectBox->updateDataModel(); mediaTypeSelectBox->updateDataModel(); - execSelectBox->updateDataModel(); + //execSelectBox->updateDataModel(); } void EmuLauncher::initWidgets() { micTable = new QTableView(this); - micTable->setSelectionMode(QAbstractItemView::MultiSelection); + micTable->setSelectionMode(QAbstractItemView::ExtendedSelection); + micTable->setCornerButtonEnabled(false); + micTable->verticalHeader()->setVisible(false); + //micTable->horizontalHeader()->setDisabled(true); + micTable->horizontalHeader()->setClickable(false); mediaTypeSelectBox = new EFFileObjectComboBox(dbMediaType, this); platformSelectBox = new EFFileObjectComboBox(dbPlatform, this); execSelectBox = new ExecutableComboBox(dbExec, this); - selectButton = new QPushButton(tr("&Update")); - launchButton = new QPushButton(tr("&Launch")); + selectButton = new QPushButton(tr("&Update"), this); + launchButton = new QPushButton(tr("&Launch"), this); } void EmuLauncher::layout() { QGridLayout *grid = new QGridLayout; grid->addWidget(platformSelectBox, 0, 0); - grid->addWidget(mediaTypeSelectBox, 1, 0); - grid->addWidget(selectButton, 1, 1); - grid->addWidget(micTable, 2, 0, 1, 2); - grid->addWidget(execSelectBox, 3, 0); - grid->addWidget(launchButton, 3, 1); + grid->addWidget(mediaTypeSelectBox, 0, 1); + grid->addWidget(selectButton, 0, 2); + grid->setColumnStretch(3, 1); + + grid->addWidget(micTable, 1, 0, 1, 4); + grid->addWidget(execSelectBox, 2, 0); + grid->addWidget(launchButton, 2, 1); + // grid will be implicitily parented to this setLayout(grid); } @@ -105,16 +113,29 @@ void EmuLauncher::updateMediaImageContainers() if (!dbMic) dbMic = new DbMediaImageContainer(this); dbMic->filter(mtid, plfid); micTable->setModel(dbMic->getDataModel()); + micTable->hideColumn(DbMediaImageContainer::MIC_FileId); + micTable->hideColumn(DbMediaImageContainer::MIC_FileSize); + micTable->hideColumn(DbMediaImageContainer::MIC_FileCheckSum); + micTable->hideColumn(DbMediaImageContainer::MIC_FilePathId); + micTable->hideColumn(DbMediaImageContainer::MIC_FilePathName); + micTable->hideColumn(DbMediaImageContainer::MIC_SetupId); + micTable->hideColumn(DbMediaImageContainer::MIC_PlatformName); + micTable->hideColumn(DbMediaImageContainer::MIC_PlatformId); + micTable->hideColumn(DbMediaImageContainer::MIC_MediaTypeName); + micTable->hideColumn(DbMediaImageContainer::MIC_MediaTypeId); micTable->resizeColumnsToContents(); platformSelectBox->updateDataModel(); mediaTypeSelectBox->updateDataModel(); + execSelectBox->updateToSetup(plfid, mtid); } void EmuLauncher::launchEmu() { - QList mediaImages; + // if selected emulator has no extensions configured, it's assumed to be a M.A.M.E. or similar and + // map of media images will be no be used + QMap mediaImages; QList mediaImageContainers; - Executable *exe; + Executable *exe = 0; try { if (!micTable || !micTable->model()) { throw EmuFrontException(tr("No search results available!")); @@ -122,12 +143,8 @@ void EmuLauncher::launchEmu() if (!execSelectBox || execSelectBox->currentIndex() == -1) { throw EmuFrontException(tr("Emulator not selected!")); } - //QModelIndex mindex = micTable->currentIndex(); QItemSelectionModel *selModel = micTable->selectionModel(); QModelIndexList listMIndex = selModel->selectedIndexes(); - /*if (!mindex.isValid()) { - throw EmuFrontException(tr("Media image container not selected!")); - }*/ if (listMIndex.count() < 1) { throw EmuFrontException(tr("Media image container not selected!")); } @@ -142,10 +159,26 @@ void EmuLauncher::launchEmu() throw EmuFrontException(tr("Failed creating Emulator object!")); } - // TODO: multiple media image container selection - // - build a list of selected media image objects - // - check that the platform and media type (setup) matches + + qDebug() << "File types; " << exe->getSetup()->getSupportedFileTypeExtensions().count(); + + bool mame = exe->getSetup()->getSupportedFileTypeExtensions().isEmpty(); + + + + if (mame && listMIndex.count() > 1) { + throw new EmuFrontException(tr("No supported file types configured for this emulator configuration. " + "Assuming emulator support container files as is. " + "Only one container can be selected without configuring supported file types." + )); + } + + + // Now we have one or more media image containers and an emulator selected, + // let's fetch the media image container data. + foreach(QModelIndex mind, listMIndex) { + if (!mind.isValid()) continue; EmuFrontObject *obImg = dbMic->getDataObjectFromModel(&mind); if (!obImg) { qDebug() << "Failed creating media image container at row " << mind.row(); @@ -158,53 +191,79 @@ void EmuLauncher::launchEmu() continue; } mediaImageContainers << mic; - QList contained = mic->getMediaImages(); - foreach(MediaImage *mi, contained) - mediaImages << mi; + QMap contained = mic->getMediaImages(); + mediaImages.unite(contained); } + if (mame) { + emuHelper->launch(exe, mediaImageContainers); + return; + } + + // mediaImageContainers list contains all the selected media image containers and + // mediaImages list contains all the media images inside all the selected containers + + + QList selectedImages; if (mediaImages.count() < 1) { - throw new EmuFrontException("No media images available!"); + throw EmuFrontException("No media images available!"); } // check if command options have slots for nr media images > 1 e.g. "-diska $1 -diskb $2 ..." QString opts = exe->getOptions(); - QRegExp rx("(\\s\\$\\d+\\s)"); + QRegExp rx("(\\$\\d+)"); QStringList list; int pos = 0; while ((pos = rx.indexIn(opts, pos)) != -1) { list << rx.cap(1); pos += rx.matchedLength(); } + bool ok; - QList selectedImages; + if (list.count() > mediaImages.count()) { + throw EmuFrontException(tr("Select %1 media images for this emulator configuration").arg(list.count())); + } if (list.count() > 1) { - for(int i = 0; i < list.count(); i++) { - //QInputDialog::getItem(); - // TODO: Use input dialog here - // Create a new input dialog class for emufrontobjects + int lim = list.count() == mediaImages.count() ? list.count() - 1 : list.count(); + for(int i = 0; i < lim; i++) { + EmuFrontObject *efo = EmuFrontInputDialog::getItem( + this, tr("Select image no. %1").arg(i+1), tr("Select"), mediaImages.values(), 0, false, &ok); + if (!ok) { + throw EmuFrontException(tr("Boot image selection was canceled, aborting.")); + } + selectedImages << efo; + MediaImage *mi = dynamic_cast(efo); + QString key = mi->getCheckSum(); + mediaImages.remove(key); + } + if (mediaImages.count() == 1) { + // there should be at least one media image left in mediaImages map + selectedImages << mediaImages.values().first(); } - // TODO: show dialog to set the media order (the images will be assigned to slots in the order in respect to the image list) } else if (mediaImages.count() > 1) { // show select boot image dialog - bool ok; EmuFrontObject *efo = EmuFrontInputDialog::getItem( - this, tr("Select boot image"), tr("Select"), mediaImages, 0, false, &ok); + this, tr("Select boot image"), tr("Select"), mediaImages.values(), 0, false, &ok); if (!ok) { - throw new EmuFrontException(tr("Boot image selection was canceled, aborting.")); + throw EmuFrontException(tr("Boot image selection was canceled, aborting.")); } + selectedImages << efo; } + else if (mediaImages.count() == 1) + selectedImages << mediaImages.values().first(); // in the both cases the (ordered) list of media images will be passed to emuHelper - foreach(EmuFrontObject *mi, mediaImages) { - qDebug() << "Media image " << mi->getName(); - } - emuHelper->launch(exe, mediaImageContainers, mediaImages); + if (selectedImages.count() < 1) + throw EmuFrontException(tr("No media images selected")); + + + emuHelper->launch(exe, mediaImageContainers, selectedImages, list.count(), tmpDirPath); + micTable->clearSelection(); } catch (EmuFrontException efe) { - delete exe; + if (exe) delete exe; qDeleteAll(mediaImageContainers); - qDeleteAll(mediaImages); + //qDeleteAll(mediaImages); these are already deleted along with containers QMessageBox::information(this, tr("Launching emulator"), efe.what(), QMessageBox::Ok); return; @@ -217,7 +276,7 @@ void EmuLauncher::processError(QProcess::ProcessError e) QString stdErr = emuHelper->readAllStandardError(); QMessageBox::warning(this, tr("Emulator"), tr("Launching emulator failed with: %1.\n").arg(e) - .append(";\n").append(proc->errorString().append(";\n") + .append(";\n").append(emuHelper->errorString().append(";\n") .append(stdErr)), QMessageBox::Ok ); } @@ -228,7 +287,7 @@ void EmuLauncher::processFinished(int a) QString stdErr = emuHelper->readAllStandardError(); QString stdMsg = emuHelper->readAllStandardOutput(); QString msg = tr("Emulator has finished with: %1.\n").arg(a).append(stdMsg); - if (a) msg.append("; ").append(proc->errorString()).append(";\n").append(stdErr); + if (a) msg.append("; ").append(emuHelper->errorString()).append(";\n").append(stdErr); QMessageBox::information(this, tr("Emulator finished"), msg, QMessageBox::Ok); } @@ -236,3 +295,8 @@ void EmuLauncher::cleanTmp() { // TODO } + +void EmuLauncher::setTmpDirPath(QString tmp) +{ + tmpDirPath = tmp; +}