/* 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 #include #include #include #include #include #include #include #include "shemov.h" #include "filesystemwidget.h" #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" #include "filesystemfileproxy.h" #include "pictureviewer.h" #include "archivetreeview.h" #include "smglobals.h" #include "seriestreewidget.h" #include "newmoviewizard.h" #include "filestreewidget.h" #include "filestreemodel.h" #include "consistencycheck.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon qApp->setWindowIcon(QIcon(":/shemov.png")); //FileSystemWidget + TabWidget mFSWidget = new FilesystemWidget; setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; mTab->addTab(mFSWidget, tr("Filemanager")); //ArchiveTreeView mATree = new ArchiveTreeView; mTab->addTab(mATree, "Archive"); connect(mATree->filesWidget(), SIGNAL(statusMessage(QString)), this, SLOT(statusbarMessage(QString))); connect(mATree->filesWidget(), SIGNAL(sizeChanged(qint64)), this, SLOT(setSize(qint64))); connect(mATree, SIGNAL(needWindowTitleChange(QString)), this, SLOT(setWindowTitle(QString))); connect(mATree->filesWidget()->filesTree()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(updateSelectionCount(const QItemSelection &, const QItemSelection &))); connect(mATree->seriesWidget()->seriesTree()->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(updateSelectionCount(QItemSelection,QItemSelection))); connect(this, SIGNAL(configChanged()), mATree->seriesWidget()->seriesTree(), SLOT(readConfig())); connect(this, SIGNAL(configChanged()), mATree->filesWidget()->filesTree(), SLOT(readConfig())); //newmoviewizard mNewMovieWizard = new NewMovieWizard(this); connect(mNewMovieWizard, SIGNAL(seriesAdded(QString,int)), mATree->seriesWidget(), SLOT(seriesAdded(QString,int))); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); createStatusbar(); createActions(); createMenus(); setFsFree(); connect(mFSWidget->fileView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(updateSelectionCount(const QItemSelection &, const QItemSelection &))); connect(mFSWidget, SIGNAL(windowTitle(QString)), this, SLOT(setWindowTitle(QString))); connect(mFSWidget->fileView(), SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &))); connect(mFSWidget, SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &))); connect(mFSWidget, SIGNAL(newTemplate(const QString &)), this, SLOT(setTemplate(const QString &))); connect(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); connect(mFSWidget->dirModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(setFsFree())); connect(mFSWidget->dirModel(), SIGNAL(layoutChanged()), this, SLOT(setFsFree())); connect(mFSWidget->dirModel(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(setFsFree())); connect(this, SIGNAL(configChanged()), mFSWidget->fileView(), SLOT(readConfig())); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); show(); mATree->seriesWidget()->readSettings(); mFSWidget->readSettings(); readSettings(); mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); } void SheMov::closeEvent(QCloseEvent *event){ mFSWidget->writeSettings(); mFSWidget->pictureViewer()->close(); mATree->seriesWidget()->writeSettings(); FilesTreeModel *filesModel = static_cast(SmGlobals::instance()->model("FilesModel")); filesModel->writeCache(); writeSettings(); delete SmGlobals::instance(); event->accept(); } void SheMov::updateSelectionCount(const QItemSelection & /* sel */, const QItemSelection & /* prev */){ QLocale l; switch (mTab->currentIndex()) { case 0: { int selCount = mFSWidget->fileView()->selectionModel()->selectedRows().count(); mSelectedItems->setText(QString::number(selCount)); qint64 selSize(0); foreach(QModelIndex idx, mFSWidget->fileView()->selectionModel()->selectedRows()){ QModelIndex real = mFSWidget->fileProxy()->mapToSource(idx); if(real.isValid()){ QFileInfo fi = mFSWidget->dirModel()->fileInfo(real); selSize += fi.size(); } } mSelectedSize->setText(QString(tr("%1")).arg(l.toString((selSize)))); break; } case 1: { int selCount = mATree->filesWidget()->filesTree()->selectionModel()->selectedRows().count(); mSelectedItems->setText(QString::number(selCount)); } } } void SheMov::statusbarMessage(const QString &message){ statusBar()->showMessage(message); } void SheMov::setTemplate(const QString &newTemplate){ mTemplate->setText(newTemplate); } void SheMov::configure(){ ConfigurationDialog dlg(this); dlg.exec(); createOpenWithMenuFS(); createOpenWithMenuAV(); emit configChanged(); } void SheMov::tabChanged(int newTab){ mEditFSMenuA->setVisible(newTab == 0); if(newTab == 0){ setWindowTitle(mFSWidget->windowTitle()); } if(newTab == 1){ setWindowTitle(mATree->windowTitle()); } updateSelectionCount(QItemSelection(), QItemSelection()); } void SheMov::setFsFree(){ struct statfs buf; QSettings s; QString dir = s.value("paths/archivedir").toString(); int success = statfs(qPrintable(dir), &buf); if(success == -1){ mFsFree->setText(tr("Error")); return; } int blocksize = buf.f_bsize; int free = buf.f_bfree; int avail = buf.f_blocks; int used = avail - free; qreal freep = free * 100.0 / avail; qreal usedp = used * 100.0 / avail; QFont f = qApp->font(); QFontMetrics fm(f); int height = fm.height() + 3; QImage img(100, height, QImage::Format_ARGB32); img.fill(0); QPainter p(&img); p.setBrush(QBrush(Qt::red)); p.setPen(QPen(Qt::blue)); p.drawRect(QRectF(0, 0, usedp, height)); p.setBrush(QBrush(Qt::green)); p.drawRect(QRectF(usedp, 0, freep, height)); quint64 freeb = static_cast(free) * blocksize; qreal freegib = freeb / 1024.0 / 1024.0 / 1024.0; QLocale l; QString freeString = l.toString(freegib, 'g', 2); freeString.append(tr(" GiB free")); QSize stringSize = fm.size(Qt::TextSingleLine, freeString); int startx = (100 - stringSize.width()) / 2; int starty = (height - stringSize.height()) / 2 + fm.ascent(); p.drawText(QPoint(startx, starty), freeString); mFsFree->setPixmap(QPixmap::fromImage(img)); } void SheMov::aboutShemov(){ QString aboutLabel = QString(tr("About %1")).arg(qApp->applicationName()); QString aboutText = QString(tr("

%1 is a little application to keep track of your pr0n movie collection, though it isn't limited to pr0n movies.

")).arg(qApp->applicationName()); aboutText.append(""); aboutText.append(tr("Sissy herself")); aboutText.append(QString(tr("")).arg(qApp->organizationName())); aboutText.append(QString(tr("")).arg(qApp->applicationVersion())); aboutText.append(QString(tr(""))); aboutText.append(tr("
Author
Organization%1
Version%1
Build:/* __debug build__ */
Dependencies
    ")); aboutText.append(tr("
  • Qt (thanks to Nokia for this great library)
  • ")); aboutText.append(tr("
  • libmagic for figuring out the file type
  • ")); aboutText.append("
"); QMessageBox::about(this, aboutLabel, aboutText); } void SheMov::showStatistics(){ StatisticsDialog dlg(this); dlg.exec(); } void SheMov::newMovieWizard(){ mNewMovieWizard->restart(); mNewMovieWizard->show(); } void SheMov::newMovieWizardWithFiles(){ QModelIndexList selected = mFSWidget->fileView()->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } mNewMovieWizard->restart(); foreach(QModelIndex sel, selected){ mNewMovieWizard->infoPage()->addFile(sel.data(QFileSystemModel::FilePathRole).toString()); } mNewMovieWizard->show(); } void SheMov::setSize(qint64 size){ QLocale l; QString val; if(size < Q_INT64_C(4707319808)){ val = QString("%1").arg(l.toString(size)); }else{ val = QString("%1").arg(l.toString(size)); } mSelectedSize->setText(val); } void SheMov::createStatusbar(){ QLabel *selSizeL = new QLabel(tr("Sel. Size")); mSelectedSize = new QLabel(tr("nothing selected yet")); mSelectedSize->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(selSizeL); statusBar()->addPermanentWidget(mSelectedSize); QLabel *selCountL = new QLabel(tr("Sel. Items")); mSelectedItems = new QLabel("0"); mSelectedItems->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(selCountL); statusBar()->addPermanentWidget(mSelectedItems); QLabel *templateL = new QLabel(tr("Template")); mTemplate = new QLabel(tr("No template set")); mTemplate->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(templateL); statusBar()->addPermanentWidget(mTemplate); QLabel *freeL = new QLabel(tr("Free space")); mFsFree = new QLabel(tr("calculating...")); mFsFree->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(freeL); statusBar()->addPermanentWidget(mFsFree); } void SheMov::createActions(){ //File menu mPlaySelectedFSA = new QAction(tr("Play selected movies..."), this); connect(mPlaySelectedFSA, SIGNAL(triggered()), mFSWidget, SLOT(playSelected())); mNewMovieWizardA = new QAction(tr("Archive movie..."), this); connect(mNewMovieWizardA, SIGNAL(triggered()), this, SLOT(newMovieWizard())); mArchiveSelectedA = new QAction(tr("Archive selected..."), this); connect(mArchiveSelectedA, SIGNAL(triggered()), this, SLOT(newMovieWizardWithFiles())); mCleanupMapper = new QSignalMapper(this); mCleanupGroup = new QActionGroup(this); QAction *cleanup1 = new QAction(tr("Cleanup actors..."), this); connect(cleanup1, SIGNAL(triggered()), mCleanupMapper, SLOT(map())); mCleanupMapper->setMapping(cleanup1, "actors"); mCleanupGroup->addAction(cleanup1); QAction *cleanup2 = new QAction(tr("Cleanup genres..."), this); connect(cleanup2, SIGNAL(triggered()), mCleanupMapper, SLOT(map())); mCleanupMapper->setMapping(cleanup2, "genres"); mCleanupGroup->addAction(cleanup2); mConsistencyA = new QAction(tr("Check consisteny..."), this); connect(mConsistencyA, SIGNAL(triggered()), this, SLOT(checkConsistency())); mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); //Edit menu (FS) mCdupA = new QAction(tr("Go up"), this); connect(mCdupA, SIGNAL(triggered()), mFSWidget, SLOT(parentDir())); connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(quit())); mMarkFilesA = new QAction(tr("Select files..."), this); mMarkFilesA->setShortcut(tr("CTRL++")); connect(mMarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(markFiles())); mUnmarkFilesA = new QAction(tr("Deselect all files"), this); mUnmarkFilesA->setShortcut(tr("CTRL+-")); connect(mUnmarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(unmarkFiles())); mCreateFolderA = new QAction(tr("Create folder..."), this); mCreateFolderA->setShortcut(tr("CTRL+n")); connect(mCreateFolderA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(createFolder())); mDeleteFilesA = new QAction(tr("Delete selected..."), this); mDeleteFilesA->setShortcut(tr("CTRL+d")); connect(mDeleteFilesA, SIGNAL(triggered()), mFSWidget, SLOT(deleteFiles())); mCopyA = new QAction(tr("Copy file(s)..."), this); mCopyA->setShortcut(tr("CTRL+v")); connect(mCopyA, SIGNAL(triggered()), mFSWidget, SLOT(copyFiles())); mMoveA = new QAction(tr("Move file(s)..."), this); mMoveA->setShortcut(tr("CTRL+m")); connect(mMoveA, SIGNAL(triggered()), mFSWidget, SLOT(moveFiles())); mRenameA = new QAction(tr("Rename file..."), this); mRenameA->setShortcut(tr("CTRL+r")); connect(mRenameA, SIGNAL(triggered()), mFSWidget, SLOT(renameFile())); mConfigA = new QAction(tr("Configure..."), this); connect(mConfigA, SIGNAL(triggered()), this, SLOT(configure())); //Edit menu rename submenu mTemplateA = new QAction(tr("Set as template"), this); mTemplateA->setShortcut(tr("CTRL+t")); connect(mTemplateA, SIGNAL(triggered()), mFSWidget, SLOT(setTemplate())); mTemplateA->setData("RenameMenu"); mRenameMapper = new QSignalMapper(this); mRenameCoverFA = new QAction(tr("Rename to front cover"), this); mRenameCoverFA->setShortcut(tr("CTRL+f")); connect(mRenameCoverFA, SIGNAL(triggered()), mRenameMapper, SLOT(map())); mRenameMapper->setMapping(mRenameCoverFA, tr("front")); mRenameCoverFA->setData("RenameMenu"); mRenameCoverBA = new QAction(tr("Rename to back cover"), this); mRenameCoverBA->setShortcut(tr("CTRL+b")); connect(mRenameCoverBA, SIGNAL(triggered()), mRenameMapper, SLOT(map())); mRenameMapper->setMapping(mRenameCoverBA, tr("back")); mRenameCoverBA->setData("RenameMenu"); mRenameCoverCA = new QAction(tr("Rename to cover"), this); mRenameCoverCA->setShortcut(tr("CTRL+c")); connect(mRenameCoverCA, SIGNAL(triggered()), mRenameMapper, SLOT(map())); mRenameMapper->setMapping(mRenameCoverCA, tr("cover")); mRenameCoverCA->setData("RenameMenu"); connect(mRenameMapper, SIGNAL(mapped(const QString &)), mFSWidget, SLOT(renameCover(const QString &))); //Help menu QString aboutLabel = QString(tr("About %1...")).arg(qApp->applicationName()); mAboutShemovA = new QAction(aboutLabel, this); connect(mAboutShemovA, SIGNAL(triggered()), this, SLOT(aboutShemov())); mAboutQtA = new QAction(tr("About Qt..."), this); connect(mAboutQtA, SIGNAL(triggered()), qApp, SLOT(aboutQt())); mStatisticsA = new QAction(tr("Some statistics..."), this); connect(mStatisticsA, SIGNAL(triggered()), this, SLOT(showStatistics())); //Tree series context menu mNewSeriesA = new QAction(tr("New series..."), this); connect(mNewSeriesA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(newSeries())); mDeleteFromSeriesA = new QAction(tr("Delete entries..."), this); connect(mDeleteFromSeriesA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(deleteFromSeries())); mPlaySelectedAVA = new QAction(tr("Play selected movies..."), this); connect(mPlaySelectedAVA, SIGNAL(triggered()), mATree, SLOT(playSelected())); mExpandAllSeriesA = new QAction(tr("Expand all"), this); connect(mExpandAllSeriesA, SIGNAL(triggered()), mATree->seriesWidget()->seriesTree(), SLOT(expandAll())); mCollapseAllSeriesA = new QAction(tr("Collapse all"), this); connect(mCollapseAllSeriesA, SIGNAL(triggered()), mATree->seriesWidget()->seriesTree(), SLOT(collapseAll())); mExpandCurrentA = new QAction(tr("Expand"), this); connect(mExpandCurrentA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(expandCurrent())); mAddCoverA = new QAction(tr("Add cover..."), this); connect(mAddCoverA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(addCover())); mEditItemA = new QAction(tr("Edit..."), this); connect(mEditItemA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(editItem())); //Tree view menu mViewTreeGroup = new QActionGroup(this); QSignalMapper *viewMapper = new QSignalMapper(this); mShowArchivedA = new QAction(tr("Show archived movies"), this); mViewTreeGroup->addAction(mShowArchivedA); viewMapper->setMapping(mShowArchivedA, 1); connect(mShowArchivedA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowArchivedA->setCheckable(true); mShowLocalA = new QAction(tr("Show local movies"), this); mViewTreeGroup->addAction(mShowLocalA); viewMapper->setMapping(mShowLocalA, 2); connect(mShowLocalA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowLocalA->setCheckable(true); mShowNormalA = new QAction(tr("Normal view"), this); mViewTreeGroup->addAction(mShowNormalA); viewMapper->setMapping(mShowNormalA, 0); connect(mShowNormalA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowNormalA->setCheckable(true); mShowNormalA->setChecked(true); //Tree FileWidget actions mMoveToBurnA = new QAction(tr("Move to burn directory"), this); connect(mMoveToBurnA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToBurn())); mMoveFilesA = new QAction(tr("Move to directory..."), this); connect(mMoveFilesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(moveToDirectory())); mSetDvdNoA = new QAction(tr("Set dvd number"), this); connect(mSetDvdNoA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(setDvdNo())); mSetQualityA = new QAction(tr("Set quality"), this); connect(mSetQualityA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(editQuality())); mSetPartNoA = new QAction(tr("Set Part no"), this); connect(mSetPartNoA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(editPart())); mDeleteFilesFromTreeA = new QAction(tr("Delete file(s)..."), this); connect(mDeleteFilesFromTreeA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(removeFiles())); mFilePropertiesA = new QAction(tr("Properties..."), this); connect(mFilePropertiesA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(fileProperties())); // misc mOpenWithMapperFS = new QSignalMapper(this); mOpenWithMapperAV = new QSignalMapper(this); connect(mOpenWithMapperFS, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); connect(mOpenWithMapperAV, SIGNAL(mapped(QString)), mATree, SLOT(playSelected(QString))); connect(mCleanupMapper, SIGNAL(mapped(QString)), mATree, SLOT(cleanDatabase(QString))); connect(viewMapper, SIGNAL(mapped(int)), mATree, SLOT(setFileViewMode(int))); } void SheMov::createMenus(){ //file menu QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(mPlaySelectedFSA); fileMenu->addSeparator(); fileMenu->addAction(mNewMovieWizardA); QMenu *cleanupMenu = new QMenu(tr("Clean database"), this); cleanupMenu->addActions(mCleanupGroup->actions()); fileMenu->addMenu(cleanupMenu); fileMenu->addAction(mConsistencyA); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); //filesystem edit menu mEditFSMenu = new QMenu(tr("&Edit"), this); mEditFSMenu->addAction(mCdupA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMarkFilesA); mEditFSMenu->addAction(mUnmarkFilesA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mCreateFolderA); mEditFSMenu->addAction(mDeleteFilesA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mCopyA); mEditFSMenu->addAction(mMoveA); mEditFSMenu->addAction(mRenameA); mRenameMenu = new QMenu(tr("&Rename..."), this); mRenameMenu->addAction(mTemplateA); mRenameMenu->addAction(mRenameCoverFA); mRenameMenu->addAction(mRenameCoverBA); mRenameMenu->addAction(mRenameCoverCA); mRenameMenuA = new QAction(tr("&Rename"), this); mRenameMenuA->setMenu(mRenameMenu); mEditFSMenu->addAction(mRenameMenuA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mConfigA); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); //TreeView view menu mTreeViewMenu = new QMenu(tr("View"), this); mTreeViewMenu->addAction(mShowNormalA); mTreeViewMenu->addAction(mShowLocalA); mTreeViewMenu->addAction(mShowArchivedA); menuBar()->addMenu(mTreeViewMenu); QMenu *helpMenu = new QMenu(tr("&Help"), this); helpMenu->addAction(mAboutShemovA); helpMenu->addAction(mAboutQtA); helpMenu->addSeparator(); helpMenu->addAction(mStatisticsA); menuBar()->addMenu(helpMenu); // FilesystemWidget context menu mOpenWithMenuFS = new QMenu(tr("Open with"), this); mFSWidget->fileView()->addAction(mPlaySelectedFSA); createOpenWithMenuFS(); mOpenWithMenuFSA = new QAction(tr("Open with"), this); mOpenWithMenuFSA->setMenu(mOpenWithMenuFS); mFSWidget->fileView()->addAction(mOpenWithMenuFSA); QAction *sep1 = new QAction(this); sep1->setSeparator(true); mFSWidget->fileView()->addAction(sep1); mFSWidget->fileView()->addAction(mCdupA); QAction *sep2 = new QAction(this); sep2->setSeparator(true); mFSWidget->fileView()->addAction(sep2); mFSWidget->fileView()->addAction(mMarkFilesA); mFSWidget->fileView()->addAction(mUnmarkFilesA); QAction *sep3 = new QAction(this); sep3->setSeparator(true); mFSWidget->fileView()->addAction(sep3); mFSWidget->fileView()->addAction(mCreateFolderA); mFSWidget->fileView()->addAction(mDeleteFilesA); mFSWidget->fileView()->addAction(mRenameA); mFSWidget->fileView()->addAction(mCopyA); mFSWidget->fileView()->addAction(mMoveA); mFSWidget->fileView()->addAction(mRenameMenuA); QAction *sep10 = new QAction(this); sep10->setSeparator(true); mFSWidget->fileView()->addAction(sep10); mFSWidget->fileView()->addAction(mArchiveSelectedA); //ArchiveTreeView context menu mATree->seriesWidget()->seriesTree()->addAction(mNewSeriesA); mATree->seriesWidget()->seriesTree()->addAction(mDeleteFromSeriesA); mATree->seriesWidget()->seriesTree()->addAction(mEditItemA); QAction *sep4 = new QAction(this); sep4->setSeparator(true); mATree->seriesWidget()->seriesTree()->addAction(sep4); mOpenWithMenuAV = new QMenu(tr("Open with"), this); mATree->seriesWidget()->seriesTree()->addAction(mPlaySelectedAVA); createOpenWithMenuAV(); mOpenWithMenuAVA = new QAction(tr("Open with"), this); mOpenWithMenuAVA->setMenu(mOpenWithMenuAV); mATree->seriesWidget()->seriesTree()->addAction(mOpenWithMenuAVA); QAction *sep5 = new QAction(this); sep5->setSeparator(true); mATree->seriesWidget()->seriesTree()->addAction(sep5); mATree->seriesWidget()->seriesTree()->addAction(mExpandCurrentA); mATree->seriesWidget()->seriesTree()->addAction(mExpandAllSeriesA); mATree->seriesWidget()->seriesTree()->addAction(mCollapseAllSeriesA); QAction *sep6 = new QAction(this); sep6->setSeparator(true); mATree->seriesWidget()->seriesTree()->addAction(sep6); mATree->seriesWidget()->seriesTree()->addAction(mAddCoverA); //ArchiveTreeView fileWidget context menu mATree->filesWidget()->filesTree()->addAction(mMoveToBurnA); mATree->filesWidget()->filesTree()->addAction(mMoveFilesA); QAction *sep7 = new QAction(this); sep7->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep7); mATree->filesWidget()->filesTree()->addAction(mSetDvdNoA); mATree->filesWidget()->filesTree()->addAction(mSetQualityA); mATree->filesWidget()->filesTree()->addAction(mSetPartNoA); QAction *sep8 = new QAction(this); sep8->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep8); mATree->filesWidget()->filesTree()->addAction(mDeleteFilesFromTreeA); QAction *sep9 = new QAction(this); sep9->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep9); mATree->filesWidget()->filesTree()->addAction(mFilePropertiesA); } void SheMov::createOpenWithMenuFS(){ if(mOpenWithGroupFS){ foreach(QAction *a, mOpenWithGroupFS->actions()){ mOpenWithMenuFS->removeAction(a); } } mOpenWithGroupFS->deleteLater(); mOpenWithGroupFS = new QActionGroup(this); QSettings s; QStringList moviePlayers = s.value("programs_movieviewer/data").toHash().keys(); moviePlayers.sort(); foreach(QString p, moviePlayers){ QAction *a = new QAction(p, mOpenWithGroupFS); mOpenWithMenuFS->addAction(a); mOpenWithMapperFS->setMapping(a, p); connect(a, SIGNAL(triggered()), mOpenWithMapperFS, SLOT(map())); } QAction *sep = new QAction(mOpenWithGroupFS); sep->setSeparator(true); mOpenWithMenuFS->addAction(sep); QStringList picViewers = s.value("programs_pictureviewer/data").toHash().keys(); picViewers.sort(); foreach(QString p, picViewers){ QAction *a = new QAction(p, mOpenWithGroupFS); mOpenWithMenuFS->addAction(a); mOpenWithMapperFS->setMapping(a, p); connect(a, SIGNAL(triggered()), mOpenWithMapperFS, SLOT(map())); } } void SheMov::createOpenWithMenuAV(){ if(mOpenWithGroupAV){ foreach(QAction *a, mOpenWithGroupAV->actions()){ mOpenWithMenuAV->removeAction(a); } } //this deletes all actions in the group also! mOpenWithGroupAV->deleteLater(); mOpenWithGroupAV = new QActionGroup(this); QSettings s; QStringList players = s.value("programs_movieviewer/data").toHash().keys(); foreach(QString p, players){ QAction *a = new QAction(p, mOpenWithGroupAV); mOpenWithMenuAV->addAction(a); mOpenWithMapperAV->setMapping(a, p); connect(a, SIGNAL(triggered()), mOpenWithMapperAV, SLOT(map())); } } void SheMov::writeSettings(){ QSettings s; s.setValue("windows/mainpos", pos()); s.setValue("windows/mainsize", size()); bool winState = windowState() & Qt::WindowMaximized; s.setValue("windows/maximized", winState); s.setValue("ui/selectedtab", mTab->currentIndex()); FilesTreeModel *filesModel = static_cast(SmGlobals::instance()->model("FilesModel")); s.setValue("ui/filestreemode", filesModel->mode()); } void SheMov::readSettings(){ QSettings s; QPoint winPos = s.value("windwos/mainpos").toPoint(); QSize winSize = s.value("windows/mainsize").toSize(); bool winState = s.value("windows/maximized", false).toBool(); resize(winSize); move(winPos); if(winState){ setWindowState(Qt::WindowMaximized); } int currentTab = s.value("ui/selectedtab", 0).toInt(); if(currentTab < mTab->count() && currentTab != mTab->currentIndex()){ mTab->setCurrentIndex(currentTab); } int filesMode = s.value("ui/filestreemode", FilesTreeModel::Normal).toInt(); switch(filesMode){ case FilesTreeModel::Normal: mShowNormalA->trigger(); break; case FilesTreeModel::Local: mShowLocalA->trigger(); break; case FilesTreeModel::Archived: mShowArchivedA->trigger(); break; default: ; } } void SheMov::checkConsistency(){ ConsistencyCheck c; c.exec(); }