/* 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 #include #include #include #include #include "shemov.h" #include "filesystemwidget.h" #include "filestreewidget.h" #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" #include "filesystemfileproxy.h" #include "archivetreeview.h" #include "smglobals.h" #include "seriestreewidget.h" #include "seriestreemodel.h" #include "newmoviewizard.h" #include "filestreewidget.h" #include "filestreemodel.h" #include "consistencycheck.h" #include "mappingtableeditor.h" #include "mappingtablemodel.h" #include "dbanalyzer.h" #include "mappingtreewidget.h" #include "newpicsdialog.h" #include "pictureswidget.h" #include "pictureviewer2.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon qApp->setWindowIcon(QIcon(":/shemov.png")); setAttribute(Qt::WA_DeleteOnClose); //init database as early as possible (void) SmGlobals::instance(); //FileSystemWidget + TabWidget mFSWidget = new FilesystemWidget; setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; mTab->addTab(mFSWidget, tr("Filemanager")); connect(this, SIGNAL(configChanged()), mFSWidget, SLOT(configChanged())); //ArchiveTreeView mATree = new ArchiveTreeView; mTab->addTab(mATree, "Archive"); connect(mATree->filesWidget(), SIGNAL(statusMessage(QString)), this, SLOT(statusbarMessage(QString))); connect(mATree, SIGNAL(needWindowTitleChange(QString)), this, SLOT(setWindowTitle(QString))); connect(mATree->filesWidget(), SIGNAL(numSelected(int)), this, SLOT(updateSelectedCount(int))); connect(mATree->filesWidget(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); connect(mATree->filesWidget(), SIGNAL(statusMessage(QString)), this, SLOT(statusbarMessage(QString))); connect(this, SIGNAL(configChanged()), mATree, SLOT(readSettings())); //pictures mPicWidget = new PicturesWidget; mTab->addTab(mPicWidget, tr("Pictures")); connect(mPicWidget, SIGNAL(needWindowTitleChange(QString)), this, SLOT(setWindowTitle(QString))); connect(mPicWidget->picView(), SIGNAL(newMappings(QString)), this, SLOT(statusbarMessage(QString))); connect(mPicWidget->picView(), SIGNAL(numSelected(int)), this, SLOT(updateSelectedCount(int))); connect(mPicWidget->picView(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); //newmoviewizard + dbanalyzer mNewMovieWizard = new NewMovieWizard(this); connect(mNewMovieWizard, SIGNAL(seriesAdded(QString,int)), mATree->seriesWidget(), SLOT(seriesAdded(QString,int))); mDbAnalyzerDialog = new DbAnalyzerDialog(this); connect(mDbAnalyzerDialog, SIGNAL(partClicked(int, int)), mATree, SLOT(selectMoviePart(int, int))); connect(mDbAnalyzerDialog, SIGNAL(delItems(int,QList&)), this, SLOT(analyzeDelete(int,QList&))); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); createStatusbar(); createActions(); createMenus(); createToolBar(); setFsFree(); connect(mFSWidget->fileView(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); connect(mFSWidget->fileView(), SIGNAL(numSelected(int)), this, SLOT(updateSelectedCount(int))); 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(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())); connect(this, SIGNAL(configChanged()), mATree->seriesWidget(), SLOT(readSettings())); connect(this, SIGNAL(configChanged()), SmGlobals::instance()->pictureViewer(), SLOT(readSettings())); connect(this, SIGNAL(configChanged()), mPicWidget->picViewer2(), SLOT(readSettings())); connect(mFSWidget, SIGNAL(mounted(bool)), this, SLOT(checkMount(bool))); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); show(); mATree->seriesWidget()->readSettings(); mATree->filesWidget()->filesTree()->readSettings(); mFSWidget->readSettings(); readSettings(); mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); mATree->filesWidget()->filesTree()->header()->resizeSections(QHeaderView::ResizeToContents); } void SheMov::closeEvent(QCloseEvent *event){ mFSWidget->writeSettings(); mFSWidget->pictureViewer()->close(); mATree->seriesWidget()->writeSettings(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); FilesTreeModel *filesModel = static_cast(SmGlobals::instance()->model("FilesModel")); filesModel->writeCache(); writeSettings(); delete SmGlobals::instance(); event->accept(); } void SheMov::updateSelectedCount(int count){ mSelectedItems->setText(QString::number(count)); } void SheMov::statusbarMessage(const QString &message){ statusBar()->showMessage(message); } void SheMov::configure(){ ConfigurationDialog dlg(this); dlg.exec(); createOpenWithMenuFS(); createOpenWithMenuAV(); emit configChanged(); } void SheMov::tabChanged(int newTab){ mEditFSMenuA->setVisible(newTab == 0); mEditAVMenuA->setVisible(newTab == 1); mEditPicMenuA->setVisible(newTab == 2); mViewFSMenuA->setVisible(newTab == 0); mViewAVMenuA->setVisible(newTab == 1); mViewPicMenuA->setVisible(newTab == 2); mCdupA->setEnabled(newTab == 0); mBackDirA->setEnabled(newTab == 0); mFilesTreeHeadersGroup->setEnabled(newTab == 1); mFilterGroup->setEnabled(newTab == 1); mShowTreeGroup->setEnabled(newTab == 1); mPicActionGroup->setEnabled(newTab == 2); mFilterFavoritesA->setEnabled(newTab == 1); mPVSelectAllA->disconnect(); switch(newTab){ case 0: connect(mPVSelectAllA, SIGNAL(triggered()), mFSWidget, SLOT(selectAllPV())); break; case 2: connect(mPVSelectAllA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(setPVAll())); break; default: ;; } } 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::setSlide(bool toggled){ QPixmap slidepm = QPixmap(":/chastity_belt_with_cuffs.png"); QImage slideimg = QImage(slidepm.size(), QImage::Format_ARGB32); QColor bgColor = QColor(Qt::red); if(toggled){ bgColor = QColor(Qt::green); } QPainter p(&slideimg); p.setBrush(bgColor); p.drawRect(0, 0, 20, mSlideLabel->height()); p.drawPixmap(0, 0, slidepm); mSlideLabel->setPixmap(QPixmap::fromImage(slideimg)); } 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()); } QSettings s; bool autoAddCovers = s.value("ui/autoaddcovers", false).toBool(); QString coverPath = s.value("paths/coverpath").toString(); if(autoAddCovers && !coverPath.isEmpty()){ QDir coverDir(coverPath); foreach(QFileInfo fi, coverDir.entryInfoList(QDir::Files)){ mNewMovieWizard->infoPage()->addFile(fi.absoluteFilePath()); } } mNewMovieWizard->show(); } void SheMov::setSize(qint64 size){ QLocale l; QString val; const qint64 dvdSize = SmGlobals::instance()->dvdSize(); qint64 free = dvdSize - size; QString selectedSize = l.toString(size / 1024.0 / 1024.0, 'f', 2); QString freeSize = l.toString(free / 1024.0 / 1024.0, 'f', 2); if(size < dvdSize){ val = QString("%1 (%2) MiB").arg(selectedSize).arg(freeSize); }else{ val = QString("%1 (%2) MiB").arg(selectedSize).arg(freeSize); } 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); mSlideLabel = new QLabel; mSlideLabel->setMinimumWidth(20); mSlideLabel->setAlignment(Qt::AlignCenter); mSlideLabel->setPixmap(QPixmap()); mSlideLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(mSlideLabel); setSlide(false); 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())); mConsistencyA = new QAction(tr("Check consisteny..."), this); connect(mConsistencyA, SIGNAL(triggered()), this, SLOT(checkConsistency())); mAnalyzerA = new QAction(QIcon(":/higheels.png"), tr("Analyze Db..."), this); connect(mAnalyzerA, SIGNAL(triggered()), this, SLOT(analyzeDb())); mMappingEditorA = new QAction(tr("Mapping editor..."), this); connect(mMappingEditorA, SIGNAL(triggered()), this, SLOT(mappingEditor())); mNewPicsA = new QAction(tr("Archive pics...."), this); connect(mNewPicsA, SIGNAL(triggered()), this, SLOT(newPicsDialog())); //connnect mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); //Edit menu (FS) mCdupA = new QAction(QIcon(":/up_dick.png"), tr("Go up"), this); connect(mCdupA, SIGNAL(triggered()), mFSWidget, SLOT(parentDir())); mBackDirA = new QAction(QIcon(":/back_dick.png"), tr("Go back"), this); connect(mBackDirA, SIGNAL(triggered()), mFSWidget, SLOT(goBack())); connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 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())); QSignalMapper *copyCutMapper = new QSignalMapper(this); mCopyA = new QAction(tr("Copy"), this); mCopyA->setShortcut(tr("CTRL+c")); copyCutMapper->setMapping(mCopyA, FilesystemWidget::Copy); connect(mCopyA, SIGNAL(triggered()), copyCutMapper, SLOT(map())); mCutA = new QAction(tr("Cut"), this); mCutA->setShortcut(tr("CTRL+x")); copyCutMapper->setMapping(mCutA, FilesystemWidget::Cut); connect(mCutA, SIGNAL(triggered()), copyCutMapper, SLOT(map())); connect(copyCutMapper, SIGNAL(mapped(int)), mFSWidget, SLOT(toClipboard(int))); mPasteA = new QAction(tr("Paste"), this); mPasteA->setShortcut(tr("Ctrl+v")); connect(mPasteA, SIGNAL(triggered()), mFSWidget, SLOT(fromClipboard())); mRenameA = new QAction(tr("Rename..."), this); mRenameA->setShortcut(tr("CTRL+r")); connect(mRenameA, SIGNAL(triggered()), mFSWidget, SLOT(renameFile())); mMountDvdA = new QAction(QIcon(":/diaper.png"), tr("(Un)mount DVD drive"), this); mMountDvdA->setCheckable(true); connect(mMountDvdA, SIGNAL(triggered()), mFSWidget, SLOT(dvdMount())); mMarkA = new QAction(tr("Mark as (un)seen"), this); connect(mMarkA, SIGNAL(triggered()), mFSWidget, SLOT(markSeen())); mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, SIGNAL(triggered()), this, SLOT(configure())); //Edit menu (AV) QSignalMapper *editMapper = new QSignalMapper(this); FilesTreeModel *filesModel = qobject_cast(SmGlobals::instance()->model("FilesModel")); const QHash editableColumns = filesModel->editableColumns(); mEditGroup = new QActionGroup(this); for(QHash::const_iterator it = editableColumns.constBegin(); it != editableColumns.constEnd(); ++it){ QAction *a = new QAction(it.key(), this); connect(a, SIGNAL(triggered()), editMapper, SLOT(map())); a->setData(it.key()); mEditGroup->addAction(a); editMapper->setMapping(a, it.value()); } connect(editMapper, SIGNAL(mapped(int)), mATree->filesWidget(), SLOT(edit(int))); mToggleFavoriteA = new QAction(tr("Toggle as favorite"), this); mToggleFavoriteA->setShortcut(tr("CTRL+m")); connect(mToggleFavoriteA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(toggleFavorite())); QSignalMapper *mappingMapper = new QSignalMapper(this); mEditGenresA = new QAction(tr("Edit genres..."), this); mappingMapper->setMapping(mEditGenresA, "genre"); connect(mEditGenresA, SIGNAL(triggered()), mappingMapper, SLOT(map())); mEditActorsA = new QAction(tr("Edit actors..."), this); mappingMapper->setMapping(mEditActorsA, "actor"); connect(mEditActorsA, SIGNAL(triggered()), mappingMapper, SLOT(map())); connect(mappingMapper, SIGNAL(mapped(QString)), this, SLOT(editMappings(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 mShowTreeGroup = new QActionGroup(this); QSignalMapper *viewMapper = new QSignalMapper(this); mShowArchivedA = new QAction(QIcon(":/gaping_ass.png"), tr("Show archived movies"), this); mShowTreeGroup->addAction(mShowArchivedA); viewMapper->setMapping(mShowArchivedA, SeriesTreeModel::Archived); connect(mShowArchivedA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowArchivedA->setCheckable(true); mShowLocalA = new QAction(QIcon(":/clitoris.png"), tr("Show local movies"), this); mShowTreeGroup->addAction(mShowLocalA); viewMapper->setMapping(mShowLocalA, SeriesTreeModel::Local); connect(mShowLocalA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowLocalA->setCheckable(true); mShowNormalA = new QAction(QIcon(":/nipple_up.png"), tr("Normal view"), this); mShowTreeGroup->addAction(mShowNormalA); viewMapper->setMapping(mShowNormalA, SeriesTreeModel::All); connect(mShowNormalA, SIGNAL(triggered()), viewMapper, SLOT(map())); mShowNormalA->setCheckable(true); mShowNormalA->setChecked(true); mShowAllFilesA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Show All files"), this); mShowAllFilesA->setCheckable(true); mShowTreeGroup->addAction(mShowAllFilesA); connect(mShowAllFilesA, SIGNAL(toggled(bool)), mATree, SLOT(showAllFiles(bool))); //Tree view headers QHash headerData = filesModel->headerData(); QSignalMapper *headerMapper = new QSignalMapper(this); mFilesTreeHeadersGroup = new QActionGroup(this); mFilesTreeHeadersGroup->setExclusive(false); for(QHash::const_iterator it = headerData.constBegin(); it != headerData.constEnd(); ++it){ QAction *a = new QAction(it.key(), this); a->setCheckable(true); a->setData(it.value()); mFilesTreeHeadersGroup->addAction(a); headerMapper->setMapping(a, a); connect(a, SIGNAL(triggered()), headerMapper, SLOT(map())); } connect(headerMapper, SIGNAL(mapped(QObject*)), mATree->filesWidget()->filesTree(), SLOT(toggleHeader(QObject*))); //Tree view hover mHoverTreeGroup = new QActionGroup(this); mHoverTreeGroup->setExclusive(false); QSignalMapper *hoverMapper = new QSignalMapper(this); mHoverPicsA = new QAction(QIcon(":/bald_pussy.png"), tr("Hover over pictures"), this); mHoverPicsA->setData("ui/hoverpics"); mHoverPicsA->setCheckable(true); hoverMapper->setMapping(mHoverPicsA, mHoverPicsA); connect(mHoverPicsA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mHoverTreeGroup->addAction(mHoverPicsA); mHoverArchiveA = new QAction(QIcon(":/prince_albert.png"), tr("Hover over archive tree"), this); mHoverArchiveA->setData("ui/hoverarchive"); mHoverArchiveA->setCheckable(true); hoverMapper->setMapping(mHoverArchiveA, mHoverArchiveA); connect(mHoverArchiveA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mHoverTreeGroup->addAction(mHoverArchiveA); mHoverMoviesA = new QAction(QIcon(":/ball_gag.png"), tr("Hover over movies"), this); mHoverMoviesA->setData("ui/hovermovies"); mHoverMoviesA->setCheckable(true); hoverMapper->setMapping(mHoverMoviesA, mHoverMoviesA); connect(mHoverMoviesA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mHoverTreeGroup->addAction(mHoverMoviesA); //Tree view filter mFilterGroup = new QActionGroup(this); mFilterMapper = new QSignalMapper(this); mFilterBySeriesA = new QAction(QIcon(":/butt_plug.png"), tr("Series name"), this); mFilterBySeriesA->setCheckable(true); mFilterMapper->setMapping(mFilterBySeriesA, SeriesTreeWidget::FilterSeries); connect(mFilterBySeriesA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterBySeriesA); mFilterByActorA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Actor"), this); mFilterByActorA->setCheckable(true); mFilterMapper->setMapping(mFilterByActorA, SeriesTreeWidget::FilterActor); connect(mFilterByActorA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterByActorA); mFilterByGenreA = new QAction(QIcon(":/spreadingpants.png"), tr("Genre"), this); mFilterByGenreA->setCheckable(true); mFilterMapper->setMapping(mFilterByGenreA, SeriesTreeWidget::FilterGenre); connect(mFilterByGenreA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterByGenreA); mFilterByQualityA = new QAction(QIcon(":/shackles.png"), tr("Quality"), this); mFilterByQualityA->setCheckable(true); mFilterMapper->setMapping(mFilterByQualityA, SeriesTreeWidget::FilterQuality); connect(mFilterByQualityA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterByQualityA); mFilterByFilenameA = new QAction(QIcon(":/steel_collar.png"), tr("Filename"), this); mFilterByFilenameA->setCheckable(true); mFilterMapper->setMapping(mFilterByFilenameA, SeriesTreeWidget::FilterFileName); connect(mFilterByFilenameA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterByFilenameA); mFilterByDvdNoA = new QAction(QIcon(":/big_ass.png"), tr("Dvd No."), this); mFilterByDvdNoA->setCheckable(true); mFilterMapper->setMapping(mFilterByDvdNoA, SeriesTreeWidget::FilterDvdNo); connect(mFilterByDvdNoA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterByDvdNoA); mFilterBySizeA = new QAction(QIcon(":/hourglass_figure.png"), tr("Size"), this); mFilterBySizeA->setCheckable(true); mFilterMapper->setMapping(mFilterBySizeA, SeriesTreeWidget::FilterSize); connect(mFilterBySizeA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); mFilterGroup->addAction(mFilterBySizeA); connect(mFilterMapper, SIGNAL(mapped(int)), mATree->seriesWidget(), SLOT(setFilterMode(int))); mFilterFavoritesA = new QAction(QIcon(":/dog_hood.png"), tr("Favorites only"), this); mFilterFavoritesA->setCheckable(true); connect(mFilterFavoritesA, SIGNAL(triggered(bool)), this, SLOT(toggleFilterGroup(bool))); connect(mFilterFavoritesA, SIGNAL(triggered(bool)), mATree->seriesWidget(), SLOT(filterFavorites(bool))); //file view hover mFSHoverGroup = new QActionGroup(this); mFSHoverGroup->setExclusive(false); mHoverDirectoriesA = new QAction(QIcon(":/french_maid_dress.png"), tr("Hover over directories"), this); mHoverDirectoriesA->setData("ui/hoverdirs"); mHoverDirectoriesA->setCheckable(true); hoverMapper->setMapping(mHoverDirectoriesA, mHoverDirectoriesA); connect(mHoverDirectoriesA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mFSHoverGroup->addAction(mHoverDirectoriesA); //connect hovermapper connect(hoverMapper, SIGNAL(mapped(QObject*)), this, SLOT(toggleHover(QObject*))); //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())); 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())); QSignalMapper *copyMapper = new QSignalMapper(this); mCopyUnixFullPathA = new QAction(tr("Copy unix file"), this); copyMapper->setMapping(mCopyUnixFullPathA, ArchiveTreeView::UnixFullPath); connect(mCopyUnixFullPathA, SIGNAL(triggered()), copyMapper, SLOT(map())); mCopyUnixDirA = new QAction(tr("Copy unix directory"), this); copyMapper->setMapping(mCopyUnixDirA, ArchiveTreeView::UnixDir); connect(mCopyUnixDirA, SIGNAL(triggered()), copyMapper, SLOT(map())); mCopyWindowsFullPathA = new QAction(tr("Copy windows file"), this); copyMapper->setMapping(mCopyWindowsFullPathA, ArchiveTreeView::WindowsFullPath); connect(mCopyWindowsFullPathA, SIGNAL(triggered()), copyMapper, SLOT(map())); mCopyWindowsDirA = new QAction(tr("Copy windows directory"), this); copyMapper->setMapping(mCopyWindowsDirA, ArchiveTreeView::WindowsDir); connect(mCopyWindowsDirA, SIGNAL(triggered()), copyMapper, SLOT(map())); connect(copyMapper, SIGNAL(mapped(int)), mATree, SLOT(copyPath(int))); mSuggestFileA = new QAction(QIcon(":/analstretcher.png"), tr("Suggest file for burning"), this); connect(mSuggestFileA, SIGNAL(triggered()), mATree->filesWidget(), SLOT(suggest())); mShowTreeGroup->addAction(mSuggestFileA); //picture widget // delete + edit mPWDeletePicFromA = new QAction(QIcon(":/huge_balls_pierced.png"), tr("Delete..."), this); mPicWidget->picView()->addAction(mPWDeletePicFromA); connect(mPWDeletePicFromA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(deletePics())); mPWEditPicMappingsA = new QAction(QIcon(":/squirting_nipple.png"), tr("Edit mappings..."), this); mPicWidget->picView()->addAction(mPWEditPicMappingsA); connect(mPWEditPicMappingsA, SIGNAL(triggered()), mPicWidget->picView(), SIGNAL(editPicsMappings())); QAction *pvSep1 = new QAction(this); pvSep1->setSeparator(true); mPicWidget->picView()->addAction(pvSep1); // viewer actions PictureViewer2 *picViewer = SmGlobals::instance()->pictureViewer(); mPVToggleA = new QAction(QIcon(":/dick_in_cage.png"), tr("Show/Hide Picture Viewer"), this); mPVToggleA->setCheckable(true); mPVToggleA->setData(PictureViewer2::HideAction); connect(mPVToggleA, SIGNAL(toggled(bool)), picViewer, SLOT(setVisible(bool))); mPVToggleA->setChecked(false); mPicWidget->picView()->addAction(mPVToggleA); picViewer->addAction(mPVToggleA); //add or replace pictures: pictureviewer QSignalMapper *PVAddMapper = new QSignalMapper(this); mPVAddA = new QAction(QIcon(":/used_tampon.png"), tr("Add selected"), this); connect(mPVAddA, SIGNAL(triggered()), PVAddMapper, SLOT(map())); PVAddMapper->setMapping(mPVAddA, false); mPicWidget->picView()->addAction(mPVAddA); mPVReplaceA = new QAction(QIcon(":/clean_tampon.png"), tr("Replace with selected"), this); connect(mPVReplaceA, SIGNAL(triggered()), PVAddMapper, SLOT(map())); PVAddMapper->setMapping(mPVReplaceA, true); mPicWidget->picView()->addAction(mPVReplaceA); connect(PVAddMapper, SIGNAL(mapped(int)), mPicWidget->picView(), SLOT(setPVData(int))); //select all from current, see tabChanged(int) mPVSelectAllA = new QAction(QIcon(":/blue_syringe.png"), tr("Select all pics"), this); picViewer->addAction(mPVSelectAllA); //slide QAction *pvSep2 = new QAction(this); pvSep2->setSeparator(true); mPicWidget->picView()->addAction(pvSep2); mPVSlideA = new QAction(QIcon(":/chastity_belt_with_cuffs.png"), tr("Slide"), this); mPVSlideA->setCheckable(true); mPVSlideA->setData(PictureViewer2::SlideAction); connect(mPVSlideA, SIGNAL(toggled(bool)), picViewer, SLOT(slide(bool))); connect(mPVSlideA, SIGNAL(toggled(bool)), this, SLOT(setSlide(bool))); QAction *pv2Sep1 = new QAction(this); pv2Sep1->setSeparator(true); picViewer->addAction(pv2Sep1); picViewer->addAction(mPVSlideA); //shuffle QAction *pvSep3 = new QAction(this); pvSep3->setSeparator(true); mPicWidget->picView()->addAction(pvSep3); mPVShuffleA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Shuffle"), this); connect(mPVShuffleA, SIGNAL(triggered()), picViewer, SLOT(shuffle())); picViewer->addAction(mPVShuffleA); // refresh mPWRefreshA = new QAction(QIcon(":/huge_bra.png"), tr("Refresh"), this); mPicWidget->picView()->addAction(mPWRefreshA); connect(mPWRefreshA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(refresh())); mPicWidget->setPicViewerAction(mPVToggleA); picViewer->initActions(); //don't add actions with checkable(true) unless you know what you're doing! mPicActionGroup = new QActionGroup(this); mPicActionGroup->addAction(mPWDeletePicFromA); mPicActionGroup->addAction(mPWEditPicMappingsA); mPicActionGroup->addAction(mPWRefreshA); // 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(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); fileMenu->addAction(mConsistencyA); fileMenu->addAction(mAnalyzerA); fileMenu->addAction(mMappingEditorA); fileMenu->addAction(mNewPicsA); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); //filesystem edit menu mEditFSMenu = new QMenu(tr("&Edit"), this); mEditFSMenu->addAction(mCdupA); mEditFSMenu->addAction(mBackDirA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMarkFilesA); mEditFSMenu->addAction(mUnmarkFilesA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mCreateFolderA); mEditFSMenu->addAction(mDeleteFilesA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mCopyA); mEditFSMenu->addAction(mCutA); mEditFSMenu->addAction(mPasteA); mEditFSMenu->addAction(mRenameA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mCopyA); mEditFSMenu->addAction(mCutA); mEditFSMenu->addAction(mPasteA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMountDvdA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMarkA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mConfigA); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); //TreeView edit menu mEditAVMenu = new QMenu(tr("&Edit"), this); foreach(QAction *a, mEditGroup->actions()){ mEditAVMenu->addAction(a); } mEditAVMenuA = menuBar()->addMenu(mEditAVMenu); QAction *sep20 = new QAction(this); sep20->setSeparator(true); mEditAVMenu->addAction(sep20); mEditAVMenu->addAction(mEditActorsA); mEditAVMenu->addAction(mEditGenresA); //Pictures edit menu mEditPicMenu = new QMenu(tr("&Edit"), this); mEditPicMenu->addAction(mPWDeletePicFromA); mEditPicMenu->addAction(mPWEditPicMappingsA); mEditPicMenuA = menuBar()->addMenu(mEditPicMenu); //TreeView view menu mTreeViewMenu = new QMenu(tr("&View"), this); mTreeViewMenu->addAction(mShowNormalA); mTreeViewMenu->addAction(mShowLocalA); mTreeViewMenu->addAction(mShowArchivedA); mTreeViewMenu->addAction(mShowAllFilesA); mTreeViewMenu->addAction(mSuggestFileA); QAction *sep14 = new QAction(this); sep14->setSeparator(true); mTreeViewMenu->addAction(sep14); mTreeHeaderMenu = new QMenu(tr("Show headers"), this); mTreeHeaderMenu->addActions(mFilesTreeHeadersGroup->actions()); mTreeViewMenu->addMenu(mTreeHeaderMenu); QAction *sep15 = new QAction(this); sep15->setSeparator(true); mTreeViewMenu->addAction(sep15); mTreeHoverMenu = new QMenu(tr("Hover over"), this); mTreeHoverMenu->addActions(mHoverTreeGroup->actions()); mTreeViewMenu->addMenu(mTreeHoverMenu); mViewAVMenuA = menuBar()->addMenu(mTreeViewMenu); mTreeFilterMenu = new QMenu(tr("Filter by"), this); mTreeFilterMenu->addActions(mFilterGroup->actions()); QAction *sep17 = new QAction(this); sep17->setSeparator(true); mTreeViewMenu->addAction(sep17); mTreeViewMenu->addMenu(mTreeFilterMenu); QAction *sep18 = new QAction(this); sep18->setSeparator(true); mTreeViewMenu->addAction(sep18); mTreeViewMenu->addAction(mFilterFavoritesA); //FileSystem view menu mFSViewMenu = new QMenu(tr("&View"), this); mFSHoverMenu = new QMenu(tr("Hover over"), this); mFSHoverMenu->addActions(mFSHoverGroup->actions()); mFSViewMenu->addMenu(mFSHoverMenu); mViewFSMenuA = menuBar()->addMenu(mFSViewMenu); //Pictures view menu mPicViewMenu = new QMenu(tr("&View"), this); mPicViewMenu->addAction(mPVToggleA); mPicViewMenu->addAction(mPVAddA); mPicViewMenu->addAction(mPVReplaceA); mPicViewMenu->addSeparator(); mPicViewMenu->addAction(mPVShuffleA); mPicViewMenu->addAction(mPWRefreshA); mViewPicMenuA = menuBar()->addMenu(mPicViewMenu); 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); mFSWidget->fileView()->addAction(mBackDirA); 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(mRenameMenuA); QAction *sep16 = new QAction(this); sep16->setSeparator(true); mFSWidget->fileView()->addAction(sep16); mFSWidget->fileView()->addAction(mCopyA); mFSWidget->fileView()->addAction(mCutA); mFSWidget->fileView()->addAction(mPasteA); QAction *sep10 = new QAction(this); sep10->setSeparator(true); mFSWidget->fileView()->addAction(sep10); mFSWidget->fileView()->addAction(mMarkA); QAction *sep11 = new QAction(this); sep11->setSeparator(true); mFSWidget->fileView()->addAction(sep11); 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); QAction *sep19 = new QAction(this); sep19->setSeparator(true); mATree->seriesWidget()->seriesTree()->addAction(sep19); mATree->seriesWidget()->seriesTree()->addAction(mToggleFavoriteA); //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()->addActions(mEditGroup->actions()); QAction *sep21 = new QAction(this); sep21->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep20); mATree->filesWidget()->filesTree()->addAction(mShowAllFilesA); mATree->filesWidget()->filesTree()->addAction(mSuggestFileA); 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); QMenu *copyMenu = new QMenu(this); copyMenu->addAction(mCopyUnixFullPathA); copyMenu->addAction(mCopyUnixDirA); QAction *sep13 = new QAction(this); sep13->setSeparator(true); copyMenu->addAction(sep13); copyMenu->addAction(mCopyWindowsFullPathA); copyMenu->addAction(mCopyWindowsDirA); QAction *copyAction = new QAction(tr("Copy to clipboard"), this); copyAction->setMenu(copyMenu); mATree->filesWidget()->filesTree()->addAction(copyAction); QAction *sep12 = new QAction(this); sep12->setSeparator(true); mATree->filesWidget()->filesTree()->addAction(sep12); 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::createToolBar(){ QToolBar *toolBar = new QToolBar(this); toolBar->addAction(mBackDirA); toolBar->addAction(mCdupA); toolBar->addSeparator(); toolBar->addAction(mConfigA); toolBar->addAction(mAnalyzerA); toolBar->addSeparator(); toolBar->addAction(mShowNormalA); toolBar->addAction(mShowArchivedA); toolBar->addAction(mShowLocalA); toolBar->addAction(mShowAllFilesA); toolBar->addAction(mSuggestFileA); toolBar->addSeparator(); toolBar->addActions(mFilterGroup->actions()); toolBar->addAction(mFilterFavoritesA); toolBar->addSeparator(); toolBar->addActions(mPicActionGroup->actions()); toolBar->addAction(mPVToggleA); toolBar->addSeparator(); toolBar->addAction(mHoverPicsA); toolBar->addAction(mHoverArchiveA); toolBar->addAction(mHoverDirectoriesA); toolBar->addAction(mHoverMoviesA); toolBar->addSeparator(); toolBar->addAction(mMountDvdA); addToolBar(Qt::LeftToolBarArea, toolBar); } 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()); QList visibleHeaders; foreach(QAction *a, mFilesTreeHeadersGroup->actions()){ if(a->isChecked()){ visibleHeaders << a->data(); } } s.setValue("ui/visibleheaders", visibleHeaders); mATree->filesWidget()->filesTree()->writeHeaderConfig(); } void SheMov::readSettings(){ QSettings s; QPoint winPos = s.value("windows/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); } tabChanged(currentTab); mHoverPicsA->setChecked(s.value("ui/hoverpics").toBool()); mHoverArchiveA->setChecked(s.value("ui/hoverarchive").toBool()); mHoverDirectoriesA->setChecked(s.value("ui/hoverdirs").toBool()); mHoverMoviesA->setChecked(s.value("ui/hovermovies").toBool()); QString dvdMount = s.value("paths/dvdmount").toString(); if(dvdMount.isEmpty()){ mMountDvdA->setEnabled(false); }else{ if(mFSWidget->isMounted()){ mMountDvdA->setChecked(true); }else{ mMountDvdA->setChecked(false); } } QList visibleHeadersDefault = QList() << 0 << 1 << 2 << 3 << 4 << 13; QList visibleHeaders = s.value("ui/visibleheaders", visibleHeadersDefault).toList(); foreach(QVariant h, visibleHeaders){ foreach(QAction *a, mFilesTreeHeadersGroup->actions()){ if(a->data() == h){ a->trigger(); } } } bool alternate = s.value("ui/allowalternate").toBool(); QPalette pal(palette()); if(alternate){ QVariant basecolor = s.value("ui/basecolor"); QVariant alternatecolor = s.value("ui/alternatecolor"); pal.setColor(QPalette::Base, basecolor.value()); pal.setColor(QPalette::AlternateBase, alternatecolor.value()); }else{ pal.setColor(QPalette::Base, Qt::white); pal.setColor(QPalette::AlternateBase, Qt::white); } qApp->setPalette(pal); int seriesFilterMode = s.value("archive/filtermode").toInt(); QAction *filterAction = qobject_cast(mFilterMapper->mapping(seriesFilterMode)); if(filterAction){ filterAction->trigger(); mATree->seriesWidget()->filter(); } } void SheMov::checkConsistency(){ ConsistencyCheck c; c.exec(); } void SheMov::analyzeDb(){ mDbAnalyzerDialog->show(); } void SheMov::analyzeDelete(int mode, QList &ids){ QString message = QString(tr("Really delete %1 items?")).arg(QString::number(ids.count())); int res = QMessageBox::question(this, tr("Delete items"), message, QMessageBox::Yes | QMessageBox::No); if(res != QMessageBox::Yes){ return; } MappingTableModel *model = 0; switch(mode){ case DbAnalyzerDialog::Actors: model = qobject_cast(SmGlobals::instance()->model("actors")); break; case DbAnalyzerDialog::Genres: model = qobject_cast(SmGlobals::instance()->model("genres")); break; default: ; } Q_ASSERT(model); model->deleteItems(ids); mDbAnalyzerDialog->refresh(); } void SheMov::toggleHover(QObject *object){ QAction *action = qobject_cast(object); if(action){ QSettings s; QString toSet = action->data().toString(); bool checked = action->isChecked(); s.setValue(toSet, checked); emit configChanged(); } } void SheMov::checkMount(bool mounted){ mMountDvdA->setChecked(mounted); } void SheMov::toggleFilterGroup(bool checked){ mFilterGroup->setEnabled(!checked); } void SheMov::editMappings(QString table){ MappingTableEditor ed(table, this); ed.exec(); } void SheMov::mappingEditor(){ QDialog dlg(this); QHBoxLayout *dlgLayout = new QHBoxLayout; MappingTreeWidget *mtw = new MappingTreeWidget; dlgLayout->addWidget(mtw); dlg.setLayout(dlgLayout); dlg.exec(); } void SheMov::newPicsDialog(){ NewPicsDialog npd(this); npd.exec(); }