/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "newmoviewizard.h" #include "smtreeitem.h" #include "seriestreemodel.h" #include "smmodelsingleton.h" #include "helper.h" NewMovieWizard::NewMovieWizard(QWidget *parent) : QWizard(parent){ addPage(new MovieInfoPage); } void NewMovieWizard::accept(){ QDialog::accept(); } MovieInfoPage::MovieInfoPage(QWidget *parent) : QWizardPage(parent){ setTitle(tr("Collect files for movie")); setSubTitle(tr("Select files by clicking the \"Add files...\" button. After adding files select one by one and set the appropriate file type. The series no is the number the movie has in the series: 14 in case of e.g. rogue adventures 14. The part number only has to be set if the movie is split in several parts.")); setPixmap(QWizard::LogoPixmap, QPixmap(":/shemov.png")); //files model setup QStringList modelHeaders = QStringList() << tr("File name") << tr("Size") << tr("File Type") << tr("Full path"); mFileModel = new WizardTreeModel(modelHeaders, this); SmTreeItem *root = new SmTreeItem(4); mMoviesItem= new SmTreeItem(QList() << tr("Movie files") << QVariant() << QVariant() << QVariant(), root); root->appendChild(mMoviesItem); mCoversItem = new SmTreeItem(QList() << tr("Cover files") << QVariant() << QVariant() << QVariant(), root); root->appendChild(mCoversItem); mFileModel->setRoot(root); //files view mFileView = new QTreeView; mFileView->setModel(mFileModel); //add + remove files QHBoxLayout *fileButtonLayout = new QHBoxLayout; fileButtonLayout->addStretch(); mAddFile = new QPushButton(tr("Add files...")); fileButtonLayout->addWidget(mAddFile); connect(mAddFile, SIGNAL(clicked()), this, SLOT(addFiles())); mRemoveFile = new QPushButton(tr("Remove file")); fileButtonLayout->addWidget(mRemoveFile); connect(mRemoveFile, SIGNAL(clicked()), this, SLOT(removeFile())); //movie name QHBoxLayout *movieTitleLayout = new QHBoxLayout; QLabel *l1 = new QLabel(tr("Movie &title")); mTitle = new QLineEdit; l1->setBuddy(mTitle); movieTitleLayout->addWidget(l1); movieTitleLayout->addWidget(mTitle); SeriesTreeModel *seriesModel = static_cast(SmModelSingleton::instance()->model("SeriesModel")); QCompleter *completer = new QCompleter(this); completer->setModel(seriesModel); mTitle->setCompleter(completer); //file type QHBoxLayout *numberLayout = new QHBoxLayout; QLabel *l2 = new QLabel(tr("File &type")); mFileType = new QComboBox; l2->setBuddy(mFileType); mFileType->addItems(mFileModel->types()); numberLayout->addWidget(l2); numberLayout->addWidget(mFileType); numberLayout->addStretch(); connect(mFileType, SIGNAL(currentIndexChanged(QString)), this, SLOT(typeChanged(QString))); //series, part + quality QLabel *l3 = new QLabel(tr("&Series no.")); mSeriesNo = new QSpinBox; l3->setBuddy(mSeriesNo); mSeriesNo->setMinimum(1); numberLayout->addWidget(l3); numberLayout->addWidget(mSeriesNo); QLabel *l4 = new QLabel(tr("&Part no.")); mPartno = new QSpinBox; l4->setBuddy(mPartno); mPartno->setMinimum(1); QLabel *l5 = new QLabel(tr("&Quality")); mQuality = new QSpinBox; l5->setBuddy(mQuality); mQuality->setMinimum(1); mQuality->setMaximum(10); numberLayout->addWidget(l5); numberLayout->addWidget(mQuality); //dvd QHBoxLayout *dvdLayout = new QHBoxLayout; mOnDvd = new QCheckBox(tr("Movie is on DVD")); dvdLayout->addWidget(mOnDvd); dvdLayout->addStretch(); QLabel *l6 = new QLabel(tr("Dvd no.")); dvdLayout->addWidget(l6); mDvdNo = new QSpinBox; mDvdNo->setMinimum(1); dvdLayout->addWidget(mDvdNo); connect(mOnDvd, SIGNAL(stateChanged(int)), this, SLOT(onDvd(int))); mNextDvdNo = new QPushButton(tr("Get next")); dvdLayout->addWidget(mNextDvdNo); connect(mNextDvdNo, SIGNAL(clicked()), this, SLOT(setNextDvdNo())); setNextDvdNo(); mNextDvdNo->setChecked(false); mDvdNo->setEnabled(false); mNextDvdNo->setEnabled(false); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mFileView); mainLayout->addLayout(fileButtonLayout); mainLayout->addLayout(movieTitleLayout); mainLayout->addLayout(numberLayout); mainLayout->addLayout(dvdLayout); setLayout(mainLayout); //expose data registerField("title", mTitle); registerField("seriesNo", mSeriesNo); registerField("partNo", mPartno); registerField("quality", mQuality); registerField("dvdNo", mDvdNo); } void MovieInfoPage::addFiles(){ QSettings s; QString startDir = s.value("paths/selecteddir", QDir::homePath()).toString(); QStringList files = QFileDialog::getOpenFileNames(this, tr("Select files"), startDir); if(files.isEmpty()){ return; } foreach(QString f, files){ QFileInfo fi(f); if(fi.exists()){ QList itemData; QModelIndex parent = QModelIndex(); itemData << fi.fileName() << fi.size() << QVariant() << fi.absoluteFilePath(); QString mimeType = Helper::mimeType(fi.absoluteFilePath()); if(mimeType.startsWith("video")){ itemData[WizardTreeModel::FileType] = WizardTreeModel::Movie; parent = mFileModel->find("Movie files"); }else{ itemData[WizardTreeModel::FileType] = WizardTreeModel::GeneralCover; parent = mFileModel->find("Cover files"); } if(parent.isValid()){ mFileModel->addRow(itemData, parent); } } } mFileView->expandAll(); mFileView->resizeColumnToContents(0); mFileView->resizeColumnToContents(1); mFileView->resizeColumnToContents(2); } void MovieInfoPage::removeFile(){ QModelIndexList selected = mFileView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } mFileModel->removeRows(selected.at(0).row(), 1, selected.at(0).parent()); } void MovieInfoPage::onDvd(int state){ mDvdNo->setEnabled(state == Qt::Checked); mNextDvdNo->setEnabled(state == Qt::Checked); } void MovieInfoPage::typeChanged(QString type){ QModelIndexList selected = mFileView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } int newTypeId = mFileModel->typeId(type); if(newTypeId == -1){ return; } QModelIndex item = selected.at(0); QModelIndex typeIndex = mFileModel->index(item.row(), WizardTreeModel::FileType, item.parent()); mFileModel->setData(typeIndex, newTypeId, Qt::EditRole); QModelIndex newParent; if(newTypeId == WizardTreeModel::Movie){ newParent = mFileModel->find("Movie files"); }else{ newParent = mFileModel->find("Cover files"); } mFileModel->reparent(item, newParent); } void MovieInfoPage::setNextDvdNo(){ SeriesTreeModel *seriesTreeModel = static_cast(SmModelSingleton::instance()->model("SeriesModel")); int nextdvd = seriesTreeModel->findNextDvdNo(); mDvdNo->setValue(nextdvd + 1); } WizardTreeModel::WizardTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ mFileTypeMap.insert(1, tr("Movie")); mFileTypeMap.insert(2, tr("Front cover")); mFileTypeMap.insert(3, tr("Back cover")); mFileTypeMap.insert(4, tr("General cover")); } Qt::ItemFlags WizardTreeModel::flags(const QModelIndex &index) const{ if(!index.parent().isValid()){ return Qt::ItemIsEnabled; } return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant WizardTreeModel::data(const QModelIndex &index, int role) const{ SmTreeItem *item = static_cast(index.internalPointer()); if(role == Qt::DisplayRole){ if(index.column() == FileSize){ if(item->parent() == root()){ return QVariant(); } QLocale l; return l.toString(item->data(FileSize).toLongLong()); } if(index.column() == FileType){ return mFileTypeMap.value(item->data(FileType).toInt()); } return item->data(index.column()); } if(role == Qt::TextAlignmentRole){ if(index.column() == FileSize){ return Qt::AlignRight; } return Qt::AlignLeft; } if(role == FileNameRole){ return item->data(FileName); } if(role == FileSizeRole){ if(item->parent() == root()){ return QVariant(); } return item->data(FileSize); } if(role == FileTypeRole){ return item->data(FileType); } if(role == FullPathRole){ return item->data(FullPath); } return QVariant(); } QStringList WizardTreeModel::types() const { return mFileTypeMap.values(); } int WizardTreeModel::typeId(const QString &value) const{ QHash::const_iterator it = mFileTypeMap.constBegin(); while(it != mFileTypeMap.constEnd()){ if(it.value() == value){ return it.key(); } ++it; } return -1; }