/* 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 "shemov.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 "archiveview.h" #include "archivecontroller.h" #include "archivebrowser.h" #include "searchdialog.h" #include "randomtab.h" #include "fswidget.h" #include "helper.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(); mTab = new QTabWidget; mFileWidget = new FSWidget; mTab->addTab(mFileWidget, tr("FS")); connect(mFileWidget, &FSWidget::message, this, &SheMov::statusbarMessage); connect(mFileWidget, &FSWidget::selectionChanged, [=](int count, qint64 size, qint64 duration) { updateSelectedCount(count); setSize(size); setDuration(duration, false); }); connect(mFileWidget, &FSWidget::needRefreshFs, this, &SheMov::setFsFree); connect(mFileWidget, &FSWidget::needConfig, this, &SheMov::configure); //experimental splash.showMessage(tr("Creating Movie archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mArchive = new ArchiveView; mTab->addTab(mArchive, "Movies"); connect(mArchive->archiveModel(), &ArchiveModel::message, this, &SheMov::statusbarMessage); //pictures splash.showMessage(tr("Creating Picture Archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mPicWidget = new PicturesWidget; mTab->addTab(mPicWidget, tr("Pictures")); connect(mPicWidget, &PicturesWidget::needWindowTitleChange, this, &SheMov::setWindowTitle); connect(mPicWidget->picView(), &PictureView::newMappings, this, &SheMov::statusbarMessage); connect(mPicWidget->picView(), &PictureView::numSelected, this, &SheMov::updateSelectedCount); connect(mPicWidget->picView(), &PictureView::selectedSize, this, &SheMov::setSize); 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, &ArchiveBrowser::sizeChanged, this, &SheMov::setSize); connect(mArchiveBrowser, &ArchiveBrowser::itemCountChanged, this, &SheMov::updateSelectedCount); connect(mArchiveBrowser, &ArchiveBrowser::needFSFreeUpdate, this, &SheMov::setFsFree); //randomtab splash.showMessage(tr("Creating Random Browser..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mRandomTab = new RandomTab; connect(mRandomTab, &RandomTab::configure, this, &SheMov::configure); mTab->addTab(mRandomTab, tr("Random")); //misc dialogs splash.showMessage(tr("Creating misc. Dialogs..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); ArchiveController *c = SmGlobals::instance()->archiveController(); mSearchDialog = new SearchDialog(this); connect(mSearchDialog, &SearchDialog::searchResultClicked, this, &SheMov::searchResult); //experimental archive connect(c, &ArchiveController::sizeChanged, this, &SheMov::setSize); connect(c, &ArchiveController::durationChanged, this, &SheMov::setDuration); connect(c->archiveTreeModel(), &ArchiveModel::windowTitle, this, &SheMov::setWindowTitle); 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(mTab, &QTabWidget::currentChanged, this, &SheMov::tabChanged); connect(this, &SheMov::configChanged, picViewer, &PictureViewer2::readSettings); connect(this, &SheMov::configChanged, c->archiveTreeModel(), &ArchiveModel::readConfig); connect(this, &SheMov::configChanged, mFileWidget, &FSWidget::readSettings); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); setCentralWidget(centralWidget); show(); splash.finish(this); mPicWidget->readSettings(); mArchive->readSettings(); mArchiveBrowser->readConfig(); readSettings(); setWindowState(Qt::WindowMaximized); } void SheMov::closeEvent(QCloseEvent *event){ 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(); createPalette(); emit configChanged(); } void SheMov::tabChanged(int newTab){ mEditPicMenuA->setVisible(newTab == Pictures); mViewPicMenuA->setVisible(newTab == Pictures); mArchiveViewMenuA->setVisible(newTab == Movies); mArchiveMenuA->setVisible(newTab == Movies); mPicActionGroup->setEnabled(newTab == Pictures); mPVSelectAllA->disconnect(); mPVShowNPDialogA->setEnabled(newTab == FileManager); mPVAddToNPA->setEnabled(newTab == FileManager); mArchiveBrowserViewMenuA->setVisible(newTab == ArchiveBrowserTab); mRandomEditMenuA->setVisible(newTab == RandomDisp); statusbarMessage(QString()); ArchiveController *c = SmGlobals::instance()->archiveController(); switch(newTab){ case FileManager: break; case Movies: c->fileSelectionChanged(QItemSelection(), QItemSelection()); c->archiveTreeModel()->setWindowTitle(); break; case Pictures: connect(mPVSelectAllA, &QAction::triggered, mPicWidget->picView(), &PictureView::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::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; } void SheMov::createHeaderMapper(SmTreeModel *model, SmTreeView *view, QActionGroup *group){ QHash headerData = model->headerData(); 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); connect(a, &QAction::triggered, [=] {view->toggleHeader(a); }); } } 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(){ mConsistencyA = new QAction(tr("Check consisteny..."), this); connect(mConsistencyA, &QAction::triggered, this, &SheMov::checkConsistency); mSearchDialogA = new QAction(tr("Search..."), this); mSearchDialogA->setShortcut(tr("CTRL+f")); connect(mSearchDialogA, &QAction::triggered, mSearchDialog, &SearchDialog::show); //connnect mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); connect(mQuitA, &QAction::triggered, qApp, &QApplication::closeAllWindows); mConfigA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(mConfigA, &QAction::triggered, this, &SheMov::configure); //Help menu QString aboutLabel = QString(tr("About %1...")).arg(qApp->applicationName()); mAboutShemovA = new QAction(aboutLabel, this); connect(mAboutShemovA, &QAction::triggered, this, &SheMov::aboutShemov); mAboutQtA = new QAction(tr("About Qt..."), this); connect(mAboutQtA, &QAction::triggered, qApp, &QApplication::aboutQt); mStatisticsA = new QAction(tr("Some statistics..."), this); connect(mStatisticsA, &QAction::triggered, this, &SheMov::showStatistics); //headers mPicsTreeHeaderGroup = new QActionGroup(this); SmTreeModel *picFilesModel = static_cast(SmGlobals::instance()->model("PicFiles")); createHeaderMapper(picFilesModel, mPicWidget->picView(), mPicsTreeHeaderGroup); mPicWidget->picView()->setHeaderGroup(mPicsTreeHeaderGroup); mArchiveFilesAG = new QActionGroup(this); ArchiveController *controller = SmGlobals::instance()->archiveController(); SmTreeModel *afilesmodel = controller->archiveFilesModel(); createHeaderMapper(afilesmodel, controller->archiveFiles(), mArchiveFilesAG); controller->archiveFiles()->setHeaderGroup(mArchiveFilesAG); SmTreeModel *abrowsermodel = static_cast(SmGlobals::instance()->model("BrowserModel")); mArchiveBrowserAG = new QActionGroup(this); createHeaderMapper(abrowsermodel, mArchiveBrowser->archiveTree(), mArchiveBrowserAG); 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, &QAction::triggered, mPicWidget->picView(), &PictureView::deletePics); mPWEditPicMappingsA = new QAction(QIcon(":/squirting_nipple.png"), tr("Edit mappings..."), this); mPicWidget->picView()->addAction(mPWEditPicMappingsA); connect(mPWEditPicMappingsA, &QAction::triggered, mPicWidget->picView(), &PictureView::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, &QAction::triggered, picViewer, &PictureViewer2::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, &QAction::toggled, picViewer, &PictureViewer2::setVisible); mPVToggleA->setChecked(false); mPicWidget->picView()->addAction(mPVToggleA); // Add selected + Replace with selected mPVAddA = new QAction(QIcon(":/used_tampon.png"), tr("Add selected"), this); connect(mPVAddA, &QAction::triggered, [=] { mPicWidget->picView()->setPVData(false); }); mPicWidget->picView()->addAction(mPVAddA); mPVReplaceA = new QAction(QIcon(":/clean_tampon.png"), tr("Replace with selected"), this); connect(mPVReplaceA, &QAction::triggered, [=] { mPicWidget->picView()->setPVData(true); }); mPicWidget->picView()->addAction(mPVReplaceA); // Refresh mPicWidget->picView()->addAction(createSeparator()); mPWRefreshA = new QAction(QIcon(":/huge_bra.png"), tr("Refresh"), this); mPicWidget->picView()->addAction(mPWRefreshA); connect(mPWRefreshA, &QAction::triggered, mPicWidget->picView(), &PictureView::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, &QAction::triggered, picViewer, &PictureViewer2::markCurrent); picViewer->addAction(mPVMarkA); mPVClearMarksA = new QAction(tr("Clear marks"), this); connect(mPVClearMarksA, &QAction::triggered, picViewer, &PictureViewer2::clearMarks); picViewer->addAction(mPVClearMarksA); mPVDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); mPVDeleteA->setData(PictureViewer2::DeleteAction); connect(mPVDeleteA, &QAction::triggered, picViewer, &PictureViewer2::deleteCurrent); picViewer->addAction(mPVDeleteA); picViewer->addAction(createSeparator()); // Copy to... mPVCopyToA = new QAction(tr("Copy to..."), this); connect(mPVCopyToA, &QAction::triggered, picViewer, &PictureViewer2::copyCurrent); picViewer->addAction(mPVCopyToA); // NewPicsDialog actions mPVShowNPDialogA = new QAction(tr("Show new pics dialog..."), this); mPVShowNPDialogA->setShortcut(tr("CTRL+s")); connect(mPVShowNPDialogA, &QAction::triggered, picViewer, &PictureViewer2::showNewPicsDialog); picViewer->addAction(mPVShowNPDialogA); mPVAddToNPA = new QAction(tr("Set file in new pics dialog"), this); mPVAddToNPA->setShortcut(tr("CTRL+a")); connect(mPVAddToNPA, &QAction::triggered, picViewer, &PictureViewer2::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, &QAction::triggered, c->archiveTree(), &ArchiveTree::edit); // edit actors mArchiveViewActorsA = new QAction(tr("Edit actors..."), this); mArchiveViewActorsA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewActorsA, &QAction::triggered, c->archiveTree(), &ArchiveTree::editActors); // edit genres mArchiveViewGenresA = new QAction(tr("Edit genres..."), this); mArchiveViewGenresA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewGenresA, &QAction::triggered, c->archiveTree(), &ArchiveTree::editGenres); // edit part no and subtitle mArchiveViewPartnoA = new QAction(tr("Edit Part No..."), this); mArchiveViewPartnoA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewPartnoA, &QAction::triggered, c->archiveTree(), &ArchiveTree::editSeriesPart); // edit metadata mArchiveViewMetadataA = new QAction(tr("Edit metadata..."), this); mArchiveViewMetadataA->setData(ArchiveModel::SeriesPartNode); // add Covers connect(mArchiveViewMetadataA, &QAction::triggered, c->archiveTree(), &ArchiveTree::editMetadata); mArchiveViewAddCoversA = new QAction(QIcon(":/huge_bra.png"), tr("Add Files..."), this); mArchiveViewAddCoversA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewAddCoversA, &QAction::triggered, c, &ArchiveController::addFiles); //collapse and expand... mArchiveViewExpandAllA = new QAction(tr("Expand all"), this); mArchiveViewExpandAllA->setData(ArchiveModel::AllNodes); connect(mArchiveViewExpandAllA, &QAction::triggered, c->archiveTree(), &ArchiveTree::expandAll); mArchiveViewCollapseAllA = new QAction(tr("Collapse all"), this); mArchiveViewCollapseAllA->setData(ArchiveModel::AllNodes); connect(mArchiveViewCollapseAllA, &QAction::triggered, c->archiveTree(), &ArchiveTree::collapseAll); // refresh all mArchiveViewRefreshA = new QAction(tr("Refresh"), this); mArchiveViewRefreshA->setData(ArchiveModel::AllNodes); connect(mArchiveViewRefreshA, &QAction::triggered, c->archiveView(), &ArchiveView::refreshArchive); // mark as favorite mArchiveViewMarkFavA = new QAction(tr("Mark as favorite"), this); mArchiveViewMarkFavA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewMarkFavA, &QAction::triggered, c->archiveTree(), &ArchiveTree::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, &QAction::triggered, c->archiveTree(), &ArchiveTree::deleteFromTree); //add new series part mArchiveViewNewPartA = new QAction(QIcon(":/french_maid_dress.png"), tr("New..."), this); mArchiveViewNewPartA->setData(ArchiveModel::SeriesNode); connect(mArchiveViewNewPartA, &QAction::triggered, c->archiveTree(), &ArchiveTree::newPart); // ArchiveFiles actions <- ArchiveView! // play selected mArchiveFilesPlayA = new QAction(tr("Play selected..."), this); connect(mArchiveFilesPlayA, &QAction::triggered, c, &ArchiveController::playSelectedFiles); // set quality mArchiveFilesQualityA = new QAction(QIcon(":/letter_q.png"), tr("Set Quality..."), this); connect(mArchiveFilesQualityA, &QAction::triggered, c, &ArchiveController::editQuality); // set dvd mArchiveFilesDvdNoA = new QAction(QIcon(":/letter_d.png"), tr("Set Dvd No. ..."), this); connect(mArchiveFilesDvdNoA, &QAction::triggered, c, &ArchiveController::editDvdNo); // set file type mArchiveFilesTypeA = new QAction(QIcon(":/letter_t.png"), tr("Set file type..."), this); connect(mArchiveFilesTypeA, &QAction::triggered, c, &ArchiveController::editFileType); // set file no mArchiveFilesFileNoA = new QAction(QIcon(":/letter_n.png"), tr("Set File No. ..."), this); connect(mArchiveFilesFileNoA, &QAction::triggered, c, &ArchiveController::editFileNo); // show properties mArchiveFilesPropertiesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Properties..."), this); connect(mArchiveFilesPropertiesA, &QAction::triggered, c, &ArchiveController::showProperties); // preview mArchiveFilesPreviewA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Preview..."), this); connect(mArchiveFilesPreviewA, &QAction::triggered, c, &ArchiveController::showPreview); // delete from archive mArchiveRemoveFilesA = new QAction(QIcon(":/delete.png"), tr("Remove..."), this); connect(mArchiveRemoveFilesA, &QAction::triggered, c->archiveFiles(), &ArchiveFiles::deleteFromFiles); //ArchiveBrowser Actions mArchiveBrowserMoveToBurnA = new QAction(QIcon(":/shackles.png"), tr("Move to burn..."), this); connect(mArchiveBrowserMoveToBurnA, &QAction::triggered, mArchiveBrowser, &ArchiveBrowser::moveToBurn); mArchiveBrowserMoveToUSBA = new QAction(QIcon(":/clean_tampon.png"), tr("Move to USB..."), this); connect(mArchiveBrowserMoveToUSBA, &QAction::triggered, mArchiveBrowser, &ArchiveBrowser::moveToUSB); mArchiveBrowserRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); connect(mArchiveBrowserRefreshA, &QAction::triggered, mArchiveBrowser, &ArchiveBrowser::refresh); mArchiveBrowserPlaySelectedA = new QAction(QIcon(":/dildo.png"), tr("Play selected..."), this); connect(mArchiveBrowserPlaySelectedA, &QAction::triggered, mArchiveBrowser, &ArchiveBrowser::playSelected); mArchiveBrowserExpandAllA = new QAction(tr("Expand all"), this); connect(mArchiveBrowserExpandAllA, &QAction::triggered, mArchiveBrowser->archiveTree(), &SmTreeView::expandAll); mArchiveBrowserCollapseAllA = new QAction(tr("Collapse all"), this); connect(mArchiveBrowserCollapseAllA, &QAction::triggered, mArchiveBrowser->archiveTree(), &SmTreeView::collapseAll); // db analyzer dialogs // analyze actors mAnalyzeActorsA = new QAction(tr("Actors..."), this); connect(mAnalyzeActorsA, &QAction::triggered, this, &SheMov::analyzeActors); // analyze genres mAnalyzeGenresA = new QAction(tr("Genres..."), this); connect(mAnalyzeGenresA, &QAction::triggered, this, &SheMov::analyzeGenres); // analyze series mAnalyzeSeriesA = new QAction(tr("Series..."), this); connect(mAnalyzeSeriesA, &QAction::triggered, this, &SheMov::analyzeSeries); // anaylze series parts mAnalyzePartsA = new QAction(tr("Series Parts..."), this); connect(mAnalyzePartsA, &QAction::triggered, this, &SheMov::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); } void SheMov::createMenus(){ //FIXME! //fileMenu->addAction(mConsistencyA); QMenu *analyzeMenu = new QMenu(tr("Analyze"), this); analyzeMenu->addAction(mAnalyzeActorsA); analyzeMenu->addAction(mAnalyzeGenresA); analyzeMenu->addAction(mAnalyzeSeriesA); analyzeMenu->addAction(mAnalyzePartsA); //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); //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); // 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::createToolBar(){ 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(); 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::searchResult(int seriesPartId){ mSearchDialog->hide(); mTab->setCurrentIndex(Movies); ArchiveController *c = SmGlobals::instance()->archiveController(); c->archiveTree()->setFocus(); c->setSeriesPart(seriesPartId); }