/* 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 "archivetreeview.h" #include "smmodelsingleton.h" #include "smtreemodel.h" #include "seriestreewidget.h" #include "filestreewidget.h" #include "filestreemodel.h" #include "seriestreemodel.h" #include "mappingtablewidget.h" #include "mappingtablemodel.h" #include "helper.h" ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){ // models mActorsModel = static_cast(SmModelSingleton::instance()->model("actors")); mGenresModel = static_cast(SmModelSingleton::instance()->model("genres")); // series view mSeriesWidget = new SeriesTreeWidget; QItemSelectionModel *selModel = mSeriesWidget->seriesTree()->selectionModel(); connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(currentChanged(QItemSelection,QItemSelection))); connect(mSeriesWidget->seriesTree(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(playSelected())); mSeriesModel = static_cast(SmModelSingleton::instance()->model("SeriesModel")); // files view mFilesWidget = new FilesTreeWidget; QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesModel"); mFilesModel = static_cast(filesModel); for(int i = 5; i < 11; ++i){ mFilesWidget->filesTree()->setColumnHidden(i, true); } // actors and genre QWidget *genreActorWidget = new QWidget; QHBoxLayout *genreActorLayout = new QHBoxLayout; mActorsWidget = new MappingTableWidget("actors"); mGenresWidget = new MappingTableWidget("genres"); genreActorLayout->addWidget(mActorsWidget); genreActorLayout->addWidget(mGenresWidget); genreActorWidget->setLayout(genreActorLayout); // fileview, actors and genres QSplitter *verticalSplitter = new QSplitter(Qt::Vertical); verticalSplitter->addWidget(mFilesWidget); verticalSplitter->addWidget(genreActorWidget); verticalSplitter->setStretchFactor(0, 3); verticalSplitter->setStretchFactor(1, 1); // layout QHBoxLayout *mainLayout = new QHBoxLayout; QSplitter *splitter = new QSplitter; splitter->addWidget(mSeriesWidget); splitter->addWidget(verticalSplitter); splitter->setStretchFactor(0, 2); splitter->setStretchFactor(1, 3); mainLayout->addWidget(splitter); setLayout(mainLayout); } void ArchiveTreeView::setFileViewMode(int mode){ switch(mode){ case FilesTreeModel::Archived: case FilesTreeModel::Local: mSeriesWidget->setEnabled(false); break; case FilesTreeModel::Normal: mSeriesWidget->setEnabled(true); break; default: ; } mFilesModel->setMode(mode); mFilesWidget->filesTree()->expandAll(); mFilesWidget->filesTree()->resizeColumnToContents(0); mFilesWidget->filesTree()->resizeColumnToContents(1); mFilesWidget->filesTree()->resizeColumnToContents(2); } void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){ foreach(QModelIndex i, deselected.indexes()){ mSelectedItems.removeAll(i); } foreach(QModelIndex i, selected.indexes()){ if(!mSelectedItems.contains(i)){ mSelectedItems << i; } } if(mSelectedItems.isEmpty()){ return; } QList selectedPartIds; QModelIndexList realSel = mSeriesWidget->mapToSource(mSelectedItems); foreach(QModelIndex i, realSel){ if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){ QList ids = mSeriesModel->childrenColumnList(i, SeriesTreeModel::SeriesPartId); foreach(QVariant id, ids){ int thisId = id.toInt(); if(!selectedPartIds.contains(thisId)){ selectedPartIds << thisId; } } } if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ int thisId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt(); if(!selectedPartIds.contains(thisId)){ selectedPartIds << thisId; } } } mFilesModel->setIds(selectedPartIds); mFilesWidget->filesTree()->expandAll(); mFilesWidget->filesTree()->resizeColumnToContents(0); mFilesWidget->filesTree()->resizeColumnToContents(1); mFilesWidget->filesTree()->resizeColumnToContents(2); mFilesWidget->filesTree()->resizeColumnToContents(3); setMappingItems(selectedPartIds, mActorsModel, mActorsWidget); setMappingItems(selectedPartIds, mGenresModel, mGenresWidget); } void ArchiveTreeView::setMappingItems(QListseriesPartIds, MappingTableModel *model, MappingTableWidget *widget){ QStringList items; foreach(int id, seriesPartIds){ QList actorNames = model->mappings(id); foreach(QVariant v, actorNames){ if(!items.contains(v.toString())){ items << v.toString(); } } } qSort(items); widget->setStringList(items); widget->setEditEnabled(seriesPartIds.count() == 1); if(seriesPartIds.count() == 1){ widget->setCurrentId(seriesPartIds.at(0)); }else{ widget->setCurrentId(-1); } } void ArchiveTreeView::playSelected(const QString &preferred){ QModelIndexList selected = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } QStringList files; foreach(QModelIndex idx, selected){ QModelIndex real = mSeriesWidget->mapToSource(idx); QFileInfoList movies = mSeriesModel->findSortedMovies(real); foreach(QFileInfo fi, movies){ if(!files.contains(fi.absoluteFilePath())){ files << fi.absoluteFilePath(); } } } QPair progData = Helper::programData("movieviewer", preferred); QString program = progData.first; QStringList args = progData.second; args << files; QProcess::startDetached(program, args); }