/* 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 "shemov.h" #include "filesystemwidget.h" #include "filesystemfileproxy.h" #include "fileview.h" #include "configurationdialog.h" #include "statisticsdialog.h" #include "smglobals.h" #include "newmoviewizard.h" #include "consistencycheck.h" #include "mappingtableeditor.h" #include "mappingtablemodel.h" #include "dbanalyzer.h" #include "newpicsdialog.h" #include "pictureswidget.h" #include "smdirmodel.h" #include "archiveview.h" #include "archivecontroller.h" #include "archivebrowser.h" #include "searchdialog.h" #include "randomtab.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { //application icon qApp->setWindowIcon(QIcon(":/shemov.png")); createPalette(); setAttribute(Qt::WA_DeleteOnClose); QSplashScreen splash(QPixmap(":/shemov_splash2.png")); splash.show(); //init database as early as possible splash.showMessage(tr("Initializing globals..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); (void) SmGlobals::instance(); //FileSystemWidget + TabWidget splash.showMessage(tr("Constructing Filemanager..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mFSWidget = new FilesystemWidget; SmGlobals::instance()->registerWidget("FSWidget", mFSWidget); setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; mTab->addTab(mFSWidget, tr("Filemanager")); connect(this, SIGNAL(configChanged()), mFSWidget, SLOT(configChanged())); //experimental splash.showMessage(tr("Creating Movie archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mArchive = new ArchiveView; mTab->addTab(mArchive, "Movies"); connect(mArchive->archiveModel(), SIGNAL(message(QString)), this, SLOT(statusbarMessage(QString))); //pictures splash.showMessage(tr("Creating Picture Archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); 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))); PictureViewer2 *picViewer = SmGlobals::instance()->pictureViewer(); //archivebrower splash.showMessage(tr("Creating Archive Browser..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mArchiveBrowser = new ArchiveBrowser; mTab->addTab(mArchiveBrowser, tr("Archive Browser")); connect(mArchiveBrowser, SIGNAL(sizeChanged(qint64)), this, SLOT(setSize(qint64))); connect(mArchiveBrowser, SIGNAL(itemCountChanged(int)), this, SLOT(updateSelectedCount(int))); connect(mArchiveBrowser, SIGNAL(needFSFreeUpdate()), this, SLOT(setFsFree())); //randomtab splash.showMessage(tr("Creating Random Browser..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mRandomTab = new RandomTab; connect(mRandomTab, SIGNAL(configure()), this, SLOT(configure())); mTab->addTab(mRandomTab, tr("Random")); //newmoviewizard + dbanalyzer + newpicsdialog + searchdialog splash.showMessage(tr("Creating misc. Dialogs..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mNewMovieWizard = new NewMovieWizard(this); mNewMovieWizard->setMinimumWidth(1024); ArchiveController *c = SmGlobals::instance()->archiveController(); connect(mNewMovieWizard, SIGNAL(accepted()), c->archiveTreeModel(), SLOT(refresh())); mNewPicsDialog = new NewPicsDialog(this); mSearchDialog = new SearchDialog(this); connect(mSearchDialog, SIGNAL(searchResultClicked(int)), this, SLOT(searchResult(int))); //experimental archive connect(c, SIGNAL(sizeChanged(qint64)), this, SLOT(setSize(qint64))); connect(c, SIGNAL(durationChanged(qint64,bool)), this, SLOT(setDuration(qint64,bool))); connect(c->archiveTreeModel(), SIGNAL(windowTitle(QString)), this, SLOT(setWindowTitle(QString))); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); splash.showMessage(tr("Creating Menus and Statusbar..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); createStatusbar(); createActions(); createMenus(); createToolBar(); setFsFree(); splash.showMessage(tr("Finishing..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); connect(mFSWidget->fileView(), SIGNAL(selectedSize(qint64)), this, SLOT(setSize(qint64))); connect(mFSWidget->fileView(), SIGNAL(selectedDuration(qint64,bool)), this, SLOT(setDuration(qint64,bool))); 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(mFSWidget->fileModel(), SIGNAL(fsFreeChanged()), this, SLOT(setFsFree())); connect(this, SIGNAL(configChanged()), mFSWidget->fileView(), SLOT(readConfig())); connect(this, SIGNAL(configChanged()), picViewer, SLOT(readSettings())); connect(this, SIGNAL(configChanged()), c->archiveTreeModel(), SLOT(readConfig())); connect(mFSWidget, SIGNAL(mounted(bool)), this, SLOT(checkMount(bool))); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); show(); splash.finish(this); mFSWidget->readSettings(); mFSWidget->fileView()->setFocus(Qt::ActiveWindowFocusReason); mPicWidget->readSettings(); mArchive->readSettings(); mArchiveBrowser->readConfig(); readSettings(); // craptastic... We can't center until it's painted, // hence this indirection :( mFSWidget->centerCurrent(); setWindowState(Qt::WindowMaximized); } void SheMov::closeEvent(QCloseEvent *event){ mFSWidget->writeSettings(); mFSWidget->pictureViewer()->close(); mPicWidget->picViewer2()->writeSettings(); mPicWidget->writeSettings(); mArchive->writeSettings(); mArchiveBrowser->writeSettings(); writeSettings(); SmGlobals *globals = SmGlobals::instance(); delete globals; QSqlDatabase::database("treedb").close(); 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(); createPalette(); emit configChanged(); } void SheMov::tabChanged(int newTab){ mEditFSMenuA->setVisible(newTab == FileManager); mEditPicMenuA->setVisible(newTab == Pictures); mViewFSMenuA->setVisible(newTab == FileManager); mViewPicMenuA->setVisible(newTab == Pictures); mArchiveViewMenuA->setVisible(newTab == Movies); mArchiveMenuA->setVisible(newTab == Movies); mCdupA->setEnabled(newTab == FileManager); mBackDirA->setEnabled(newTab == FileManager); mPicActionGroup->setEnabled(newTab == Pictures); mPVSelectAllA->disconnect(); mPVShowNPDialogA->setEnabled(newTab == FileManager); mPVAddToNPA->setEnabled(newTab == FileManager); mNewPicsA->setEnabled(newTab == FileManager); mNewMovieWizardA->setEnabled(newTab == FileManager); mArchiveBrowserViewMenuA->setVisible(newTab == ArchiveBrowserTab); mRandomEditMenuA->setVisible(newTab == RandomDisp); statusbarMessage(QString()); ArchiveController *c = SmGlobals::instance()->archiveController(); switch(newTab){ case FileManager: connect(mPVSelectAllA, SIGNAL(triggered()), mFSWidget, SLOT(selectAllPV())); mFSWidget->fileView()->selectedFilesChanged(); mFSWidget->setWindowTitle(); break; case Movies: c->fileSelectionChanged(QItemSelection(), QItemSelection()); c->archiveTreeModel()->setWindowTitle(); break; case Pictures: connect(mPVSelectAllA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(setPVAll())); mPicWidget->constructWindowTitle(); setDuration(0x0, false); break; default: setDuration(0x0, false); ;; } } 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; int freeRounded = qRound(freegib); QString freeString = QString("%1 GiB free").arg(QString::number(freeRounded)); 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 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(); mNewMovieWizard->infoPage()->setCurrentDir(mFSWidget->currentDir()); foreach(QModelIndex sel, selected){ mNewMovieWizard->infoPage()->addFile(sel.data(SmDirModel::FullPathRole).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->infoPage()->selectFirst(); mNewMovieWizard->show(); } void SheMov::setSize(qint64 size){ QLocale l; QString val; qint64 free = DVDSIZE - size; QString selectedSize = l.toString(size); QString freeSize = l.toString(free); if(size < DVDSIZE){ val = QString("%1 (%2)").arg(selectedSize).arg(freeSize); }else{ val = QString("%1 (%2)").arg(selectedSize).arg(freeSize); } mSelectedSize->setText(val); } void SheMov::setDuration(qint64 dur, bool maybeMore){ Helper::Duration d(dur); QString t = d.toString(); if(maybeMore){ t.append("+"); } mSelectedDuration->setText(t); } QAction *SheMov::createSeparator(){ QAction *tmp = new QAction(this); tmp->setSeparator(true); return tmp; } QSignalMapper *SheMov::createHeaderMapper(SmTreeModel *model, QActionGroup *group){ QHash headerData = model->headerData(); QSignalMapper *retval = new QSignalMapper(this); group->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()); group->addAction(a); retval->setMapping(a, a); connect(a, SIGNAL(triggered()), retval, SLOT(map())); } return retval; } void SheMov::createStatusbar(){ QLabel *selDurL = new QLabel(tr("Duration")); mSelectedDuration = new QLabel("00:00:00"); mSelectedDuration->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addPermanentWidget(selDurL); statusBar()->addPermanentWidget(mSelectedDuration); 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 *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())); mOpenTimesFSAG = new QActionGroup(this); mOpenTimesFSMapper = new QSignalMapper(this); for(int i = 2; i < 6; ++i){ QString actString = QString("Play %1 times...").arg(i); QAction *playTimesA = new QAction(actString, this); mOpenTimesFSMapper->setMapping(playTimesA, i); connect(playTimesA, SIGNAL(triggered()), mOpenTimesFSMapper, SLOT(map())); mOpenTimesFSAG->addAction(playTimesA); } connect(mOpenTimesFSMapper, SIGNAL(mapped(int)), mFSWidget, SLOT(playSelectedRepeat(int))); mOpenTimesFSAG->addAction(createSeparator()); QString infiniteTimes = QString(tr("Play %1 times")).arg(QChar(0x221E)); // infinite mPlaySelectedInfTimesA = new QAction(infiniteTimes, this); connect(mPlaySelectedInfTimesA, SIGNAL(triggered()), mFSWidget, SLOT(playSelectedInfinite())); mOpenTimesFSAG->addAction(mPlaySelectedInfTimesA); mPlaySelectedFSTimesA = new QAction(tr("Play repeat..."), this); mNewMovieWizardA = new QAction(tr("Archive movie..."), this); connect(mNewMovieWizardA, SIGNAL(triggered()), this, SLOT(newMovieWizard())); mArchiveSelectedMovsA = new QAction(QIcon(":/butt_plug.png"), tr("Archive selected movies..."), this); connect(mArchiveSelectedMovsA, SIGNAL(triggered()), this, SLOT(newMovieWizardWithFiles())); mArchiveSelectedPicsA = new QAction(QIcon(":/hourglass_figure.png"), tr("Archive selected pics..."), this); connect(mArchiveSelectedPicsA, SIGNAL(triggered()), this, SLOT(newPicsDialogWithFiles())); mArchivePicsInDirA = new QAction(QIcon(":/higheels.png"), tr("Archive all pics..."), this); connect(mArchivePicsInDirA, SIGNAL(triggered()), this, SLOT(newPicsDialogWithDir())); mConsistencyA = new QAction(tr("Check consisteny..."), this); connect(mConsistencyA, SIGNAL(triggered()), this, SLOT(checkConsistency())); mNewPicsA = new QAction(tr("Archive pics...."), this); connect(mNewPicsA, SIGNAL(triggered()), this, SLOT(newPicsDialog())); mUnpackA = new QAction(QIcon(":/dog_hood.png"), tr("Unpack..."), this); connect(mUnpackA, SIGNAL(triggered()), mFSWidget, SLOT(unpack())); mSearchDialogA = new QAction(tr("Search..."), this); mSearchDialogA->setShortcut(tr("CTRL+f")); connect(mSearchDialogA, SIGNAL(triggered()), mSearchDialog, SLOT(show())); //connnect mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); connect(mQuitA, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); //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())); mGotoArchiveA = new QAction(tr("Goto archive..."), this); connect(mGotoArchiveA, SIGNAL(triggered()), this, SLOT(gotoArchive())); mMarkFilesA = new QAction(tr("Select files..."), this); mMarkFilesA->setShortcut(tr("CTRL++")); mMarkFilesA->setShortcut(QKeySequence(Qt::CTRL + Qt::KeypadModifier + Qt::Key_Plus)); connect(mMarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(markFiles())); mUnmarkFilesA = new QAction(tr("Deselect all files"), this); mUnmarkFilesA->setShortcut(tr("CTRL+-")); mUnmarkFilesA->setShortcut(QKeySequence(Qt::CTRL + Qt::KeypadModifier + Qt::Key_Minus)); connect(mUnmarkFilesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(unmarkFiles())); mCreateFolderA = new QAction(QIcon(":/folder.png"), tr("New folder..."), this); mCreateFolderA->setShortcut(tr("CTRL+n")); connect(mCreateFolderA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(createFolder())); mDeleteFilesA = new QAction(QIcon(":/delete.png"), 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(QIcon(":/rename.png"), 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())); mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, SIGNAL(triggered()), this, SLOT(configure())); mMoveToArchiveA = new QAction(tr("Move to archive"), this); connect(mMoveToArchiveA, SIGNAL(triggered()), mFSWidget, SLOT(moveToArchive())); //View menu (FS) mRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); connect(mRefreshA, SIGNAL(triggered()), mFSWidget->fileModel(), SLOT(refresh())); mFSViewPropertiesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Properties..."), this); connect(mFSViewPropertiesA, SIGNAL(triggered()), mFSWidget->fileView(), SLOT(properties())); mFSPreviewA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Preview..."), this); connect(mFSPreviewA, SIGNAL(triggered()), mFSWidget, SLOT(preview())); mFSResizeA = new QAction(QIcon(":/analstretcher.png"), tr("Resize"), this); connect(mFSResizeA, SIGNAL(triggered()), mFSWidget, SLOT(resizeFileView())); //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())); //headers mFileSysHeaderGroup = new QActionGroup(this); QSignalMapper *fileSysHeaderMapper = createHeaderMapper(qobject_cast(mFSWidget->fileModel()), mFileSysHeaderGroup); connect(fileSysHeaderMapper, SIGNAL(mapped(QObject*)), mFSWidget->fileView(), SLOT(toggleHeader(QObject*))); mFSWidget->fileView()->setHeaderGroup(mFileSysHeaderGroup); mPicsTreeHeaderGroup = new QActionGroup(this); SmTreeModel *picFilesModel = static_cast(SmGlobals::instance()->model("PicFiles")); QSignalMapper *picsTreeHeaderMapper = createHeaderMapper(picFilesModel, mPicsTreeHeaderGroup); connect(picsTreeHeaderMapper, SIGNAL(mapped(QObject*)), mPicWidget->picView(), SLOT(toggleHeader(QObject*))); mPicWidget->picView()->setHeaderGroup(mPicsTreeHeaderGroup); mArchiveFilesAG = new QActionGroup(this); ArchiveController *controller = SmGlobals::instance()->archiveController(); SmTreeModel *afilesmodel = controller->archiveFilesModel(); QSignalMapper *aFilesMapper = createHeaderMapper(afilesmodel, mArchiveFilesAG); connect(aFilesMapper, SIGNAL(mapped(QObject*)), controller->archiveFiles(), SLOT(toggleHeader(QObject*))); controller->archiveFiles()->setHeaderGroup(mArchiveFilesAG); SmTreeModel *abrowsermodel = static_cast(SmGlobals::instance()->model("BrowserModel")); mArchiveBrowserAG = new QActionGroup(this); QSignalMapper *archiveBrowserHeaderMapper = createHeaderMapper(abrowsermodel, mArchiveBrowserAG); connect(archiveBrowserHeaderMapper, SIGNAL(mapped(QObject*)), mArchiveBrowser->archiveTree(), SLOT(toggleHeader(QObject*))); mArchiveBrowser->archiveTree()->setHeaderGroup(mArchiveBrowserAG); /* very unfortunate naming of variables: * picViewer: the actual PictureViewer2 window * picView: the picture files TreeView * First: the Treeview -> picView */ // Delete... + Edit Mappings... 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())); mPicWidget->picView()->addAction(createSeparator()); // Show slide dialog PictureViewer2 *picViewer = SmGlobals::instance()->pictureViewer(); mPVSlideDlgA = new QAction(QIcon(":/hourglass_figure.png"), tr("Show slide dialog..."), this); mPVSlideDlgA->setData(PictureViewer2::SlideAction); mPicWidget->picView()->addAction(mPVSlideDlgA); connect(mPVSlideDlgA, SIGNAL(triggered()), picViewer, SLOT(showSlide())); mPicWidget->picView()->addAction(createSeparator()); // Show/Hide Picture Viewer 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); // Add selected + Replace with selected 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))); // Refresh mPicWidget->picView()->addAction(createSeparator()); 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); /* Now the context menu for the actual Viewer * picViewer -> PictureViewer2 */ // Slide Dialog picViewer->addAction(mPVSlideDlgA); picViewer->addAction(createSeparator()); // Show/Hide Picture Viewer picViewer->addAction(mPVToggleA); // Select all pics mPVSelectAllA = new QAction(QIcon(":/blue_syringe.png"), tr("Select all pics"), this); picViewer->addAction(mPVSelectAllA); // PictureViewer mark Action picViewer->addAction(createSeparator()); mPVMarkA = new QAction(QIcon(":/higheels.png"), tr("(Un-)Mark"), this); mPVMarkA->setCheckable(true); mPVMarkA->setData(PictureViewer2::MarkAction); connect(mPVMarkA, SIGNAL(triggered()), picViewer, SLOT(markCurrent())); picViewer->addAction(mPVMarkA); mPVClearMarksA = new QAction(tr("Clear marks"), this); connect(mPVClearMarksA, SIGNAL(triggered()), picViewer, SLOT(clearMarks())); picViewer->addAction(mPVClearMarksA); mPVDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); mPVDeleteA->setData(PictureViewer2::DeleteAction); connect(mPVDeleteA, SIGNAL(triggered()), picViewer, SLOT(deleteCurrent())); picViewer->addAction(mPVDeleteA); picViewer->addAction(createSeparator()); // Copy to... mPVCopyToA = new QAction(tr("Copy to..."), this); connect(mPVCopyToA, SIGNAL(triggered()), picViewer, SLOT(copyCurrent())); picViewer->addAction(mPVCopyToA); // NewPicsDialog actions mPVShowNPDialogA = new QAction(tr("Show new pics dialog..."), this); mPVShowNPDialogA->setShortcut(tr("CTRL+s")); connect(mPVShowNPDialogA, SIGNAL(triggered()), picViewer, SLOT(showNewPicsDialog())); picViewer->addAction(mPVShowNPDialogA); mPVAddToNPA = new QAction(tr("Set file in new pics dialog"), this); mPVAddToNPA->setShortcut(tr("CTRL+a")); connect(mPVAddToNPA, SIGNAL(triggered()), picViewer, SLOT(addToNewPics())); picViewer->addAction(mPVAddToNPA); // assign actions to PictureViewer2 members, so they can be toggled from within picViewer->initActions(); picViewer->hide(); /* picView(er) END Actions! */ // ArchiveView actions ArchiveController *c = SmGlobals::instance()->archiveController(); // edit mArchiveViewRenameA = new QAction(tr("Edit..."), this); mArchiveViewRenameA->setData(ArchiveModel::AllNodes); connect(mArchiveViewRenameA, SIGNAL(triggered()), c->archiveTree(), SLOT(edit())); // edit actors mArchiveViewActorsA = new QAction(tr("Edit actors..."), this); mArchiveViewActorsA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewActorsA, SIGNAL(triggered()), c->archiveTree(), SLOT(editActors())); // edit genres mArchiveViewGenresA = new QAction(tr("Edit genres..."), this); mArchiveViewGenresA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewGenresA, SIGNAL(triggered()), c->archiveTree(), SLOT(editGenres())); // edit part no and subtitle mArchiveViewPartnoA = new QAction(tr("Edit Part No..."), this); mArchiveViewPartnoA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewPartnoA, SIGNAL(triggered()), c->archiveTree(), SLOT(editSeriesPart())); // edit metadata mArchiveViewMetadataA = new QAction(tr("Edit metadata..."), this); mArchiveViewMetadataA->setData(ArchiveModel::SeriesPartNode); // add Covers connect(mArchiveViewMetadataA, SIGNAL(triggered()), c->archiveTree(), SLOT(editMetadata())); mArchiveViewAddCoversA = new QAction(QIcon(":/huge_bra.png"), tr("Add Files..."), this); mArchiveViewAddCoversA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewAddCoversA, SIGNAL(triggered()), c, SLOT(addFiles())); //collapse and expand... mArchiveViewExpandAllA = new QAction(tr("Expand all"), this); mArchiveViewExpandAllA->setData(ArchiveModel::AllNodes); connect(mArchiveViewExpandAllA, SIGNAL(triggered()), c->archiveTree(), SLOT(expandAll())); mArchiveViewCollapseAllA = new QAction(tr("Collapse all"), this); mArchiveViewCollapseAllA->setData(ArchiveModel::AllNodes); connect(mArchiveViewCollapseAllA, SIGNAL(triggered()), c->archiveTree(), SLOT(collapseAll())); // refresh all mArchiveViewRefreshA = new QAction(tr("Refresh"), this); mArchiveViewRefreshA->setData(ArchiveModel::AllNodes); connect(mArchiveViewRefreshA, SIGNAL(triggered()), c->archiveView(), SLOT(refreshArchive())); // mark as favorite mArchiveViewMarkFavA = new QAction(tr("Mark as favorite"), this); mArchiveViewMarkFavA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewMarkFavA, SIGNAL(triggered()), c->archiveTree(), SLOT(markAsFavorite())); //delete from Tree mArchiveViewDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); int deleteMask = 0; deleteMask |= ArchiveModel::SeriesNode; deleteMask |= ArchiveModel::SeriesPartNode; mArchiveViewDeleteA->setData(deleteMask); connect(mArchiveViewDeleteA, SIGNAL(triggered()), c->archiveTree(), SLOT(deleteFromTree())); //add new series part mArchiveViewNewPartA = new QAction(QIcon(":/french_maid_dress.png"), tr("New..."), this); mArchiveViewNewPartA->setData(ArchiveModel::SeriesNode); connect(mArchiveViewNewPartA, SIGNAL(triggered()), c->archiveTree(), SLOT(newPart())); // ArchiveFiles actions <- ArchiveView! // play selected mArchiveFilesPlayA = new QAction(tr("Play selected..."), this); connect(mArchiveFilesPlayA, SIGNAL(triggered()), c, SLOT(playSelectedFiles())); // set quality mArchiveFilesQualityA = new QAction(QIcon(":/letter_q.png"), tr("Set Quality..."), this); connect(mArchiveFilesQualityA, SIGNAL(triggered()), c, SLOT(editQuality())); // set dvd mArchiveFilesDvdNoA = new QAction(QIcon(":/letter_d.png"), tr("Set Dvd No. ..."), this); connect(mArchiveFilesDvdNoA, SIGNAL(triggered()), c, SLOT(editDvdNo())); // set file type mArchiveFilesTypeA = new QAction(QIcon(":/letter_t.png"), tr("Set file type..."), this); connect(mArchiveFilesTypeA, SIGNAL(triggered()), c, SLOT(editFileType())); // set file no mArchiveFilesFileNoA = new QAction(QIcon(":/letter_n.png"), tr("Set File No. ..."), this); connect(mArchiveFilesFileNoA, SIGNAL(triggered()), c, SLOT(editFileNo())); // show properties mArchiveFilesPropertiesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Properties..."), this); connect(mArchiveFilesPropertiesA, SIGNAL(triggered()), c, SLOT(showProperties())); // preview mArchiveFilesPreviewA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Preview..."), this); connect(mArchiveFilesPreviewA, SIGNAL(triggered()), c, SLOT(showPreview())); // delete from archive mArchiveRemoveFilesA = new QAction(QIcon(":/delete.png"), tr("Remove..."), this); connect(mArchiveRemoveFilesA, SIGNAL(triggered()), c->archiveFiles(), SLOT(deleteFromFiles())); //ArchiveBrowser Actions mArchiveBrowserMoveToBurnA = new QAction(QIcon(":/shackles.png"), tr("Move to burn..."), this); connect(mArchiveBrowserMoveToBurnA, SIGNAL(triggered()), mArchiveBrowser, SLOT(moveToBurn())); mArchiveBrowserMoveToUSBA = new QAction(QIcon(":/clean_tampon.png"), tr("Move to USB..."), this); connect(mArchiveBrowserMoveToUSBA, SIGNAL(triggered()), mArchiveBrowser, SLOT(moveToUSB())); mArchiveBrowserRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); connect(mArchiveBrowserRefreshA, SIGNAL(triggered()), mArchiveBrowser, SLOT(refresh())); mArchiveBrowserPlaySelectedA = new QAction(QIcon(":/dildo.png"), tr("Play selected..."), this); connect(mArchiveBrowserPlaySelectedA, SIGNAL(triggered()), mArchiveBrowser, SLOT(playSelected())); mArchiveBrowserExpandAllA = new QAction(tr("Expand all"), this); connect(mArchiveBrowserExpandAllA, SIGNAL(triggered()), mArchiveBrowser->archiveTree(), SLOT(expandAll())); mArchiveBrowserCollapseAllA = new QAction(tr("Collapse all"), this); connect(mArchiveBrowserCollapseAllA, SIGNAL(triggered()), mArchiveBrowser->archiveTree(), SLOT(collapseAll())); // db analyzer dialogs // analyze actors mAnalyzeActorsA = new QAction(tr("Actors..."), this); connect(mAnalyzeActorsA, SIGNAL(triggered()), this, SLOT(analyzeActors())); // analyze genres mAnalyzeGenresA = new QAction(tr("Genres..."), this); connect(mAnalyzeGenresA, SIGNAL(triggered()), this, SLOT(analyzeGenres())); // analyze series mAnalyzeSeriesA = new QAction(tr("Series..."), this); connect(mAnalyzeSeriesA, SIGNAL(triggered()), this, SLOT(analyzeSeries())); // anaylze series parts mAnalyzePartsA = new QAction(tr("Series Parts..."), this); connect(mAnalyzePartsA, SIGNAL(triggered()), this, SLOT(analyzeParts())); //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); connect(mOpenWithMapperFS, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); } void SheMov::createMenus(){ //file menu QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(mNewMovieWizardA); fileMenu->addAction(mNewPicsA); fileMenu->addAction(mSearchDialogA); fileMenu->addSeparator(); fileMenu->addAction(mConsistencyA); QMenu *analyzeMenu = new QMenu(tr("Analyze"), this); analyzeMenu->addAction(mAnalyzeActorsA); analyzeMenu->addAction(mAnalyzeGenresA); analyzeMenu->addAction(mAnalyzeSeriesA); analyzeMenu->addAction(mAnalyzePartsA); fileMenu->addMenu(analyzeMenu); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); //filesystem edit menu mEditFSMenu = new QMenu(tr("&Edit"), this); mEditFSMenu->addAction(mCdupA); mEditFSMenu->addAction(mBackDirA); mEditFSMenu->addAction(mGotoArchiveA); 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->addAction(mUnpackA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mMoveToArchiveA); mEditFSMenu->addSeparator(); mEditFSMenu->addAction(mConfigA); mEditFSMenuA = menuBar()->addMenu(mEditFSMenu); //Pictures edit menu mEditPicMenu = new QMenu(tr("&Edit"), this); mEditPicMenu->addAction(mPWDeletePicFromA); mEditPicMenu->addAction(mPWEditPicMappingsA); mEditPicMenuA = menuBar()->addMenu(mEditPicMenu); //Archive edit menu: populated when creating context menu! mArchiveEditMenu = new QMenu(tr("&Edit"), this); mArchiveMenuA = menuBar()->addMenu(mArchiveEditMenu); //FileSystem view menu mFSViewMenu = new QMenu(tr("&View"), this); mFSViewMenu->addSeparator(); QMenu *fsHeaderMenu = new QMenu(tr("Show headers"), this); fsHeaderMenu->addActions(mFileSysHeaderGroup->actions()); mFSViewMenu->addMenu(fsHeaderMenu); mFSViewMenu->addSeparator(); mFSViewMenu->addAction(mFSResizeA); mFSViewMenu->addSeparator(); mFSViewMenu->addAction(mRefreshA); mViewFSMenuA = menuBar()->addMenu(mFSViewMenu); //Pictures view menu mPicViewMenu = new QMenu(tr("&View"), this); mPicViewMenu->addAction(mPVToggleA); mPicViewMenu->addAction(mPVAddA); mPicViewMenu->addAction(mPVReplaceA); mPicViewMenu->addSeparator(); QMenu *headerMenu = new QMenu(tr("Show headers"), this); headerMenu->addActions(mPicsTreeHeaderGroup->actions()); mPicViewMenu->addMenu(headerMenu); mPicViewMenu->addSeparator(); mPicViewMenu->addAction(mPWRefreshA); mViewPicMenuA = menuBar()->addMenu(mPicViewMenu); //Archive Browser view menu mArchiveBrowserViewMenu = new QMenu(tr("&View"), this); QMenu *abHeaderMenu = new QMenu(tr("Show headers"), this); abHeaderMenu->addActions(mArchiveBrowserAG->actions()); mArchiveBrowserViewMenu->addMenu(abHeaderMenu); mArchiveBrowserViewMenuA = menuBar()->addMenu(mArchiveBrowserViewMenu); mArchiveBrowserViewMenu->addSeparator(); mArchiveBrowserViewMenu->addAction(mArchiveBrowserPlaySelectedA); mArchiveBrowserViewMenu->addSeparator(); mArchiveBrowserViewMenu->addAction(mArchiveBrowserExpandAllA); mArchiveBrowserViewMenu->addAction(mArchiveBrowserCollapseAllA); mArchiveBrowserViewMenu->addSeparator(); mArchiveBrowserViewMenu->addAction(mArchiveBrowserMoveToBurnA); mArchiveBrowserViewMenu->addAction(mArchiveBrowserMoveToUSBA); mArchiveBrowserViewMenu->addSeparator(); mArchiveBrowserViewMenu->addAction(mArchiveBrowserRefreshA); //Movie archive QMenu *archiveHeaderMenu = new QMenu(tr("Show headers"), this); archiveHeaderMenu->addActions(mArchiveFilesAG->actions()); mArchiveViewMenu = new QMenu(tr("&View"), this); archiveHeaderMenu->addActions(mArchiveFilesAG->actions()); mArchiveViewMenu->addMenu(archiveHeaderMenu); mArchiveViewMenuA = menuBar()->addMenu(mArchiveViewMenu); 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); mPlaySelectedTimesMenuFS = new QMenu(tr("Play repeat..."), this); mPlaySelectedTimesMenuFS->addActions(mOpenTimesFSAG->actions()); mPlaySelectedTimesMenuFSA = new QAction(tr("Play repeat..."), this); mPlaySelectedTimesMenuFSA->setMenu(mPlaySelectedTimesMenuFS); mFSWidget->fileView()->addAction(mPlaySelectedTimesMenuFSA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mCdupA); mFSWidget->fileView()->addAction(mBackDirA); mFSWidget->fileView()->addAction(mGotoArchiveA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mMarkFilesA); //Menu text: Select files... mFSWidget->fileView()->addAction(mUnmarkFilesA); //Menu text: Deselect all files mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mCreateFolderA); mFSWidget->fileView()->addAction(mDeleteFilesA); mFSWidget->fileView()->addAction(mRenameA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mCopyA); mFSWidget->fileView()->addAction(mCutA); mFSWidget->fileView()->addAction(mPasteA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mMoveToArchiveA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mRefreshA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mArchiveSelectedPicsA); mFSWidget->fileView()->addAction(mArchivePicsInDirA); mFSWidget->fileView()->addAction(mArchiveSelectedMovsA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mUnpackA); mFSWidget->fileView()->addAction(createSeparator()); mFSWidget->fileView()->addAction(mFSPreviewA); mFSWidget->fileView()->addAction(mFSViewPropertiesA); // Movie archive ArchiveController *c = SmGlobals::instance()->archiveController(); c->addActionForTree(mArchiveViewRenameA); c->addActionForTree(mArchiveViewNewPartA); c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewActorsA); c->addActionForTree(mArchiveViewGenresA); c->addActionForTree(mArchiveViewPartnoA); c->addActionForTree(mArchiveViewMetadataA); c->addActionForTree(mArchiveViewAddCoversA); c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewMarkFavA); c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewExpandAllA); c->addActionForTree(mArchiveViewCollapseAllA); c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewDeleteA); c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewRefreshA); QMenu *archiveTreeM = new QMenu(tr("Archive"), this); archiveTreeM->addActions(c->archiveTree()->actions()); // Archive files (exp.) c->archiveFiles()->addAction(mArchiveFilesPlayA); c->archiveFiles()->addAction(createSeparator()); c->archiveFiles()->addAction(mArchiveFilesQualityA); c->archiveFiles()->addAction(mArchiveFilesDvdNoA); c->archiveFiles()->addAction(mArchiveFilesTypeA); c->archiveFiles()->addAction(mArchiveFilesFileNoA); c->archiveFiles()->addAction(createSeparator()); c->archiveFiles()->addAction(mArchiveRemoveFilesA); c->archiveFiles()->addAction(createSeparator()); c->archiveFiles()->addAction(mArchiveFilesPreviewA); c->archiveFiles()->addAction(createSeparator()); c->archiveFiles()->addAction(mArchiveFilesPropertiesA); QMenu *archiveFilesM = new QMenu(tr("Files"), this); archiveFilesM->addActions(c->archiveFiles()->actions()); // ArchiveBrowser context menu mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserPlaySelectedA); mArchiveBrowser->archiveTree()->addAction(createSeparator()); mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserExpandAllA); mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserCollapseAllA); mArchiveBrowser->archiveTree()->addAction(createSeparator()); mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserMoveToBurnA); mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserMoveToUSBA); mArchiveBrowser->archiveTree()->addAction(createSeparator()); mArchiveBrowser->archiveTree()->addAction(mArchiveBrowserRefreshA); mArchiveEditMenu->addMenu(archiveTreeM); mArchiveEditMenu->addMenu(archiveFilesM); // Random mRandomEditMenu = mRandomTab->editMenu(); mRandomEditMenuA = menuBar()->insertMenu(mArchiveMenuA, mRandomEditMenu); } 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::createToolBar(){ mFSWidget->toolBar()->addAction(mBackDirA); mFSWidget->toolBar()->addAction(mCdupA); mFSWidget->toolBar()->addSeparator(); mFSWidget->toolBar()->addAction(mUnpackA); mFSWidget->toolBar()->addSeparator(); mFSWidget->toolBar()->addAction(mCreateFolderA); mFSWidget->toolBar()->addAction(mRenameA); mFSWidget->toolBar()->addAction(mDeleteFilesA); mFSWidget->toolBar()->addAction(mRefreshA); mFSWidget->toolBar()->addSeparator(); mFSWidget->toolBar()->addAction(mArchiveSelectedMovsA); mFSWidget->toolBar()->addAction(mArchiveSelectedPicsA); mFSWidget->toolBar()->addSeparator(); mFSWidget->toolBar()->addAction(mFSPreviewA); mFSWidget->toolBar()->addAction(mFSViewPropertiesA); mFSWidget->toolBar()->addAction(mFSResizeA); mFSWidget->toolBar()->addSeparator(); mFSWidget->toolBar()->addAction(mConfigA); mArchive->toolBar()->addAction(mArchiveFilesQualityA); mArchive->toolBar()->addAction(mArchiveFilesDvdNoA); mArchive->toolBar()->addAction(mArchiveFilesTypeA); mArchive->toolBar()->addAction(mArchiveFilesFileNoA); mArchive->toolBar()->addSeparator(); mArchive->toolBar()->addAction(mArchiveFilesPreviewA); mArchive->toolBar()->addAction(mArchiveFilesPropertiesA); mArchive->toolBar()->addAction(mArchiveViewAddCoversA); mArchive->toolBar()->addSeparator(); mArchive->toolBar()->addAction(mConfigA); mArchiveBrowser->toolBar()->addAction(mArchiveBrowserPlaySelectedA); mArchiveBrowser->toolBar()->addSeparator(); mArchiveBrowser->toolBar()->addAction(mArchiveBrowserRefreshA); mArchiveBrowser->toolBar()->addAction(mArchiveBrowserMoveToBurnA); mArchiveBrowser->toolBar()->addAction(mArchiveBrowserMoveToUSBA); mArchiveBrowser->toolBar()->addSeparator(); mArchiveBrowser->toolBar()->addAction(mConfigA); } void SheMov::writeSettings(){ QSettings s; s.setValue("ui/selectedtab", mTab->currentIndex()); } void SheMov::readSettings(){ QSettings s; int currentTab = s.value("ui/selectedtab", 0).toInt(); if(currentTab < mTab->count() && currentTab != mTab->currentIndex()){ mTab->setCurrentIndex(currentTab); } tabChanged(currentTab); QString dvdMount = s.value("paths/dvdmount").toString(); if(dvdMount.isEmpty()){ mMountDvdA->setEnabled(false); }else{ if(mFSWidget->isMounted()){ mMountDvdA->setChecked(true); }else{ mMountDvdA->setChecked(false); } } createPalette(); } void SheMov::createPalette(){ QSettings s; 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); } void SheMov::analyzeActors(){ EmptyActorsDialog d(tr("Actors"), this); d.populate(); d.exec(); } void SheMov::analyzeGenres(){ EmptyGenresDialog d(tr("Genres"), this); d.populate(); d.exec(); } void SheMov::analyzeSeries(){ EmptySeriesDialog d(tr("Series"), this); d.populate(); d.exec(); } void SheMov::analyzeParts(){ EmptyPartsDialog d(tr("Series Parts"), this); d.populate(); d.exec(); } void SheMov::checkConsistency(){ ConsistencyCheck c; c.exec(); } 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::newPicsDialog(){ mNewPicsDialog->exec(); } void SheMov::newPicsDialogWithFiles(){ QModelIndexList selected = mFSWidget->fileView()->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } QStringList files; foreach(QModelIndex idx, selected){ files << idx.data(SmDirModel::FullPathRole).toString(); } mNewPicsDialog->clearFiles(); mNewPicsDialog->addFiles(files); mNewPicsDialog->exec(); } void SheMov::newPicsDialogWithDir(){ QString dir = mFSWidget->currentDir(); mNewPicsDialog->clearFiles(); mNewPicsDialog->setDir(dir); SmGlobals::instance()->pictureViewer()->show(); mNewPicsDialog->exec(); } void SheMov::searchResult(int seriesPartId){ mSearchDialog->hide(); mTab->setCurrentIndex(Movies); ArchiveController *c = SmGlobals::instance()->archiveController(); c->archiveTree()->setFocus(); c->setSeriesPart(seriesPartId); } void SheMov::gotoArchive(){ const QModelIndexList idxs = mFSWidget->fileView()->selectionModel()->selectedRows(SmDirModel::Md5sum); if(idxs.isEmpty()){ return; } QModelIndex first = idxs.first(); if(first.data(SmDirModel::PresentRole).toInt() == SmDirModel::InNone){ return; } QString md5Sum = first.data(SmDirModel::Md5sumRole).toString(); ArchiveController *c = SmGlobals::instance()->archiveController(); int seriesPartId = c->archiveTreeModel()->seriesPartIdFromMd5(md5Sum); if(seriesPartId != -1){ c->setSeriesPart(seriesPartId); mTab->setCurrentIndex(Movies); } }