#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fswidget.h" #include "helper.h" FSWidget::FSWidget(QWidget *parent) : QWidget(parent) { setPalette(qApp->palette()); setupWidget(); } void FSWidget::setupWidget(){ QToolBar *toolbar = new QToolBar; QPixmap buttplug(":/butt_plug.png"); QMatrix rotatematrix; rotatematrix.rotate(90); QIcon buttplugRight(buttplug.transformed(rotatematrix)); rotatematrix.rotate(-180); QIcon buttplugLeft(buttplug.transformed(rotatematrix)); QAction *backA = new QAction(buttplugLeft, tr("Prev. dir"), this); toolbar->addAction(backA); QAction *forwardA = new QAction(buttplugRight, tr("Next dir"), this); toolbar->addAction(forwardA); QLabel *dirL = new QLabel(tr("Dir")); mDirCB = new QComboBox; mDirCB->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(mDirCB, &QComboBox::currentTextChanged, this, &FSWidget::gatherData); QAction *addDirA = new QAction(QIcon(":/gaping_ass.png"), tr("Add dir..."), this); connect(addDirA, &QAction::triggered, [=] { QString newDir = QFileDialog::getExistingDirectory(this, tr("Select directory"), QDir::homePath()); insertItem(mDirCB, newDir); } ); QAction *removeDirA = new QAction(QIcon(":/hourglass_figure.png"), tr("Remove dir."), this); connect(removeDirA, &QAction::triggered, [=] { removeItem(mDirCB);} ); QToolBar *dirTB = new QToolBar; dirTB->addAction(addDirA); dirTB->addAction(removeDirA); QLabel *filterL = new QLabel(tr("Filter")); mFilterCB = new QComboBox; mFilterCB->setInsertPolicy(QComboBox::InsertAlphabetically); mFilterCB->setSizeAdjustPolicy(QComboBox::AdjustToContents); QAction *addFilterA = new QAction(QIcon(":/gaping_ass.png"), tr("Add filter..."), this); connect(addFilterA, &QAction::triggered, [=] { QString filter = QInputDialog::getText(this, tr("Mime filter"), tr("Filter")); insertItem(mFilterCB, filter); } ); QAction *removeFilterA = new QAction(QIcon(":/hourglass_figure.png"), tr("Remove filter"), this); connect(removeFilterA, &QAction::triggered, [=] { removeItem(mFilterCB); }); QToolBar *filterTB = new QToolBar; filterTB->addAction(addFilterA); filterTB->addAction(removeFilterA); QHBoxLayout *topWL = new QHBoxLayout; topWL->addWidget(dirL); topWL->addWidget(mDirCB); topWL->addWidget(dirTB); topWL->addWidget(filterL); topWL->addWidget(mFilterCB); topWL->addWidget(filterTB); topWL->addWidget(toolbar); topWL->addStretch(); mFileView = new QTreeView; mFileView->setAlternatingRowColors(true); mFileView->setSortingEnabled(true); mFileView->setUniformRowHeights(true); mFileView->setSelectionBehavior(QAbstractItemView::SelectRows); mFileView->setSelectionMode(QAbstractItemView::ExtendedSelection); mModel = new QStandardItemModel; mProxy = new QSortFilterProxyModel; mProxy->setSourceModel(mModel); mFileView->setModel(mProxy); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topWL); mainLayout->addWidget(mFileView); setLayout(mainLayout); readSettings(); } FSWidget::~FSWidget(){ writeSettings(); } void FSWidget::readSettings(){ QSettings s; QStringList dirs = s.value("fs/dirs").toStringList(); mDirCB->addItems(dirs); QString cDir = s.value("fs/curdir").toString(); mDirCB->setCurrentText(cDir); QStringList filters = s.value("fs/filters").toStringList(); mFilterCB->addItems(filters); QString cFilter = s.value("fs/curfilter").toString(); mFilterCB->setCurrentText(cFilter); } void FSWidget::writeSettings(){ QSettings s; QString curDir = mDirCB->currentText(); QStringList dirs; for(int i = 0 ; i < mDirCB->count(); ++i){ dirs << mDirCB->itemText(i); } s.setValue("fs/dirs", dirs); s.setValue("fs/curdir", curDir); QString curFilter = mFilterCB->currentText(); QStringList filters; for(int i = 0; i < mFilterCB->count(); ++i){ filters << mFilterCB->itemText(i); } s.setValue("fs/filters", filters); s.setValue("fs/curfilter", curFilter); } void FSWidget::insertItem(QComboBox *cb, const QString &text){ if(text.isEmpty()){ return; } int idx = 0; while(idx != cb->count()){ QString curT = cb->itemText(idx); if(text == curT){ return; } if(cb->itemText(idx) > text){ break; } ++idx; } cb->insertItem(idx, text); } void FSWidget::removeItem(QComboBox *cb){ int toRemove = cb->findText(cb->currentText()); if(toRemove != -1){ cb->removeItem(toRemove); } } void FSWidget::gatherData(const QString &curDir){ mFileView->setSortingEnabled(false); mModel->clear(); QStandardItem *root = mModel->invisibleRootItem(); QMimeDatabase mimedb; mModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("MIME") << tr("Size") << tr("Duration") << tr("MD5")); QDirIterator it(curDir, QDir::Files); mFileView->setUpdatesEnabled(false); while(it.hasNext()){ QFileInfo fi = it.next(); QMimeType mimeType = mimedb.mimeTypeForFile(fi); qint64 seconds = 0; Helper::Duration dur; QString durStr(tr("n/a")); QLocale l; QString size = l.toString(fi.size()); QString md5 = Helper::md5Sum(fi.absoluteFilePath()); QIcon i(":/huge_bra.png"); if(mimeType.name().startsWith("video")){ QJsonDocument jDoc = Helper::streamData(fi.absoluteFilePath()); QJsonObject jObj = jDoc.object(); QJsonValue durationV = jObj["format"].toObject()["duration"]; seconds = durationV.toVariant().toDouble(); dur = Helper::Duration(seconds); durStr = dur.toString(); } QList items; QFont f("courier new"); for(int i = 0; i < 5; ++i){ QStandardItem *item = new QStandardItem; item->setFont(f); item->setEditable(false); items << item; } items[0]->setText(fi.fileName()); items[1]->setText(mimeType.name()); items[2]->setText(size); items[2]->setTextAlignment(Qt::AlignRight); items[3]->setText(durStr); items[4]->setText(md5); root->appendRow(items); for(int i = 0; i < 5; ++i){ mFileView->resizeColumnToContents(i); } } mFileView->setUpdatesEnabled(true); mFileView->setSortingEnabled(true); }