/* 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 "smglobals.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(SmGlobals::instance()->model("actors")); mGenresModel = static_cast(SmGlobals::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(SmGlobals::instance()->model("SeriesModel")); // files view mFilesWidget = new FilesTreeWidget; QAbstractItemModel *filesModel = SmGlobals::instance()->model("FilesModel"); mFilesModel = static_cast(filesModel); for(int i = 5; i < 11; ++i){ mFilesWidget->filesTree()->setColumnHidden(i, true); } connect(mSeriesWidget, SIGNAL(filesReload()), mFilesWidget->filesTree(), SLOT(expandAll())); // 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); constructWindowTitle(); } 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: ; } mFilesWidget->resetSize(); mFilesModel->setMode(mode); mFilesWidget->filesTree()->expandAll(); mFilesWidget->filesTree()->resizeColumnToContents(0); mFilesWidget->filesTree()->resizeColumnToContents(1); mFilesWidget->filesTree()->resizeColumnToContents(2); constructWindowTitle(); } void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){ Q_UNUSED(selected); Q_UNUSED(deselected); QModelIndexList selectedSeries = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); mFilesWidget->resetSize(); if(selectedSeries.isEmpty()){ return; } QList selectedPartIds; SeriesTreeSortModel *proxy = mSeriesWidget->seriesProxy(); foreach(QModelIndex i, selectedSeries){ QModelIndex real = proxy->mapToSource(i); if(real.isValid()){ int type = real.data(SeriesTreeModel::TypeRole).toInt(); if(type == SeriesTreeModel::Series){ QList childIds = mSeriesModel->childrenColumnList(real, SeriesTreeModel::SeriesPartId); foreach(QVariant id, childIds){ int realId = id.toInt(); if(!selectedPartIds.contains(realId)){ selectedPartIds << realId; } } }else if(type == SeriesTreeModel::Part){ int realId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt(); if(!selectedPartIds.contains(realId)){ selectedPartIds << realId; } } } } 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->seriesProxy()->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); } void ArchiveTreeView::constructWindowTitle(){ QString modeString = mFilesModel->modeName(); mWindowTitle = QString("Movie Archive - [%1]").arg(modeString); emit needWindowTitleChange(mWindowTitle); }