#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "shemovcleaner.h" #include "torrentwidget.h" #include "filewidget.h" #include "filecopier.h" #include "torrentdisplay.h" #include "configurationwidget.h" #include "filewidget.h" #include "globals.h" #include "helper.h" ShemovCleaner::ShemovCleaner(QWidget *parent) : QMainWindow(parent) { //general setup qApp->setWindowIcon(QIcon(":/clean_tampon.png")); setMinimumWidth(800); setMinimumHeight(600); QSplashScreen splash(QPixmap(":/shemovcleaner_splash.png")); splash.showMessage(tr("Opening database and preparing..."), Qt::AlignHCenter, Qt::darkGreen); splash.show(); qApp->processEvents(); openDatabase(); createGlobalActions(); splash.showMessage(tr("Reading torrents..."), Qt::AlignHCenter, Qt::darkGreen); qApp->processEvents(); mTab = new QTabWidget; mTorrentTab = new TorrentWidget; mTorrentTab->gatherData(); splash.showMessage(tr("Gathering files..."), Qt::AlignHCenter, Qt::darkGreen); qApp->processEvents(); mFileTab = new FileWidget; mFileTab->gatherData(); splash.showMessage(tr("Finalizing..."), Qt::AlignHCenter, Qt::darkGreen); qApp->processEvents(); mTab->addTab(mTorrentTab, tr("&Torrents")); mTab->addTab(mFileTab, tr("Fi&les")); createStatusBar(); setCentralWidget(mTab); connect(mTorrentTab, &TorrentWidget::statusMessage, this, &ShemovCleaner::statusBarMessage); connect(mTorrentTab, &TorrentWidget::selectionCountChanged, this, &ShemovCleaner::setSelectionCount); connect(mTorrentTab, &TorrentWidget::freeSpaceChanged, this, &ShemovCleaner::updateFreeSpace); connect(mFileTab, &FileWidget::statusMessage, this, &ShemovCleaner::statusBarMessage); connect(mFileTab, &FileWidget::selectionCountChanged, this, &ShemovCleaner::setSelectionCount); connect(mFileTab, &FileWidget::durationChanged, this, &ShemovCleaner::setDuration); connect(mFileTab, &FileWidget::freeSpaceChanged, this, &ShemovCleaner::updateFreeSpace); connect(mTab, &QTabWidget::currentChanged, this, &ShemovCleaner::tabChanged); connect(this, &ShemovCleaner::configurationChanged, mFileTab, &FileWidget::readSettings); connect(mFileTab->fileCopier(), &FileCopier::copying, this, &ShemovCleaner::updateCopying); connect(mFileTab->fileCopier(), &FileCopier::finished, this, [=] { updateCopying(QString());} ); connect(mFileTab->fileCopier(), &FileCopier::finished, mFileTab, &FileWidget::gatherData); mCopying->installEventFilter(this); updateCopying(QString()); QMenu *helpMenu = new QMenu(tr("&Help")); QAction *aboutThisA = new QAction(tr("About ShemovCleaner..."), this); connect(aboutThisA, &QAction::triggered, this, &ShemovCleaner::aboutThisProgram); helpMenu->addAction(aboutThisA); helpMenu->addSeparator(); QAction *aboutQtA = new QAction(tr("About Qt..."), this); connect(aboutQtA, &QAction::triggered, qApp, &QApplication::aboutQt); helpMenu->addAction(aboutQtA); mTorrentTab->menuBar()->addMenu(helpMenu); mFileTab->menuBar()->addMenu(helpMenu); QSettings s; restoreGeometry(s.value("geometry").toByteArray()); mTorrentTab->torrentFileView()->setFocus(); readSettings(); Helper::setAlternatingRowColors(); mTorrentTab->selectFirst(); mFileTab->selectFirst(); } ShemovCleaner::~ShemovCleaner(){ writeSettings(); } void ShemovCleaner::statusBarMessage(const QString &msg){ statusBar()->showMessage(msg, 10*1000); } void ShemovCleaner::setDuration(const QString &msg){ mDuration->setText(msg); } void ShemovCleaner::updateFreeSpace(const QString &path){ QStorageInfo si(path); QString drive = si.rootPath(); if(drive.endsWith('/')){ drive.chop(1); } mDrive->setText(drive); QString textFree = QString(tr("%1/%2GB free")).arg(QString::number(si.bytesFree() / 1024 / 1024 / 1024), QString::number(si.bytesTotal() / 1024 / 1024 / 1024)); mFree->setText(textFree); } void ShemovCleaner::updateCopying(const QString &count){ QImage img(mCopying->size(), QImage::Format_ARGB32); if(mFileTab->fileCopier()->isRunning()){ img.fill(Qt::red); QPainter p(&img); QFont f(qApp->font()); f.setBold(true); p.setFont(f); p.setPen(Qt::blue); p.drawText(mCopying->rect(), Qt::AlignCenter, count); }else{ img.fill(Qt::green); } mCopying->setPixmap(QPixmap::fromImage(img)); } void ShemovCleaner::setSelectionCount(const QString &msg){ mSelected->setText(msg); } void ShemovCleaner::configure(){ ConfigurationWidget w(this); int res = w.exec(); if(res == QDialog::Accepted){ openDatabase(); emit configurationChanged(); Helper::setAlternatingRowColors(); } } void ShemovCleaner::tabChanged(int idx){ QString winTitle; if(idx == Torrents){ setDuration("00:00:00"); updateFreeSpace(mTorrentTab->currentDir()); winTitle = QString(tr("%1 Torrents [%2]")).arg(qApp->applicationName(), mTorrentTab->currentDir()); }else if(idx == Videos){ mFileTab->fileView()->setFocus(); updateFreeSpace(mFileTab->currentDir()); winTitle = QString(tr("%1 Files [%2]")).arg(qApp->applicationName(), mFileTab->currentDir()); } setWindowTitle(winTitle); } void ShemovCleaner::closeEvent(QCloseEvent *e){ int retval = QMessageBox::question(this, tr("Exit"), tr("Really close?")); if(retval == QMessageBox::Yes){ QSettings s; s.setValue("geometry", saveGeometry()); QMainWindow::closeEvent(e); }else{ e->ignore(); } } bool ShemovCleaner::eventFilter(QObject *watched, QEvent *event){ if(watched == mCopying){ if(event->type() == QEvent::MouseButtonPress){ if(mFileTab->fileCopier()->isRunning()){ int retval = QMessageBox::question(this, tr("Cancel copy?"), tr("Cancel copying?")); if(retval == QMessageBox::Yes){ mFileTab->fileCopier()->cancel(); return true; } } } } return QMainWindow::eventFilter(watched, event); } void ShemovCleaner::createStatusBar(){ QLabel *l1 = new QLabel(tr("Sel.")); mSelected = new QLabel("000/000"); mSelected->setMinimumWidth(80); mSelected->setAlignment(Qt::AlignCenter); mSelected->setFrameStyle(QFrame::Panel | QFrame::Sunken); QLabel *l2 = new QLabel(tr("Dur.")); mDuration = new QLabel("00:00:00"); mDuration->setFrameStyle(QFrame::Panel | QFrame::Sunken); mDrive = new QLabel(tr("C:")); mFree = new QLabel; mFree->setFrameStyle(QFrame::Panel | QFrame::Sunken); mFree->setMinimumWidth(120); mFree->setAlignment(Qt::AlignCenter); QFont f(qApp->font()); f.setBold(true); QFontMetrics fm(f); mFree->setMaximumHeight(fm.height() + 6); mCopying = new QLabel; mCopying->setFrameStyle(QFrame::Panel | QFrame::Sunken); mCopying->setMinimumWidth(fm.maxWidth() + 6); mCopying->setMaximumWidth(fm.maxWidth() + 6); mCopying->setMaximumHeight(fm.height() + 6); mCopying->setMinimumHeight(fm.height() + 6); statusBar()->addPermanentWidget(new QLabel(tr("C:"))); statusBar()->addPermanentWidget(mCopying); statusBar()->addPermanentWidget(l1); statusBar()->addPermanentWidget(mSelected); statusBar()->addPermanentWidget(l2); statusBar()->addPermanentWidget(mDuration); statusBar()->addPermanentWidget(mDrive); statusBar()->addPermanentWidget(mFree); updateCopying(QString()); } void ShemovCleaner::createGlobalActions(){ QAction *quitA = new QAction(tr("Quit"), this); quitA->setShortcut(tr("CTRL+Q")); connect(quitA, &QAction::triggered, qApp, &QApplication::closeAllWindows); quitA->setData(Globals::QuitAction); Globals::instance()->addAction(quitA); QAction *configA = new QAction(QIcon(":/chastity_belt.png"), tr("Configure..."), this); connect(configA, &QAction::triggered, this, &ShemovCleaner::configure); configA->setData(Globals::ConfigAction); Globals::instance()->addAction(configA); } void ShemovCleaner::openDatabase(){ QSettings s; QString dbhost = s.value("dbhost").toString(); QString dbuser = s.value("dbuser").toString(); QString dbpass = s.value("dbpass").toString(); QString dbname = s.value("dbname").toString(); if(!QSqlDatabase::contains("shemovdb")){ QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "shemovdb"); db.setHostName(dbhost); db.setUserName(dbuser); db.setPassword(dbpass); db.setDatabaseName(dbname); if(!db.open()){ int res = ConfigurationWidget(this).exec(); if(res == QDialog::Accepted){ openDatabase(); }else{ QMessageBox::critical(this, tr("Error"), tr("Could not open database. Giving up!")); qApp->closeAllWindows(); } } } } void ShemovCleaner::readSettings(){ QSettings s; int curTab = s.value("startupTab").toInt(); mTab->setCurrentIndex(curTab); tabChanged(curTab); } void ShemovCleaner::writeSettings(){ int curTab = mTab->currentIndex(); QSettings s; s.setValue("startupTab", curTab); } void ShemovCleaner::aboutThisProgram(){ QString aboutLabel = QString(tr("About %1")).arg(qApp->applicationName()); QString aboutText = QString("

%1 - A little helper program for the big sister SheMov

").arg(qApp->applicationName()); aboutText.append(""); aboutText.append(QString(tr("Sissy herself %1")).arg(QChar(0x26A4))); 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__ */
DependsQt
")); QMessageBox::about(this, aboutLabel, aboutText); } QAction *ShemovCleaner::createSeparator(){ QAction *retval = new QAction(this); retval->setSeparator(true); return retval; }